CPS-2181 - #1 Included Module Set Tag in NCMP calls to DMI for Yang Module Resources 38/137838/8
authordavid.mcweeney <david.mcweeney@est.tech>
Wed, 1 May 2024 11:08:00 +0000 (12:08 +0100)
committerdavid.mcweeney <david.mcweeney@est.tech>
Wed, 15 May 2024 13:09:30 +0000 (14:09 +0100)
Change-Id: I4f8cf79667e3155f49b9109d26b5807f5d54f90c
Signed-off-by: david.mcweeney <david.mcweeney@est.tech>
Issue-ID: CPS-2181

cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/operations/DmiModelOperations.java
cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/operations/DmiModelOperationsSpec.groovy
cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/operations/DmiOperationsBaseSpec.groovy

index 3a281d7..798f6de 100644 (file)
@@ -24,7 +24,9 @@ package org.onap.cps.ncmp.api.impl.operations;
 import static org.onap.cps.ncmp.api.impl.operations.RequiredDmiService.MODEL;
 
 import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -88,8 +90,8 @@ public class DmiModelOperations extends DmiOperations {
         if (newModuleReferences.isEmpty()) {
             return Collections.emptyMap();
         }
-        final String jsonWithDataAndDmiProperties = getRequestBodyToFetchYangResources(
-            newModuleReferences, yangModelCmHandle.getDmiProperties());
+        final String jsonWithDataAndDmiProperties = getRequestBodyToFetchYangResources(newModuleReferences,
+                yangModelCmHandle.getDmiProperties(), yangModelCmHandle.getModuleSetTag());
         final ResponseEntity<Object> responseEntity = getResourceFromDmiWithJsonData(
             yangModelCmHandle.resolveDmiServiceName(MODEL),
             jsonWithDataAndDmiProperties,
@@ -117,11 +119,16 @@ public class DmiModelOperations extends DmiOperations {
     }
 
     private static String getRequestBodyToFetchYangResources(final Collection<ModuleReference> newModuleReferences,
-        final List<YangModelCmHandle.Property> dmiProperties) {
+                                                             final List<YangModelCmHandle.Property> dmiProperties,
+                                                             final String moduleSetTag) {
         final JsonArray moduleReferencesAsJson = getModuleReferencesAsJson(newModuleReferences);
         final JsonObject data = new JsonObject();
         data.add("modules", moduleReferencesAsJson);
         final JsonObject jsonRequestObject = new JsonObject();
+        if (!moduleSetTag.isEmpty()) {
+            final JsonElement moduleSetTagAsJson = JsonParser.parseString(moduleSetTag);
+            jsonRequestObject.add("moduleSetTag", moduleSetTagAsJson);
+        }
         jsonRequestObject.add("data", data);
         jsonRequestObject.add("cmHandleProperties", toJsonObject(dmiProperties));
         return jsonRequestObject.toString();
index e99e8a3..9aab467 100644 (file)
@@ -58,7 +58,7 @@ class DmiModelOperationsSpec extends DmiOperationsBaseSpec {
             def moduleReferencesAsLisOfMaps = [[moduleName: 'mod1', revision: 'A'], [moduleName: 'mod2', revision: 'X']]
             def expectedUrl = "${dmiServiceName}/dmi/v1/ch/${cmHandleId}/modules"
             def responseFromDmi = new ResponseEntity([schemas: moduleReferencesAsLisOfMaps], HttpStatus.OK)
-            mockDmiRestClient.postOperationWithJsonData(expectedUrl, '{"cmHandleProperties":{},"moduleSetTag":"tag1"}', READ, NO_AUTH_HEADER)
+            mockDmiRestClient.postOperationWithJsonData(expectedUrl, '{"cmHandleProperties":{},"moduleSetTag":""}', READ, NO_AUTH_HEADER)
                     >> responseFromDmi
         when: 'get module references is called'
             def result = objectUnderTest.getModuleReferences(yangModelCmHandle)
@@ -91,7 +91,7 @@ class DmiModelOperationsSpec extends DmiOperationsBaseSpec {
         and: 'a positive response from DMI service when it is called with tha expected parameters'
             def responseFromDmi = new ResponseEntity<String>(HttpStatus.OK)
             mockDmiRestClient.postOperationWithJsonData("${dmiServiceName}/dmi/v1/ch/${cmHandleId}/modules",
-                    '{"cmHandleProperties":' + expectedAdditionalPropertiesInRequest + ',"moduleSetTag":"tag1"}', READ, NO_AUTH_HEADER) >> responseFromDmi
+                    '{"cmHandleProperties":' + expectedAdditionalPropertiesInRequest + ',"moduleSetTag":""}', READ, NO_AUTH_HEADER) >> responseFromDmi
         when: 'a get module references is called'
             def result = objectUnderTest.getModuleReferences(yangModelCmHandle)
         then: 'the result is the response from DMI service'
@@ -139,7 +139,7 @@ class DmiModelOperationsSpec extends DmiOperationsBaseSpec {
     def 'Retrieving yang resources, DMI property handling #scenario.'() {
         given: 'a cm handle'
             mockYangModelCmHandleRetrieval(dmiProperties)
-        and: 'a positive response from DMI service when it is called with the expected parameters'
+        and: 'a positive response from DMI service when it is called with the expected moduleSetTag, modules and properties'
             def responseFromDmi = new ResponseEntity<>([[moduleName: 'mod1', revision: 'A', yangSource: 'some yang source']], HttpStatus.OK)
             mockDmiRestClient.postOperationWithJsonData("${dmiServiceName}/dmi/v1/ch/${cmHandleId}/moduleResources",
                     '{"data":{"modules":[{"name":"mod1","revision":"A"},{"name":"mod2","revision":"X"}]},"cmHandleProperties":' + expectedAdditionalPropertiesInRequest + '}',
@@ -154,6 +154,24 @@ class DmiModelOperationsSpec extends DmiOperationsBaseSpec {
             'without properties'                    | []                          || '{}'
     }
 
+    def 'Retrieving yang resources  #scenario'() {
+        given: 'a cm handle'
+            mockYangModelCmHandleRetrieval([], moduleSetTag)
+        and: 'a positive response from DMI service when it is called with the expected moduleSetTag'
+            def responseFromDmi = new ResponseEntity<>([[moduleName: 'mod1', revision: 'A', yangSource: 'some yang source']], HttpStatus.OK)
+            mockDmiRestClient.postOperationWithJsonData("${dmiServiceName}/dmi/v1/ch/${cmHandleId}/moduleResources",
+                '{' + expectedModuleSetTagInRequest + '"data":{"modules":[{"name":"mod1","revision":"A"},{"name":"mod2","revision":"X"}]},"cmHandleProperties":{}}',
+                READ, NO_AUTH_HEADER) >> responseFromDmi
+        when: 'get new yang resources from DMI service'
+            def result = objectUnderTest.getNewYangResourcesFromDmi(yangModelCmHandle, newModuleReferences)
+        then: 'the result is the response from DMI service'
+            assert result == [mod1:'some yang source']
+        where: 'the following Module Set Tags are used'
+            scenario                 | moduleSetTag    || expectedModuleSetTagInRequest
+            'Without module set tag' | ''              || ''
+            'With module set tag'    | 'moduleSetTag1' || '"moduleSetTag":"moduleSetTag1",'
+    }
+
     def 'Retrieving yang resources from DMI with no module references.'() {
         given: 'a cm handle'
             mockYangModelCmHandleRetrieval([])
index b7af502..72a0f2f 100644 (file)
@@ -58,22 +58,27 @@ abstract class DmiOperationsBaseSpec extends Specification {
     def static resourceIdentifier = 'parent/child'
 
     def mockYangModelCmHandleRetrieval(dmiProperties) {
-        populateYangModelCmHandle(dmiProperties)
+        populateYangModelCmHandle(dmiProperties, '')
+        mockInventoryPersistence.getYangModelCmHandle(cmHandleId) >> yangModelCmHandle
+    }
+
+    def mockYangModelCmHandleRetrieval(dmiProperties, moduleSetTag) {
+        populateYangModelCmHandle(dmiProperties, moduleSetTag)
         mockInventoryPersistence.getYangModelCmHandle(cmHandleId) >> yangModelCmHandle
     }
 
     def mockYangModelCmHandleCollectionRetrieval(dmiProperties) {
-        populateYangModelCmHandle(dmiProperties)
+        populateYangModelCmHandle(dmiProperties, "")
         mockInventoryPersistence.getYangModelCmHandles(_) >> [yangModelCmHandle]
     }
 
-    def populateYangModelCmHandle(dmiProperties) {
+    def populateYangModelCmHandle(dmiProperties, moduleSetTag) {
         yangModelCmHandle.dmiDataServiceName = dmiServiceName
         yangModelCmHandle.dmiServiceName = dmiServiceName
         yangModelCmHandle.dmiProperties = dmiProperties
         yangModelCmHandle.id = cmHandleId
         yangModelCmHandle.compositeState = new CompositeState()
         yangModelCmHandle.compositeState.cmHandleState = CmHandleState.READY
-        yangModelCmHandle.moduleSetTag = 'tag1'
+        yangModelCmHandle.moduleSetTag = moduleSetTag
     }
 }