Introduced a dmi rest demo csit stub 72/135372/8
authorsourabh_sourabh <sourabh.sourabh@est.tech>
Tue, 4 Jul 2023 23:56:05 +0000 (00:56 +0100)
committersourabh_sourabh <sourabh.sourabh@est.tech>
Thu, 13 Jul 2023 14:32:12 +0000 (15:32 +0100)
- Introduced a new response code 0 for data operational success response.
- Created a new dmi plugin rest stub for demo and performance testing.
- Removed dmi plugin stub of wiremocked.
- Updated parent pom to add newely created demo stub.
- updated docker compose to add neww demo stub with profile for CSIT,
  demo and performance testing.
- Removed target id list from unsupported operation/datastore from REST
  response.

Issue-ID: CPS-1560

Signed-off-by: sourabh_sourabh <sourabh.sourabh@est.tech>
Change-Id: Ie8198366df820e7d4b8b6e8a85ff9cdb0fce7435
Signed-off-by: sourabh_sourabh <sourabh.sourabh@est.tech>
23 files changed:
cps-ncmp-rest-stub/cps-ncmp-rest-stub-service/src/test/groovy/org/onap/cps/ncmp/rest/stub/providers/ResourceProviderSpec.groovy
cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/controller/handlers/NcmpDatastoreRequestHandler.java
cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/NcmpEventResponseCode.java
csit/plans/cps/test.properties
dmi-plugin-demo-and-csit-stub/dmi-plugin-demo-and-csit-stub-app/pom.xml [new file with mode: 0644]
dmi-plugin-demo-and-csit-stub/dmi-plugin-demo-and-csit-stub-app/src/main/java/org/onap/cps/ncmp/dmi/rest/stub/DmiDemoApplication.java [new file with mode: 0644]
dmi-plugin-demo-and-csit-stub/dmi-plugin-demo-and-csit-stub-service/pom.xml [new file with mode: 0644]
dmi-plugin-demo-and-csit-stub/dmi-plugin-demo-and-csit-stub-service/src/main/java/org/onap/cps/ncmp/dmi/rest/stub/controller/DmiRestStubController.java [new file with mode: 0644]
dmi-plugin-demo-and-csit-stub/dmi-plugin-demo-and-csit-stub-service/src/main/java/org/onap/cps/ncmp/dmi/rest/stub/model/data/operational/CmHandle.java [new file with mode: 0644]
dmi-plugin-demo-and-csit-stub/dmi-plugin-demo-and-csit-stub-service/src/main/java/org/onap/cps/ncmp/dmi/rest/stub/model/data/operational/DataOperationRequest.java [new file with mode: 0644]
dmi-plugin-demo-and-csit-stub/dmi-plugin-demo-and-csit-stub-service/src/main/java/org/onap/cps/ncmp/dmi/rest/stub/model/data/operational/ResourceDataOperationRequests.java [new file with mode: 0644]
dmi-plugin-demo-and-csit-stub/dmi-plugin-demo-and-csit-stub-service/src/main/java/org/onap/cps/ncmp/dmi/rest/stub/utils/ResourceFileReaderUtil.java [new file with mode: 0644]
dmi-plugin-demo-and-csit-stub/dmi-plugin-demo-and-csit-stub-service/src/main/resources/application.yml [new file with mode: 0644]
dmi-plugin-demo-and-csit-stub/dmi-plugin-demo-and-csit-stub-service/src/main/resources/data/operational/ietf-network-topology-sample-rfc8345.json [new file with mode: 0644]
dmi-plugin-demo-and-csit-stub/dmi-plugin-demo-and-csit-stub-service/src/main/resources/module/moduleResourcesResponse.json [moved from dmi-plugin-stub/files/moduleResourcesResponse.json with 100% similarity]
dmi-plugin-demo-and-csit-stub/dmi-plugin-demo-and-csit-stub-service/src/main/resources/module/moduleResponse.json [moved from dmi-plugin-stub/files/moduleResponse.json with 100% similarity]
dmi-plugin-demo-and-csit-stub/pom.xml [new file with mode: 0644]
dmi-plugin-stub/mappings/dataOperationRequest.json [deleted file]
dmi-plugin-stub/mappings/module.json [deleted file]
dmi-plugin-stub/mappings/moduleResources.json [deleted file]
dmi-plugin-stub/start.sh [deleted file]
docker-compose/docker-compose.yml
pom.xml

