Remove CmHandle in DMI-Registry 14/123514/7
authorDylanB95EST <dylan.byrne@est.tech>
Tue, 24 Aug 2021 15:56:40 +0000 (16:56 +0100)
committerDylan Byrne <dylan.byrne@est.tech>
Wed, 25 Aug 2021 15:00:17 +0000 (15:00 +0000)
Remove CM Handles within DMI-Registry as part of DMI-Registration story.

Issue-ID: CPS-444
Change-Id: I91bb5e346354b2723fafb565c25d5728731aa09e
Signed-off-by: DylanB95EST <dylan.byrne@est.tech>
cps-ncmp-rest/docs/openapi/components.yaml
cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImpl.java
cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/models/DmiPluginRegistration.java
cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImplSpec.groovy

index 7047217..ca1c6ab 100644 (file)
@@ -44,6 +44,10 @@ components:
           type: array
           items:
             $ref: '#/components/schemas/RestCmHandle'
+        removedCmHandles:
+          type: array
+          items:
+            type: string
 
     RestCmHandle:
       required:
index 1ea95d3..ca5fa8e 100755 (executable)
@@ -42,6 +42,7 @@ import org.onap.cps.ncmp.api.models.GenericRequestBody;
 import org.onap.cps.ncmp.api.models.PersistenceCmHandle;
 import org.onap.cps.ncmp.api.models.PersistenceCmHandlesList;
 import org.onap.cps.spi.FetchDescendantsOption;
+import org.onap.cps.spi.exceptions.DataNodeNotFoundException;
 import org.onap.cps.spi.exceptions.DataValidationException;
 import org.onap.cps.spi.model.DataNode;
 import org.springframework.http.HttpStatus;
@@ -131,6 +132,9 @@ public class NetworkCmProxyDataServiceImpl implements NetworkCmProxyDataService
         if (dmiPluginRegistration.getUpdatedCmHandles() != null) {
             parseAndUpdateCmHandlesInDmiRegistration(dmiPluginRegistration);
         }
+        if (dmiPluginRegistration.getRemovedCmHandles() != null) {
+            parseAndRemoveCmHandlesInDmiRegistration(dmiPluginRegistration);
+        }
     }
 
     private void parseAndCreateCmHandlesInDmiRegistration(final DmiPluginRegistration dmiPluginRegistration) {
@@ -173,6 +177,17 @@ public class NetworkCmProxyDataServiceImpl implements NetworkCmProxyDataService
         }
     }
 
+    private void parseAndRemoveCmHandlesInDmiRegistration(final DmiPluginRegistration dmiPluginRegistration) {
+        for (final String cmHandle: dmiPluginRegistration.getRemovedCmHandles()) {
+            try {
+                cpsDataService.deleteListNodeData(NCMP_DATASPACE_NAME, NCMP_DMI_REGISTRY_ANCHOR,
+                    "/dmi-registry/cm-handles[@id='" + cmHandle + "']");
+            } catch (final DataNodeNotFoundException e) {
+                log.warn("Datanode {} not deleted message {}", cmHandle, e.getMessage());
+            }
+        }
+    }
+
     @Override
     public Object getResourceDataOperationalForCmHandle(final @NotNull String cmHandle,
                                                         final @NotNull String resourceIdentifier,
index fcf9e92..f5a0d79 100644 (file)
@@ -41,6 +41,6 @@ public class DmiPluginRegistration {
 
     private List<CmHandle> updatedCmHandles;
 
-    private List<CmHandle> deletedCmHandles;
+    private List<String> removedCmHandles;
 
 }
index f356ce6..c6c955f 100644 (file)
@@ -40,6 +40,8 @@ class NetworkCmProxyDataServiceImplSpec extends Specification {
 
     @Shared
     def persistenceCmHandle = new CmHandle()
+    @Shared
+    def cmHandlesArray = ['cmHandle001']
 
     def mockCpsDataService = Mock(CpsDataService)
     def mockCpsQueryService = Mock(CpsQueryService)
@@ -110,25 +112,28 @@ class NetworkCmProxyDataServiceImplSpec extends Specification {
 
     def 'Register or re-register a DMI Plugin with #scenario cm handles.'() {
         given: 'a registration '
-            def dmiRegistryAnchor = 'ncmp-dmi-registry'
             def dmiPluginRegistration = new DmiPluginRegistration()
             dmiPluginRegistration.dmiPlugin = 'my-server'
             persistenceCmHandle.cmHandleID = '123'
             persistenceCmHandle.cmHandleProperties = [name1: 'value1', name2: 'value2']
             dmiPluginRegistration.createdCmHandles = createdCmHandles
             dmiPluginRegistration.updatedCmHandles = updatedCmHandles
+            dmiPluginRegistration.removedCmHandles = removedCmHandles
             def expectedJsonData = '{"cm-handles":[{"id":"123","dmi-service-name":"my-server","additional-properties":[{"name":"name1","value":"value1"},{"name":"name2","value":"value2"}]}]}'
         when: 'registration is updated'
             objectUnderTest.updateDmiPluginRegistration(dmiPluginRegistration)
         then: 'the CPS save list node data is invoked with the expected parameters'
             expectedCallsToSaveNode * mockCpsDataService.saveListNodeData('NCMP-Admin', 'ncmp-dmi-registry', '/dmi-registry', expectedJsonData)
-        and: 'update Node and Child Data Nodes is invoked with correct parameter'
-            expectedCallsToUpdateNode * mockCpsDataService.updateNodeLeavesAndExistingDescendantLeaves('NCMP-Admin', dmiRegistryAnchor, '/dmi-registry', expectedJsonData)
+        and: 'update Node and Child Data Nodes is invoked with correct parameters'
+            expectedCallsToUpdateNode * mockCpsDataService.updateNodeLeavesAndExistingDescendantLeaves('NCMP-Admin',  'ncmp-dmi-registry', '/dmi-registry', expectedJsonData)
+        and : 'delete list data node is invoked with the correct parameters'
+            expectedCallsToDeleteListDataNode * mockCpsDataService.deleteListNodeData('NCMP-Admin', 'ncmp-dmi-registry', "/dmi-registry/cm-handles[@id='cmHandle001']")
         where:
-            scenario                | createdCmHandles       | updatedCmHandles       || expectedCallsToSaveNode   | expectedCallsToUpdateNode
-            'create'                | [persistenceCmHandle ] | []                     || 1                         | 0
-            'update'                | []                     | [persistenceCmHandle ] || 0                         | 1
-            'create and update'     | [persistenceCmHandle ] | [persistenceCmHandle ] || 1                         | 1
+            scenario                        | createdCmHandles       | updatedCmHandles       | removedCmHandles || expectedCallsToSaveNode   | expectedCallsToUpdateNode | expectedCallsToDeleteListDataNode
+            'create'                        | [persistenceCmHandle ] | []                     | []               || 1                         | 0                         | 0
+            'update'                        | []                     | [persistenceCmHandle ] | []               || 0                         | 1                         | 0
+            'delete'                        | []                     | []                     | cmHandlesArray   || 0                         | 0                         | 1
+            'create, update and delete'     | [persistenceCmHandle ] | [persistenceCmHandle ] | cmHandlesArray   || 1                         | 1                         | 1
 
     }
     def 'Get resource data for pass-through operational from dmi.'() {