Add Onap Mock Emulator 47/13647/1
authorGeora Barsky <georab@amdocs.com>
Tue, 19 Sep 2017 21:08:12 +0000 (17:08 -0400)
committerGeora Barsky <georab@amdocs.com>
Wed, 20 Sep 2017 03:41:20 +0000 (23:41 -0400)
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>
test/mock/pom.xml [new file with mode: 0644]
test/mock/src/main/docker/Dockerfile [new file with mode: 0644]
test/mock/src/main/docker/docker-entrypoint.sh [new file with mode: 0644]
test/mock/src/main/java/org/onap/integration/test/mock/MockApplication.java [new file with mode: 0644]
test/mock/src/main/java/org/onap/integration/test/mock/extension/WebhookDefinition.java [new file with mode: 0644]
test/mock/src/main/java/org/onap/integration/test/mock/extension/Webhooks.java [new file with mode: 0644]
test/mock/src/main/resources/application.properties [new file with mode: 0644]
test/mock/src/test/java/org/onap/integration/test/mock/MockApplicationTests.java [new file with mode: 0644]

diff --git a/test/mock/pom.xml b/test/mock/pom.xml
new file mode 100644 (file)
index 0000000..56aad78
--- /dev/null
@@ -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 (file)
index 0000000..b1bf4d9
--- /dev/null
@@ -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 (file)
index 0000000..47364a2
--- /dev/null
@@ -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 (file)
index 0000000..115cb25
--- /dev/null
@@ -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 (file)
index 0000000..dff99fd
--- /dev/null
@@ -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 (file)
index 0000000..cb17ba6
--- /dev/null
@@ -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 (file)
index 0000000..51ad5eb
--- /dev/null
@@ -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 (file)
index 0000000..8d2a046
--- /dev/null
@@ -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() {
+       }
+
+}