index 7bfe5c3..948d8a1 100644 (file)
@@ -21,7 +21,6 @@
 package org.onap.cps.ncmp.rest.stub.providers
 
 import java.nio.file.Files
-import java.nio.file.Path
 import org.springframework.util.FileSystemUtils
 import spock.lang.Shared
 import spock.lang.Specification
@@ -46,7 +45,7 @@ class ResourceProviderSpec extends Specification {
 
     def 'Resource Provider with existing file on #scenario'() {
 
-        given: 'a resource provider with base stub folder defined on #scenario' 
+        given: 'a resource provider with base stub folder defined on #scenario'
             def resourceProvider = new ResourceProviderImpl(dir)
         when: 'attempting to access that file #filename'
             def optional= resourceProvider.getResourceInputStream(filename)
index 101be45..d7aeab6 100644 (file)
@@ -167,12 +167,10 @@ public class NcmpDatastoreRequestHandler implements TaskManagementDefaultHandler
         dataOperationRequest.getDataOperationDefinitions().forEach(dataOperationDetail -> {
             if (OperationType.fromOperationName(dataOperationDetail.getOperation()) != READ) {
                 throw new OperationNotSupportedException(
-                        dataOperationDetail.getOperation() + " operation not yet supported for target ids :"
-                                + dataOperationDetail.getCmHandleIds());
+                        dataOperationDetail.getOperation() + " operation not yet supported");
             } else if (DatastoreType.fromDatastoreName(dataOperationDetail.getDatastore()) == OPERATIONAL) {
                 throw new InvalidDatastoreException(dataOperationDetail.getDatastore()
-                        + " datastore is not supported for target ids : "
-                        + dataOperationDetail.getCmHandleIds());
+                        + " datastore is not supported");
             }
         });
     }
