summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeora Barsky <georab@amdocs.com>2017-09-19 17:08:12 -0400
committerGeora Barsky <georab@amdocs.com>2017-09-19 23:41:20 -0400
commit16c93bd15d9809c1e4a4295db6a634d75ed1a8ea (patch)
treefc7d0dafb116c00454365ea68fa417c97c34bc10
parent7e83d7fbdb6975f7b9e47284aacc833749853d62 (diff)
Add Onap Mock Emulator
Onap Mock Emulator is aimed to emulate SNIRO functionality for vCPE use case Change-Id: Idd6e1e4c955749c31f1891b0fc6e6b8236d931f0 JIRA-ID:INT-215 Signed-off-by: Geora Barsky <georab@amdocs.com>
-rw-r--r--test/mock/pom.xml142
-rw-r--r--test/mock/src/main/docker/Dockerfile19
-rw-r--r--test/mock/src/main/docker/docker-entrypoint.sh5
-rw-r--r--test/mock/src/main/java/org/onap/integration/test/mock/MockApplication.java122
-rw-r--r--test/mock/src/main/java/org/onap/integration/test/mock/extension/WebhookDefinition.java101
-rw-r--r--test/mock/src/main/java/org/onap/integration/test/mock/extension/Webhooks.java100
-rw-r--r--test/mock/src/main/resources/application.properties1
-rw-r--r--test/mock/src/test/java/org/onap/integration/test/mock/MockApplicationTests.java16
8 files changed, 506 insertions, 0 deletions
diff --git a/test/mock/pom.xml b/test/mock/pom.xml
new file mode 100644
index 000000000..56aad78f2
--- /dev/null
+++ b/test/mock/pom.xml
@@ -0,0 +1,142 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>org.onap.integration</groupId>
+ <artifactId>mock</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ <name>mock</name>
+ <description>onap emulator project based on Spring Boot</description>
+
+<parent>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-parent</artifactId>
+ <version>1.5.7.RELEASE</version>
+ <relativePath/> <!-- lookup parent from repository -->
+</parent>
+
+<properties>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+ <java.version>1.8</java.version>
+ <versions.jackson>2.8.9</versions.jackson>
+ <jetty.version>9.2.22.v20170606</jetty.version>
+</properties>
+
+<dependencies>
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-test</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.cloud</groupId>
+ <artifactId>spring-cloud-contract-wiremock</artifactId>
+ <version>1.1.3.RELEASE</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>net.sf.jopt-simple</groupId>
+ <artifactId>jopt-simple</artifactId>
+ <version>5.0.3</version>
+ </dependency>
+ <dependency>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-server</artifactId>
+ <version>9.2.22.v20170606</version>
+ </dependency>
+ <dependency>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-servlet</artifactId>
+ <version>9.2.22.v20170606</version>
+ </dependency>
+ <dependency>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-servlets</artifactId>
+ <version>9.2.22.v20170606</version>
+ </dependency>
+ <dependency>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-webapp</artifactId>
+ <version>9.2.22.v20170606</version>
+ </dependency>
+ <dependency>
+ <groupId>com.google.guava</groupId>
+ <artifactId>guava</artifactId>
+ <version>20.0</version>
+ </dependency>
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-core</artifactId>
+ <version>${versions.jackson}</version>
+ </dependency>
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-annotations</artifactId>
+ <version>${versions.jackson}</version>
+ </dependency>
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-databind</artifactId>
+ <version>${versions.jackson}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.httpcomponents</groupId>
+ <artifactId>httpclient</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.xmlunit</groupId>
+ <artifactId>xmlunit-core</artifactId>
+ <version>2.3.0</version>
+ </dependency>
+ <dependency>
+ <groupId>org.xmlunit</groupId>
+ <artifactId>xmlunit-legacy</artifactId>
+ <version>2.3.0</version>
+ </dependency>
+ <dependency>
+ <groupId>com.jayway.jsonpath</groupId>
+ <artifactId>json-path</artifactId>
+ <version>2.4.0</version>
+ </dependency>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
+ <version>1.7.12</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.commons</groupId>
+ <artifactId>commons-lang3</artifactId>
+ <version>3.6</version>
+ </dependency>
+ <dependency>
+ <groupId>com.flipkart.zjsonpatch</groupId>
+ <artifactId>zjsonpatch</artifactId>
+ <version>0.3.0</version>
+ </dependency>
+ <dependency>
+ <groupId>com.github.jknack</groupId>
+ <artifactId>handlebars</artifactId>
+ <version>4.0.6</version>
+ </dependency>
+</dependencies>
+
+<build>
+ <finalName>${project.artifactId}</finalName>
+ <plugins>
+ <plugin>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-maven-plugin</artifactId>
+ </plugin>
+ <plugin>
+ <artifactId>maven-dependency-plugin</artifactId>
+ </plugin>
+ </plugins>
+</build>
+</project>
diff --git a/test/mock/src/main/docker/Dockerfile b/test/mock/src/main/docker/Dockerfile
new file mode 100644
index 000000000..b1bf4d93c
--- /dev/null
+++ b/test/mock/src/main/docker/Dockerfile
@@ -0,0 +1,19 @@
+FROM openjdk:8-jre
+
+MAINTAINER Geora Barsky <georab@amdocs.com>
+
+RUN mkdir -p /var/wiremock/lib/
+
+ADD mock.jar /var/wiremock/lib/app.jar
+
+WORKDIR /home/wiremock
+
+COPY docker-entrypoint.sh /
+RUN chmod 700 /docker-entrypoint.sh
+
+VOLUME /home/wiremock
+EXPOSE 8080 8081 9999
+
+ENTRYPOINT ["/docker-entrypoint.sh"]
+
+CMD ["java", "-jar","/var/wiremock/lib/app.jar"] \ No newline at end of file
diff --git a/test/mock/src/main/docker/docker-entrypoint.sh b/test/mock/src/main/docker/docker-entrypoint.sh
new file mode 100644
index 000000000..47364a270
--- /dev/null
+++ b/test/mock/src/main/docker/docker-entrypoint.sh
@@ -0,0 +1,5 @@
+#!/bin/bash
+
+touch /app.jar
+
+java -Xms1024m -Xmx1024m -jar /var/wiremock/lib/app.jar \ No newline at end of file
diff --git a/test/mock/src/main/java/org/onap/integration/test/mock/MockApplication.java b/test/mock/src/main/java/org/onap/integration/test/mock/MockApplication.java
new file mode 100644
index 000000000..115cb252a
--- /dev/null
+++ b/test/mock/src/main/java/org/onap/integration/test/mock/MockApplication.java
@@ -0,0 +1,122 @@
+package org.onap.integration.test.mock;
+
+import static com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder.responseDefinition;
+import static com.github.tomakehurst.wiremock.client.WireMock.anyUrl;
+import static com.github.tomakehurst.wiremock.core.WireMockApp.FILES_ROOT;
+import static com.github.tomakehurst.wiremock.core.WireMockApp.MAPPINGS_ROOT;
+import static com.github.tomakehurst.wiremock.http.RequestMethod.ANY;
+import static com.github.tomakehurst.wiremock.matching.RequestPatternBuilder.newRequestPattern;
+import static java.lang.System.out;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+import com.github.tomakehurst.wiremock.WireMockServer;
+import com.github.tomakehurst.wiremock.common.ConsoleNotifier;
+import com.github.tomakehurst.wiremock.common.FatalStartupException;
+import com.github.tomakehurst.wiremock.common.FileSource;
+import com.github.tomakehurst.wiremock.core.WireMockConfiguration;
+import com.github.tomakehurst.wiremock.http.ResponseDefinition;
+import com.github.tomakehurst.wiremock.matching.RequestPattern;
+import com.github.tomakehurst.wiremock.standalone.MappingsLoader;
+import com.github.tomakehurst.wiremock.stubbing.StubMapping;
+import com.github.tomakehurst.wiremock.stubbing.StubMappings;
+
+@SpringBootApplication
+public class MockApplication {
+
+
+ private static final String BANNER= " \n" +
+" ******** **** **** ## \n" +
+" **######** ###* *### ## \n" +
+" *##******##* ##*** ***## ##\n" +
+" **#* *#** ##*#* *#*## ## \n" +
+" *#* *#* ##****** ******* ##****** ##*#* *#*## ******* ****** ## *** \n" +
+" *#* *#* ##*####* *######* ##*####** ##*#* *#*## **#####** **####** ## *#** \n" +
+" *#* *#* ##****#* *#****#* ##** **#* ## *** *** ## *#** **#* *#****#* ## **#** \n" +
+" *# #* ##* *#* #* ##* *#* ## *#* *#* ## *#* *#* *#* *#* ##**#** \n" +
+" *#* *#* ##* ## ****## ##* *#* ## *#* *#* ## *#* *#* *#* ##*##* \n" +
+" *#* *#* ## ## **###### ## #* ## *#* *#* ## *# #* *# ##**#** \n" +
+" *#* *#* ## ## *#****## ##* *#* ## *#*#* ## *#* *#* *#* ##**##* \n" +
+" **#* *#** ## ## *#* *## ##* *#* ## *#*#* ## *#* *#* *#* *#* ## *#** \n" +
+" *##******##* ## ## *#* **##* ##** **#* ## *#*#* ## *#** **#* *#****#* ## **#* \n" +
+" **######** ## ## *#######* ##*####* ## *###* ## **#####** **####** ## *#** \n" +
+" ******** ## ## *******#* ##****** ## *#* ## ******* ****** ## *#* \n" +
+" ## \n" +
+" ## \n" +
+" ## \n" +
+" ** \n" ;
+
+ static {
+ System.setProperty("org.mortbay.log.class", "com.github.tomakehurst.wiremock.jetty.LoggerAdapter");
+ }
+
+ private WireMockServer wireMockServer;
+
+ public static void main(String[] args) {
+ SpringApplication.run(MockApplication.class, args);
+ //new WireMockServerRunner().run("--port 9999");
+ new MockApplication().run(args);
+ }
+
+ public void run(String... args) {
+
+ WireMockConfiguration options = WireMockConfiguration.options();
+ options.port(9999);
+ FileSource fileSource = options.filesRoot();
+ fileSource.createIfNecessary();
+ FileSource filesFileSource = fileSource.child(FILES_ROOT);
+ filesFileSource.createIfNecessary();
+ FileSource mappingsFileSource = fileSource.child(MAPPINGS_ROOT);
+ mappingsFileSource.createIfNecessary();
+
+ // Register extension
+ options.extensions("org.onap.integration.test.mock.extension.Webhooks");
+ // Register notifier
+ options.notifier(new ConsoleNotifier(true));
+ wireMockServer = new WireMockServer(options);
+
+ wireMockServer.enableRecordMappings(mappingsFileSource, filesFileSource);
+
+ //if (options.specifiesProxyUrl()) {
+ // addProxyMapping(options.proxyUrl());
+ //}
+
+ try {
+ wireMockServer.start();
+ out.println(BANNER);
+ out.println();
+ out.println(options);
+ } catch (FatalStartupException e) {
+ System.err.println(e.getMessage());
+ System.exit(1);
+ }
+ }
+
+ private void addProxyMapping(final String baseUrl) {
+ wireMockServer.loadMappingsUsing(new MappingsLoader() {
+ @Override
+ public void loadMappingsInto(StubMappings stubMappings) {
+ RequestPattern requestPattern = newRequestPattern(ANY, anyUrl()).build();
+ ResponseDefinition responseDef = responseDefinition()
+ .proxiedFrom(baseUrl)
+ .build();
+
+ StubMapping proxyBasedMapping = new StubMapping(requestPattern, responseDef);
+ proxyBasedMapping.setPriority(10); // Make it low priority so that existing stubs will take precedence
+ stubMappings.addMapping(proxyBasedMapping);
+ }
+ });
+ }
+
+ public void stop() {
+ wireMockServer.stop();
+ }
+
+ public boolean isRunning() {
+ return wireMockServer.isRunning();
+ }
+
+ public int port() { return wireMockServer.port(); }
+
+}
diff --git a/test/mock/src/main/java/org/onap/integration/test/mock/extension/WebhookDefinition.java b/test/mock/src/main/java/org/onap/integration/test/mock/extension/WebhookDefinition.java
new file mode 100644
index 000000000..dff99fd41
--- /dev/null
+++ b/test/mock/src/main/java/org/onap/integration/test/mock/extension/WebhookDefinition.java
@@ -0,0 +1,101 @@
+package org.onap.integration.test.mock.extension;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.github.tomakehurst.wiremock.http.Body;
+import com.github.tomakehurst.wiremock.http.HttpHeader;
+import com.github.tomakehurst.wiremock.http.HttpHeaders;
+import com.github.tomakehurst.wiremock.http.RequestMethod;
+
+import java.net.URI;
+import java.util.List;
+
+import static com.google.common.collect.Lists.newArrayList;
+
+public class WebhookDefinition {
+
+ private RequestMethod method;
+ private URI url;
+ private List<HttpHeader> headers;
+ private Body body = Body.none();
+
+ @JsonCreator
+ public WebhookDefinition(@JsonProperty("method") RequestMethod method,
+ @JsonProperty("url") URI url,
+ @JsonProperty("headers") HttpHeaders headers,
+ @JsonProperty("body") String body,
+ @JsonProperty("base64Body") String base64Body) {
+ this.method = method;
+ this.url = url;
+ this.headers = newArrayList(headers.all());
+ this.body = Body.fromOneOf(null, body, null, base64Body);
+ }
+
+ public WebhookDefinition() {
+ }
+
+ public RequestMethod getMethod() {
+ return method;
+ }
+
+ public URI getUrl() {
+ return url;
+ }
+
+ public HttpHeaders getHeaders() {
+ return new HttpHeaders(headers);
+ }
+
+ public String getBase64Body() {
+ return body.isBinary() ? body.asBase64() : null;
+ }
+
+ public String getBody() {
+ return body.isBinary() ? null : body.asString();
+ }
+
+ @JsonIgnore
+ public byte[] getBinaryBody() {
+ return body.asBytes();
+ }
+
+ public WebhookDefinition withMethod(RequestMethod method) {
+ this.method = method;
+ return this;
+ }
+
+ public WebhookDefinition withUrl(URI url) {
+ this.url = url;
+ return this;
+ }
+
+ public WebhookDefinition withUrl(String url) {
+ withUrl(URI.create(url));
+ return this;
+ }
+
+ public WebhookDefinition withHeaders(List<HttpHeader> headers) {
+ this.headers = headers;
+ return this;
+ }
+
+ public WebhookDefinition withHeader(String key, String... values) {
+ if (headers == null) {
+ headers = newArrayList();
+ }
+
+ headers.add(new HttpHeader(key, values));
+ return this;
+ }
+
+ public WebhookDefinition withBody(String body) {
+ this.body = new Body(body);
+ return this;
+ }
+
+ public WebhookDefinition withBinaryBody(byte[] body) {
+ this.body = new Body(body);
+ return this;
+ }
+}
diff --git a/test/mock/src/main/java/org/onap/integration/test/mock/extension/Webhooks.java b/test/mock/src/main/java/org/onap/integration/test/mock/extension/Webhooks.java
new file mode 100644
index 000000000..cb17ba658
--- /dev/null
+++ b/test/mock/src/main/java/org/onap/integration/test/mock/extension/Webhooks.java
@@ -0,0 +1,100 @@
+package org.onap.integration.test.mock.extension;
+
+import com.github.tomakehurst.wiremock.common.Notifier;
+import com.github.tomakehurst.wiremock.core.Admin;
+import com.github.tomakehurst.wiremock.extension.Parameters;
+import com.github.tomakehurst.wiremock.extension.PostServeAction;
+import com.github.tomakehurst.wiremock.http.HttpClientFactory;
+import com.github.tomakehurst.wiremock.http.HttpHeader;
+import com.github.tomakehurst.wiremock.stubbing.ServeEvent;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
+import org.apache.http.client.methods.HttpUriRequest;
+import org.apache.http.entity.ByteArrayEntity;
+import org.apache.http.util.EntityUtils;
+
+import java.io.IOException;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+
+import static com.github.tomakehurst.wiremock.common.Exceptions.throwUnchecked;
+import static com.github.tomakehurst.wiremock.common.LocalNotifier.notifier;
+import static com.github.tomakehurst.wiremock.http.HttpClientFactory.getHttpRequestFor;
+import static java.util.concurrent.TimeUnit.SECONDS;
+
+public class Webhooks extends PostServeAction {
+
+ private final ScheduledExecutorService scheduler;
+ private final HttpClient httpClient;
+
+ public Webhooks() {
+ scheduler = Executors.newScheduledThreadPool(10);
+ httpClient = HttpClientFactory.createClient();
+ }
+
+ @Override
+ public String getName() {
+ return "webhook";
+ }
+
+ @Override
+ public void doAction(ServeEvent serveEvent, Admin admin, Parameters parameters) {
+ final WebhookDefinition definition = parameters.as(WebhookDefinition.class);
+ final Notifier notifier = notifier();
+
+ scheduler.schedule(
+ new Runnable() {
+ @Override
+ public void run() {
+ HttpUriRequest request = buildRequest(definition);
+
+ try {
+ HttpResponse response = httpClient.execute(request);
+ notifier.info(
+ String.format("Webhook %s request to %s returned status %s\n\n%s",
+ definition.getMethod(),
+ definition.getUrl(),
+ response.getStatusLine(),
+ EntityUtils.toString(response.getEntity())
+ )
+ );
+ System.out.println(String.format("Webhook %s request to %s returned status %s\n\n%s",
+ definition.getMethod(),
+ definition.getUrl(),
+ response.getStatusLine(),
+ EntityUtils.toString(response.getEntity())
+ )
+ );
+ } catch (IOException e) {
+ throwUnchecked(e);
+ }
+ }
+ },
+ 0L,
+ SECONDS
+ );
+ }
+
+ private static HttpUriRequest buildRequest(WebhookDefinition definition) {
+ HttpUriRequest request = getHttpRequestFor(
+ definition.getMethod(),
+ definition.getUrl().toString()
+ );
+
+ for (HttpHeader header: definition.getHeaders().all()) {
+ request.addHeader(header.key(), header.firstValue());
+ }
+
+ if (definition.getMethod().hasEntity()) {
+ HttpEntityEnclosingRequestBase entityRequest = (HttpEntityEnclosingRequestBase) request;
+ entityRequest.setEntity(new ByteArrayEntity(definition.getBinaryBody()));
+ }
+
+ return request;
+ }
+
+ public static WebhookDefinition webhook() {
+ return new WebhookDefinition();
+ }
+}
diff --git a/test/mock/src/main/resources/application.properties b/test/mock/src/main/resources/application.properties
new file mode 100644
index 000000000..51ad5ebf4
--- /dev/null
+++ b/test/mock/src/main/resources/application.properties
@@ -0,0 +1 @@
+server.port=9090
diff --git a/test/mock/src/test/java/org/onap/integration/test/mock/MockApplicationTests.java b/test/mock/src/test/java/org/onap/integration/test/mock/MockApplicationTests.java
new file mode 100644
index 000000000..8d2a04625
--- /dev/null
+++ b/test/mock/src/test/java/org/onap/integration/test/mock/MockApplicationTests.java
@@ -0,0 +1,16 @@
+package org.onap.integration.test.mock;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class MockApplicationTests {
+
+ @Test
+ public void contextLoads() {
+ }
+
+}