From 65bc4fdc0264d75a9fc9b468a1ca329cb0b8c260 Mon Sep 17 00:00:00 2001 From: niamhcore Date: Wed, 8 Dec 2021 14:19:02 +0000 Subject: [PATCH] Delete anchor and schema set when a registration is removed Issue-ID: CPS-783 Signed-off-by: niamhcore Change-Id: I9644949e00c4de900b2609c1e70744ae5a243582 --- .../api/impl/NetworkCmProxyDataServiceImpl.java | 7 +++++-- ...rkCmProxyDataServiceImplRegistrationSpec.groovy | 24 ++++++++++++++-------- docs/release-notes.rst | 1 + 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImpl.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImpl.java index 363dbc211..faa2efe3a 100755 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImpl.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImpl.java @@ -24,6 +24,7 @@ package org.onap.cps.ncmp.api.impl; import static org.onap.cps.ncmp.api.impl.operations.DmiRequestBody.OperationEnum; +import static org.onap.cps.spi.CascadeDeleteAllowed.CASCADE_DELETE_ALLOWED; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; @@ -289,13 +290,15 @@ public class NetworkCmProxyDataServiceImpl implements NetworkCmProxyDataService } protected void syncModulesAndCreateAnchor(final PersistenceCmHandle persistenceCmHandle) { - fetchAndSyncModules(persistenceCmHandle); + syncAndCreateSchemaSet(persistenceCmHandle); createAnchor(persistenceCmHandle); } private void parseAndRemoveCmHandlesInDmiRegistration(final DmiPluginRegistration dmiPluginRegistration) { for (final String cmHandle : dmiPluginRegistration.getRemovedCmHandles()) { try { + cpsModuleService.deleteSchemaSet(NFP_OPERATIONAL_DATASTORE_DATASPACE_NAME, cmHandle, + CASCADE_DELETE_ALLOWED); cpsDataService.deleteListOrListElement(NCMP_DATASPACE_NAME, NCMP_DMI_REGISTRY_ANCHOR, "/dmi-registry/cm-handles[@id='" + cmHandle + "']", NO_TIMESTAMP); } catch (final DataNodeNotFoundException e) { @@ -304,7 +307,7 @@ public class NetworkCmProxyDataServiceImpl implements NetworkCmProxyDataService } } - private void fetchAndSyncModules(final PersistenceCmHandle persistenceCmHandle) { + private void syncAndCreateSchemaSet(final PersistenceCmHandle persistenceCmHandle) { final List moduleReferencesFromCmHandle = toModuleReferences(dmiModelOperations.getModuleReferences(persistenceCmHandle)); diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImplRegistrationSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImplRegistrationSpec.groovy index 86c01b407..41084541c 100644 --- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImplRegistrationSpec.groovy +++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImplRegistrationSpec.groovy @@ -23,6 +23,7 @@ package org.onap.cps.ncmp.api.impl import com.fasterxml.jackson.core.JsonProcessingException import com.fasterxml.jackson.databind.ObjectMapper import org.onap.cps.api.CpsDataService +import org.onap.cps.api.CpsModuleService import org.onap.cps.ncmp.api.impl.exception.NcmpException import org.onap.cps.ncmp.api.models.CmHandle import org.onap.cps.ncmp.api.models.DmiPluginRegistration @@ -31,6 +32,8 @@ import org.onap.cps.spi.exceptions.DataValidationException import spock.lang.Shared import spock.lang.Specification +import static org.onap.cps.spi.CascadeDeleteAllowed.CASCADE_DELETE_ALLOWED + class NetworkCmProxyDataServiceImplRegistrationSpec extends Specification { @Shared @@ -40,6 +43,7 @@ class NetworkCmProxyDataServiceImplRegistrationSpec extends Specification { def cmHandlesArray = ['cmHandle001'] def mockCpsDataService = Mock(CpsDataService) + def mockCpsModuleService = Mock(CpsModuleService) def spyObjectMapper = Spy(ObjectMapper) def noTimestamp = null @@ -62,16 +66,18 @@ class NetworkCmProxyDataServiceImplRegistrationSpec extends Specification { and: 'update node and child data nodes is invoked with correct parameters' expectedCallsToUpdateNode * mockCpsDataService.updateNodeLeavesAndExistingDescendantLeaves('NCMP-Admin', 'ncmp-dmi-registry', '/dmi-registry', expectedJsonData, noTimestamp) - and : 'delete list or list element is invoked with the correct parameters' - expectedCallsToDeleteListElement * mockCpsDataService.deleteListOrListElement('NCMP-Admin', + and: 'delete schema set is invoked with the correct parameters' + expectedCallsToDeleteSchemaSetAndListElement * mockCpsModuleService.deleteSchemaSet('NFP-Operational', 'cmHandle001', CASCADE_DELETE_ALLOWED) + and: 'delete list or list element is invoked with the correct parameters' + expectedCallsToDeleteSchemaSetAndListElement * mockCpsDataService.deleteListOrListElement('NCMP-Admin', 'ncmp-dmi-registry', "/dmi-registry/cm-handles[@id='cmHandle001']", noTimestamp) where: - scenario | createdCmHandles | updatedCmHandles | removedCmHandles || expectedCallsToSaveNode | expectedCallsToUpdateNode | expectedCallsToDeleteListElement - '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 - 'no valid data' | null | null | null || 0 | 0 | 0 + scenario | createdCmHandles | updatedCmHandles | removedCmHandles || expectedCallsToSaveNode | expectedCallsToUpdateNode | expectedCallsToDeleteSchemaSetAndListElement + '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 + 'no valid data' | null | null | null || 0 | 0 | 0 } def 'Register a DMI Plugin for the given cm-handle(s) without additional properties.'() { @@ -159,7 +165,7 @@ class NetworkCmProxyDataServiceImplRegistrationSpec extends Specification { } def getObjectUnderTestWithModelSyncDisabled() { - def objectUnderTest = Spy(new NetworkCmProxyDataServiceImpl(null, null, null, + def objectUnderTest = Spy(new NetworkCmProxyDataServiceImpl(null, null, mockCpsModuleService, mockCpsDataService, null, null, spyObjectMapper)) objectUnderTest.syncModulesAndCreateAnchor(*_) >> null return objectUnderTest diff --git a/docs/release-notes.rst b/docs/release-notes.rst index 1339d155d..84f4c8894 100755 --- a/docs/release-notes.rst +++ b/docs/release-notes.rst @@ -35,6 +35,7 @@ Bug Fixes - `CPS-762 `_ Query cm handles for module names returns incorrect cm handle identifiers - `CPS-788 `_ Yang Resource formatting is incorrect + - `CPS-783 `_ Remove cm handle does not completely remove all cm handle information Known Limitations, Issues and Workarounds ----------------------------------------- -- 2.16.6