index 42d8135..d250c36 100644 (file)
@@ -25,6 +25,7 @@ import lombok.Getter;
 @Getter
 public enum NcmpEventResponseCode {
 
+    SUCCESS("0", "Successfully applied changes"),
     CM_HANDLES_NOT_FOUND("100", "cm handle id(s) not found"),
     CM_HANDLES_NOT_READY("101", "cm handle(s) not ready"),
     DMI_SERVICE_NOT_RESPONDING("102", "dmi plugin service is not responding"),
index 14d6f77..474a718 100644 (file)
@@ -29,3 +29,6 @@ ADVISED_MODULES_SYNC_SLEEP_TIME_MS=2000
 CMHANDLE_DATA_SYNC_SLEEP_TIME_MS=2000
 
 CPS_HOME=$CPS_HOME
+
+DMI_DEMO_STUB_PORT=8784
+DMI_DEMO_STUB_VERSION=latest
diff --git a/dmi-plugin-demo-and-csit-stub/dmi-plugin-demo-and-csit-stub-app/pom.xml b/dmi-plugin-demo-and-csit-stub/dmi-plugin-demo-and-csit-stub-app/pom.xml
new file mode 100644 (file)
index 0000000..71dcec8
--- /dev/null
@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ============LICENSE_START=======================================================
+  Copyright (C) 2023 Nordix Foundation
+  ================================================================================
+  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.
+  SPDX-License-Identifier: Apache-2.0
+  ============LICENSE_END=========================================================
+-->
+
+<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.onap.cps</groupId>
+        <artifactId>dmi-plugin-demo-and-csit-stub</artifactId>
+        <version>3.3.4-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>dmi-plugin-demo-and-csit-stub-app</artifactId>
+
+    <properties>
+        <app>org.onap.cps.ncmp.dmi.rest.stub.DmiDemoApplication</app>
+        <maven.build.timestamp.format>yyyyMMdd'T'HHmmss'Z'</maven.build.timestamp.format>
+        <base.image>${docker.pull.registry}/onap/integration-java11:8.0.0</base.image>
+        <image.tag>${project.version}-${maven.build.timestamp}</image.tag>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <build>
+        <pluginManagement>
+            <plugins>
+                <plugin>
+                    <groupId>com.google.cloud.tools</groupId>
+                    <artifactId>jib-maven-plugin</artifactId>
+                    <configuration>
+                        <container>
+                            <mainClass>${app}</mainClass>
+                            <creationTime>USE_CURRENT_TIMESTAMP</creationTime>
+                        </container>
+                        <from>
+                            <image>${base.image}</image>
+                        </from>
+                        <to>
+                            <tags>
+                                <tag>latest</tag>
+                            </tags>
+                            <image>${docker.push.registry}/onap/${image.name}:${image.tag}</image>
+                        </to>
+                    </configuration>
+                    <executions>
+                        <execution>
+                            <phase>package</phase>
+                            <id>build</id>
+                            <goals>
+                                <goal>dockerBuild</goal>
+                            </goals>
+                        </execution>
+                        <execution>
+                            <phase>deploy</phase>
+                            <id>buildAndPush</id>
+                            <goals>
+                                <goal>build</goal>
+                            </goals>
+                        </execution>
+                    </executions>
+                </plugin>
+            </plugins>
+        </pluginManagement>
+    </build>
+
+    <profiles>
+        <profile>
+            <id>docker</id>
+            <activation>
+                <activeByDefault>true</activeByDefault>
+            </activation>
+            <properties>
+                <image.name>dmi-plugin-demo-and-csit-stub</image.name>
+            </properties>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>com.google.cloud.tools</groupId>
+                        <artifactId>jib-maven-plugin</artifactId>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
+    <dependencies>
+        <dependency>
+            <groupId>org.onap.cps</groupId>
+            <artifactId>dmi-plugin-demo-and-csit-stub-service</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+    </dependencies>
+</project>
\ No newline at end of file
diff --git a/dmi-plugin-demo-and-csit-stub/dmi-plugin-demo-and-csit-stub-app/src/main/java/org/onap/cps/ncmp/dmi/rest/stub/DmiDemoApplication.java b/dmi-plugin-demo-and-csit-stub/dmi-plugin-demo-and-csit-stub-app/src/main/java/org/onap/cps/ncmp/dmi/rest/stub/DmiDemoApplication.java
new file mode 100644 (file)
index 0000000..2d4a2d8
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2023 Nordix Foundation
+ *  ================================================================================
+ *  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.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+
+package org.onap.cps.ncmp.dmi.rest.stub;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class DmiDemoApplication {
+
+    public static void main(final String[] args) {
+        SpringApplication.run(DmiDemoApplication.class, args);
+    }
+}
diff --git a/dmi-plugin-demo-and-csit-stub/dmi-plugin-demo-and-csit-stub-service/pom.xml b/dmi-plugin-demo-and-csit-stub/dmi-plugin-demo-and-csit-stub-service/pom.xml
new file mode 100644 (file)
index 0000000..a9e3827
--- /dev/null
@@ -0,0 +1,51 @@
+<!--
+  ============LICENSE_START=======================================================
+  Copyright (C) 2023 Nordix Foundation
+  ================================================================================
+  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.
+  SPDX-License-Identifier: Apache-2.0
+  ============LICENSE_END=========================================================
+-->
+
+<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.onap.cps</groupId>
+        <artifactId>dmi-plugin-demo-and-csit-stub</artifactId>
+        <version>3.3.4-SNAPSHOT</version>
+    </parent>
+    <artifactId>dmi-plugin-demo-and-csit-stub-service</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.springframework.boot</groupId>
+                    <artifactId>spring-boot-starter-tomcat</artifactId>
+                </exclusion>
+            </exclusions>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.googlecode.json-simple</groupId>
+            <artifactId>json-simple</artifactId>
+            <version>1.1.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.onap.cps</groupId>
+            <artifactId>cps-ncmp-rest</artifactId>
+        </dependency>
+    </dependencies>
+</project>
\ No newline at end of file
diff --git a/dmi-plugin-demo-and-csit-stub/dmi-plugin-demo-and-csit-stub-service/src/main/java/org/onap/cps/ncmp/dmi/rest/stub/controller/DmiRestStubController.java b/dmi-plugin-demo-and-csit-stub/dmi-plugin-demo-and-csit-stub-service/src/main/java/org/onap/cps/ncmp/dmi/rest/stub/controller/DmiRestStubController.java
new file mode 100644 (file)
index 0000000..b7e67d7
--- /dev/null
@@ -0,0 +1,180 @@
+/*
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2023 Nordix Foundation
+ *  ================================================================================
+ *  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.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+
+package org.onap.cps.ncmp.dmi.rest.stub.controller;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.cloudevents.CloudEvent;
+import io.cloudevents.core.builder.CloudEventBuilder;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+import java.util.stream.Collectors;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.json.simple.parser.JSONParser;
+import org.json.simple.parser.ParseException;
+import org.onap.cps.ncmp.api.NcmpEventResponseCode;
+import org.onap.cps.ncmp.api.impl.utils.EventDateTimeFormatter;
+import org.onap.cps.ncmp.dmi.rest.stub.model.data.operational.CmHandle;
+import org.onap.cps.ncmp.dmi.rest.stub.model.data.operational.DataOperationRequest;
+import org.onap.cps.ncmp.dmi.rest.stub.model.data.operational.ResourceDataOperationRequests;
+import org.onap.cps.ncmp.dmi.rest.stub.utils.ResourceFileReaderUtil;
+import org.onap.cps.ncmp.events.async1_0_0.Data;
+import org.onap.cps.ncmp.events.async1_0_0.DataOperationEvent;
+import org.onap.cps.ncmp.events.async1_0_0.Response;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.ApplicationContext;
+import org.springframework.core.io.ResourceLoader;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.kafka.core.KafkaTemplate;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("${rest.api.dmi-stub-base-path}")
+@RequiredArgsConstructor
+@Slf4j
+public class DmiRestStubController {
+
+    private final KafkaTemplate<String, CloudEvent> cloudEventKafkaTemplate;
+    private final ObjectMapper objectMapper;
+    private final ApplicationContext applicationContext;
+
+    @Value("${app.ncmp.async-m2m.topic}")
+    private String ncmpAsyncM2mTopic;
+
+    private String dataOperationEventType = "org.onap.cps.ncmp.events.async1_0_0.DataOperationEvent";
+
+    /**
+     * Get all modules for given cm handle.
+     *
+     * @param cmHandle                The identifier for a network function, network element, subnetwork,
+     *                                or any other cm object by managed Network CM Proxy
+     * @param moduleReferencesRequest module references request body
+     * @return ResponseEntity response entity having module response as json string.
+     */
+    @PostMapping("/v1/ch/{cmHandle}/modules")
+    public ResponseEntity<String> getModuleReferences(@PathVariable final String cmHandle,
+                                                      @RequestBody final Object moduleReferencesRequest) {
+        final String moduleResponseContent = ResourceFileReaderUtil
+                .getResourceFileContent(applicationContext.getResource(
+                        ResourceLoader.CLASSPATH_URL_PREFIX + "module/moduleResponse.json"));
+        return ResponseEntity.ok(moduleResponseContent);
+    }
+
+    /**
+     * Get all module resources for given cm handle.
+     *
+     * @param cmHandle                   The identifier for a network function, network element, subnetwork,
+     *                                   or any other cm object by managed Network CM Proxy
+     * @param moduleResourcesReadRequest module resources read request body
+     * @return ResponseEntity response entity having module resources response as json string.
+     */
+    @PostMapping("/v1/ch/{cmHandle}/moduleResources")
+    public ResponseEntity<String> retrieveModuleResources(
+            @PathVariable final String cmHandle,
+            @RequestBody final Object moduleResourcesReadRequest) {
+        final String moduleResourcesResponseContent = ResourceFileReaderUtil
+                .getResourceFileContent(applicationContext.getResource(
+                        ResourceLoader.CLASSPATH_URL_PREFIX + "module/moduleResourcesResponse.json"));
+        return ResponseEntity.ok(moduleResourcesResponseContent);
+    }
+
+    /**
+     * This method is not implemented for ONAP DMI plugin.
+     *
+     * @param topic                         client given topic name
+     * @param requestId                     requestId generated by NCMP as an ack for client
+     * @param resourceDataOperationRequests list of operation details
+     * @return (@ code ResponseEntity) response entity
+     */
+    @PostMapping("/v1/data")
+    public ResponseEntity<Void> getResourceDataForCmHandleDataOperation(@RequestParam(value = "topic")
+                                                                            final String topic,
+                                                                        @RequestParam(value = "requestId")
+                                                                        final String requestId,
+                                                                        @RequestBody final ResourceDataOperationRequests
+                                                                                resourceDataOperationRequests) {
+        log.info("Request received from the NCMP to DMI Plugin");
+        resourceDataOperationRequests.forEach(resourceDataOperationRequest -> {
+            final DataOperationEvent dataOperationEvent = getDataOperationEvent(resourceDataOperationRequest);
+            resourceDataOperationRequest.getCmHandles().forEach(cmHandle -> {
+                dataOperationEvent.getData().getResponses().get(0).setIds(List.of(cmHandle.getId()));
+                final CloudEvent cloudEvent = buildAndGetCloudEvent(topic, requestId, dataOperationEvent);
+                cloudEventKafkaTemplate.send(ncmpAsyncM2mTopic, UUID.randomUUID().toString(), cloudEvent);
+            });
+        });
+        return new ResponseEntity<>(HttpStatus.ACCEPTED);
+    }
+
+    private CloudEvent buildAndGetCloudEvent(final String topic, final String requestId,
+                                             final DataOperationEvent dataOperationEvent) {
+        CloudEvent cloudEvent = null;
+        try {
+            cloudEvent = CloudEventBuilder.v1()
+                    .withId(UUID.randomUUID().toString())
+                    .withSource(URI.create("DMI"))
+                    .withType(dataOperationEventType)
+                    .withDataSchema(URI.create("urn:cps:" + dataOperationEventType + ":1.0.0"))
+                    .withTime(EventDateTimeFormatter.toIsoOffsetDateTime(
+                            EventDateTimeFormatter.getCurrentIsoFormattedDateTime()))
+                    .withData(objectMapper.writeValueAsBytes(dataOperationEvent))
+                    .withExtension("destination", topic)
+                    .withExtension("correlationid", requestId)
+                    .build();
+        } catch (final JsonProcessingException jsonProcessingException) {
+            log.error("Unable to parse event into bytes. cause : {}", jsonProcessingException.getMessage());
+        }
+        return cloudEvent;
+    }
+
+    private DataOperationEvent getDataOperationEvent(final DataOperationRequest dataOperationRequest) {
+        final Response response = new Response();
+        response.setOperationId(dataOperationRequest.getOperationId());
+        response.setStatusCode(NcmpEventResponseCode.SUCCESS.getStatusCode());
+        response.setStatusMessage(NcmpEventResponseCode.SUCCESS.getStatusMessage());
+        response.setIds(dataOperationRequest.getCmHandles().stream().map(CmHandle::getId).collect(Collectors.toList()));
+        final String ietfNetworkTopologySample = ResourceFileReaderUtil
+                .getResourceFileContent(applicationContext.getResource(
+                        ResourceLoader.CLASSPATH_URL_PREFIX
+                                + "data/operational/ietf-network-topology-sample-rfc8345.json"));
+        final JSONParser jsonParser = new JSONParser();
+        try {
+            response.setResult(jsonParser.parse(ietfNetworkTopologySample));
+        } catch (final ParseException parseException) {
+            log.error("Unable to parse event result as json object. cause : {}", parseException.getMessage());
+        }
+        final List<Response> responseList = new ArrayList<>();
+        responseList.add(response);
+        final Data data = new Data();
+        data.setResponses(responseList);
+        final DataOperationEvent dataOperationEvent = new DataOperationEvent();
+        dataOperationEvent.setData(data);
+        return dataOperationEvent;
+    }
+}
diff --git a/dmi-plugin-demo-and-csit-stub/dmi-plugin-demo-and-csit-stub-service/src/main/java/org/onap/cps/ncmp/dmi/rest/stub/model/data/operational/CmHandle.java b/dmi-plugin-demo-and-csit-stub/dmi-plugin-demo-and-csit-stub-service/src/main/java/org/onap/cps/ncmp/dmi/rest/stub/model/data/operational/CmHandle.java
new file mode 100644 (file)
index 0000000..93a90c9
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2023 Nordix Foundation
+ *  ================================================================================
+ *  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.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+
+package org.onap.cps.ncmp.dmi.rest.stub.model.data.operational;
+
+import java.util.HashMap;
+import java.util.Map;
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+public class CmHandle {
+    private String id;
+    private Map<String, String> cmHandleProperties = new HashMap<>();
+}
diff --git a/dmi-plugin-demo-and-csit-stub/dmi-plugin-demo-and-csit-stub-service/src/main/java/org/onap/cps/ncmp/dmi/rest/stub/model/data/operational/DataOperationRequest.java b/dmi-plugin-demo-and-csit-stub/dmi-plugin-demo-and-csit-stub-service/src/main/java/org/onap/cps/ncmp/dmi/rest/stub/model/data/operational/DataOperationRequest.java
new file mode 100644 (file)
index 0000000..2c0cb91
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2023 Nordix Foundation
+ *  ================================================================================
+ *  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.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+
+package org.onap.cps.ncmp.dmi.rest.stub.model.data.operational;
+
+import java.util.ArrayList;
+import java.util.List;
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+public class DataOperationRequest {
+    private String operation;
+    private String operationId;
+    private String datastore;
+    private String options;
+    private String resourceIdentifier;
+    private List<CmHandle> cmHandles = new ArrayList<>();
+}
diff --git a/dmi-plugin-demo-and-csit-stub/dmi-plugin-demo-and-csit-stub-service/src/main/java/org/onap/cps/ncmp/dmi/rest/stub/model/data/operational/ResourceDataOperationRequests.java b/dmi-plugin-demo-and-csit-stub/dmi-plugin-demo-and-csit-stub-service/src/main/java/org/onap/cps/ncmp/dmi/rest/stub/model/data/operational/ResourceDataOperationRequests.java
new file mode 100644 (file)
index 0000000..68a222a
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2023 Nordix Foundation
+ *  ================================================================================
+ *  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.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+
+package org.onap.cps.ncmp.dmi.rest.stub.model.data.operational;
+
+import java.util.ArrayList;
+
+public class ResourceDataOperationRequests extends ArrayList<DataOperationRequest> {
+    private static final long serialVersionUID = 3553323170854399881L;
+}
diff --git a/dmi-plugin-demo-and-csit-stub/dmi-plugin-demo-and-csit-stub-service/src/main/java/org/onap/cps/ncmp/dmi/rest/stub/utils/ResourceFileReaderUtil.java b/dmi-plugin-demo-and-csit-stub/dmi-plugin-demo-and-csit-stub-service/src/main/java/org/onap/cps/ncmp/dmi/rest/stub/utils/ResourceFileReaderUtil.java
new file mode 100644 (file)
index 0000000..0d2adee
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2023 Nordix Foundation
+ *  ================================================================================
+ *  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.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+
+package org.onap.cps.ncmp.dmi.rest.stub.utils;
+
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.core.io.Resource;
+import org.springframework.util.StreamUtils;
+
+/**
+ * Common convenience methods for reading resource file content.
+ */
+@Slf4j
+public class ResourceFileReaderUtil {
+
+    /**
+     * Converts a resource file content into string.
+     *
+     * @param fileClasspath to name of the file in test/resources
+     * @return the content of the file as a String
+     * @throws IOException when there is an IO issue
+     */
+    public static String getResourceFileContent(final Resource fileClasspath) {
+        String fileContent = null;
+        try {
+            fileContent = StreamUtils.copyToString(fileClasspath.getInputStream(), StandardCharsets.UTF_8);
+        } catch (final IOException ioException) {
+            log.debug("unable to read resource file content. cause : {}", ioException.getMessage());
+        }
+        return fileContent;
+    }
+}
diff --git a/dmi-plugin-demo-and-csit-stub/dmi-plugin-demo-and-csit-stub-service/src/main/resources/application.yml b/dmi-plugin-demo-and-csit-stub/dmi-plugin-demo-and-csit-stub-service/src/main/resources/application.yml
new file mode 100644 (file)
index 0000000..8e39a4e
--- /dev/null
@@ -0,0 +1,42 @@
+#  ============LICENSE_START=======================================================
+#  Copyright (C) 2023 Nordix Foundation
+#  ================================================================================
+#  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.
+#
+#  SPDX-License-Identifier: Apache-2.0
+#  ============LICENSE_END=========================================================
+server:
+    port: 8092
+
+rest:
+    api:
+        dmi-stub-base-path: /dmi
+
+spring:
+    main:
+        banner-mode: "off"
+    application:
+        name: "dmi-plugin-demo-and-csit-stub"
+
+    kafka:
+        bootstrap-servers: ${KAFKA_BOOTSTRAP_SERVER:localhost:19092}
+        security:
+            protocol: PLAINTEXT
+        producer:
+            value-serializer: io.cloudevents.kafka.CloudEventSerializer
+            client-id: cps-core
+
+app:
+    ncmp:
+        async-m2m:
+            topic: ${NCMP_ASYNC_M2M_TOPIC:ncmp-async-m2m}
diff --git a/dmi-plugin-demo-and-csit-stub/dmi-plugin-demo-and-csit-stub-service/src/main/resources/data/operational/ietf-network-topology-sample-rfc8345.json b/dmi-plugin-demo-and-csit-stub/dmi-plugin-demo-and-csit-stub-service/src/main/resources/data/operational/ietf-network-topology-sample-rfc8345.json
new file mode 100644 (file)
index 0000000..8f9dbc2
--- /dev/null
@@ -0,0 +1,76 @@
+{
+     "ietf-network:networks": {
+       "network": [
+         {
+           "network-types": {
+           },
+           "network-id": "otn-hc",
+           "node": [
+             {
+               "node-id": "D1",
+               "termination-point": [
+                 {
+                   "tp-id": "1-0-1"
+                 },
+                 {
+                   "tp-id": "1-2-1"
+                 },
+                 {
+                   "tp-id": "1-3-1"
+                 }
+               ]
+             },
+             {
+               "node-id": "D2",
+               "termination-point": [
+                 {
+                   "tp-id": "2-0-1"
+                 },
+                 {
+                   "tp-id": "2-1-1"
+                 },
+                 {
+                   "tp-id": "2-3-1"
+                 }
+               ]
+             },
+             {
+               "node-id": "D3",
+               "termination-point": [
+                 {
+                   "tp-id": "3-1-1"
+                 },
+                 {
+                   "tp-id": "3-2-1"
+                 }
+               ]
+             }
+           ],
+           "ietf-network-topology:link": [
+             {
+               "link-id": "D1,1-2-1,D2,2-1-1",
+               "source": {
+                 "source-node": "D1",
+                 "source-tp": "1-2-1"
+               },
+               "destination": {
+                 "dest-node": "D2",
+                 "dest-tp": "2-1-1"
+               }
+             },
+             {
+               "link-id": "D2,2-1-1,D1,1-2-1",
+               "source": {
+                 "source-node": "D2",
+                 "source-tp": "2-1-1"
+               },
+               "destination": {
+                 "dest-node": "D1",
+                 "dest-tp": "1-2-1"
+               }
+             }
+           ]
+         }
+       ]
+     }
+   }
diff --git a/dmi-plugin-demo-and-csit-stub/pom.xml b/dmi-plugin-demo-and-csit-stub/pom.xml
new file mode 100644 (file)
index 0000000..e8dd4c0
--- /dev/null
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ============LICENSE_START=======================================================
+  Copyright (C) 2023 Nordix Foundation
+  ================================================================================
+  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.
+  SPDX-License-Identifier: Apache-2.0
+  ============LICENSE_END=========================================================
+-->
+
+<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.onap.cps</groupId>
+        <artifactId>cps-parent</artifactId>
+        <version>3.3.4-SNAPSHOT</version>
+        <relativePath>../cps-parent/pom.xml</relativePath>
+    </parent>
+
+    <artifactId>dmi-plugin-demo-and-csit-stub</artifactId>
+    <packaging>pom</packaging>
+
+    <properties>
+        <parent.directory>${project.parent.basedir}/..</parent.directory>
+        <sonar.skip>true</sonar.skip>
+        <jacoco.skip>true</jacoco.skip>
+    </properties>
+
+    <modules>
+        <module>dmi-plugin-demo-and-csit-stub-service</module>
+        <module>dmi-plugin-demo-and-csit-stub-app</module>
+    </modules>
+</project>
\ No newline at end of file
diff --git a/dmi-plugin-stub/mappings/dataOperationRequest.json b/dmi-plugin-stub/mappings/dataOperationRequest.json
deleted file mode 100644 (file)
index 1df7363..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-  "request": {
-    "method": "POST",
-    "urlPattern": "/dmi/v1/data?.*"
-  },
-  "response": {
-    "status": 501
-  }
-}
diff --git a/dmi-plugin-stub/mappings/module.json b/dmi-plugin-stub/mappings/module.json
deleted file mode 100644 (file)
index a1b35ba..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-    "request": {
-        "method": "POST",
-        "urlPattern": "/dmi/v1/ch/.*/modules"
-    },
-    "response": {
-        "status": 200,
-        "bodyFileName": "moduleResponse.json",
-        "headers": {
-            "Content-Type": "application/json"
-        }
-    }
-}
diff --git a/dmi-plugin-stub/mappings/moduleResources.json b/dmi-plugin-stub/mappings/moduleResources.json
deleted file mode 100644 (file)
index 4efb9b0..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-    "request": {
-        "method": "POST",
-        "urlPattern": "/dmi/v1/ch/.*/moduleResources"
-    },
-    "response": {
-        "status": 200,
-        "bodyFileName": "moduleResourcesResponse.json",
-        "headers": {
-            "Content-Type": "application/json"
-        }
-    }
-}
diff --git a/dmi-plugin-stub/start.sh b/dmi-plugin-stub/start.sh
deleted file mode 100755 (executable)
index ffa8ce8..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-docker run -it --rm -p 8783:8080 -v "$(pwd)"/mappings:/home/wiremock/mappings -v "$(pwd)"/files:/home/wiremock/__files --name wiremock wiremock/wiremock:2.33.2 --verbose
-
index 3dc54bb..23f34b4 100644 (file)
@@ -106,17 +106,19 @@ services:
     profiles:
       - dmi-service
 
