Send new module set tag to DMI during model upgrade 95/140095/1
authordanielhanrahan <daniel.hanrahan@est.tech>
Mon, 27 Jan 2025 16:55:10 +0000 (16:55 +0000)
committerdanielhanrahan <daniel.hanrahan@est.tech>
Tue, 28 Jan 2025 10:13:57 +0000 (10:13 +0000)
Previously, DMI would receive old module set tag in the
request body. The tag being upgrade to is the expected one.

Issue-ID: CPS-2589
Signed-off-by: danielhanrahan <daniel.hanrahan@est.tech>
Change-Id: I0554136f0d4c55d687b575313d932f6bcab15c92

cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/DmiModelOperations.java
cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/ModuleOperationsUtils.java
cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/ModuleSyncService.java
cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/sync/DmiModelOperationsSpec.groovy
cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/sync/ModuleSyncServiceSpec.groovy

index 1e24671..2cc4375 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  ============LICENSE_START=======================================================
- *  Copyright (C) 2021-2024 Nordix Foundation
+ *  Copyright (C) 2021-2025 Nordix Foundation
  *  Modifications Copyright (C) 2022 Bell Canada
  *  ================================================================================
  *  Licensed under the Apache License, Version 2.0 (the "License");
@@ -61,13 +61,14 @@ public class DmiModelOperations {
      * Retrieves module references.
      *
      * @param yangModelCmHandle the yang model cm handle
+     * @param targetModuleSetTag module set tag to send to dmi
      * @return module references
      */
     @Timed(value = "cps.ncmp.inventory.module.references.from.dmi",
         description = "Time taken to get all module references for a cm handle from dmi")
-    public List<ModuleReference> getModuleReferences(final YangModelCmHandle yangModelCmHandle) {
-        final DmiRequestBody dmiRequestBody = DmiRequestBody.builder()
-                .moduleSetTag(yangModelCmHandle.getModuleSetTag()).build();
+    public List<ModuleReference> getModuleReferences(final YangModelCmHandle yangModelCmHandle,
+                                                     final String targetModuleSetTag) {
+        final DmiRequestBody dmiRequestBody = DmiRequestBody.builder().moduleSetTag(targetModuleSetTag).build();
         dmiRequestBody.asDmiProperties(yangModelCmHandle.getDmiProperties());
         final ResponseEntity<Object> dmiFetchModulesResponseEntity = getResourceFromDmiWithJsonData(
             yangModelCmHandle.resolveDmiServiceName(MODEL),
@@ -79,18 +80,20 @@ public class DmiModelOperations {
      * Retrieve yang resources from dmi for any modules that CPS-NCMP hasn't cached before.
      *
      * @param yangModelCmHandle the yangModelCmHandle
+     * @param targetModuleSetTag module set tag to send to dmi
      * @param newModuleReferences the unknown module references
      * @return yang resources as map of module name to yang(re)source
      */
     @Timed(value = "cps.ncmp.inventory.yang.resources.from.dmi",
         description = "Time taken to get list of yang resources from dmi")
     public Map<String, String> getNewYangResourcesFromDmi(final YangModelCmHandle yangModelCmHandle,
+                                                          final String targetModuleSetTag,
                                                           final Collection<ModuleReference> newModuleReferences) {
         if (newModuleReferences.isEmpty()) {
             return Collections.emptyMap();
         }
         final String jsonWithDataAndDmiProperties = getRequestBodyToFetchYangResources(newModuleReferences,
-                yangModelCmHandle.getDmiProperties(), yangModelCmHandle.getModuleSetTag());
+                yangModelCmHandle.getDmiProperties(), targetModuleSetTag);
         final ResponseEntity<Object> responseEntity = getResourceFromDmiWithJsonData(
             yangModelCmHandle.resolveDmiServiceName(MODEL),
             jsonWithDataAndDmiProperties,
@@ -123,13 +126,13 @@ public class DmiModelOperations {
 
     private static String getRequestBodyToFetchYangResources(final Collection<ModuleReference> newModuleReferences,
                                                              final List<YangModelCmHandle.Property> dmiProperties,
-                                                             final String moduleSetTag) {
+                                                             final String targetModuleSetTag) {
         final JsonArray moduleReferencesAsJson = getModuleReferencesAsJson(newModuleReferences);
         final JsonObject data = new JsonObject();
         data.add("modules", moduleReferencesAsJson);
         final JsonObject jsonRequestObject = new JsonObject();
-        if (!moduleSetTag.isEmpty()) {
-            jsonRequestObject.addProperty("moduleSetTag", moduleSetTag);
+        if (!targetModuleSetTag.isEmpty()) {
+            jsonRequestObject.addProperty("moduleSetTag", targetModuleSetTag);
         }
         jsonRequestObject.add("data", data);
         jsonRequestObject.add("cmHandleProperties", toJsonObject(dmiProperties));
index e9f3d9b..80e4165 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  ============LICENSE_START=======================================================
- *  Copyright (C) 2022-2024 Nordix Foundation
+ *  Copyright (C) 2022-2025 Nordix Foundation
  *  Modifications Copyright (C) 2022 Bell Canada
  *  ================================================================================
  *  Licensed under the Apache License, Version 2.0 (the "License");
@@ -189,7 +189,12 @@ public class ModuleOperationsUtils {
                 .getLockReasonCategory()));
     }
 
-    public static String getTargetModuleSetTagFromLockReason(final CompositeState.LockReason lockReason) {
+    public static String getTargetModuleSetTagForUpgrade(final YangModelCmHandle yangModelCmHandle) {
+        final CompositeState.LockReason lockReason = yangModelCmHandle.getCompositeState().getLockReason();
+        return getTargetModuleSetTagFromLockReason(lockReason);
+    }
+
+    private static String getTargetModuleSetTagFromLockReason(final CompositeState.LockReason lockReason) {
         return getLockedCompositeStateDetails(lockReason).getOrDefault(MODULE_SET_TAG_KEY, "");
     }
 
index 017995e..f929d67 100644 (file)
@@ -66,9 +66,9 @@ public class ModuleSyncService {
      */
     public void syncAndCreateSchemaSetAndAnchor(final YangModelCmHandle yangModelCmHandle) {
         final String cmHandleId = yangModelCmHandle.getId();
-        final String moduleSetTag = yangModelCmHandle.getModuleSetTag();
-        final String schemaSetName = getSchemaSetName(cmHandleId, moduleSetTag);
-        syncAndCreateSchemaSet(yangModelCmHandle, schemaSetName);
+        final String targetModuleSetTag = yangModelCmHandle.getModuleSetTag();
+        final String schemaSetName = getSchemaSetNameForModuleSetTag(cmHandleId, targetModuleSetTag);
+        syncAndCreateSchemaSet(yangModelCmHandle, schemaSetName, targetModuleSetTag);
         try {
             cpsAnchorService.createAnchor(NFP_OPERATIONAL_DATASTORE_DATASPACE_NAME, schemaSetName, cmHandleId);
         } catch (final AlreadyDefinedException alreadyDefinedException) {
@@ -85,27 +85,27 @@ public class ModuleSyncService {
     public void syncAndUpgradeSchemaSet(final YangModelCmHandle yangModelCmHandle) {
         final String cmHandleId = yangModelCmHandle.getId();
         final String sourceModuleSetTag = yangModelCmHandle.getModuleSetTag();
-        final String targetModuleSetTag = ModuleOperationsUtils.getTargetModuleSetTagFromLockReason(
-                yangModelCmHandle.getCompositeState().getLockReason());
+        final String targetModuleSetTag = ModuleOperationsUtils.getTargetModuleSetTagForUpgrade(yangModelCmHandle);
+        final String schemaSetName = getSchemaSetNameForModuleSetTag(cmHandleId, targetModuleSetTag);
         if (sourceModuleSetTag.isEmpty() && targetModuleSetTag.isEmpty()) {
-            final ModuleDelta moduleDelta = getModuleDelta(yangModelCmHandle);
+            final ModuleDelta moduleDelta = getModuleDelta(yangModelCmHandle, targetModuleSetTag);
             cpsModuleService.upgradeSchemaSetFromModules(NFP_OPERATIONAL_DATASTORE_DATASPACE_NAME,
-                    cmHandleId, moduleDelta.newModuleNameToContentMap, moduleDelta.allModuleReferences);
+                    schemaSetName, moduleDelta.newModuleNameToContentMap, moduleDelta.allModuleReferences);
         } else {
-            final String targetSchemaSetName = getSchemaSetName(cmHandleId, targetModuleSetTag);
-            syncAndCreateSchemaSet(yangModelCmHandle, targetSchemaSetName);
-            cpsAnchorService.updateAnchorSchemaSet(NFP_OPERATIONAL_DATASTORE_DATASPACE_NAME, cmHandleId,
-                    targetSchemaSetName);
+            syncAndCreateSchemaSet(yangModelCmHandle, schemaSetName, targetModuleSetTag);
+            cpsAnchorService.updateAnchorSchemaSet(NFP_OPERATIONAL_DATASTORE_DATASPACE_NAME, cmHandleId, schemaSetName);
             setCmHandleModuleSetTag(yangModelCmHandle, targetModuleSetTag);
             log.info("Upgrading schema set for CM handle ID: {}, Source Tag: {}, Target Tag: {}",
                 cmHandleId, sourceModuleSetTag, targetModuleSetTag);
         }
     }
 
-    private void syncAndCreateSchemaSet(final YangModelCmHandle yangModelCmHandle, final String schemaSetName) {
+    private void syncAndCreateSchemaSet(final YangModelCmHandle yangModelCmHandle,
+                                        final String schemaSetName,
+                                        final String targetModuleSetTag) {
         if (isNewSchemaSet(schemaSetName)) {
             final String cmHandleId = yangModelCmHandle.getId();
-            final ModuleDelta moduleDelta = getModuleDelta(yangModelCmHandle);
+            final ModuleDelta moduleDelta = getModuleDelta(yangModelCmHandle, targetModuleSetTag);
             try {
                 log.info("Creating Schema Set {} for CM Handle {}", schemaSetName, cmHandleId);
                 cpsModuleService.createSchemaSetFromModules(
@@ -127,13 +127,14 @@ public class ModuleSyncService {
         return !cpsModuleService.schemaSetExists(NFP_OPERATIONAL_DATASTORE_DATASPACE_NAME, schemaSetName);
     }
 
-    private ModuleDelta getModuleDelta(final YangModelCmHandle yangModelCmHandle) {
+    private ModuleDelta getModuleDelta(final YangModelCmHandle yangModelCmHandle,
+                                       final String targetModuleSetTag) {
         final Collection<ModuleReference> allModuleReferences =
-            dmiModelOperations.getModuleReferences(yangModelCmHandle);
+            dmiModelOperations.getModuleReferences(yangModelCmHandle, targetModuleSetTag);
         final Collection<ModuleReference> newModuleReferences =
                 cpsModuleService.identifyNewModuleReferences(allModuleReferences);
         final Map<String, String> newYangResources = dmiModelOperations.getNewYangResourcesFromDmi(yangModelCmHandle,
-                newModuleReferences);
+                targetModuleSetTag, newModuleReferences);
         log.debug("Module delta calculated for CM handle ID: {}. All references: {}. New modules: {}",
             yangModelCmHandle.getId(), allModuleReferences, newYangResources.keySet());
         return new ModuleDelta(allModuleReferences, newYangResources);
@@ -146,7 +147,7 @@ public class ModuleSyncService {
                 jsonForUpdate, OffsetDateTime.now(), ContentType.JSON);
     }
 
-    private static String getSchemaSetName(final String cmHandleId, final String moduleSetTag) {
+    private static String getSchemaSetNameForModuleSetTag(final String cmHandleId, final String moduleSetTag) {
         return moduleSetTag.isEmpty() ? cmHandleId : moduleSetTag;
     }
 
index 7145559..302e43f 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  ============LICENSE_START=======================================================
- *  Copyright (C) 2021-2024 Nordix Foundation
+ *  Copyright (C) 2021-2025 Nordix Foundation
  *  Modifications Copyright (C) 2022 Bell Canada
  *  ================================================================================
  *  Licensed under the Apache License, Version 2.0 (the "License");
 
 package org.onap.cps.ncmp.impl.inventory.sync
 
-import com.fasterxml.jackson.core.JsonProcessingException
-import com.fasterxml.jackson.databind.ObjectMapper
 import org.onap.cps.ncmp.impl.dmi.DmiOperationsBaseSpec
 import org.onap.cps.ncmp.impl.dmi.DmiProperties
 import org.onap.cps.ncmp.impl.utils.http.UrlTemplateParameters
 import org.onap.cps.api.model.ModuleReference
 import org.onap.cps.utils.JsonObjectMapper
-import org.spockframework.spring.SpringBean
 import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.boot.test.context.SpringBootTest
 import org.springframework.http.HttpStatus
@@ -40,9 +37,12 @@ import static org.onap.cps.ncmp.api.data.models.OperationType.READ
 import static org.onap.cps.ncmp.impl.models.RequiredDmiService.MODEL
 
 @SpringBootTest
-@ContextConfiguration(classes = [DmiProperties, DmiModelOperations])
+@ContextConfiguration(classes = [DmiProperties, DmiModelOperations, JsonObjectMapper])
 class DmiModelOperationsSpec extends DmiOperationsBaseSpec {
 
+    def NO_AUTH_HEADER = null
+    def NO_MODULE_SET_TAG = ''
+
     def expectedModulesUrlTemplateWithVariables = new UrlTemplateParameters('myServiceName/dmi/v1/ch/{cmHandleId}/modules', ['cmHandleId': cmHandleId])
     def expectedModuleResourcesUrlTemplateWithVariables = new UrlTemplateParameters('myServiceName/dmi/v1/ch/{cmHandleId}/moduleResources', ['cmHandleId': cmHandleId])
 
@@ -52,11 +52,6 @@ class DmiModelOperationsSpec extends DmiOperationsBaseSpec {
     @Autowired
     DmiModelOperations objectUnderTest
 
-    @SpringBean
-    JsonObjectMapper spiedJsonObjectMapper = Spy(new JsonObjectMapper(new ObjectMapper()))
-
-    def NO_AUTH_HEADER = null
-
     def 'Retrieving module references.'() {
         given: 'a cm handle'
             mockYangModelCmHandleRetrieval([])
@@ -65,7 +60,7 @@ class DmiModelOperationsSpec extends DmiOperationsBaseSpec {
             def responseFromDmi = new ResponseEntity([schemas: moduleReferencesAsLisOfMaps], HttpStatus.OK)
             mockDmiRestClient.synchronousPostOperationWithJsonData(MODEL, expectedModulesUrlTemplateWithVariables, '{"cmHandleProperties":{},"moduleSetTag":""}', READ, NO_AUTH_HEADER) >> responseFromDmi
         when: 'get module references is called'
-            def result = objectUnderTest.getModuleReferences(yangModelCmHandle)
+            def result = objectUnderTest.getModuleReferences(yangModelCmHandle, NO_MODULE_SET_TAG)
         then: 'the result consists of expected module references'
             assert result == [new ModuleReference(moduleName: 'mod1', revision: 'A'), new ModuleReference(moduleName: 'mod2', revision: 'X')]
     }
@@ -78,7 +73,7 @@ class DmiModelOperationsSpec extends DmiOperationsBaseSpec {
             def responseFromDmi = new ResponseEntity(bodyAsMap, HttpStatus.NO_CONTENT)
             mockDmiRestClient.synchronousPostOperationWithJsonData(*_) >> responseFromDmi
         when: 'get module references is called'
-            def result = objectUnderTest.getModuleReferences(yangModelCmHandle)
+            def result = objectUnderTest.getModuleReferences(yangModelCmHandle, NO_MODULE_SET_TAG)
         then: 'the result is empty'
             assert result == []
         where: 'the DMI response body has the following content'
@@ -97,7 +92,7 @@ class DmiModelOperationsSpec extends DmiOperationsBaseSpec {
             mockDmiRestClient.synchronousPostOperationWithJsonData(MODEL, expectedModulesUrlTemplateWithVariables,
                     '{"cmHandleProperties":' + expectedAdditionalPropertiesInRequest + ',"moduleSetTag":""}', READ, NO_AUTH_HEADER) >> responseFromDmi
         when: 'a get module references is called'
-            def result = objectUnderTest.getModuleReferences(yangModelCmHandle)
+            def result = objectUnderTest.getModuleReferences(yangModelCmHandle, NO_MODULE_SET_TAG)
         then: 'the result is the response from DMI service'
             assert result == []
         where: 'the following DMI properties are used'
@@ -116,7 +111,7 @@ class DmiModelOperationsSpec extends DmiOperationsBaseSpec {
             mockDmiRestClient.synchronousPostOperationWithJsonData(MODEL, expectedModuleResourcesUrlTemplateWithVariables,
                     '{"data":{"modules":[' + expectedModuleReferencesInRequest + ']},"cmHandleProperties":{}}', READ, NO_AUTH_HEADER) >> responseFromDmi
         when: 'get new yang resources from DMI service'
-            def result = objectUnderTest.getNewYangResourcesFromDmi(yangModelCmHandle, newModuleReferences)
+            def result = objectUnderTest.getNewYangResourcesFromDmi(yangModelCmHandle, NO_MODULE_SET_TAG, newModuleReferences)
         then: 'the result has the 2 expected yang (re)sources (order is not guaranteed)'
             assert result.size() == 2
             assert result.get('mod1') == 'some yang source'
@@ -131,7 +126,7 @@ class DmiModelOperationsSpec extends DmiOperationsBaseSpec {
             def responseFromDmi = new ResponseEntity(responseFromDmiBody, HttpStatus.NO_CONTENT)
             mockDmiRestClient.synchronousPostOperationWithJsonData(*_) >> responseFromDmi
         when: 'get new yang resources from DMI service'
-            def result = objectUnderTest.getNewYangResourcesFromDmi(yangModelCmHandle, newModuleReferences)
+            def result = objectUnderTest.getNewYangResourcesFromDmi(yangModelCmHandle, NO_MODULE_SET_TAG, newModuleReferences)
         then: 'the result is empty'
             assert result == [:]
         where: 'the DMI response body has the following content'
@@ -149,7 +144,7 @@ class DmiModelOperationsSpec extends DmiOperationsBaseSpec {
                     '{"data":{"modules":[{"name":"mod1","revision":"A"},{"name":"mod2","revision":"X"}]},"cmHandleProperties":' + expectedAdditionalPropertiesInRequest + '}',
                     READ, NO_AUTH_HEADER) >> responseFromDmi
         when: 'get new yang resources from DMI service'
-            def result = objectUnderTest.getNewYangResourcesFromDmi(yangModelCmHandle, newModuleReferences)
+            def result = objectUnderTest.getNewYangResourcesFromDmi(yangModelCmHandle, NO_MODULE_SET_TAG, newModuleReferences)
         then: 'the result is the response from DMI service'
             assert result == [mod1:'some yang source']
         where: 'the following DMI properties are used'
@@ -166,7 +161,7 @@ class DmiModelOperationsSpec extends DmiOperationsBaseSpec {
             mockDmiRestClient.synchronousPostOperationWithJsonData(MODEL, expectedModuleResourcesUrlTemplateWithVariables,
                 '{' + 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)
+            def result = objectUnderTest.getNewYangResourcesFromDmi(yangModelCmHandle, moduleSetTag, newModuleReferences)
         then: 'the result is the response from DMI service'
             assert result == [mod1:'some yang source']
         where: 'the following Module Set Tags are used'
@@ -180,7 +175,7 @@ class DmiModelOperationsSpec extends DmiOperationsBaseSpec {
         given: 'a cm handle'
             mockYangModelCmHandleRetrieval([])
         when: 'a get new yang resources from DMI is called with no module references'
-            def result = objectUnderTest.getNewYangResourcesFromDmi(yangModelCmHandle, [])
+            def result = objectUnderTest.getNewYangResourcesFromDmi(yangModelCmHandle, NO_MODULE_SET_TAG, [])
         then: 'no resources are returned'
             assert result == [:]
         and: 'no request is sent to DMI'
@@ -191,21 +186,35 @@ class DmiModelOperationsSpec extends DmiOperationsBaseSpec {
         given: 'a cm handle'
             mockYangModelCmHandleRetrieval(null)
         when: 'a get new yang resources from DMI is called'
-            objectUnderTest.getNewYangResourcesFromDmi(yangModelCmHandle, [new ModuleReference('mod1', 'A')])
+            objectUnderTest.getNewYangResourcesFromDmi(yangModelCmHandle, NO_MODULE_SET_TAG, [new ModuleReference('mod1', 'A')])
         then: 'a null pointer is thrown (we might need to address this later)'
             thrown(NullPointerException)
     }
 
-    def 'Retrieving module references with Json processing exception.'() {
-        given: 'a cm handle'
-            mockYangModelCmHandleRetrieval([])
-        and: 'a Json processing exception occurs'
-            spiedJsonObjectMapper.asJsonString(_) >> {throw (new JsonProcessingException('parsing error'))}
-        when: 'a DMI operation is executed'
-            objectUnderTest.getModuleReferences(yangModelCmHandle)
-        then: 'an ncmp exception is thrown'
-            def exceptionThrown = thrown(JsonProcessingException)
-        and: 'the message indicates a parsing error'
-            exceptionThrown.message.toLowerCase().contains('parsing error')
+    def 'Retrieving module references forwards the new module set tag to DMI during CM-handle upgrade.'() {
+        given: 'a cm handle with an existing module set tag'
+            mockYangModelCmHandleRetrieval([], 'OLD-TAG')
+        when: 'get module references is called'
+            objectUnderTest.getModuleReferences(yangModelCmHandle, 'NEW-TAG')
+        then: 'a request was sent to DMI with the NEW module set tag in the body'
+            1 * mockDmiRestClient.synchronousPostOperationWithJsonData(*_) >> { args ->
+                def requestBodyAsJson = args[2] as String
+                assert requestBodyAsJson.contains('"moduleSetTag":"NEW-TAG"')
+                return new ResponseEntity([schemas: [[moduleName: 'mod1', revision: 'A'], [moduleName: 'mod2', revision: 'X']]], HttpStatus.OK)
+            }
+    }
+
+    def 'Retrieving yang resources forwards the new module set tag to DMI during CM-handle upgrade.'() {
+        given: 'a cm handle with an existing module set tag'
+            mockYangModelCmHandleRetrieval([], 'OLD-TAG')
+        when: 'get new yang resources from DMI service'
+            objectUnderTest.getNewYangResourcesFromDmi(yangModelCmHandle, 'NEW-TAG', newModuleReferences)
+        then: 'a request was sent to DMI with the NEW module set tag in the body'
+            1 * mockDmiRestClient.synchronousPostOperationWithJsonData(*_) >> { args ->
+                def requestBodyAsJson = args[2] as String
+                assert requestBodyAsJson.contains('"moduleSetTag":"NEW-TAG"')
+                return new ResponseEntity([[moduleName: 'mod1', revision: 'A', yangSource: 'some yang source'],
+                                           [moduleName: 'mod2', revision: 'X', yangSource: 'other yang source']], HttpStatus.OK)
+            }
     }
 }
index 868609e..b4837f7 100644 (file)
@@ -39,6 +39,8 @@ import static org.onap.cps.ncmp.api.inventory.models.LockReasonCategory.MODULE_U
 
 class ModuleSyncServiceSpec extends Specification {
 
+    def NO_MODULE_SET_TAG = ''
+
     def mockCpsModuleService = Mock(CpsModuleService)
     def mockDmiModelOperations = Mock(DmiModelOperations)
     def mockCpsAnchorService = Mock(CpsAnchorService)
@@ -53,9 +55,9 @@ class ModuleSyncServiceSpec extends Specification {
             def yangModelCmHandle = createAdvisedCmHandle(moduleSetTag)
         and: 'DMI operations returns some module references'
             def moduleReferences =  [ new ModuleReference('module1','1'), new ModuleReference('module2','2') ]
-            mockDmiModelOperations.getModuleReferences(yangModelCmHandle) >> moduleReferences
+            mockDmiModelOperations.getModuleReferences(yangModelCmHandle, moduleSetTag) >> moduleReferences
         and: 'DMI-Plugin returns resource(s) for "new" module(s)'
-            mockDmiModelOperations.getNewYangResourcesFromDmi(yangModelCmHandle, identifiedNewModuleReferences) >> newModuleNameContentToMap
+            mockDmiModelOperations.getNewYangResourcesFromDmi(yangModelCmHandle, moduleSetTag, identifiedNewModuleReferences) >> newModuleNameContentToMap
         and: 'the module service identifies #identifiedNewModuleReferences.size() new modules'
             mockCpsModuleService.identifyNewModuleReferences(moduleReferences) >> identifiedNewModuleReferences
         when: 'module sync is triggered'
@@ -140,8 +142,8 @@ class ModuleSyncServiceSpec extends Specification {
             def yangModelCmHandle = YangModelCmHandle.toYangModelCmHandle(dmiServiceName, '', '', ncmpServiceCmHandle,'', '', '')
         and: 'DMI operations returns some module references for upgraded cm handle'
             def moduleReferences =  [ new ModuleReference('module1','1') ]
-            mockDmiModelOperations.getModuleReferences(yangModelCmHandle) >> moduleReferences
-            mockDmiModelOperations.getNewYangResourcesFromDmi(_, []) >> [:]
+            mockDmiModelOperations.getModuleReferences(yangModelCmHandle, NO_MODULE_SET_TAG) >> moduleReferences
+            mockDmiModelOperations.getNewYangResourcesFromDmi(_, NO_MODULE_SET_TAG, []) >> [:]
         and: 'none of these module references are new (all already known to the system)'
             mockCpsModuleService.identifyNewModuleReferences(_) >> []
         when: 'module sync is triggered'
@@ -163,7 +165,7 @@ class ModuleSyncServiceSpec extends Specification {
             mockCpsModuleService.schemaSetExists(NFP_OPERATIONAL_DATASTORE_DATASPACE_NAME, tagTo) >> schemaExists
         and: 'DMI operations returns some module references for upgraded cm handle'
             def moduleReferences =  [ new ModuleReference('module1','1') ]
-            expectedCallsToDmi * mockDmiModelOperations.getModuleReferences(yangModelCmHandle) >> moduleReferences
+            expectedCallsToDmi * mockDmiModelOperations.getModuleReferences(yangModelCmHandle, tagTo) >> moduleReferences
         and: 'dmi returns no new yang resources'
             mockDmiModelOperations.getNewYangResourcesFromDmi(*_) >> [:]
         and: 'none of these module references are new (all already known to the system)'