List of Input Parameters for VSP

Change-Id: Ie913ead731e120bd69349a4ebec13f4521eaac4d
Issue-ID: SDC-2049
Co-authored-by: jguistwite@iconectiv.com
Signed-off-by: Vodafone <onap@vodafone.com>
diff --git a/openecomp-be/api/openecomp-sdc-rest-webapp/externaltesting-rest/externaltesting-rest-services/pom.xml b/openecomp-be/api/openecomp-sdc-rest-webapp/externaltesting-rest/externaltesting-rest-services/pom.xml
new file mode 100644
index 0000000..9b9dfd0
--- /dev/null
+++ b/openecomp-be/api/openecomp-sdc-rest-webapp/externaltesting-rest/externaltesting-rest-services/pom.xml
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Copyright © 2019 iconectiv
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+
+<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>
+
+    <artifactId>externaltesting-rest-services</artifactId>
+    <parent>
+        <groupId>org.openecomp.sdc.onboarding</groupId>
+        <artifactId>externaltesting-rest</artifactId>
+        <version>1.4.0-SNAPSHOT</version>
+    </parent>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-core</artifactId>
+            <version>${spring.framework.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-context</artifactId>
+            <version>${spring.framework.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-context-support</artifactId>
+            <version>${spring.framework.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-web</artifactId>
+            <version>${spring.framework.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-beans</artifactId>
+            <version>${spring.framework.version}</version>
+        </dependency>
+
+        <!-- CXF -->
+        <dependency>
+            <groupId>org.apache.cxf</groupId>
+            <artifactId>cxf-rt-frontend-jaxrs</artifactId>
+            <version>${cxf.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+            <version>${http.client.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>javax.inject</groupId>
+            <artifactId>javax.inject</artifactId>
+            <version>${javax.inject.version}</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>javax.ws.rs</groupId>
+            <artifactId>javax.ws.rs-api</artifactId>
+            <version>${ws.rs.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.sun.jersey</groupId>
+            <artifactId>jersey-core</artifactId>
+            <version>${jersey.core.version}</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>javax.ws.rs</groupId>
+                    <artifactId>jsr311-api</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>io.swagger</groupId>
+            <artifactId>swagger-annotations</artifactId>
+            <version>${swagger.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-annotations</artifactId>
+            <version>${jackson.annotations.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.dataformat</groupId>
+            <artifactId>jackson-dataformat-xml</artifactId>
+            <version>${jackson.dataformat.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.codehaus.woodstox</groupId>
+            <artifactId>woodstox-core-asl</artifactId>
+            <version>${woodstox.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.openecomp.sdc</groupId>
+            <artifactId>openecomp-sdc-vendor-software-product-manager</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.sun.jersey.contribs</groupId>
+            <artifactId>jersey-multipart</artifactId>
+            <version>${jersey.multipart.version}</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+          <groupId>org.mockito</groupId>
+          <artifactId>mockito-core</artifactId>
+          <scope>test</scope>
+        </dependency>
+        <dependency>
+          <groupId>org.openecomp.sdc</groupId>
+          <artifactId>openecomp-sdc-externaltesting-impl</artifactId>
+          <version>${project.version}</version>
+        </dependency>
+    </dependencies>
+
+</project>
diff --git a/openecomp-be/api/openecomp-sdc-rest-webapp/externaltesting-rest/externaltesting-rest-services/src/main/java/org/openecomp/sdcrests/externaltesting/rest/ExternalTesting.java b/openecomp-be/api/openecomp-sdc-rest-webapp/externaltesting-rest/externaltesting-rest-services/src/main/java/org/openecomp/sdcrests/externaltesting/rest/ExternalTesting.java
new file mode 100644
index 0000000..14c45fb
--- /dev/null
+++ b/openecomp-be/api/openecomp-sdc-rest-webapp/externaltesting-rest/externaltesting-rest-services/src/main/java/org/openecomp/sdcrests/externaltesting/rest/ExternalTesting.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright © 2019 iconectiv
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.openecomp.sdcrests.externaltesting.rest;
+
+import io.swagger.annotations.Api;
+import org.openecomp.core.externaltesting.api.VtpTestExecutionRequest;
+import org.springframework.validation.annotation.Validated;
+
+import javax.ws.rs.*;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.util.List;
+
+
+@Path("/v1.0/externaltesting")
+@Produces(MediaType.APPLICATION_JSON)
+@Consumes(MediaType.APPLICATION_JSON)
+@Api(value = "External-Testing")
+@Validated
+
+public interface ExternalTesting {
+
+  @GET
+  @Path("/config")
+  Response getConfig();
+
+  @GET
+  @Path("/testcasetree")
+  Response getTestCasesAsTree();
+
+  @GET
+  @Path("/endpoints")
+  Response getEndpoints();
+
+  @GET
+  @Path("/endpoints/{endpointId}/scenarios")
+  Response getScenarios(@PathParam("endpointId") String endpointId);
+
+  @GET
+  @Path("/endpoints/{endpointId}/scenarios/{scenario}/testsuites")
+  Response getTestsuites(@PathParam("endpointId") String endpointId, @PathParam("scenario") String scenario);
+
+  @GET
+  @Path("/endpoints/{endpointId}/scenarios/{scenario}/testcases")
+  Response getTestcases(@PathParam("endpointId") String endpointId,
+                        @PathParam("scenario") String scenario);
+
+  @GET
+  @Path("/endpoints/{endpointId}/scenarios/{scenario}/testsuites/{testsuite}/testcases/{testcase}")
+  Response getTestcase(@PathParam("endpointId") String endpointId,
+                       @PathParam("scenario") String scenario,
+                       @PathParam("testsuite") String testsuite,
+                       @PathParam("testcase") String testcase);
+
+  @POST
+  @Path("/endpoints/{endpointId}/executions/{executionId}")
+  Response getExecution(@PathParam("endpointId") String endpointId,
+                        @PathParam("executionId") String executionId);
+
+
+  @POST
+  @Path("/executions")
+  Response execute(List<VtpTestExecutionRequest> req,
+                   @QueryParam("requestId") String requestId);
+
+}
diff --git a/openecomp-be/api/openecomp-sdc-rest-webapp/externaltesting-rest/externaltesting-rest-services/src/main/java/org/openecomp/sdcrests/externaltesting/rest/services/ExternalTestingImpl.java b/openecomp-be/api/openecomp-sdc-rest-webapp/externaltesting-rest/externaltesting-rest-services/src/main/java/org/openecomp/sdcrests/externaltesting/rest/services/ExternalTestingImpl.java
new file mode 100644
index 0000000..206eb49
--- /dev/null
+++ b/openecomp-be/api/openecomp-sdc-rest-webapp/externaltesting-rest/externaltesting-rest-services/src/main/java/org/openecomp/sdcrests/externaltesting/rest/services/ExternalTestingImpl.java
@@ -0,0 +1,164 @@
+/*
+ * Copyright © 2019 iconectiv
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.openecomp.sdcrests.externaltesting.rest.services;
+
+
+import org.openecomp.core.externaltesting.api.*;
+import org.openecomp.core.externaltesting.errors.ExternalTestingException;
+import org.openecomp.sdc.logging.api.Logger;
+import org.openecomp.sdc.logging.api.LoggerFactory;
+import org.openecomp.sdcrests.externaltesting.rest.ExternalTesting;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Service;
+
+import javax.inject.Named;
+import javax.ws.rs.core.Response;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+@SuppressWarnings("unused")
+@Named
+@Service("externaltesting")
+@Scope(value = "prototype")
+public class ExternalTestingImpl implements ExternalTesting {
+
+  private ExternalTestingManager testingManager;
+
+  private static final Logger logger =
+      LoggerFactory.getLogger(ExternalTestingImpl.class);
+
+  public ExternalTestingImpl(@Autowired ExternalTestingManager testingManager) {
+    this.testingManager = testingManager;
+  }
+
+  /**
+   * Return the configuration of the feature to the client.
+   * @return JSON response content.
+   */
+  @Override
+  public Response getConfig() {
+    try {
+      return Response.ok(testingManager.getConfig()).build();
+    }
+    catch (ExternalTestingException e) {
+      return convertTestingException(e);
+    }
+  }
+
+  /**
+   * Return the test tree structure created by the testing manager.
+   * @return JSON response content.
+   */
+  @Override
+  public Response getTestCasesAsTree() {
+    try {
+      return Response.ok(testingManager.getTestCasesAsTree()).build();
+    }
+    catch (ExternalTestingException e) {
+      return convertTestingException(e);
+    }
+  }
+
+  @Override
+  public Response getEndpoints() {
+    try {
+      return Response.ok(testingManager.getEndpoints()).build();
+    }
+    catch (ExternalTestingException e) {
+      return convertTestingException(e);
+    }
+
+  }
+  @Override
+  public Response getScenarios(String endpoint) {
+    try {
+      return Response.ok(testingManager.getScenarios(endpoint)).build();
+    }
+    catch (ExternalTestingException e) {
+      return convertTestingException(e);
+    }
+
+  }
+
+  @Override
+  public Response getTestsuites(String endpoint, String scenario) {
+    try {
+      return Response.ok(testingManager.getTestSuites(endpoint, scenario)).build();
+    }
+    catch (ExternalTestingException e) {
+      return convertTestingException(e);
+    }
+  }
+
+  @Override
+  public Response getTestcases(String endpoint, String scenario) {
+    try {
+      return Response.ok(testingManager.getTestCases(endpoint, scenario)).build();
+    }
+    catch (ExternalTestingException e) {
+      return convertTestingException(e);
+    }
+  }
+
+  @Override
+  public Response getTestcase(String endpoint, String scenario, String testsuite, String testcase) {
+    try {
+      return Response.ok(testingManager.getTestCase(endpoint, scenario, testsuite, testcase)).build();
+    }
+    catch (ExternalTestingException e) {
+      return convertTestingException(e);
+    }
+  }
+
+  @Override
+  public Response execute(List<VtpTestExecutionRequest> req, String requestId) {
+    try {
+      List<VtpTestExecutionResponse> responses = testingManager.execute(req, requestId);
+      List<Integer> statuses = responses.stream().map(r-> Optional.ofNullable(r.getHttpStatus()).orElse(200)).distinct().collect(Collectors.toList());
+      if (statuses.size() == 1) {
+        // 1 status so use it...
+        return Response.status(statuses.get(0)).entity(responses).build();
+      }
+      else {
+        return Response.status(207).entity(responses).build();
+      }
+    }
+    catch (ExternalTestingException e) {
+      return convertTestingException(e);
+    }
+  }
+
+  @Override
+  public Response getExecution(String endpoint, String executionId) {
+    try {
+      return Response.ok(testingManager.getExecution(endpoint, executionId)).build();
+    }
+    catch (ExternalTestingException e) {
+      return convertTestingException(e);
+    }
+  }
+
+  private Response convertTestingException(ExternalTestingException e) {
+    if (logger.isErrorEnabled()) {
+      logger.error("testing exception {} {} {}", e.getTitle(), e.getCode(), e.getDetail(), e);
+    }
+    TestErrorBody body = new TestErrorBody(e.getTitle(), e.getCode(), e.getDetail());
+    return Response.status(e.getCode()).entity(body).build();
+  }
+}
diff --git a/openecomp-be/api/openecomp-sdc-rest-webapp/externaltesting-rest/externaltesting-rest-services/src/test/java/org/openecomp/sdcrests/externaltesting/rest/services/ApiTests.java b/openecomp-be/api/openecomp-sdc-rest-webapp/externaltesting-rest/externaltesting-rest-services/src/test/java/org/openecomp/sdcrests/externaltesting/rest/services/ApiTests.java
new file mode 100644
index 0000000..d9da7e9
--- /dev/null
+++ b/openecomp-be/api/openecomp-sdc-rest-webapp/externaltesting-rest/externaltesting-rest-services/src/test/java/org/openecomp/sdcrests/externaltesting/rest/services/ApiTests.java
@@ -0,0 +1,197 @@
+/*
+ * Copyright © 2019 iconectiv
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.openecomp.sdcrests.externaltesting.rest.services;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.core.externaltesting.api.*;
+import org.openecomp.core.externaltesting.errors.ExternalTestingException;
+
+import java.util.Arrays;
+import java.util.List;
+
+public class ApiTests {
+
+  private static final String EP = "ep";
+  private static final String EXEC = "exec";
+  private static final String SC = "sc";
+  private static final String TS = "ts";
+  private static final String TC = "tc";
+  private static final String EXPECTED = "Expected";
+
+
+  @Mock
+  private ExternalTestingManager testingManager;
+
+  /**
+   * At the API level, test that the code does not throw
+   * exceptions but there's not much to test.
+   */
+  @Test
+  public void testApi() {
+    MockitoAnnotations.initMocks(this);
+
+    ExternalTestingImpl testing = new ExternalTestingImpl(testingManager);
+    Assert.assertNotNull(testing.getConfig());
+    Assert.assertNotNull(testing.getEndpoints());
+    Assert.assertNotNull(testing.getExecution(EP, EXEC));
+    Assert.assertNotNull(testing.getScenarios(EP));
+    Assert.assertNotNull(testing.getTestcase(EP, SC, TS, TC));
+    Assert.assertNotNull(testing.getTestcases(EP, SC));
+    Assert.assertNotNull(testing.getTestsuites(EP, SC));
+    Assert.assertNotNull(testing.getTestCasesAsTree());
+
+    List<VtpTestExecutionRequest> requests =
+            Arrays.asList(new VtpTestExecutionRequest(), new VtpTestExecutionRequest());
+    Assert.assertNotNull(testing.execute(requests, "requestId"));
+  }
+
+  class ApiTestExternalTestingManager implements ExternalTestingManager {
+    @Override
+    public String getConfig() {
+      throw new ExternalTestingException(EXPECTED, 500, EXPECTED);
+    }
+
+    @Override
+    public TestTreeNode getTestCasesAsTree() {
+      throw new ExternalTestingException(EXPECTED, 500, EXPECTED);
+    }
+
+    @Override
+    public List<VtpNameDescriptionPair> getEndpoints() {
+      throw new ExternalTestingException(EXPECTED, 500, EXPECTED);
+    }
+
+    @Override
+    public List<VtpNameDescriptionPair> getScenarios(String endpoint) {
+      throw new ExternalTestingException(EXPECTED, 500, EXPECTED);
+    }
+
+    @Override
+    public List<VtpNameDescriptionPair> getTestSuites(String endpoint, String scenario) {
+      throw new ExternalTestingException(EXPECTED, 500, EXPECTED);
+    }
+
+    @Override
+    public List<VtpTestCase> getTestCases(String endpoint, String scenario) {
+      throw new ExternalTestingException(EXPECTED, 500, EXPECTED);
+    }
+
+    @Override
+    public VtpTestCase getTestCase(String endpoint, String scenario, String testSuite, String testCaseName) {
+      throw new ExternalTestingException(EXPECTED, 500, EXPECTED);
+    }
+
+    @Override
+    public List<VtpTestExecutionResponse> execute(List<VtpTestExecutionRequest> requests, String requestId) {
+      throw new ExternalTestingException(EXPECTED, 500, EXPECTED);
+    }
+
+    @Override
+    public VtpTestExecutionResponse getExecution(String endpoint, String executionId) {
+      throw new ExternalTestingException(EXPECTED, 500, EXPECTED);
+    }
+  }
+
+  /**
+   * Test the exception handler logic for the cases when the
+   * testing manager throws an exception.
+   */
+  @Test
+  public void testExceptions() {
+    MockitoAnnotations.initMocks(this);
+
+    ExternalTestingManager m = new ApiTestExternalTestingManager();
+    ExternalTestingImpl testingF = new ExternalTestingImpl(m);
+
+    try {
+      testingF.getConfig();
+    }
+    catch (Exception ex) {
+      // expected.
+    }
+
+
+    try {
+      testingF.getEndpoints();
+    }
+    catch (ExternalTestingException e) {
+      // expected.
+    }
+
+    try {
+      testingF.getExecution(EP, EXEC);
+    }
+    catch (ExternalTestingException e) {
+      // expected.
+    }
+    try {
+      testingF.getScenarios(EP);
+    }
+    catch (ExternalTestingException e) {
+      // expected.
+    }
+
+    try {
+      testingF.getTestcase(EP, SC, TS, TC);
+    }
+    catch (ExternalTestingException e) {
+      // expected.
+    }
+
+    try {
+      testingF.getTestcases(EP, SC);
+    }
+    catch (ExternalTestingException e) {
+      // expected.
+    }
+
+    try {
+      testingF.getTestsuites(EP, SC);
+    }
+    catch (ExternalTestingException e) {
+      // expected.
+    }
+
+    try {
+      testingF.getTestCasesAsTree();
+    }
+    catch (ExternalTestingException e) {
+      // expected.
+    }
+
+    List<VtpTestExecutionRequest> requestsF =
+            Arrays.asList(new VtpTestExecutionRequest(), new VtpTestExecutionRequest());
+
+    try {
+      testingF.execute(requestsF, null);
+    }
+    catch (ExternalTestingException e) {
+      // expected.
+    }
+
+
+    try {
+      testingF.execute(requestsF, null);
+    }
+    catch (ExternalTestingException e) {
+      // expected.
+    }
+  }
+}
diff --git a/openecomp-be/api/openecomp-sdc-rest-webapp/externaltesting-rest/externaltesting-rest-services/src/test/resources/logback-test.xml b/openecomp-be/api/openecomp-sdc-rest-webapp/externaltesting-rest/externaltesting-rest-services/src/test/resources/logback-test.xml
new file mode 100644
index 0000000..e049897
--- /dev/null
+++ b/openecomp-be/api/openecomp-sdc-rest-webapp/externaltesting-rest/externaltesting-rest-services/src/test/resources/logback-test.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Copyright © 2019 iconectiv
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+
+<configuration>
+
+  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+    <encoder>
+      <Pattern>%d{dd-MMM-yyyy HH:mm:ss:SSS} %-5level %logger{36}.%M\(%line\) - %msg%n</Pattern>
+    </encoder>
+  </appender>
+
+  <root level="DEBUG">
+    <appender-ref ref="STDOUT" />
+  </root>
+
+</configuration>
diff --git a/openecomp-be/api/openecomp-sdc-rest-webapp/externaltesting-rest/pom.xml b/openecomp-be/api/openecomp-sdc-rest-webapp/externaltesting-rest/pom.xml
new file mode 100644
index 0000000..7a5953b
--- /dev/null
+++ b/openecomp-be/api/openecomp-sdc-rest-webapp/externaltesting-rest/pom.xml
@@ -0,0 +1,20 @@
+<?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.openecomp.sdc.onboarding</groupId>
+    <artifactId>externaltesting-rest</artifactId>
+    <name>external-testing-rest</name>
+    <packaging>pom</packaging>
+
+    <parent>
+        <groupId>org.openecomp.sdc</groupId>
+        <artifactId>openecomp-sdc-rest-webapp</artifactId>
+        <version>1.4.0-SNAPSHOT</version>
+    </parent>
+
+    <modules>
+        <module>/externaltesting-rest-services</module>
+    </modules>
+</project>