-  ncmp-dmi-plugin-stub:
-    container_name: ncmp-dmi-plugin-stub
-    image: wiremock/wiremock:2.33.2
+  ncmp-dmi-plugin-demo-and-csit-stub:
+    container_name: ncmp-dmi-plugin-demo-and-csit-stub
+    image: ${DOCKER_REPO:-nexus3.onap.org:10003}/onap/dmi-plugin-demo-and-csit-stub:${DMI_DEMO_STUB_VERSION:-latest}
     ports:
-      - ${DMI_PORT:-8783}:8080
-    volumes:
-      - ../dmi-plugin-stub/mappings:/home/wiremock/mappings
-      - ../dmi-plugin-stub/files:/home/wiremock/__files
+      - ${DMI_DEMO_STUB_PORT:-8784}:8092
+    environment:
+      KAFKA_BOOTSTRAP_SERVER: kafka:9092
+      NCMP_CONSUMER_GROUP_ID: ncmp-group
+      NCMP_ASYNC_M2M_TOPIC: ncmp-async-m2m
     restart: unless-stopped
     profiles:
       - dmi-stub
+      - dmi-service
 
   prometheus:
     container_name: prometheus-container
diff --git a/pom.xml b/pom.xml
index 7270bc4..910afa2 100644 (file)
--- a/pom.xml
+++ b/pom.xml
@@ -61,6 +61,7 @@
         <module>cps-ncmp-rest-stub</module>\r
         <module>cps-path-parser</module>\r
         <module>cps-ri</module>\r
+        <module>dmi-plugin-demo-and-csit-stub</module>\r
         <module>integration-test</module>\r
         <module>checkstyle</module>\r
         <module>spotbugs</module>\r