From: ToineSiebelink Date: Mon, 18 Dec 2023 12:25:41 +0000 (+0000) Subject: Remove the dependency-cycle between beans X-Git-Tag: 3.4.1~7 X-Git-Url: https://gerrit.onap.org/r/gitweb?a=commitdiff_plain;h=a966bab93a17fcba4e7fc28354c01b3f0878fbbe;p=cps.git Remove the dependency-cycle between beans - Splitting admin service into AnchorService and DataspaceService (this resolves the cyclic dependency) - Improved Delete dataspace integration error tests (were depending on execution order, now independent) Issue-ID: CPS-871 Change-Id: I47efedb6eb4bd2900f72d689616b7b7b62df2938 Signed-off-by: halil.cakal Signed-off-by: ToineSiebelink --- diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/inventory/InventoryPersistenceImpl.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/inventory/InventoryPersistenceImpl.java index 159d8f345..a0aeac3e8 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/inventory/InventoryPersistenceImpl.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/inventory/InventoryPersistenceImpl.java @@ -29,7 +29,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import lombok.extern.slf4j.Slf4j; -import org.onap.cps.api.CpsAdminService; +import org.onap.cps.api.CpsAnchorService; import org.onap.cps.api.CpsDataService; import org.onap.cps.api.CpsModuleService; import org.onap.cps.ncmp.api.impl.utils.YangDataConverter; @@ -48,7 +48,7 @@ import org.springframework.stereotype.Component; public class InventoryPersistenceImpl extends NcmpPersistenceImpl implements InventoryPersistence { private final CpsModuleService cpsModuleService; - private final CpsAdminService cpsAdminService; + private final CpsAnchorService cpsAnchorService; private final CpsValidator cpsValidator; /** @@ -58,14 +58,14 @@ public class InventoryPersistenceImpl extends NcmpPersistenceImpl implements Inv * @param cpsDataService cps data service instance * @param cpsModuleService cps module service instance * @param cpsValidator cps validation service instance - * @param cpsAdminService cps admin service instance + * @param cpsAnchorService cps anchor service instance */ public InventoryPersistenceImpl(final JsonObjectMapper jsonObjectMapper, final CpsDataService cpsDataService, final CpsModuleService cpsModuleService, final CpsValidator cpsValidator, - final CpsAdminService cpsAdminService) { + final CpsAnchorService cpsAnchorService) { super(jsonObjectMapper, cpsDataService, cpsModuleService, cpsValidator); this.cpsModuleService = cpsModuleService; - this.cpsAdminService = cpsAdminService; + this.cpsAnchorService = cpsAnchorService; this.cpsValidator = cpsValidator; } @@ -160,7 +160,7 @@ public class InventoryPersistenceImpl extends NcmpPersistenceImpl implements Inv @Override public Collection getCmHandleIdsWithGivenModules(final Collection moduleNamesForQuery) { - return cpsAdminService.queryAnchorNames(NFP_OPERATIONAL_DATASTORE_DATASPACE_NAME, moduleNamesForQuery); + return cpsAnchorService.queryAnchorNames(NFP_OPERATIONAL_DATASTORE_DATASPACE_NAME, moduleNamesForQuery); } private static String createCmHandleXPath(final String cmHandleId) { diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/inventory/sync/ModuleSyncService.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/inventory/sync/ModuleSyncService.java index a6b85a5ca..b21a2f1f8 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/inventory/sync/ModuleSyncService.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/inventory/sync/ModuleSyncService.java @@ -35,7 +35,7 @@ import java.util.Optional; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.onap.cps.api.CpsAdminService; +import org.onap.cps.api.CpsAnchorService; import org.onap.cps.api.CpsDataService; import org.onap.cps.api.CpsModuleService; import org.onap.cps.ncmp.api.impl.inventory.CmHandleQueries; @@ -59,9 +59,9 @@ public class ModuleSyncService { private final DmiModelOperations dmiModelOperations; private final CpsModuleService cpsModuleService; - private final CpsAdminService cpsAdminService; private final CmHandleQueries cmHandleQueries; private final CpsDataService cpsDataService; + private final CpsAnchorService cpsAnchorService; private final JsonObjectMapper jsonObjectMapper; private final Map> moduleSetTagCache; private static final Map NO_NEW_MODULES = Collections.emptyMap(); @@ -105,7 +105,7 @@ public class ModuleSyncService { } } if (!inUpgrade) { - cpsAdminService.createAnchor(NFP_OPERATIONAL_DATASTORE_DATASPACE_NAME, cmHandleId, cmHandleId); + cpsAnchorService.createAnchor(NFP_OPERATIONAL_DATASTORE_DATASPACE_NAME, cmHandleId, cmHandleId); } setCmHandleModuleSetTag(yangModelCmHandle, moduleSetTag); } diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/init/AbstractModelLoader.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/init/AbstractModelLoader.java index fd5f2b0ed..bd8dec4dc 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/init/AbstractModelLoader.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/init/AbstractModelLoader.java @@ -29,8 +29,9 @@ import java.util.Map; import lombok.NonNull; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.onap.cps.api.CpsAdminService; +import org.onap.cps.api.CpsAnchorService; import org.onap.cps.api.CpsDataService; +import org.onap.cps.api.CpsDataspaceService; import org.onap.cps.api.CpsModuleService; import org.onap.cps.ncmp.api.impl.exception.NcmpStartUpException; import org.onap.cps.spi.CascadeDeleteAllowed; @@ -44,9 +45,10 @@ import org.springframework.boot.context.event.ApplicationReadyEvent; @RequiredArgsConstructor abstract class AbstractModelLoader implements ModelLoader { - private final CpsAdminService cpsAdminService; + private final CpsDataspaceService cpsDataspaceService; private final CpsModuleService cpsModuleService; private final CpsDataService cpsDataService; + private final CpsAnchorService cpsAnchorService; private static final int EXIT_CODE_ON_ERROR = 1; @@ -71,7 +73,7 @@ abstract class AbstractModelLoader implements ModelLoader { void waitUntilDataspaceIsAvailable(final String dataspaceName) { log.info("Model Loader start-up, waiting for database to be ready"); int attemptCount = 0; - while (cpsAdminService.getDataspace(dataspaceName) == null) { + while (cpsDataspaceService.getDataspace(dataspaceName) == null) { if (attemptCount < maximumAttemptCount) { try { Thread.sleep(attemptCount * retryTimeMs); @@ -111,7 +113,7 @@ abstract class AbstractModelLoader implements ModelLoader { void createAnchor(final String dataspaceName, final String schemaSetName, final String anchorName) { try { - cpsAdminService.createAnchor(dataspaceName, schemaSetName, anchorName); + cpsAnchorService.createAnchor(dataspaceName, schemaSetName, anchorName); } catch (final AlreadyDefinedException alreadyDefinedException) { log.warn("Creating new anchor failed as anchor already exists"); } catch (final Exception exception) { @@ -134,7 +136,7 @@ abstract class AbstractModelLoader implements ModelLoader { void updateAnchorSchemaSet(final String dataspaceName, final String anchorName, final String schemaSetName) { try { - cpsAdminService.updateAnchorSchemaSet(dataspaceName, anchorName, schemaSetName); + cpsAnchorService.updateAnchorSchemaSet(dataspaceName, anchorName, schemaSetName); } catch (final Exception exception) { log.error("Updating schema set failed: {}", exception.getMessage()); throw new NcmpStartUpException("Updating schema set failed", exception.getMessage()); diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/init/CmDataSubscriptionModelLoader.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/init/CmDataSubscriptionModelLoader.java index ade31e9ce..c0f0279ad 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/init/CmDataSubscriptionModelLoader.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/init/CmDataSubscriptionModelLoader.java @@ -23,8 +23,9 @@ package org.onap.cps.ncmp.init; import static org.onap.cps.ncmp.api.impl.ncmppersistence.NcmpPersistence.NCMP_DATASPACE_NAME; import lombok.extern.slf4j.Slf4j; -import org.onap.cps.api.CpsAdminService; +import org.onap.cps.api.CpsAnchorService; import org.onap.cps.api.CpsDataService; +import org.onap.cps.api.CpsDataspaceService; import org.onap.cps.api.CpsModuleService; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @@ -45,10 +46,11 @@ public class CmDataSubscriptionModelLoader extends AbstractModelLoader { - public CmDataSubscriptionModelLoader(final CpsAdminService cpsAdminService, + public CmDataSubscriptionModelLoader(final CpsDataspaceService cpsDataspaceService, final CpsModuleService cpsModuleService, - final CpsDataService cpsDataService) { - super(cpsAdminService, cpsModuleService, cpsDataService); + final CpsDataService cpsDataService, + final CpsAnchorService cpsAnchorService) { + super(cpsDataspaceService, cpsModuleService, cpsDataService, cpsAnchorService); } @Value("${ncmp.model-loader.subscription:true}") diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/init/InventoryModelLoader.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/init/InventoryModelLoader.java index a27eb6f7c..0e562cdd8 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/init/InventoryModelLoader.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/init/InventoryModelLoader.java @@ -24,8 +24,9 @@ import static org.onap.cps.ncmp.api.impl.ncmppersistence.NcmpPersistence.NCMP_DA import static org.onap.cps.ncmp.api.impl.ncmppersistence.NcmpPersistence.NCMP_DMI_REGISTRY_ANCHOR; import lombok.extern.slf4j.Slf4j; -import org.onap.cps.api.CpsAdminService; +import org.onap.cps.api.CpsAnchorService; import org.onap.cps.api.CpsDataService; +import org.onap.cps.api.CpsDataspaceService; import org.onap.cps.api.CpsModuleService; import org.springframework.stereotype.Service; @@ -36,10 +37,11 @@ public class InventoryModelLoader extends AbstractModelLoader { private static final String NEW_MODEL_FILE_NAME = "dmi-registry@2023-11-27.yang"; private static final String NEW_SCHEMA_SET_NAME = "dmi-registry-2023-11-27"; - public InventoryModelLoader(final CpsAdminService cpsAdminService, + public InventoryModelLoader(final CpsDataspaceService cpsDataspaceService, final CpsModuleService cpsModuleService, - final CpsDataService cpsDataService) { - super(cpsAdminService, cpsModuleService, cpsDataService); + final CpsDataService cpsDataService, + final CpsAnchorService cpsAnchorService) { + super(cpsDataspaceService, cpsModuleService, cpsDataService, cpsAnchorService); } @Override 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 013341f4b..f565ede39 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 @@ -210,12 +210,10 @@ class NetworkCmProxyDataServiceImplRegistrationSpec extends Specification { } and: 'state handler is invoked with the expected parameters' 1 * mockLcmEventsCmHandleStateHandler.initiateStateAdvised(_) >> { - args -> - { - def cmHandleStatePerCmHandle = (args[0] as List) - cmHandleStatePerCmHandle.each { - assert (it.id == 'cmhandle' && it.dmiServiceName == 'my-server') - } + args -> { + def yangModelCmHandles = args[0] + assert yangModelCmHandles.id == ['cmhandle'] + assert yangModelCmHandles.dmiServiceName == ['my-server'] } } where: diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/inventory/InventoryPersistenceImplSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/inventory/InventoryPersistenceImplSpec.groovy index bb4eebd40..297f18c98 100644 --- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/inventory/InventoryPersistenceImplSpec.groovy +++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/inventory/InventoryPersistenceImplSpec.groovy @@ -22,6 +22,8 @@ package org.onap.cps.ncmp.api.impl.inventory +import org.onap.cps.api.CpsAnchorService + import static org.onap.cps.ncmp.api.impl.ncmppersistence.NcmpPersistence.NFP_OPERATIONAL_DATASTORE_DATASPACE_NAME import static org.onap.cps.ncmp.api.impl.ncmppersistence.NcmpPersistence.NCMP_DATASPACE_NAME import static org.onap.cps.ncmp.api.impl.ncmppersistence.NcmpPersistence.NCMP_DMI_REGISTRY_ANCHOR @@ -30,12 +32,8 @@ import static org.onap.cps.ncmp.api.impl.ncmppersistence.NcmpPersistence.NO_TIME import static org.onap.cps.spi.FetchDescendantsOption.INCLUDE_ALL_DESCENDANTS import com.fasterxml.jackson.databind.ObjectMapper -import org.onap.cps.api.CpsAdminService import org.onap.cps.api.CpsDataService import org.onap.cps.api.CpsModuleService -import org.onap.cps.ncmp.api.impl.inventory.CmHandleState -import org.onap.cps.ncmp.api.impl.inventory.CompositeState -import org.onap.cps.ncmp.api.impl.inventory.InventoryPersistenceImpl import org.onap.cps.ncmp.api.impl.yangmodels.YangModelCmHandle import org.onap.cps.spi.CascadeDeleteAllowed import org.onap.cps.spi.FetchDescendantsOption @@ -58,12 +56,12 @@ class InventoryPersistenceImplSpec extends Specification { def mockCpsModuleService = Mock(CpsModuleService) - def mockCpsAdminService = Mock(CpsAdminService) + def mockCpsAnchorService = Mock(CpsAnchorService) def mockCpsValidator = Mock(CpsValidator) def objectUnderTest = new InventoryPersistenceImpl(spiedJsonObjectMapper, mockCpsDataService, mockCpsModuleService, - mockCpsValidator, mockCpsAdminService) + mockCpsValidator, mockCpsAnchorService) def formattedDateAndTime = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ") .format(OffsetDateTime.of(2022, 12, 31, 20, 30, 40, 1, ZoneOffset.UTC)) @@ -284,7 +282,7 @@ class InventoryPersistenceImplSpec extends Specification { when: 'the method to get cm handles is called' objectUnderTest.getCmHandleIdsWithGivenModules(['sample-module-name']) then: 'the admin persistence service method to query anchors is invoked once with the same parameter' - 1 * mockCpsAdminService.queryAnchorNames(NFP_OPERATIONAL_DATASTORE_DATASPACE_NAME, ['sample-module-name']) + 1 * mockCpsAnchorService.queryAnchorNames(NFP_OPERATIONAL_DATASTORE_DATASPACE_NAME, ['sample-module-name']) } def 'Replace list content'() { diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/inventory/sync/ModuleSyncServiceSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/inventory/sync/ModuleSyncServiceSpec.groovy index 2ded84fac..de783ed2c 100644 --- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/inventory/sync/ModuleSyncServiceSpec.groovy +++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/inventory/sync/ModuleSyncServiceSpec.groovy @@ -20,13 +20,14 @@ package org.onap.cps.ncmp.api.impl.inventory.sync +import org.onap.cps.api.CpsAnchorService + import static org.onap.cps.ncmp.api.impl.ncmppersistence.NcmpPersistence.NFP_OPERATIONAL_DATASTORE_DATASPACE_NAME import static org.onap.cps.ncmp.api.impl.inventory.LockReasonCategory.MODULE_UPGRADE import org.onap.cps.ncmp.api.impl.inventory.CmHandleState import org.onap.cps.spi.FetchDescendantsOption import org.onap.cps.spi.model.DataNode -import org.onap.cps.api.CpsAdminService import org.onap.cps.api.CpsDataService import org.onap.cps.api.CpsModuleService import org.onap.cps.spi.model.DataNodeBuilder @@ -45,14 +46,14 @@ class ModuleSyncServiceSpec extends Specification { def mockCpsModuleService = Mock(CpsModuleService) def mockDmiModelOperations = Mock(DmiModelOperations) - def mockCpsAdminService = Mock(CpsAdminService) + def mockCpsAnchorService = Mock(CpsAnchorService) def mockCmHandleQueries = Mock(CmHandleQueries) def mockCpsDataService = Mock(CpsDataService) def mockJsonObjectMapper = Mock(JsonObjectMapper) def mockModuleSetTagCache = [:] - def objectUnderTest = new ModuleSyncService(mockDmiModelOperations, mockCpsModuleService, mockCpsAdminService, - mockCmHandleQueries, mockCpsDataService, mockJsonObjectMapper, mockModuleSetTagCache) + def objectUnderTest = new ModuleSyncService(mockDmiModelOperations, mockCpsModuleService, + mockCmHandleQueries, mockCpsDataService, mockCpsAnchorService, mockJsonObjectMapper, mockModuleSetTagCache) def expectedDataspaceName = NFP_OPERATIONAL_DATASTORE_DATASPACE_NAME def static cmHandleWithModuleSetTag = new DataNodeBuilder().withXpath("//cm-handles[@module-set-tag='tag-1'][@id='otherId']").withAnchor('otherId').build() @@ -78,7 +79,7 @@ class ModuleSyncServiceSpec extends Specification { then: 'create schema set from module is invoked with correct parameters' 1 * mockCpsModuleService.createSchemaSetFromModules(NFP_OPERATIONAL_DATASTORE_DATASPACE_NAME, 'ch-1', newModuleNameContentToMap, moduleReferences) and: 'anchor is created with the correct parameters' - 1 * mockCpsAdminService.createAnchor(NFP_OPERATIONAL_DATASTORE_DATASPACE_NAME, 'ch-1', 'ch-1') + 1 * mockCpsAnchorService.createAnchor(NFP_OPERATIONAL_DATASTORE_DATASPACE_NAME, 'ch-1', 'ch-1') where: 'the following parameters are used' scenario | existingModuleResourcesInCps | identifiedNewModuleReferences | newModuleNameContentToMap | moduleSetTag 'one new module' | [['module2': '2'], ['module3': '3']] | [['module1': '1']] | [module1: 'some yang source'] | '' @@ -115,7 +116,7 @@ class ModuleSyncServiceSpec extends Specification { and: 'create schema set from module is invoked for the upgraded cm handle' expectedCallsToCeateSchemaSet * mockCpsModuleService.createSchemaSetFromModules(NFP_OPERATIONAL_DATASTORE_DATASPACE_NAME, 'upgraded-ch', [:], moduleReferences) and: 'No anchor is created for the upgraded cm handle' - 0 * mockCpsAdminService.createAnchor(*_) + 0 * mockCpsAnchorService.createAnchor(*_) where: 'the following parameters are used' scenario | populateCache | existingCmHandlesWithSameTag || expectedCallsToUpgradeSchemaSet | expectedCallsToCeateSchemaSet 'new' | false | [] || 0 | 1 diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/init/AbstractModelLoaderSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/init/AbstractModelLoaderSpec.groovy index e5ed21f1c..3b1c25ba6 100644 --- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/init/AbstractModelLoaderSpec.groovy +++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/init/AbstractModelLoaderSpec.groovy @@ -23,7 +23,8 @@ package org.onap.cps.ncmp.init import ch.qos.logback.classic.Level import ch.qos.logback.classic.Logger import ch.qos.logback.core.read.ListAppender -import org.onap.cps.api.CpsAdminService +import org.onap.cps.api.CpsDataspaceService +import org.onap.cps.api.CpsAnchorService import org.onap.cps.api.CpsDataService import org.onap.cps.api.CpsModuleService import org.onap.cps.ncmp.api.impl.exception.NcmpStartUpException @@ -37,10 +38,11 @@ import spock.lang.Specification class AbstractModelLoaderSpec extends Specification { - def mockCpsAdminService = Mock(CpsAdminService) + def mockCpsDataspaceService = Mock(CpsDataspaceService) def mockCpsModuleService = Mock(CpsModuleService) def mockCpsDataService = Mock(CpsDataService) - def objectUnderTest = Spy(new TestModelLoader(mockCpsAdminService, mockCpsModuleService, mockCpsDataService)) + def mockCpsAnchorService = Mock(CpsAnchorService) + def objectUnderTest = Spy(new TestModelLoader(mockCpsDataspaceService, mockCpsModuleService, mockCpsDataService, mockCpsAnchorService)) def applicationContext = new AnnotationConfigApplicationContext() @@ -141,12 +143,12 @@ class AbstractModelLoaderSpec extends Specification { when: 'creating an anchor' objectUnderTest.createAnchor('some dataspace','some schema set','new name') then: 'the operation is delegated to the admin service' - 1 * mockCpsAdminService.createAnchor('some dataspace','some schema set', 'new name') + 1 * mockCpsAnchorService.createAnchor('some dataspace','some schema set', 'new name') } def 'Create anchor with already defined exception.'() { given: 'the admin service throws an already defined exception' - mockCpsAdminService.createAnchor(*_)>> { throw AlreadyDefinedException.forAnchor('name','context',null) } + mockCpsAnchorService.createAnchor(*_)>> { throw AlreadyDefinedException.forAnchor('name','context',null) } when: 'attempt to create anchor' objectUnderTest.createAnchor('some dataspace','some schema set','new name') then: 'the exception is ignored i.e. no exception thrown up' @@ -158,7 +160,7 @@ class AbstractModelLoaderSpec extends Specification { def 'Create anchor with any other exception.'() { given: 'the admin service throws a exception' - mockCpsAdminService.createAnchor(*_)>> { throw new RuntimeException('test message') } + mockCpsAnchorService.createAnchor(*_)>> { throw new RuntimeException('test message') } when: 'attempt to create anchor' objectUnderTest.createAnchor('some dataspace','some schema set','new name') then: 'a startup exception with correct message and details is thrown' @@ -201,12 +203,12 @@ class AbstractModelLoaderSpec extends Specification { when: 'a schema set for an anchor is updated' objectUnderTest.updateAnchorSchemaSet('some dataspace', 'anchor', 'new schema set') then: 'the request is delegated to the admin service' - 1 * mockCpsAdminService.updateAnchorSchemaSet('some dataspace', 'anchor', 'new schema set') + 1 * mockCpsAnchorService.updateAnchorSchemaSet('some dataspace', 'anchor', 'new schema set') } def 'Update anchor schema set with exception.'() { given: 'the admin service throws an exception' - mockCpsAdminService.updateAnchorSchemaSet(*_) >> { throw new RuntimeException('test message') } + mockCpsAnchorService.updateAnchorSchemaSet(*_) >> { throw new RuntimeException('test message') } when: 'a schema set for an anchor is updated' objectUnderTest.updateAnchorSchemaSet('some dataspace', 'anchor', 'new schema set') then: 'a startup exception with correct message and details is thrown' @@ -217,10 +219,11 @@ class AbstractModelLoaderSpec extends Specification { class TestModelLoader extends AbstractModelLoader { - TestModelLoader(final CpsAdminService cpsAdminService, + TestModelLoader(final CpsDataspaceService cpsDataspaceService, final CpsModuleService cpsModuleService, - final CpsDataService cpsDataService) { - super(cpsAdminService, cpsModuleService, cpsDataService) + final CpsDataService cpsDataService, + final CpsAnchorService cpsAnchorService) { + super(cpsDataspaceService, cpsModuleService, cpsDataService, cpsAnchorService) super.maximumAttemptCount = 2 super.retryTimeMs = 1 } diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/init/CmDataSubscriptionModelLoaderSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/init/CmDataSubscriptionModelLoaderSpec.groovy index 06627129a..aed495ec4 100644 --- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/init/CmDataSubscriptionModelLoaderSpec.groovy +++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/init/CmDataSubscriptionModelLoaderSpec.groovy @@ -20,12 +20,14 @@ package org.onap.cps.ncmp.init +import org.onap.cps.api.CpsAnchorService + import static org.onap.cps.ncmp.api.impl.ncmppersistence.NcmpPersistence.NCMP_DATASPACE_NAME import ch.qos.logback.classic.Level import ch.qos.logback.classic.Logger import ch.qos.logback.core.read.ListAppender -import org.onap.cps.api.CpsAdminService +import org.onap.cps.api.CpsDataspaceService import org.onap.cps.api.CpsDataService import org.onap.cps.api.CpsModuleService import org.onap.cps.spi.model.Dataspace @@ -36,10 +38,11 @@ import spock.lang.Specification class CmDataSubscriptionModelLoaderSpec extends Specification { - def mockCpsAdminService = Mock(CpsAdminService) + def mockCpsDataspaceService = Mock(CpsDataspaceService) def mockCpsModuleService = Mock(CpsModuleService) def mockCpsDataService = Mock(CpsDataService) - def objectUnderTest = new CmDataSubscriptionModelLoader(mockCpsAdminService, mockCpsModuleService, mockCpsDataService) + def mockCpsAnchorService = Mock(CpsAnchorService) + def objectUnderTest = new CmDataSubscriptionModelLoader(mockCpsDataspaceService, mockCpsModuleService, mockCpsDataService, mockCpsAnchorService) def applicationContext = new AnnotationConfigApplicationContext() @@ -65,13 +68,13 @@ class CmDataSubscriptionModelLoaderSpec extends Specification { given:'model loader is enabled' objectUnderTest.subscriptionModelLoaderEnabled = true and: 'dataspace is ready for use' - mockCpsAdminService.getDataspace(NCMP_DATASPACE_NAME) >> new Dataspace('') + mockCpsDataspaceService.getDataspace(NCMP_DATASPACE_NAME) >> new Dataspace('') when: 'the application is ready' objectUnderTest.onApplicationEvent(Mock(ApplicationReadyEvent)) then: 'the module service to create schema set is called once' 1 * mockCpsModuleService.createSchemaSet(NCMP_DATASPACE_NAME, 'cm-data-subscriptions', expectedYangResourcesToContentMap) and: 'the admin service to create an anchor set is called once' - 1 * mockCpsAdminService.createAnchor(NCMP_DATASPACE_NAME, 'cm-data-subscriptions', 'cm-data-subscriptions') + 1 * mockCpsAnchorService.createAnchor(NCMP_DATASPACE_NAME, 'cm-data-subscriptions', 'cm-data-subscriptions') and: 'the data service to create a top level datanode is called once' 1 * mockCpsDataService.saveData(NCMP_DATASPACE_NAME, 'cm-data-subscriptions', '{"datastores":{}}', _) } @@ -82,7 +85,7 @@ class CmDataSubscriptionModelLoaderSpec extends Specification { when: 'application is ready' objectUnderTest.onApplicationEvent(Mock(ApplicationReadyEvent)) then: 'no interaction with admin service' - 0 * mockCpsAdminService.getDataspace(_) + 0 * mockCpsDataspaceService.getDataspace(_) then: 'a message is logged that the function is disabled' def logs = loggingListAppender.list.toString() assert logs.contains('Subscription Model Loader is disabled') diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/init/InventoryModelLoaderSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/init/InventoryModelLoaderSpec.groovy index 4eb2ca3c7..5557993ab 100644 --- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/init/InventoryModelLoaderSpec.groovy +++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/init/InventoryModelLoaderSpec.groovy @@ -20,13 +20,15 @@ package org.onap.cps.ncmp.init +import org.onap.cps.api.CpsAnchorService + import static org.onap.cps.ncmp.api.impl.ncmppersistence.NcmpPersistence.NCMP_DATASPACE_NAME import static org.onap.cps.ncmp.api.impl.ncmppersistence.NcmpPersistence.NCMP_DMI_REGISTRY_ANCHOR import ch.qos.logback.classic.Level import ch.qos.logback.classic.Logger import ch.qos.logback.core.read.ListAppender -import org.onap.cps.api.CpsAdminService +import org.onap.cps.api.CpsDataspaceService import org.onap.cps.api.CpsDataService import org.onap.cps.api.CpsModuleService import org.onap.cps.spi.model.Dataspace @@ -37,10 +39,11 @@ import spock.lang.Specification class InventoryModelLoaderSpec extends Specification { - def mockCpsAdminService = Mock(CpsAdminService) + def mockCpsAdminService = Mock(CpsDataspaceService) def mockCpsModuleService = Mock(CpsModuleService) def mockCpsDataService = Mock(CpsDataService) - def objectUnderTest = new InventoryModelLoader(mockCpsAdminService, mockCpsModuleService, mockCpsDataService) + def mockCpsAnchorService = Mock(CpsAnchorService) + def objectUnderTest = new InventoryModelLoader(mockCpsAdminService, mockCpsModuleService, mockCpsDataService, mockCpsAnchorService) def applicationContext = new AnnotationConfigApplicationContext() @@ -70,7 +73,7 @@ class InventoryModelLoaderSpec extends Specification { then: 'the module service is used to create the new schema set from the correct resource' 1 * mockCpsModuleService.createSchemaSet(NCMP_DATASPACE_NAME, 'dmi-registry-2023-11-27', expectedYangResourceToContentMap) and: 'the admin service is used to update the anchor' - 1 * mockCpsAdminService.updateAnchorSchemaSet(NCMP_DATASPACE_NAME, NCMP_DMI_REGISTRY_ANCHOR, 'dmi-registry-2023-11-27') + 1 * mockCpsAnchorService.updateAnchorSchemaSet(NCMP_DATASPACE_NAME, NCMP_DMI_REGISTRY_ANCHOR, 'dmi-registry-2023-11-27') and: 'No schema sets are being removed by the module service (yet)' 0 * mockCpsModuleService.deleteSchemaSet(NCMP_DATASPACE_NAME, _, _) } diff --git a/cps-rest/src/main/java/org/onap/cps/rest/controller/AdminRestController.java b/cps-rest/src/main/java/org/onap/cps/rest/controller/AdminRestController.java index 993dad58c..9b78f8520 100755 --- a/cps-rest/src/main/java/org/onap/cps/rest/controller/AdminRestController.java +++ b/cps-rest/src/main/java/org/onap/cps/rest/controller/AdminRestController.java @@ -33,7 +33,8 @@ import java.util.Collection; import java.util.List; import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; -import org.onap.cps.api.CpsAdminService; +import org.onap.cps.api.CpsAnchorService; +import org.onap.cps.api.CpsDataspaceService; import org.onap.cps.api.CpsModuleService; import org.onap.cps.rest.api.CpsAdminApi; import org.onap.cps.rest.model.AnchorDetails; @@ -53,9 +54,10 @@ import org.springframework.web.multipart.MultipartFile; @RequiredArgsConstructor public class AdminRestController implements CpsAdminApi { - private final CpsAdminService cpsAdminService; + private final CpsDataspaceService cpsDataspaceService; private final CpsModuleService cpsModuleService; private final CpsRestInputMapper cpsRestInputMapper; + private final CpsAnchorService cpsAnchorService; /** * Create a dataspace. @@ -65,7 +67,7 @@ public class AdminRestController implements CpsAdminApi { */ @Override public ResponseEntity createDataspace(@NotNull @Valid final String dataspaceName) { - cpsAdminService.createDataspace(dataspaceName); + cpsDataspaceService.createDataspace(dataspaceName); return new ResponseEntity<>(dataspaceName, HttpStatus.CREATED); } @@ -77,7 +79,7 @@ public class AdminRestController implements CpsAdminApi { */ @Override public ResponseEntity createDataspaceV2(@NotNull @Valid final String dataspaceName) { - cpsAdminService.createDataspace(dataspaceName); + cpsDataspaceService.createDataspace(dataspaceName); return new ResponseEntity<>(HttpStatus.CREATED); } @@ -89,7 +91,7 @@ public class AdminRestController implements CpsAdminApi { */ @Override public ResponseEntity deleteDataspace(final String apiVersion, final String dataspaceName) { - cpsAdminService.deleteDataspace(dataspaceName); + cpsDataspaceService.deleteDataspace(dataspaceName); return new ResponseEntity<>(HttpStatus.NO_CONTENT); } @@ -184,7 +186,7 @@ public class AdminRestController implements CpsAdminApi { @Override public ResponseEntity createAnchor(final String dataspaceName, @NotNull @Valid final String schemaSetName, @NotNull @Valid final String anchorName) { - cpsAdminService.createAnchor(dataspaceName, schemaSetName, anchorName); + cpsAnchorService.createAnchor(dataspaceName, schemaSetName, anchorName); return new ResponseEntity<>(anchorName, HttpStatus.CREATED); } @@ -199,7 +201,7 @@ public class AdminRestController implements CpsAdminApi { @Override public ResponseEntity createAnchorV2(final String dataspaceName, @NotNull @Valid final String schemaSetName, @NotNull @Valid final String anchorName) { - cpsAdminService.createAnchor(dataspaceName, schemaSetName, anchorName); + cpsAnchorService.createAnchor(dataspaceName, schemaSetName, anchorName); return new ResponseEntity<>(HttpStatus.CREATED); } @@ -214,7 +216,7 @@ public class AdminRestController implements CpsAdminApi { @Override public ResponseEntity deleteAnchor(final String apiVersion, final String dataspaceName, final String anchorName) { - cpsAdminService.deleteAnchor(dataspaceName, anchorName); + cpsAnchorService.deleteAnchor(dataspaceName, anchorName); return new ResponseEntity<>(HttpStatus.NO_CONTENT); } @@ -229,7 +231,7 @@ public class AdminRestController implements CpsAdminApi { @Override public ResponseEntity getAnchor(final String apiVersion, final String dataspaceName, final String anchorName) { - final var anchor = cpsAdminService.getAnchor(dataspaceName, anchorName); + final var anchor = cpsAnchorService.getAnchor(dataspaceName, anchorName); final var anchorDetails = cpsRestInputMapper.toAnchorDetails(anchor); return new ResponseEntity<>(anchorDetails, HttpStatus.OK); } @@ -244,7 +246,7 @@ public class AdminRestController implements CpsAdminApi { @Override public ResponseEntity> getAnchors(final String apiVersion, final String dataspaceName) { - final Collection anchors = cpsAdminService.getAnchors(dataspaceName); + final Collection anchors = cpsAnchorService.getAnchors(dataspaceName); final List anchorDetails = anchors.stream().map(cpsRestInputMapper::toAnchorDetails) .collect(Collectors.toList()); return new ResponseEntity<>(anchorDetails, HttpStatus.OK); @@ -252,7 +254,7 @@ public class AdminRestController implements CpsAdminApi { @Override public ResponseEntity> getAllDataspaces(final String apiVersion) { - final Collection dataspaces = cpsAdminService.getAllDataspaces(); + final Collection dataspaces = cpsDataspaceService.getAllDataspaces(); final List dataspaceDetails = dataspaces.stream().map(cpsRestInputMapper::toDataspaceDetails) .collect(Collectors.toList()); return new ResponseEntity<>(dataspaceDetails, HttpStatus.OK); @@ -260,7 +262,7 @@ public class AdminRestController implements CpsAdminApi { @Override public ResponseEntity getDataspace(final String apiVersion, final String dataspaceName) { - final Dataspace dataspace = cpsAdminService.getDataspace(dataspaceName); + final Dataspace dataspace = cpsDataspaceService.getDataspace(dataspaceName); final DataspaceDetails dataspaceDetails = cpsRestInputMapper.toDataspaceDetails(dataspace); return new ResponseEntity<>(dataspaceDetails, HttpStatus.OK); } diff --git a/cps-rest/src/test/groovy/org/onap/cps/rest/controller/AdminRestControllerSpec.groovy b/cps-rest/src/test/groovy/org/onap/cps/rest/controller/AdminRestControllerSpec.groovy index f81efd669..81ac511a9 100755 --- a/cps-rest/src/test/groovy/org/onap/cps/rest/controller/AdminRestControllerSpec.groovy +++ b/cps-rest/src/test/groovy/org/onap/cps/rest/controller/AdminRestControllerSpec.groovy @@ -23,6 +23,8 @@ package org.onap.cps.rest.controller +import org.onap.cps.api.CpsAnchorService + import static org.onap.cps.spi.CascadeDeleteAllowed.CASCADE_DELETE_PROHIBITED import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get @@ -30,7 +32,7 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilder import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post import org.mapstruct.factory.Mappers -import org.onap.cps.api.CpsAdminService +import org.onap.cps.api.CpsDataspaceService import org.onap.cps.api.CpsModuleService import org.onap.cps.spi.exceptions.AlreadyDefinedException import org.onap.cps.spi.exceptions.SchemaSetInUseException @@ -56,7 +58,10 @@ class AdminRestControllerSpec extends Specification { CpsModuleService mockCpsModuleService = Mock() @SpringBean - CpsAdminService mockCpsAdminService = Mock() + CpsDataspaceService mockCpsDataspaceService = Mock() + + @SpringBean + CpsAnchorService mockCpsAnchorService = Mock() @SpringBean CpsRestInputMapper cpsRestInputMapper = Mappers.getMapper(CpsRestInputMapper) @@ -76,26 +81,27 @@ class AdminRestControllerSpec extends Specification { def 'Create new dataspace with #scenario.'() { when: 'post is invoked' def response = - mvc.perform( - post("/cps/api/${apiVersion}/dataspaces") - .param('dataspace-name', dataspaceName)) - .andReturn().response + mvc.perform( + post("/cps/api/${apiVersion}/dataspaces") + .param('dataspace-name', dataspaceName)) + .andReturn().response then: 'service method is invoked with expected parameters' - 1 * mockCpsAdminService.createDataspace(dataspaceName) + 1 * mockCpsDataspaceService.createDataspace(dataspaceName) and: 'dataspace is create successfully' response.status == HttpStatus.CREATED.value() assert response.getContentAsString() == expectedResponseBody where: 'following cases are tested' - scenario | apiVersion || expectedResponseBody - 'V1 API' | 'v1' || 'my_dataspace' - 'V2 API' | 'v2' || '' - } + scenario | apiVersion || expectedResponseBody + 'V1 API' | 'v1' || 'my_dataspace' + 'V2 API' | 'v2' || '' + } + def 'Create dataspace over existing with same name.'() { given: 'an endpoint' def createDataspaceEndpoint = "$basePath/v1/dataspaces" and: 'the service method throws an exception indicating the dataspace is already defined' def thrownException = new AlreadyDefinedException(dataspaceName, new RuntimeException()) - mockCpsAdminService.createDataspace(dataspaceName) >> { throw thrownException } + mockCpsDataspaceService.createDataspace(dataspaceName) >> { throw thrownException } when: 'post is invoked' def response = mvc.perform( @@ -108,7 +114,7 @@ class AdminRestControllerSpec extends Specification { def 'Get a dataspace.'() { given: 'service method returns a dataspace' - mockCpsAdminService.getDataspace(dataspaceName) >> dataspace + mockCpsDataspaceService.getDataspace(dataspaceName) >> dataspace and: 'an endpoint' def getDataspaceEndpoint = "$basePath/v1/admin/dataspaces/$dataspaceName" when: 'get dataspace API is invoked' @@ -120,7 +126,7 @@ class AdminRestControllerSpec extends Specification { def 'Get all dataspaces.'() { given: 'service method returns all dataspace' - mockCpsAdminService.getAllDataspaces() >> [dataspace, new Dataspace(name: "dataspace-test2")] + mockCpsDataspaceService.getAllDataspaces() >> [dataspace, new Dataspace(name: "dataspace-test2")] and: 'an endpoint' def getAllDataspaceEndpoint = "$basePath/v1/admin/dataspaces" when: 'get all dataspace API is invoked' @@ -317,7 +323,7 @@ class AdminRestControllerSpec extends Specification { .params(requestParams as MultiValueMap)) .andReturn().response then: 'anchor is created successfully' - 1 * mockCpsAdminService.createAnchor(dataspaceName, schemaSetName, anchorName) + 1 * mockCpsAnchorService.createAnchor(dataspaceName, schemaSetName, anchorName) assert response.status == HttpStatus.CREATED.value() assert response.getContentAsString() == expectedResponseBody where: 'following cases are tested' @@ -328,7 +334,7 @@ class AdminRestControllerSpec extends Specification { def 'Get existing anchor.'() { given: 'service method returns a list of anchors' - mockCpsAdminService.getAnchors(dataspaceName) >> [anchor] + mockCpsAnchorService.getAnchors(dataspaceName) >> [anchor] and: 'an endpoint' def anchorEndpoint = "$basePath/v1/dataspaces/$dataspaceName/anchors" when: 'get all anchors API is invoked' @@ -340,7 +346,7 @@ class AdminRestControllerSpec extends Specification { def 'Get existing anchor by dataspace and anchor name.'() { given: 'service method returns an anchor' - mockCpsAdminService.getAnchor(dataspaceName, anchorName) >> + mockCpsAnchorService.getAnchor(dataspaceName, anchorName) >> new Anchor(name: anchorName, dataspaceName: dataspaceName, schemaSetName: schemaSetName) and: 'an endpoint' def anchorEndpoint = "$basePath/v1/dataspaces/$dataspaceName/anchors/$anchorName" @@ -360,7 +366,7 @@ class AdminRestControllerSpec extends Specification { when: 'delete method is invoked on anchor endpoint' def response = mvc.perform(delete(anchorEndpoint)).andReturn().response then: 'associated service method is invoked with expected parameters' - 1 * mockCpsAdminService.deleteAnchor(dataspaceName, anchorName) + 1 * mockCpsAnchorService.deleteAnchor(dataspaceName, anchorName) and: 'response code indicates success' response.status == HttpStatus.NO_CONTENT.value() } @@ -373,7 +379,7 @@ class AdminRestControllerSpec extends Specification { .param('dataspace-name', dataspaceName)) .andReturn().response then: 'associated service method is invoked with expected parameter' - 1 * mockCpsAdminService.deleteDataspace(dataspaceName) + 1 * mockCpsDataspaceService.deleteDataspace(dataspaceName) and: 'response code indicates success' response.status == HttpStatus.NO_CONTENT.value() } diff --git a/cps-rest/src/test/groovy/org/onap/cps/rest/exceptions/CpsRestExceptionHandlerSpec.groovy b/cps-rest/src/test/groovy/org/onap/cps/rest/exceptions/CpsRestExceptionHandlerSpec.groovy index 535b83df7..ff2bed434 100644 --- a/cps-rest/src/test/groovy/org/onap/cps/rest/exceptions/CpsRestExceptionHandlerSpec.groovy +++ b/cps-rest/src/test/groovy/org/onap/cps/rest/exceptions/CpsRestExceptionHandlerSpec.groovy @@ -26,7 +26,8 @@ package org.onap.cps.rest.exceptions import com.fasterxml.jackson.databind.ObjectMapper import groovy.json.JsonSlurper -import org.onap.cps.api.CpsAdminService +import org.onap.cps.api.CpsDataspaceService +import org.onap.cps.api.CpsAnchorService import org.onap.cps.api.CpsDataService import org.onap.cps.api.CpsModuleService import org.onap.cps.api.CpsQueryService @@ -63,7 +64,10 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilder class CpsRestExceptionHandlerSpec extends Specification { @SpringBean - CpsAdminService mockCpsAdminService = Stub() + CpsDataspaceService mockCpsAdminService = Stub() + + @SpringBean + CpsAnchorService mockCpsAnchorService = Stub() @SpringBean CpsModuleService mockCpsModuleService = Stub() @@ -198,7 +202,7 @@ class CpsRestExceptionHandlerSpec extends Specification { */ def setupTestException(exception) { - mockCpsAdminService.getAnchors(_) >> { throw exception } + mockCpsAnchorService.getAnchors(_) >> { throw exception } } def performTestRequest() { diff --git a/cps-service/src/main/java/org/onap/cps/api/CpsAdminService.java b/cps-service/src/main/java/org/onap/cps/api/CpsAnchorService.java old mode 100755 new mode 100644 similarity index 75% rename from cps-service/src/main/java/org/onap/cps/api/CpsAdminService.java rename to cps-service/src/main/java/org/onap/cps/api/CpsAnchorService.java index edd052a51..a247150c1 --- a/cps-service/src/main/java/org/onap/cps/api/CpsAdminService.java +++ b/cps-service/src/main/java/org/onap/cps/api/CpsAnchorService.java @@ -1,9 +1,6 @@ /* - * ============LICENSE_START======================================================= - * Copyright (C) 2020-2023 Nordix Foundation - * Modifications Copyright (C) 2020-2022 Bell Canada. - * Modifications Copyright (C) 2021 Pantheon.tech - * Modifications Copyright (C) 2022 TechMahindra Ltd. + * ============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. @@ -24,46 +21,10 @@ package org.onap.cps.api; import java.util.Collection; -import org.onap.cps.spi.exceptions.AlreadyDefinedException; import org.onap.cps.spi.exceptions.CpsException; import org.onap.cps.spi.model.Anchor; -import org.onap.cps.spi.model.Dataspace; -/** - * CPS Admin Service. - */ -public interface CpsAdminService { - - /** - * Create dataspace. - * - * @param dataspaceName dataspace name - * @throws AlreadyDefinedException if dataspace with same name already exists - */ - void createDataspace(String dataspaceName); - - /** - * Delete dataspace. - * - * @param dataspaceName the name of the dataspace to delete - */ - void deleteDataspace(String dataspaceName); - - /** - * Get dataspace by given dataspace name. - * - * @param dataspaceName dataspace name - * @return a dataspace - */ - Dataspace getDataspace(String dataspaceName); - - /** - * Get All Dataspaces. - * - * - * @return a collection of dataspaces - */ - Collection getAllDataspaces(); +public interface CpsAnchorService { /** * Create an Anchor. diff --git a/cps-service/src/main/java/org/onap/cps/api/CpsDataspaceService.java b/cps-service/src/main/java/org/onap/cps/api/CpsDataspaceService.java new file mode 100644 index 000000000..7b9460426 --- /dev/null +++ b/cps-service/src/main/java/org/onap/cps/api/CpsDataspaceService.java @@ -0,0 +1,66 @@ +/* + * ============LICENSE_START======================================================= + * Copyright (C) 2020-2023 Nordix Foundation + * Modifications Copyright (C) 2020-2022 Bell Canada. + * Modifications Copyright (C) 2021 Pantheon.tech + * Modifications Copyright (C) 2022 TechMahindra Ltd. + * ================================================================================ + * 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.api; + +import java.util.Collection; +import org.onap.cps.spi.exceptions.AlreadyDefinedException; +import org.onap.cps.spi.model.Dataspace; + +/** + * CPS Admin Service. + */ +public interface CpsDataspaceService { + + /** + * Create dataspace. + * + * @param dataspaceName dataspace name + * @throws AlreadyDefinedException if dataspace with same name already exists + */ + void createDataspace(String dataspaceName); + + /** + * Delete dataspace. + * + * @param dataspaceName the name of the dataspace to delete + */ + void deleteDataspace(String dataspaceName); + + /** + * Get dataspace by given dataspace name. + * + * @param dataspaceName dataspace name + * @return a dataspace + */ + Dataspace getDataspace(String dataspaceName); + + /** + * Get All Dataspaces. + * + * + * @return a collection of dataspaces + */ + Collection getAllDataspaces(); + +} diff --git a/cps-service/src/main/java/org/onap/cps/api/impl/CpsAdminServiceImpl.java b/cps-service/src/main/java/org/onap/cps/api/impl/CpsAnchorServiceImpl.java old mode 100755 new mode 100644 similarity index 66% rename from cps-service/src/main/java/org/onap/cps/api/impl/CpsAdminServiceImpl.java rename to cps-service/src/main/java/org/onap/cps/api/impl/CpsAnchorServiceImpl.java index d83ee434d..f09a795a6 --- a/cps-service/src/main/java/org/onap/cps/api/impl/CpsAdminServiceImpl.java +++ b/cps-service/src/main/java/org/onap/cps/api/impl/CpsAnchorServiceImpl.java @@ -1,9 +1,6 @@ /* - * ============LICENSE_START======================================================= - * Copyright (C) 2020-2023 Nordix Foundation - * Modifications Copyright (C) 2020-2022 Bell Canada. - * Modifications Copyright (C) 2021 Pantheon.tech - * Modifications Copyright (C) 2022 TechMahindra Ltd. + * ============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. @@ -23,51 +20,24 @@ package org.onap.cps.api.impl; -import java.time.OffsetDateTime; import java.util.Collection; import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; -import org.onap.cps.api.CpsAdminService; -import org.onap.cps.api.CpsDataService; +import org.onap.cps.api.CpsAnchorService; import org.onap.cps.spi.CpsAdminPersistenceService; +import org.onap.cps.spi.CpsDataPersistenceService; import org.onap.cps.spi.model.Anchor; -import org.onap.cps.spi.model.Dataspace; import org.onap.cps.spi.utils.CpsValidator; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Component; +import org.springframework.stereotype.Service; -@Component("CpsAdminServiceImpl") -@RequiredArgsConstructor(onConstructor = @__(@Lazy)) -public class CpsAdminServiceImpl implements CpsAdminService { +@Service +@RequiredArgsConstructor +public class CpsAnchorServiceImpl implements CpsAnchorService { private final CpsAdminPersistenceService cpsAdminPersistenceService; - @Lazy - private final CpsDataService cpsDataService; + private final CpsDataPersistenceService cpsDataPersistenceService; private final CpsValidator cpsValidator; - @Override - public void createDataspace(final String dataspaceName) { - cpsValidator.validateNameCharacters(dataspaceName); - cpsAdminPersistenceService.createDataspace(dataspaceName); - } - - @Override - public void deleteDataspace(final String dataspaceName) { - cpsValidator.validateNameCharacters(dataspaceName); - cpsAdminPersistenceService.deleteDataspace(dataspaceName); - } - - @Override - public Dataspace getDataspace(final String dataspaceName) { - cpsValidator.validateNameCharacters(dataspaceName); - return cpsAdminPersistenceService.getDataspace(dataspaceName); - } - - @Override - public Collection getAllDataspaces() { - return cpsAdminPersistenceService.getAllDataspaces(); - } - @Override public void createAnchor(final String dataspaceName, final String schemaSetName, final String anchorName) { cpsValidator.validateNameCharacters(dataspaceName, schemaSetName, anchorName); @@ -102,7 +72,7 @@ public class CpsAdminServiceImpl implements CpsAdminService { @Override public void deleteAnchor(final String dataspaceName, final String anchorName) { cpsValidator.validateNameCharacters(dataspaceName, anchorName); - cpsDataService.deleteDataNodes(dataspaceName, anchorName, OffsetDateTime.now()); + cpsDataPersistenceService.deleteDataNodes(dataspaceName, anchorName); cpsAdminPersistenceService.deleteAnchor(dataspaceName, anchorName); } @@ -110,7 +80,7 @@ public class CpsAdminServiceImpl implements CpsAdminService { public void deleteAnchors(final String dataspaceName, final Collection anchorNames) { cpsValidator.validateNameCharacters(dataspaceName); cpsValidator.validateNameCharacters(anchorNames); - cpsDataService.deleteDataNodes(dataspaceName, anchorNames, OffsetDateTime.now()); + cpsDataPersistenceService.deleteDataNodes(dataspaceName, anchorNames); cpsAdminPersistenceService.deleteAnchors(dataspaceName, anchorNames); } @@ -123,8 +93,8 @@ public class CpsAdminServiceImpl implements CpsAdminService { @Override public void updateAnchorSchemaSet(final String dataspaceName, - final String anchorName, - final String schemaSetName) { + final String anchorName, + final String schemaSetName) { cpsAdminPersistenceService.updateAnchorSchemaSet(dataspaceName, anchorName, schemaSetName); } } diff --git a/cps-service/src/main/java/org/onap/cps/api/impl/CpsDataServiceImpl.java b/cps-service/src/main/java/org/onap/cps/api/impl/CpsDataServiceImpl.java index 6672d6883..a1bae6a44 100755 --- a/cps-service/src/main/java/org/onap/cps/api/impl/CpsDataServiceImpl.java +++ b/cps-service/src/main/java/org/onap/cps/api/impl/CpsDataServiceImpl.java @@ -35,7 +35,7 @@ import java.util.Map; import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.onap.cps.api.CpsAdminService; +import org.onap.cps.api.CpsAnchorService; import org.onap.cps.api.CpsDataService; import org.onap.cps.api.CpsDeltaService; import org.onap.cps.cpspath.parser.CpsPathUtil; @@ -62,7 +62,7 @@ public class CpsDataServiceImpl implements CpsDataService { private static final long DEFAULT_LOCK_TIMEOUT_IN_MILLISECONDS = 300L; private final CpsDataPersistenceService cpsDataPersistenceService; - private final CpsAdminService cpsAdminService; + private final CpsAnchorService cpsAnchorService; private final YangTextSchemaSourceSetCache yangTextSchemaSourceSetCache; private final CpsValidator cpsValidator; private final TimedYangParser timedYangParser; @@ -80,7 +80,7 @@ public class CpsDataServiceImpl implements CpsDataService { public void saveData(final String dataspaceName, final String anchorName, final String nodeData, final OffsetDateTime observedTimestamp, final ContentType contentType) { cpsValidator.validateNameCharacters(dataspaceName, anchorName); - final Anchor anchor = cpsAdminService.getAnchor(dataspaceName, anchorName); + final Anchor anchor = cpsAnchorService.getAnchor(dataspaceName, anchorName); final Collection dataNodes = buildDataNodes(anchor, ROOT_NODE_XPATH, nodeData, contentType); cpsDataPersistenceService.storeDataNodes(dataspaceName, anchorName, dataNodes); } @@ -98,7 +98,7 @@ public class CpsDataServiceImpl implements CpsDataService { final String nodeData, final OffsetDateTime observedTimestamp, final ContentType contentType) { cpsValidator.validateNameCharacters(dataspaceName, anchorName); - final Anchor anchor = cpsAdminService.getAnchor(dataspaceName, anchorName); + final Anchor anchor = cpsAnchorService.getAnchor(dataspaceName, anchorName); final Collection dataNodes = buildDataNodes(anchor, parentNodeXpath, nodeData, contentType); cpsDataPersistenceService.addChildDataNodes(dataspaceName, anchorName, parentNodeXpath, dataNodes); } @@ -109,7 +109,7 @@ public class CpsDataServiceImpl implements CpsDataService { public void saveListElements(final String dataspaceName, final String anchorName, final String parentNodeXpath, final String jsonData, final OffsetDateTime observedTimestamp) { cpsValidator.validateNameCharacters(dataspaceName, anchorName); - final Anchor anchor = cpsAdminService.getAnchor(dataspaceName, anchorName); + final Anchor anchor = cpsAnchorService.getAnchor(dataspaceName, anchorName); final Collection listElementDataNodeCollection = buildDataNodes(anchor, parentNodeXpath, jsonData, ContentType.JSON); if (isRootNodeXpath(parentNodeXpath)) { @@ -126,7 +126,7 @@ public class CpsDataServiceImpl implements CpsDataService { public void saveListElementsBatch(final String dataspaceName, final String anchorName, final String parentNodeXpath, final Collection jsonDataList, final OffsetDateTime observedTimestamp) { cpsValidator.validateNameCharacters(dataspaceName, anchorName); - final Anchor anchor = cpsAdminService.getAnchor(dataspaceName, anchorName); + final Anchor anchor = cpsAnchorService.getAnchor(dataspaceName, anchorName); final Collection> listElementDataNodeCollections = buildDataNodes(anchor, parentNodeXpath, jsonDataList, ContentType.JSON); cpsDataPersistenceService.addMultipleLists(dataspaceName, anchorName, parentNodeXpath, @@ -160,7 +160,7 @@ public class CpsDataServiceImpl implements CpsDataService { public void updateNodeLeaves(final String dataspaceName, final String anchorName, final String parentNodeXpath, final String jsonData, final OffsetDateTime observedTimestamp) { cpsValidator.validateNameCharacters(dataspaceName, anchorName); - final Anchor anchor = cpsAdminService.getAnchor(dataspaceName, anchorName); + final Anchor anchor = cpsAnchorService.getAnchor(dataspaceName, anchorName); final Collection dataNodesInPatch = buildDataNodes(anchor, parentNodeXpath, jsonData, ContentType.JSON); final Map> xpathToUpdatedLeaves = dataNodesInPatch.stream() @@ -176,7 +176,7 @@ public class CpsDataServiceImpl implements CpsDataService { final String dataNodeUpdatesAsJson, final OffsetDateTime observedTimestamp) { cpsValidator.validateNameCharacters(dataspaceName, anchorName); - final Anchor anchor = cpsAdminService.getAnchor(dataspaceName, anchorName); + final Anchor anchor = cpsAnchorService.getAnchor(dataspaceName, anchorName); final Collection dataNodeUpdates = buildDataNodes(anchor, parentNodeXpath, dataNodeUpdatesAsJson, ContentType.JSON); for (final DataNode dataNodeUpdate : dataNodeUpdates) { @@ -228,7 +228,7 @@ public class CpsDataServiceImpl implements CpsDataService { final String parentNodeXpath, final String jsonData, final OffsetDateTime observedTimestamp) { cpsValidator.validateNameCharacters(dataspaceName, anchorName); - final Anchor anchor = cpsAdminService.getAnchor(dataspaceName, anchorName); + final Anchor anchor = cpsAnchorService.getAnchor(dataspaceName, anchorName); final Collection dataNodes = buildDataNodes(anchor, parentNodeXpath, jsonData, ContentType.JSON); cpsDataPersistenceService.updateDataNodesAndDescendants(dataspaceName, anchorName, dataNodes); } @@ -240,7 +240,7 @@ public class CpsDataServiceImpl implements CpsDataService { final Map nodesJsonData, final OffsetDateTime observedTimestamp) { cpsValidator.validateNameCharacters(dataspaceName, anchorName); - final Anchor anchor = cpsAdminService.getAnchor(dataspaceName, anchorName); + final Anchor anchor = cpsAnchorService.getAnchor(dataspaceName, anchorName); final Collection dataNodes = buildDataNodes(anchor, nodesJsonData); cpsDataPersistenceService.updateDataNodesAndDescendants(dataspaceName, anchorName, dataNodes); } @@ -251,7 +251,7 @@ public class CpsDataServiceImpl implements CpsDataService { public void replaceListContent(final String dataspaceName, final String anchorName, final String parentNodeXpath, final String jsonData, final OffsetDateTime observedTimestamp) { cpsValidator.validateNameCharacters(dataspaceName, anchorName); - final Anchor anchor = cpsAdminService.getAnchor(dataspaceName, anchorName); + final Anchor anchor = cpsAnchorService.getAnchor(dataspaceName, anchorName); final Collection newListElements = buildDataNodes(anchor, parentNodeXpath, jsonData, ContentType.JSON); replaceListContent(dataspaceName, anchorName, parentNodeXpath, newListElements, observedTimestamp); diff --git a/cps-service/src/main/java/org/onap/cps/api/impl/CpsDataspaceServiceImpl.java b/cps-service/src/main/java/org/onap/cps/api/impl/CpsDataspaceServiceImpl.java new file mode 100644 index 000000000..a7f5da487 --- /dev/null +++ b/cps-service/src/main/java/org/onap/cps/api/impl/CpsDataspaceServiceImpl.java @@ -0,0 +1,64 @@ +/* + * ============LICENSE_START======================================================= + * Copyright (C) 2020-2023 Nordix Foundation + * Modifications Copyright (C) 2020-2022 Bell Canada. + * Modifications Copyright (C) 2021 Pantheon.tech + * Modifications Copyright (C) 2022 TechMahindra Ltd. + * ================================================================================ + * 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.api.impl; + +import java.util.Collection; +import lombok.RequiredArgsConstructor; +import org.onap.cps.api.CpsDataspaceService; +import org.onap.cps.spi.CpsAdminPersistenceService; +import org.onap.cps.spi.model.Dataspace; +import org.onap.cps.spi.utils.CpsValidator; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class CpsDataspaceServiceImpl implements CpsDataspaceService { + + private final CpsAdminPersistenceService cpsAdminPersistenceService; + private final CpsValidator cpsValidator; + + @Override + public void createDataspace(final String dataspaceName) { + cpsValidator.validateNameCharacters(dataspaceName); + cpsAdminPersistenceService.createDataspace(dataspaceName); + } + + @Override + public void deleteDataspace(final String dataspaceName) { + cpsValidator.validateNameCharacters(dataspaceName); + cpsAdminPersistenceService.deleteDataspace(dataspaceName); + } + + @Override + public Dataspace getDataspace(final String dataspaceName) { + cpsValidator.validateNameCharacters(dataspaceName); + return cpsAdminPersistenceService.getDataspace(dataspaceName); + } + + @Override + public Collection getAllDataspaces() { + return cpsAdminPersistenceService.getAllDataspaces(); + } + +} diff --git a/cps-service/src/main/java/org/onap/cps/api/impl/CpsModuleServiceImpl.java b/cps-service/src/main/java/org/onap/cps/api/impl/CpsModuleServiceImpl.java index 533723784..61a4e623a 100644 --- a/cps-service/src/main/java/org/onap/cps/api/impl/CpsModuleServiceImpl.java +++ b/cps-service/src/main/java/org/onap/cps/api/impl/CpsModuleServiceImpl.java @@ -28,7 +28,7 @@ import java.util.Collection; import java.util.Map; import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; -import org.onap.cps.api.CpsAdminService; +import org.onap.cps.api.CpsAnchorService; import org.onap.cps.api.CpsModuleService; import org.onap.cps.spi.CascadeDeleteAllowed; import org.onap.cps.spi.CpsModulePersistenceService; @@ -49,7 +49,7 @@ public class CpsModuleServiceImpl implements CpsModuleService { private final CpsModulePersistenceService cpsModulePersistenceService; private final YangTextSchemaSourceSetCache yangTextSchemaSourceSetCache; - private final CpsAdminService cpsAdminService; + private final CpsAnchorService cpsAnchorService; private final CpsValidator cpsValidator; private final TimedYangTextSchemaSourceSetBuilder timedYangTextSchemaSourceSetBuilder; @@ -97,12 +97,12 @@ public class CpsModuleServiceImpl implements CpsModuleService { public void deleteSchemaSet(final String dataspaceName, final String schemaSetName, final CascadeDeleteAllowed cascadeDeleteAllowed) { cpsValidator.validateNameCharacters(dataspaceName, schemaSetName); - final Collection anchors = cpsAdminService.getAnchors(dataspaceName, schemaSetName); + final Collection anchors = cpsAnchorService.getAnchors(dataspaceName, schemaSetName); if (!anchors.isEmpty() && isCascadeDeleteProhibited(cascadeDeleteAllowed)) { throw new SchemaSetInUseException(dataspaceName, schemaSetName); } for (final Anchor anchor : anchors) { - cpsAdminService.deleteAnchor(dataspaceName, anchor.getName()); + cpsAnchorService.deleteAnchor(dataspaceName, anchor.getName()); } cpsModulePersistenceService.deleteSchemaSet(dataspaceName, schemaSetName); yangTextSchemaSourceSetCache.removeFromCache(dataspaceName, schemaSetName); @@ -114,9 +114,9 @@ public class CpsModuleServiceImpl implements CpsModuleService { public void deleteSchemaSetsWithCascade(final String dataspaceName, final Collection schemaSetNames) { cpsValidator.validateNameCharacters(dataspaceName); cpsValidator.validateNameCharacters(schemaSetNames); - final Collection anchorNames = cpsAdminService.getAnchors(dataspaceName, schemaSetNames) + final Collection anchorNames = cpsAnchorService.getAnchors(dataspaceName, schemaSetNames) .stream().map(Anchor::getName).collect(Collectors.toSet()); - cpsAdminService.deleteAnchors(dataspaceName, anchorNames); + cpsAnchorService.deleteAnchors(dataspaceName, anchorNames); cpsModulePersistenceService.deleteUnusedYangResourceModules(); cpsModulePersistenceService.deleteSchemaSets(dataspaceName, schemaSetNames); for (final String schemaSetName : schemaSetNames) { diff --git a/cps-service/src/main/java/org/onap/cps/utils/PrefixResolver.java b/cps-service/src/main/java/org/onap/cps/utils/PrefixResolver.java index d58ddf4fa..35dc7347b 100644 --- a/cps-service/src/main/java/org/onap/cps/utils/PrefixResolver.java +++ b/cps-service/src/main/java/org/onap/cps/utils/PrefixResolver.java @@ -26,7 +26,7 @@ import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; import lombok.RequiredArgsConstructor; -import org.onap.cps.api.CpsAdminService; +import org.onap.cps.api.CpsAnchorService; import org.onap.cps.api.impl.YangTextSchemaSourceSetCache; import org.onap.cps.cache.AnchorDataCacheEntry; import org.onap.cps.cpspath.parser.CpsPathPrefixType; @@ -48,7 +48,7 @@ public class PrefixResolver { private static final String CACHE_ENTRY_PROPERTY_NAME = "prefixPerContainerName"; - private final CpsAdminService cpsAdminService; + private final CpsAnchorService cpsAnchorService; private final YangTextSchemaSourceSetCache yangTextSchemaSourceSetCache; @@ -63,7 +63,7 @@ public class PrefixResolver { * @return the prefix of the module the top level element of given xpath */ public String getPrefix(final String dataspaceName, final String anchorName, final String xpath) { - final Anchor anchor = cpsAdminService.getAnchor(dataspaceName, anchorName); + final Anchor anchor = cpsAnchorService.getAnchor(dataspaceName, anchorName); return getPrefix(anchor, xpath); } diff --git a/cps-service/src/test/groovy/org/onap/cps/api/impl/CpsAdminServiceImplSpec.groovy b/cps-service/src/test/groovy/org/onap/cps/api/impl/CpsAnchorServiceImplSpec.groovy old mode 100755 new mode 100644 similarity index 74% rename from cps-service/src/test/groovy/org/onap/cps/api/impl/CpsAdminServiceImplSpec.groovy rename to cps-service/src/test/groovy/org/onap/cps/api/impl/CpsAnchorServiceImplSpec.groovy index 12564fb6d..3546b8167 --- a/cps-service/src/test/groovy/org/onap/cps/api/impl/CpsAdminServiceImplSpec.groovy +++ b/cps-service/src/test/groovy/org/onap/cps/api/impl/CpsAnchorServiceImplSpec.groovy @@ -1,9 +1,6 @@ /* - * ============LICENSE_START======================================================= - * Copyright (C) 2020-2023 Nordix Foundation - * Modifications Copyright (C) 2020-2022 Bell Canada. - * Modifications Copyright (C) 2021 Pantheon.tech - * Modifications Copyright (C) 2022 TechMahindra Ltd. + * ============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. @@ -23,29 +20,20 @@ package org.onap.cps.api.impl -import org.onap.cps.api.CpsDataService import org.onap.cps.spi.CpsAdminPersistenceService +import org.onap.cps.spi.CpsDataPersistenceService import org.onap.cps.spi.exceptions.ModuleNamesNotFoundException import org.onap.cps.spi.model.Anchor -import org.onap.cps.spi.model.Dataspace import org.onap.cps.spi.utils.CpsValidator import spock.lang.Specification -import java.time.OffsetDateTime -class CpsAdminServiceImplSpec extends Specification { +class CpsAnchorServiceImplSpec extends Specification { + def mockCpsAdminPersistenceService = Mock(CpsAdminPersistenceService) - def mockCpsDataService = Mock(CpsDataService) + def mockCpsDataPersistenceService = Mock(CpsDataPersistenceService) def mockCpsValidator = Mock(CpsValidator) - def objectUnderTest = new CpsAdminServiceImpl(mockCpsAdminPersistenceService, mockCpsDataService,mockCpsValidator) - def 'Create dataspace method invokes persistence service.'() { - when: 'create dataspace method is invoked' - objectUnderTest.createDataspace('someDataspace') - then: 'the persistence service method is invoked with same parameters' - 1 * mockCpsAdminPersistenceService.createDataspace('someDataspace') - and: 'the CpsValidator is called on the dataspaceName' - 1 * mockCpsValidator.validateNameCharacters('someDataspace') - } + def objectUnderTest = new CpsAnchorServiceImpl(mockCpsAdminPersistenceService, mockCpsDataPersistenceService, mockCpsValidator) def 'Create anchor method invokes persistence service.'() { when: 'create anchor method is invoked' @@ -105,29 +93,13 @@ class CpsAdminServiceImplSpec extends Specification { 1 * mockCpsValidator.validateNameCharacters('someDataspace', 'someAnchor') } - def 'Retrieve dataspace.'() { - given: 'a dataspace is already created' - def dataspace = new Dataspace(name: "someDataspace") - mockCpsAdminPersistenceService.getDataspace('someDataspace') >> dataspace - expect: 'the dataspace provided by persistence service is returned as result' - assert objectUnderTest.getDataspace('someDataspace') == dataspace - } - - def 'Retrieve all dataspaces.'() { - given: 'that all given dataspaces are already created' - def dataspaces = [new Dataspace(name: "test-dataspace1"), new Dataspace(name: "test-dataspace2")] - mockCpsAdminPersistenceService.getAllDataspaces() >> dataspaces - expect: 'the dataspace provided by persistence service is returned as result' - assert objectUnderTest.getAllDataspaces() == dataspaces - } - def 'Delete anchor.'() { when: 'delete anchor is invoked' objectUnderTest.deleteAnchor('someDataspace','someAnchor') then: 'delete data nodes is invoked on the data service with expected parameters' - 1 * mockCpsDataService.deleteDataNodes('someDataspace','someAnchor', _ as OffsetDateTime ) + 1 * mockCpsDataPersistenceService.deleteDataNodes('someDataspace','someAnchor') and: 'the persistence service method is invoked with same parameters to delete anchor' - 1 * mockCpsAdminPersistenceService.deleteAnchor('someDataspace','someAnchor') + 1 * mockCpsAdminPersistenceService.deleteAnchor('someDataspace','someAnchor') and: 'the CpsValidator is called on the dataspaceName, anchorName' 1 * mockCpsValidator.validateNameCharacters('someDataspace', 'someAnchor') } @@ -136,7 +108,7 @@ class CpsAdminServiceImplSpec extends Specification { when: 'delete anchors is invoked' objectUnderTest.deleteAnchors('someDataspace', ['anchor1', 'anchor2']) then: 'delete data nodes is invoked on the data service with expected parameters' - 1 * mockCpsDataService.deleteDataNodes('someDataspace', _ as Collection, _ as OffsetDateTime) + 1 * mockCpsDataPersistenceService.deleteDataNodes('someDataspace', _ as Collection) and: 'the persistence service method is invoked with same parameters to delete anchor' 1 * mockCpsAdminPersistenceService.deleteAnchors('someDataspace',_ as Collection) and: 'the CpsValidator is called on the dataspace name and anchor names' @@ -157,7 +129,7 @@ class CpsAdminServiceImplSpec extends Specification { def 'Query all anchors with Module Names Not Found Exception in persistence layer.'() { given: 'the persistence layer throws a Module Names Not Found Exception' - def originalException = new ModuleNamesNotFoundException('exception-ds', [ 'm1', 'm2']) + def originalException = new ModuleNamesNotFoundException('exception-ds', ['m1', 'm2']) mockCpsAdminPersistenceService.queryAnchors(*_) >> { throw originalException} when: 'attempt query anchors' objectUnderTest.queryAnchorNames('some-dataspace-name', []) @@ -170,19 +142,11 @@ class CpsAdminServiceImplSpec extends Specification { assert thrownUp.details.contains('m2') } - def 'Delete dataspace.'() { - when: 'delete dataspace is invoked' - objectUnderTest.deleteDataspace('someDataspace') - then: 'associated persistence service method is invoked with correct parameter' - 1 * mockCpsAdminPersistenceService.deleteDataspace('someDataspace') - and: 'the CpsValidator is called on the dataspaceName' - 1 * mockCpsValidator.validateNameCharacters('someDataspace') - } - def 'Update anchor schema set.'() { when: 'update anchor is invoked' objectUnderTest.updateAnchorSchemaSet('someDataspace', 'someAnchor', 'someSchemaSetName') then: 'associated persistence service method is invoked with correct parameter' 1 * mockCpsAdminPersistenceService.updateAnchorSchemaSet('someDataspace', 'someAnchor', 'someSchemaSetName') } + } diff --git a/cps-service/src/test/groovy/org/onap/cps/api/impl/CpsDataServiceImplSpec.groovy b/cps-service/src/test/groovy/org/onap/cps/api/impl/CpsDataServiceImplSpec.groovy index 6ff708a6e..77e15c320 100644 --- a/cps-service/src/test/groovy/org/onap/cps/api/impl/CpsDataServiceImplSpec.groovy +++ b/cps-service/src/test/groovy/org/onap/cps/api/impl/CpsDataServiceImplSpec.groovy @@ -24,7 +24,7 @@ package org.onap.cps.api.impl import org.onap.cps.TestUtils -import org.onap.cps.api.CpsAdminService +import org.onap.cps.api.CpsAnchorService import org.onap.cps.api.CpsDeltaService import org.onap.cps.spi.CpsDataPersistenceService import org.onap.cps.spi.FetchDescendantsOption @@ -43,26 +43,24 @@ import org.onap.cps.yang.YangTextSchemaSourceSet import org.onap.cps.yang.YangTextSchemaSourceSetBuilder import spock.lang.Shared import spock.lang.Specification - import java.time.OffsetDateTime import java.util.stream.Collectors class CpsDataServiceImplSpec extends Specification { def mockCpsDataPersistenceService = Mock(CpsDataPersistenceService) - def mockCpsAdminService = Mock(CpsAdminService) + def mockCpsAnchorService = Mock(CpsAnchorService) def mockYangTextSchemaSourceSetCache = Mock(YangTextSchemaSourceSetCache) def mockCpsValidator = Mock(CpsValidator) def timedYangParser = new TimedYangParser() def mockCpsDeltaService = Mock(CpsDeltaService); - def objectUnderTest = new CpsDataServiceImpl(mockCpsDataPersistenceService, mockCpsAdminService, + def objectUnderTest = new CpsDataServiceImpl(mockCpsDataPersistenceService, mockCpsAnchorService, mockYangTextSchemaSourceSetCache, mockCpsValidator, timedYangParser, mockCpsDeltaService) def setup() { - - mockCpsAdminService.getAnchor(dataspaceName, anchorName) >> anchor - mockCpsAdminService.getAnchor(dataspaceName, ANCHOR_NAME_1) >> anchor1 - mockCpsAdminService.getAnchor(dataspaceName, ANCHOR_NAME_2) >> anchor2 + mockCpsAnchorService.getAnchor(dataspaceName, anchorName) >> anchor + mockCpsAnchorService.getAnchor(dataspaceName, ANCHOR_NAME_1) >> anchor1 + mockCpsAnchorService.getAnchor(dataspaceName, ANCHOR_NAME_2) >> anchor2 } @Shared @@ -426,7 +424,7 @@ class CpsDataServiceImplSpec extends Specification { def 'Delete all data nodes for given dataspace and multiple anchors.'() { given: 'schema set for given anchors and dataspace references test tree model' setupSchemaSetMocks('test-tree.yang') - mockCpsAdminService.getAnchors(dataspaceName, ['anchor1', 'anchor2']) >> + mockCpsAnchorService.getAnchors(dataspaceName, ['anchor1', 'anchor2']) >> [new Anchor(name: 'anchor1', dataspaceName: dataspaceName), new Anchor(name: 'anchor2', dataspaceName: dataspaceName)] when: 'delete data node method is invoked with correct parameters' diff --git a/cps-service/src/test/groovy/org/onap/cps/api/impl/CpsDataspaceServiceImplSpec.groovy b/cps-service/src/test/groovy/org/onap/cps/api/impl/CpsDataspaceServiceImplSpec.groovy new file mode 100644 index 000000000..8e17594bd --- /dev/null +++ b/cps-service/src/test/groovy/org/onap/cps/api/impl/CpsDataspaceServiceImplSpec.groovy @@ -0,0 +1,67 @@ +/* + * ============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.api.impl + +import org.onap.cps.spi.CpsAdminPersistenceService +import org.onap.cps.spi.model.Dataspace +import org.onap.cps.spi.utils.CpsValidator +import spock.lang.Specification + +class CpsDataspaceServiceImplSpec extends Specification { + def mockCpsAdminPersistenceService = Mock(CpsAdminPersistenceService) + def mockCpsValidator = Mock(CpsValidator) + def objectUnderTest = new CpsDataspaceServiceImpl(mockCpsAdminPersistenceService,mockCpsValidator) + + def 'Create dataspace method invokes persistence service.'() { + when: 'create dataspace method is invoked' + objectUnderTest.createDataspace('someDataspace') + then: 'the persistence service method is invoked with same parameters' + 1 * mockCpsAdminPersistenceService.createDataspace('someDataspace') + and: 'the CpsValidator is called on the dataspaceName' + 1 * mockCpsValidator.validateNameCharacters('someDataspace') + } + + def 'Retrieve dataspace.'() { + given: 'a dataspace is already created' + def dataspace = new Dataspace(name: "someDataspace") + mockCpsAdminPersistenceService.getDataspace('someDataspace') >> dataspace + expect: 'the dataspace provided by persistence service is returned as result' + assert objectUnderTest.getDataspace('someDataspace') == dataspace + } + + def 'Retrieve all dataspaces.'() { + given: 'that all given dataspaces are already created' + def dataspaces = [new Dataspace(name: "test-dataspace1"), new Dataspace(name: "test-dataspace2")] + mockCpsAdminPersistenceService.getAllDataspaces() >> dataspaces + expect: 'the dataspace provided by persistence service is returned as result' + assert objectUnderTest.getAllDataspaces() == dataspaces + } + + def 'Delete dataspace.'() { + when: 'delete dataspace is invoked' + objectUnderTest.deleteDataspace('someDataspace') + then: 'associated persistence service method is invoked with correct parameter' + 1 * mockCpsAdminPersistenceService.deleteDataspace('someDataspace') + and: 'the CpsValidator is called on the dataspaceName' + 1 * mockCpsValidator.validateNameCharacters('someDataspace') + } + +} diff --git a/cps-service/src/test/groovy/org/onap/cps/api/impl/CpsModuleServiceImplSpec.groovy b/cps-service/src/test/groovy/org/onap/cps/api/impl/CpsModuleServiceImplSpec.groovy index d8edb02ab..d909e27ab 100644 --- a/cps-service/src/test/groovy/org/onap/cps/api/impl/CpsModuleServiceImplSpec.groovy +++ b/cps-service/src/test/groovy/org/onap/cps/api/impl/CpsModuleServiceImplSpec.groovy @@ -23,11 +23,12 @@ package org.onap.cps.api.impl +import org.onap.cps.api.CpsAnchorService + import static org.onap.cps.spi.CascadeDeleteAllowed.CASCADE_DELETE_ALLOWED import static org.onap.cps.spi.CascadeDeleteAllowed.CASCADE_DELETE_PROHIBITED import org.onap.cps.TestUtils -import org.onap.cps.api.CpsAdminService import org.onap.cps.spi.CpsModulePersistenceService import org.onap.cps.spi.exceptions.DuplicatedYangResourceException import org.onap.cps.spi.exceptions.ModelValidationException @@ -45,12 +46,12 @@ import spock.lang.Specification class CpsModuleServiceImplSpec extends Specification { def mockCpsModulePersistenceService = Mock(CpsModulePersistenceService) - def mockCpsAdminService = Mock(CpsAdminService) def mockYangTextSchemaSourceSetCache = Mock(YangTextSchemaSourceSetCache) + def mockCpsAnchorService = Mock(CpsAnchorService) def mockCpsValidator = Mock(CpsValidator) def timedYangTextSchemaSourceSetBuilder = new TimedYangTextSchemaSourceSetBuilder() - def objectUnderTest = new CpsModuleServiceImpl(mockCpsModulePersistenceService, mockYangTextSchemaSourceSetCache, mockCpsAdminService, mockCpsValidator,timedYangTextSchemaSourceSetBuilder) + def objectUnderTest = new CpsModuleServiceImpl(mockCpsModulePersistenceService, mockYangTextSchemaSourceSetCache, mockCpsAnchorService, mockCpsValidator,timedYangTextSchemaSourceSetBuilder) def 'Create schema set.'() { when: 'Create schema set method is invoked' @@ -133,11 +134,11 @@ class CpsModuleServiceImplSpec extends Specification { def 'Delete schema-set when cascade is allowed.'() { given: '#numberOfAnchors anchors are associated with schemaset' def associatedAnchors = createAnchors(numberOfAnchors) - mockCpsAdminService.getAnchors('my-dataspace', 'my-schemaset') >> associatedAnchors + mockCpsAnchorService.getAnchors('my-dataspace', 'my-schemaset') >> associatedAnchors when: 'schema set deletion is requested with cascade allowed' objectUnderTest.deleteSchemaSet('my-dataspace', 'my-schemaset', CASCADE_DELETE_ALLOWED) then: 'anchor deletion is called #numberOfAnchors times' - numberOfAnchors * mockCpsAdminService.deleteAnchor('my-dataspace', _) + numberOfAnchors * mockCpsAnchorService.deleteAnchor('my-dataspace', _) and: 'persistence service method is invoked with same parameters' 1 * mockCpsModulePersistenceService.deleteSchemaSet('my-dataspace', 'my-schemaset') and: 'schema set will be removed from the cache' @@ -152,11 +153,11 @@ class CpsModuleServiceImplSpec extends Specification { def 'Delete schema-set when cascade is prohibited.'() { given: 'no anchors are associated with schemaset' - mockCpsAdminService.getAnchors('my-dataspace', 'my-schemaset') >> Collections.emptyList() + mockCpsAnchorService.getAnchors('my-dataspace', 'my-schemaset') >> Collections.emptyList() when: 'schema set deletion is requested with cascade allowed' objectUnderTest.deleteSchemaSet('my-dataspace', 'my-schemaset', CASCADE_DELETE_PROHIBITED) then: 'no anchors are deleted' - 0 * mockCpsAdminService.deleteAnchor(_, _) + 0 * mockCpsAnchorService.deleteAnchor(_, _) and: 'persistence service method is invoked with same parameters' 1 * mockCpsModulePersistenceService.deleteSchemaSet('my-dataspace', 'my-schemaset') and: 'schema set will be removed from the cache' @@ -169,7 +170,7 @@ class CpsModuleServiceImplSpec extends Specification { def 'Delete schema-set when cascade is prohibited and schema-set has anchors.'() { given: '2 anchors are associated with schemaset' - mockCpsAdminService.getAnchors('my-dataspace', 'my-schemaset') >> createAnchors(2) + mockCpsAnchorService.getAnchors('my-dataspace', 'my-schemaset') >> createAnchors(2) when: 'schema set deletion is requested with cascade allowed' objectUnderTest.deleteSchemaSet('my-dataspace', 'my-schemaset', CASCADE_DELETE_PROHIBITED) then: 'Schema-Set in Use exception is thrown' @@ -178,11 +179,11 @@ class CpsModuleServiceImplSpec extends Specification { def 'Delete multiple schema-sets when cascade is allowed.'() { given: '#numberOfAnchors anchors are associated with each schemaset' - mockCpsAdminService.getAnchors('my-dataspace', ['my-schemaset1', 'my-schemaset2']) >> createAnchors(numberOfAnchors * 2) + mockCpsAnchorService.getAnchors('my-dataspace', ['my-schemaset1', 'my-schemaset2']) >> createAnchors(numberOfAnchors * 2) when: 'schema set deletion is requested with cascade allowed' objectUnderTest.deleteSchemaSetsWithCascade('my-dataspace', ['my-schemaset1', 'my-schemaset2']) then: 'anchor deletion is called #numberOfAnchors times' - mockCpsAdminService.deleteAnchors('my-dataspace', _) + mockCpsAnchorService.deleteAnchors('my-dataspace', _) and: 'persistence service method is invoked with same parameters' mockCpsModulePersistenceService.deleteSchemaSets('my-dataspace', _) and: 'schema sets will be removed from the cache' diff --git a/cps-service/src/test/groovy/org/onap/cps/api/impl/E2ENetworkSliceSpec.groovy b/cps-service/src/test/groovy/org/onap/cps/api/impl/E2ENetworkSliceSpec.groovy index 118ee1cd0..4782468f1 100755 --- a/cps-service/src/test/groovy/org/onap/cps/api/impl/E2ENetworkSliceSpec.groovy +++ b/cps-service/src/test/groovy/org/onap/cps/api/impl/E2ENetworkSliceSpec.groovy @@ -24,7 +24,7 @@ package org.onap.cps.api.impl import org.onap.cps.TestUtils -import org.onap.cps.api.CpsAdminService +import org.onap.cps.api.CpsAnchorService import org.onap.cps.api.CpsDeltaService import org.onap.cps.spi.CpsDataPersistenceService import org.onap.cps.spi.CpsDataPersistenceService @@ -40,7 +40,7 @@ import spock.lang.Specification class E2ENetworkSliceSpec extends Specification { def mockModuleStoreService = Mock(CpsModulePersistenceService) def mockDataStoreService = Mock(CpsDataPersistenceService) - def mockCpsAdminService = Mock(CpsAdminService) + def mockCpsAnchorService = Mock(CpsAnchorService) def mockYangTextSchemaSourceSetCache = Mock(YangTextSchemaSourceSetCache) def mockCpsValidator = Mock(CpsValidator) def timedYangTextSchemaSourceSetBuilder = new TimedYangTextSchemaSourceSetBuilder() @@ -48,9 +48,9 @@ class E2ENetworkSliceSpec extends Specification { def mockCpsDeltaService = Mock(CpsDeltaService) def cpsModuleServiceImpl = new CpsModuleServiceImpl(mockModuleStoreService, - mockYangTextSchemaSourceSetCache, mockCpsAdminService, mockCpsValidator,timedYangTextSchemaSourceSetBuilder) + mockYangTextSchemaSourceSetCache, mockCpsAnchorService, mockCpsValidator,timedYangTextSchemaSourceSetBuilder) - def cpsDataServiceImpl = new CpsDataServiceImpl(mockDataStoreService, mockCpsAdminService, + def cpsDataServiceImpl = new CpsDataServiceImpl(mockDataStoreService, mockCpsAnchorService, mockYangTextSchemaSourceSetCache, mockCpsValidator, timedYangParser, mockCpsDeltaService) def dataspaceName = 'someDataspace' @@ -90,7 +90,7 @@ class E2ENetworkSliceSpec extends Specification { and : 'a valid json is provided for the model' def jsonData = TestUtils.getResourceFileContent('e2e/basic/cps-Cavsta-Data.txt') and : 'all the further dependencies are mocked ' - mockCpsAdminService.getAnchor(dataspaceName, anchorName) >> + mockCpsAnchorService.getAnchor(dataspaceName, anchorName) >> new Anchor().builder().name(anchorName).schemaSetName(schemaSetName).dataspaceName(dataspaceName).build() mockYangTextSchemaSourceSetCache.get(dataspaceName, schemaSetName) >> YangTextSchemaSourceSetBuilder.of(yangResourcesNameToContentMap) @@ -123,7 +123,7 @@ class E2ENetworkSliceSpec extends Specification { and : 'a valid json is provided for the model' def jsonData = TestUtils.getResourceFileContent('e2e/basic/cps-ran-inventory-data.json') and : 'all the further dependencies are mocked ' - mockCpsAdminService.getAnchor('someDataspace', 'someAnchor') >> + mockCpsAnchorService.getAnchor('someDataspace', 'someAnchor') >> new Anchor().builder().name('someAnchor').schemaSetName('someSchemaSet').dataspaceName(dataspaceName).build() mockYangTextSchemaSourceSetCache.get('someDataspace', 'someSchemaSet') >> YangTextSchemaSourceSetBuilder.of(yangResourcesNameToContentMap) mockModuleStoreService.getYangSchemaResources('someDataspace', 'someSchemaSet') >> schemaContext diff --git a/cps-service/src/test/groovy/org/onap/cps/utils/PrefixResolverSpec.groovy b/cps-service/src/test/groovy/org/onap/cps/utils/PrefixResolverSpec.groovy index ff6ab346f..b975de655 100644 --- a/cps-service/src/test/groovy/org/onap/cps/utils/PrefixResolverSpec.groovy +++ b/cps-service/src/test/groovy/org/onap/cps/utils/PrefixResolverSpec.groovy @@ -24,7 +24,7 @@ package org.onap.cps.utils import com.hazelcast.map.IMap import org.onap.cps.TestUtils -import org.onap.cps.api.CpsAdminService +import org.onap.cps.api.CpsAnchorService import org.onap.cps.api.impl.YangTextSchemaSourceSetCache import org.onap.cps.cache.AnchorDataCacheEntry import org.onap.cps.spi.model.Anchor @@ -34,13 +34,13 @@ import spock.lang.Specification class PrefixResolverSpec extends Specification { - def mockCpsAdminService = Mock(CpsAdminService) + def mockCpsAnchorService = Mock(CpsAnchorService) def mockYangTextSchemaSourceSetCache = Mock(YangTextSchemaSourceSetCache) def mockAnchorDataCache = Mock(IMap) - def objectUnderTest = new PrefixResolver(mockCpsAdminService, mockYangTextSchemaSourceSetCache, mockAnchorDataCache) + def objectUnderTest = new PrefixResolver(mockCpsAnchorService, mockYangTextSchemaSourceSetCache, mockAnchorDataCache) def mockYangTextSchemaSourceSet = Mock(YangTextSchemaSourceSet) @@ -52,7 +52,7 @@ class PrefixResolverSpec extends Specification { given: 'an anchor for the test-tree model' def anchor = new Anchor(dataspaceName: 'testDataspace', name: 'testAnchor') and: 'the system can get this anchor' - mockCpsAdminService.getAnchor('testDataspace', 'testAnchor') >> anchor + mockCpsAnchorService.getAnchor('testDataspace', 'testAnchor') >> anchor and: 'the schema source cache contains the schema context for the test-tree module' mockYangTextSchemaSourceSet.getSchemaContext() >> schemaContext } diff --git a/integration-test/src/test/groovy/org/onap/cps/integration/base/CpsIntegrationSpecBase.groovy b/integration-test/src/test/groovy/org/onap/cps/integration/base/CpsIntegrationSpecBase.groovy index 40fe03018..6dec3dbf9 100644 --- a/integration-test/src/test/groovy/org/onap/cps/integration/base/CpsIntegrationSpecBase.groovy +++ b/integration-test/src/test/groovy/org/onap/cps/integration/base/CpsIntegrationSpecBase.groovy @@ -20,10 +20,11 @@ package org.onap.cps.integration.base +import org.onap.cps.api.CpsAnchorService +import org.onap.cps.api.CpsDataService +import org.onap.cps.api.CpsDataspaceService +import org.onap.cps.api.CpsModuleService import org.onap.cps.api.CpsQueryService -import org.onap.cps.api.impl.CpsAdminServiceImpl -import org.onap.cps.api.impl.CpsDataServiceImpl -import org.onap.cps.api.impl.CpsModuleServiceImpl import org.onap.cps.integration.DatabaseTestContainer import org.onap.cps.spi.config.CpsSessionFactory import org.onap.cps.spi.exceptions.DataspaceNotFoundException @@ -44,7 +45,7 @@ import spock.lang.Specification import java.time.OffsetDateTime -@SpringBootTest(classes = [TestConfig, CpsAdminServiceImpl, CpsValidatorImpl, SessionManager, CpsSessionFactory]) +@SpringBootTest(classes = [TestConfig, CpsValidatorImpl, SessionManager, CpsSessionFactory]) @Testcontainers @EnableAutoConfiguration @EnableJpaRepositories(basePackageClasses = [DataspaceRepository]) @@ -57,15 +58,19 @@ class CpsIntegrationSpecBase extends Specification { @Autowired @Lazy - CpsAdminServiceImpl cpsAdminService + CpsDataspaceService cpsDataspaceService @Autowired @Lazy - CpsDataServiceImpl cpsDataService + CpsAnchorService cpsAnchorService @Autowired @Lazy - CpsModuleServiceImpl cpsModuleService + CpsDataService cpsDataService + + @Autowired + @Lazy + CpsModuleService cpsModuleService @Autowired @Lazy @@ -83,7 +88,7 @@ class CpsIntegrationSpecBase extends Specification { def setup() { if (!initialized) { - cpsAdminService.createDataspace(GENERAL_TEST_DATASPACE) + cpsDataspaceService.createDataspace(GENERAL_TEST_DATASPACE) def bookstoreModelFileContent = readResourceDataFile('bookstore/bookstore.yang') cpsModuleService.createSchemaSet(GENERAL_TEST_DATASPACE, BOOKSTORE_SCHEMA_SET, [bookstore : bookstoreModelFileContent]) initialized = true; @@ -108,7 +113,7 @@ class CpsIntegrationSpecBase extends Specification { def dataspaceExists(dataspaceName) { try { - cpsAdminService.getDataspace(dataspaceName) + cpsDataspaceService.getDataspace(dataspaceName) } catch (DataspaceNotFoundException dataspaceNotFoundException) { return false } @@ -117,7 +122,7 @@ class CpsIntegrationSpecBase extends Specification { def addAnchorsWithData(numberOfAnchors, dataspaceName, schemaSetName, anchorNamePrefix, data) { (1..numberOfAnchors).each { - cpsAdminService.createAnchor(dataspaceName, schemaSetName, anchorNamePrefix + it) + cpsAnchorService.createAnchor(dataspaceName, schemaSetName, anchorNamePrefix + it) cpsDataService.saveData(dataspaceName, anchorNamePrefix + it, data.replace("Easons", "Easons-"+it.toString()), OffsetDateTime.now()) } } diff --git a/integration-test/src/test/groovy/org/onap/cps/integration/base/FunctionalSpecBase.groovy b/integration-test/src/test/groovy/org/onap/cps/integration/base/FunctionalSpecBase.groovy index 14612d6c1..b10194560 100644 --- a/integration-test/src/test/groovy/org/onap/cps/integration/base/FunctionalSpecBase.groovy +++ b/integration-test/src/test/groovy/org/onap/cps/integration/base/FunctionalSpecBase.groovy @@ -50,9 +50,9 @@ class FunctionalSpecBase extends CpsIntegrationSpecBase { } def setupBookstoreInfraStructure() { - cpsAdminService.createDataspace(FUNCTIONAL_TEST_DATASPACE_1) - cpsAdminService.createDataspace(FUNCTIONAL_TEST_DATASPACE_2) - cpsAdminService.createDataspace(FUNCTIONAL_TEST_DATASPACE_3) + cpsDataspaceService.createDataspace(FUNCTIONAL_TEST_DATASPACE_1) + cpsDataspaceService.createDataspace(FUNCTIONAL_TEST_DATASPACE_2) + cpsDataspaceService.createDataspace(FUNCTIONAL_TEST_DATASPACE_3) def bookstoreYangModelAsString = readResourceDataFile('bookstore/bookstore.yang') cpsModuleService.createSchemaSet(FUNCTIONAL_TEST_DATASPACE_1, BOOKSTORE_SCHEMA_SET, [bookstore: bookstoreYangModelAsString]) cpsModuleService.createSchemaSet(FUNCTIONAL_TEST_DATASPACE_2, BOOKSTORE_SCHEMA_SET, [bookstore: bookstoreYangModelAsString]) @@ -73,8 +73,8 @@ class FunctionalSpecBase extends CpsIntegrationSpecBase { def restoreBookstoreDataAnchor(anchorNumber) { def anchorName = 'bookstoreAnchor' + anchorNumber - cpsAdminService.deleteAnchor(FUNCTIONAL_TEST_DATASPACE_1, anchorName) - cpsAdminService.createAnchor(FUNCTIONAL_TEST_DATASPACE_1, BOOKSTORE_SCHEMA_SET, anchorName) + cpsAnchorService.deleteAnchor(FUNCTIONAL_TEST_DATASPACE_1, anchorName) + cpsAnchorService.createAnchor(FUNCTIONAL_TEST_DATASPACE_1, BOOKSTORE_SCHEMA_SET, anchorName) cpsDataService.saveData(FUNCTIONAL_TEST_DATASPACE_1, anchorName, bookstoreJsonData.replace("Easons", "Easons-"+anchorNumber.toString()), OffsetDateTime.now()) } diff --git a/integration-test/src/test/groovy/org/onap/cps/integration/functional/CpsAdminServiceIntegrationSpec.groovy b/integration-test/src/test/groovy/org/onap/cps/integration/functional/CpsAnchorServiceIntegrationSpec.groovy similarity index 66% rename from integration-test/src/test/groovy/org/onap/cps/integration/functional/CpsAdminServiceIntegrationSpec.groovy rename to integration-test/src/test/groovy/org/onap/cps/integration/functional/CpsAnchorServiceIntegrationSpec.groovy index f8eca6199..99dab8426 100644 --- a/integration-test/src/test/groovy/org/onap/cps/integration/functional/CpsAdminServiceIntegrationSpec.groovy +++ b/integration-test/src/test/groovy/org/onap/cps/integration/functional/CpsAnchorServiceIntegrationSpec.groovy @@ -20,76 +20,19 @@ package org.onap.cps.integration.functional -import org.onap.cps.api.CpsAdminService +import org.onap.cps.api.CpsAnchorService import org.onap.cps.integration.base.CpsIntegrationSpecBase import org.onap.cps.spi.FetchDescendantsOption import org.onap.cps.spi.exceptions.AlreadyDefinedException import org.onap.cps.spi.exceptions.AnchorNotFoundException -import org.onap.cps.spi.exceptions.DataspaceInUseException -import org.onap.cps.spi.exceptions.DataspaceNotFoundException -import java.time.OffsetDateTime - -class CpsAdminServiceIntegrationSpec extends CpsIntegrationSpecBase { - - CpsAdminService objectUnderTest - def setup() { objectUnderTest = cpsAdminService } - - def 'Dataspace CRUD operations.'() { - when: 'a dataspace is created' - objectUnderTest.createDataspace('newDataspace') - then: 'the dataspace can be read' - assert objectUnderTest.getDataspace('newDataspace').name == 'newDataspace' - and: 'it can be deleted' - objectUnderTest.deleteDataspace('newDataspace') - then: 'the dataspace no longer exists i.e. an exception is thrown if an attempt is made to retrieve it' - def thrown = null - try { - objectUnderTest.getDataspace('newDataspace') - } catch(Exception exception) { - thrown = exception - } - assert thrown instanceof DataspaceNotFoundException - } +import java.time.OffsetDateTime - def 'Delete dataspace with error; #scenario.'() { - setup: 'add some anchors if needed' - numberOfAnchors.times { - objectUnderTest.createAnchor(GENERAL_TEST_DATASPACE, BOOKSTORE_SCHEMA_SET, 'anchor' + it) - } - when: 'attempt to delete dataspace' - objectUnderTest.deleteDataspace(dataspaceName) - then: 'the correct exception is thrown with the relevant details' - def thrownException = thrown(expectedException) - thrownException.details.contains(expectedMessageDetails) - cleanup: - numberOfAnchors.times { - objectUnderTest.deleteAnchor(GENERAL_TEST_DATASPACE, 'anchor' + it) - } - where: 'the following data is used' - scenario | dataspaceName | numberOfAnchors || expectedException | expectedMessageDetails - 'dataspace name does not exist' | 'unknown' | 0 || DataspaceNotFoundException | 'unknown does not exist' - 'dataspace contains schemasets' | GENERAL_TEST_DATASPACE | 0 || DataspaceInUseException | 'contains 1 schemaset(s)' - 'dataspace contains anchors' | GENERAL_TEST_DATASPACE | 2 || DataspaceInUseException | 'contains 2 anchor(s)' - } +class CpsAnchorServiceIntegrationSpec extends CpsIntegrationSpecBase { - def 'Retrieve all dataspaces (depends on total test suite).'() { - given: 'two addtional dataspaces are created' - objectUnderTest.createDataspace('dataspace1') - objectUnderTest.createDataspace('dataspace2') - when: 'all datespaces are retreived' - def result = objectUnderTest.getAllDataspaces() - then: 'there are at least 3 dataspaces (2 new ones plus the general test dataspace)' - result.size() >= 3 - assert result.name.containsAll([GENERAL_TEST_DATASPACE, 'dataspace1', 'dataspace2']) - } + CpsAnchorService objectUnderTest - def 'Duplicate dataspaces.'() { - when: 'attempting to create a dataspace with the same name as an existing one' - objectUnderTest.createDataspace(GENERAL_TEST_DATASPACE) - then: 'an exception is thrown indicating the dataspace already exists' - thrown(AlreadyDefinedException) - } + def setup() { objectUnderTest = cpsAnchorService } def 'Anchor CRUD operations.'() { when: 'an anchor is created' @@ -148,9 +91,9 @@ class CpsAdminServiceIntegrationSpec extends CpsIntegrationSpecBase { then: 'an empty result is returned (no error)' assert result == [] where: - scenario | dataspaceName - 'non existing database' | 'nonExistingDataspace' - 'just unknown module(s)' | GENERAL_TEST_DATASPACE + scenario | dataspaceName + 'non existing database' | 'nonExistingDataspace' + 'just unknown module(s)' | GENERAL_TEST_DATASPACE } def 'Update anchor schema set.'() { diff --git a/integration-test/src/test/groovy/org/onap/cps/integration/functional/CpsDataServiceIntegrationSpec.groovy b/integration-test/src/test/groovy/org/onap/cps/integration/functional/CpsDataServiceIntegrationSpec.groovy index 017ede7de..b107a87e8 100644 --- a/integration-test/src/test/groovy/org/onap/cps/integration/functional/CpsDataServiceIntegrationSpec.groovy +++ b/integration-test/src/test/groovy/org/onap/cps/integration/functional/CpsDataServiceIntegrationSpec.groovy @@ -34,8 +34,6 @@ import org.onap.cps.spi.exceptions.DataValidationException import org.onap.cps.spi.exceptions.DataspaceNotFoundException import org.onap.cps.spi.model.DeltaReport -import java.time.OffsetDateTime - import static org.onap.cps.spi.FetchDescendantsOption.DIRECT_CHILDREN_ONLY import static org.onap.cps.spi.FetchDescendantsOption.INCLUDE_ALL_DESCENDANTS import static org.onap.cps.spi.FetchDescendantsOption.OMIT_DESCENDANTS @@ -174,7 +172,7 @@ class CpsDataServiceIntegrationSpec extends FunctionalSpecBase { def 'Attempt to create a top level data node using root.'() { given: 'a new anchor' - cpsAdminService.createAnchor(FUNCTIONAL_TEST_DATASPACE_1, BOOKSTORE_SCHEMA_SET, 'newAnchor1'); + cpsAnchorService.createAnchor(FUNCTIONAL_TEST_DATASPACE_1, BOOKSTORE_SCHEMA_SET, 'newAnchor1'); when: 'attempt to save new top level datanode' def json = '{"bookstore": {"bookstore-name": "New Store"} }' objectUnderTest.saveData(FUNCTIONAL_TEST_DATASPACE_1, 'newAnchor1' , '/', json, now) diff --git a/integration-test/src/test/groovy/org/onap/cps/integration/functional/CpsDataspaceServiceIntegrationSpec.groovy b/integration-test/src/test/groovy/org/onap/cps/integration/functional/CpsDataspaceServiceIntegrationSpec.groovy new file mode 100644 index 000000000..739e80224 --- /dev/null +++ b/integration-test/src/test/groovy/org/onap/cps/integration/functional/CpsDataspaceServiceIntegrationSpec.groovy @@ -0,0 +1,107 @@ +/* + * ============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.integration.functional + +import org.onap.cps.api.CpsDataspaceService +import org.onap.cps.integration.base.CpsIntegrationSpecBase +import org.onap.cps.spi.exceptions.AlreadyDefinedException +import org.onap.cps.spi.exceptions.DataspaceInUseException +import org.onap.cps.spi.exceptions.DataspaceNotFoundException + +class CpsDataspaceServiceIntegrationSpec extends CpsIntegrationSpecBase { + + CpsDataspaceService objectUnderTest + + def setup() { objectUnderTest = cpsDataspaceService } + + def 'Dataspace CRUD operations.'() { + when: 'a dataspace is created' + objectUnderTest.createDataspace('newDataspace') + then: 'the dataspace can be read' + assert objectUnderTest.getDataspace('newDataspace').name == 'newDataspace' + and: 'it can be deleted' + objectUnderTest.deleteDataspace('newDataspace') + then: 'the dataspace no longer exists i.e. an exception is thrown if an attempt is made to retrieve it' + def thrown = null + try { + objectUnderTest.getDataspace('newDataspace') + } catch(Exception exception) { + thrown = exception + } + assert thrown instanceof DataspaceNotFoundException + } + + def 'Attempt to delete a non-existing dataspace'() { + when: 'attempt to delete a non-existing dataspace' + objectUnderTest.deleteDataspace('non-existing-name') + then: 'a not found exception is thrown with the relevant dataspace name' + def thrownException = thrown(DataspaceNotFoundException) + assert thrownException.details.contains('non-existing-name does not exist') + } + + def 'Attempt Delete dataspace with a schema set and anchor'() { + setup: 'a dataspace with a schema set and anchor' + objectUnderTest.createDataspace('targetDataspace') + cpsModuleService.createSchemaSet('targetDataspace','someSchemaSet',[:]) + cpsAnchorService.createAnchor('targetDataspace', 'someSchemaSet', 'some_anchor') + when: 'attempt to delete dataspace' + objectUnderTest.deleteDataspace('targetDataspace') + then: 'an in-use exception is thrown mentioning anchors' + def thrownException = thrown(DataspaceInUseException) + assert thrownException.details.contains('contains 1 anchor(s)') + cleanup: + cpsModuleService.deleteSchemaSetsWithCascade('targetDataspace',['someSchemaSet']) + objectUnderTest.deleteDataspace('targetDataspace') + } + + def 'Attempt to delete dataspace with just a schema set'() { + setup: 'a dataspace with a schema set' + objectUnderTest.createDataspace('targetDataspace') + cpsModuleService.createSchemaSet('targetDataspace','someSchemaSet',[:]) + when: 'attempt to delete dataspace' + objectUnderTest.deleteDataspace('targetDataspace') + then: 'an in-use exception is thrown mentioning schemasets' + def thrownException = thrown(DataspaceInUseException) + assert thrownException.details.contains('contains 1 schemaset(s)') + cleanup: + cpsModuleService.deleteSchemaSetsWithCascade('targetDataspace',['someSchemaSet']) + objectUnderTest.deleteDataspace('targetDataspace') + } + + def 'Retrieve all dataspaces (depends on total test suite).'() { + given: 'two addtional dataspaces are created' + objectUnderTest.createDataspace('dataspace1') + objectUnderTest.createDataspace('dataspace2') + when: 'all datespaces are retreived' + def result = objectUnderTest.getAllDataspaces() + then: 'there are at least 3 dataspaces (2 new ones plus the general test dataspace)' + result.size() >= 3 + assert result.name.containsAll([GENERAL_TEST_DATASPACE, 'dataspace1', 'dataspace2']) + } + + def 'Duplicate dataspaces.'() { + when: 'attempting to create a dataspace with the same name as an existing one' + objectUnderTest.createDataspace(GENERAL_TEST_DATASPACE) + then: 'an exception is thrown indicating the dataspace already exists' + thrown(AlreadyDefinedException) + } + +} diff --git a/integration-test/src/test/groovy/org/onap/cps/integration/functional/CpsModuleServiceIntegrationSpec.groovy b/integration-test/src/test/groovy/org/onap/cps/integration/functional/CpsModuleServiceIntegrationSpec.groovy index 2e1b082c0..cf0e0b594 100644 --- a/integration-test/src/test/groovy/org/onap/cps/integration/functional/CpsModuleServiceIntegrationSpec.groovy +++ b/integration-test/src/test/groovy/org/onap/cps/integration/functional/CpsModuleServiceIntegrationSpec.groovy @@ -20,6 +20,7 @@ package org.onap.cps.integration.functional +import org.onap.cps.api.CpsModuleService import org.onap.cps.api.impl.CpsModuleServiceImpl import org.onap.cps.integration.base.FunctionalSpecBase import org.onap.cps.spi.CascadeDeleteAllowed @@ -33,7 +34,7 @@ import org.onap.cps.spi.model.ModuleReference class CpsModuleServiceIntegrationSpec extends FunctionalSpecBase { - CpsModuleServiceImpl objectUnderTest + CpsModuleService objectUnderTest private static def originalNumberOfModuleReferences = 1 private static def existingModuleReference = new ModuleReference('stores','2020-09-15') @@ -97,7 +98,7 @@ class CpsModuleServiceIntegrationSpec extends FunctionalSpecBase { def schemaSetName = "NewSchemaWith${numberOfNewModules}Modules" objectUnderTest.createSchemaSetFromModules(FUNCTIONAL_TEST_DATASPACE_1, schemaSetName, newYangResourcesNameToContentMap, moduleReferences) and: 'associated with a new anchor' - cpsAdminService.createAnchor(FUNCTIONAL_TEST_DATASPACE_1, schemaSetName, 'newAnchor') + cpsAnchorService.createAnchor(FUNCTIONAL_TEST_DATASPACE_1, schemaSetName, 'newAnchor') then: 'the new anchor has the correct number of modules' def yangResourceModuleReferences = objectUnderTest.getYangResourcesModuleReferences(FUNCTIONAL_TEST_DATASPACE_1, 'newAnchor') assert expectedNumberOfModulesForAnchor == yangResourceModuleReferences.size() @@ -204,7 +205,7 @@ class CpsModuleServiceIntegrationSpec extends FunctionalSpecBase { objectUnderTest.createSchemaSet(FUNCTIONAL_TEST_DATASPACE_1, 'newSchemaSet', newYangResourcesNameToContentMap) and: 'optionally create anchor for the schema set' if (associateWithAnchor) { - cpsAdminService.createAnchor(FUNCTIONAL_TEST_DATASPACE_1, 'newSchemaSet', 'newAnchor') + cpsAnchorService.createAnchor(FUNCTIONAL_TEST_DATASPACE_1, 'newSchemaSet', 'newAnchor') } when: 'attempt to delete the schema set' try { @@ -270,7 +271,7 @@ class CpsModuleServiceIntegrationSpec extends FunctionalSpecBase { given: 'an anchor and schema set with 2 modules (to be upgraded)' populateNewYangResourcesNameToContentMapAndAllModuleReferences('original', 2) objectUnderTest.createSchemaSetFromModules(FUNCTIONAL_TEST_DATASPACE_1, 'targetSchema', newYangResourcesNameToContentMap, []) - cpsAdminService.createAnchor(FUNCTIONAL_TEST_DATASPACE_1, 'targetSchema', 'targetAnchor') + cpsAnchorService.createAnchor(FUNCTIONAL_TEST_DATASPACE_1, 'targetSchema', 'targetAnchor') def yangResourceModuleReferencesBeforeUpgrade = objectUnderTest.getYangResourcesModuleReferences(FUNCTIONAL_TEST_DATASPACE_1, 'targetAnchor') assert yangResourceModuleReferencesBeforeUpgrade.size() == 2 assert yangResourceModuleReferencesBeforeUpgrade.containsAll([new ModuleReference('original_0','2000-01-01'),new ModuleReference('original_1','2001-01-01')]) @@ -291,18 +292,18 @@ class CpsModuleServiceIntegrationSpec extends FunctionalSpecBase { cleanup: objectUnderTest.deleteSchemaSetsWithCascade(FUNCTIONAL_TEST_DATASPACE_1, ['targetSchema']) } - + def 'Upgrade existing schema set from another anchor (used in NCMP for matching module set tag)'() { given: 'an anchor and schema set with 1 module (target)' populateNewYangResourcesNameToContentMapAndAllModuleReferences('target', 1) objectUnderTest.createSchemaSetFromModules(FUNCTIONAL_TEST_DATASPACE_1, 'targetSchema', newYangResourcesNameToContentMap, []) - cpsAdminService.createAnchor(FUNCTIONAL_TEST_DATASPACE_1, 'targetSchema', 'targetAnchor') + cpsAnchorService.createAnchor(FUNCTIONAL_TEST_DATASPACE_1, 'targetSchema', 'targetAnchor') def moduleReferencesBeforeUpgrade = objectUnderTest.getYangResourcesModuleReferences(FUNCTIONAL_TEST_DATASPACE_1, 'targetAnchor') assert moduleReferencesBeforeUpgrade.size() == 1 and: 'another anchor and schema set with 2 other modules (source for upgrade)' populateNewYangResourcesNameToContentMapAndAllModuleReferences('source', 2) objectUnderTest.createSchemaSetFromModules(FUNCTIONAL_TEST_DATASPACE_1, 'sourceSchema', newYangResourcesNameToContentMap, []) - cpsAdminService.createAnchor(FUNCTIONAL_TEST_DATASPACE_1, 'sourceSchema', 'sourceAnchor') + cpsAnchorService.createAnchor(FUNCTIONAL_TEST_DATASPACE_1, 'sourceSchema', 'sourceAnchor') assert objectUnderTest.getYangResourcesModuleReferences(FUNCTIONAL_TEST_DATASPACE_1, 'sourceAnchor').size() == 2 when: 'the target schema is upgraded using the module references from the source anchor' def moduleReferencesFromSourceAnchor = objectUnderTest.getYangResourcesModuleReferences(FUNCTIONAL_TEST_DATASPACE_1, 'sourceAnchor') diff --git a/integration-test/src/test/groovy/org/onap/cps/integration/performance/base/CpsPerfTestBase.groovy b/integration-test/src/test/groovy/org/onap/cps/integration/performance/base/CpsPerfTestBase.groovy index d8012ec6d..816aeff71 100644 --- a/integration-test/src/test/groovy/org/onap/cps/integration/performance/base/CpsPerfTestBase.groovy +++ b/integration-test/src/test/groovy/org/onap/cps/integration/performance/base/CpsPerfTestBase.groovy @@ -43,7 +43,7 @@ class CpsPerfTestBase extends PerfTestBase { } def setupPerformanceInfraStructure() { - cpsAdminService.createDataspace(CPS_PERFORMANCE_TEST_DATASPACE) + cpsDataspaceService.createDataspace(CPS_PERFORMANCE_TEST_DATASPACE) def modelAsString = readResourceDataFile('bookstore/bookstore.yang') cpsModuleService.createSchemaSet(CPS_PERFORMANCE_TEST_DATASPACE, BOOKSTORE_SCHEMA_SET, [bookstore: modelAsString]) } diff --git a/integration-test/src/test/groovy/org/onap/cps/integration/performance/base/NcmpPerfTestBase.groovy b/integration-test/src/test/groovy/org/onap/cps/integration/performance/base/NcmpPerfTestBase.groovy index 12b04be2e..0557d5bb7 100644 --- a/integration-test/src/test/groovy/org/onap/cps/integration/performance/base/NcmpPerfTestBase.groovy +++ b/integration-test/src/test/groovy/org/onap/cps/integration/performance/base/NcmpPerfTestBase.groovy @@ -59,14 +59,14 @@ class NcmpPerfTestBase extends PerfTestBase { } def setupPerformanceInfraStructure() { - cpsAdminService.createDataspace(NCMP_PERFORMANCE_TEST_DATASPACE) + cpsDataspaceService.createDataspace(NCMP_PERFORMANCE_TEST_DATASPACE) createRegistrySchemaSet() createCmDataSubscriptionsSchemaSet() addCmSubscriptionData() } def createInitialData() { - cpsAdminService.createAnchor(NCMP_PERFORMANCE_TEST_DATASPACE, REGISTRY_SCHEMA_SET, REGISTRY_ANCHOR) + cpsDataspaceService.createAnchor(NCMP_PERFORMANCE_TEST_DATASPACE, REGISTRY_SCHEMA_SET, REGISTRY_ANCHOR) def data = readResourceDataFile('ncmp-registry/1000-cmhandles.json') cpsDataService.saveData(NCMP_PERFORMANCE_TEST_DATASPACE, REGISTRY_ANCHOR, data, OffsetDateTime.now()) } @@ -82,7 +82,7 @@ class NcmpPerfTestBase extends PerfTestBase { } def addCmSubscriptionData() { - cpsAdminService.createAnchor(NCMP_PERFORMANCE_TEST_DATASPACE, CM_DATA_SUBSCRIPTIONS_SCHEMA_SET, CM_DATA_SUBSCRIPTIONS_ANCHOR) + cpsDataspaceService.createAnchor(NCMP_PERFORMANCE_TEST_DATASPACE, CM_DATA_SUBSCRIPTIONS_SCHEMA_SET, CM_DATA_SUBSCRIPTIONS_ANCHOR) cpsDataService.saveData(NCMP_PERFORMANCE_TEST_DATASPACE, CM_DATA_SUBSCRIPTIONS_ANCHOR, datastore1cmHandlePlaceHolder, now) def subscribers = createLeafList('subscribers',numberOfCmDataSubscribers, subscriberIdPrefix) def filters = '"filters":' + createJsonArray('filter',numberOfFiltersPerCmHandle,'xpath',xpathPrefix,subscribers) diff --git a/integration-test/src/test/groovy/org/onap/cps/integration/performance/cps/CpsDataServiceLimitsPerfTest.groovy b/integration-test/src/test/groovy/org/onap/cps/integration/performance/cps/CpsDataServiceLimitsPerfTest.groovy index ce66cb08a..4d4d6125c 100644 --- a/integration-test/src/test/groovy/org/onap/cps/integration/performance/cps/CpsDataServiceLimitsPerfTest.groovy +++ b/integration-test/src/test/groovy/org/onap/cps/integration/performance/cps/CpsDataServiceLimitsPerfTest.groovy @@ -35,7 +35,7 @@ class CpsDataServiceLimitsPerfTest extends CpsPerfTestBase { def 'Create 33,000 books (note further tests depend on this running first).'() { given: 'an anchor containing a bookstore with one category' - cpsAdminService.createAnchor(CPS_PERFORMANCE_TEST_DATASPACE, BOOKSTORE_SCHEMA_SET, 'limitsAnchor') + cpsAnchorService.createAnchor(CPS_PERFORMANCE_TEST_DATASPACE, BOOKSTORE_SCHEMA_SET, 'limitsAnchor') def parentNodeData = '{"bookstore": { "categories": [{ "code": 1, "name": "Test", "books" : [] }] }}' cpsDataService.saveData(CPS_PERFORMANCE_TEST_DATASPACE, 'limitsAnchor', parentNodeData, OffsetDateTime.now()) when: '33,000 books are added' @@ -84,7 +84,7 @@ class CpsDataServiceLimitsPerfTest extends CpsPerfTestBase { when: resourceMeter.start() cpsDataService.deleteDataNodes(CPS_PERFORMANCE_TEST_DATASPACE, 'limitsAnchor', OffsetDateTime.now()) - cpsAdminService.deleteAnchor(CPS_PERFORMANCE_TEST_DATASPACE, 'limitsAnchor') + cpsAnchorService.deleteAnchor(CPS_PERFORMANCE_TEST_DATASPACE, 'limitsAnchor') resourceMeter.stop() def durationInSeconds = resourceMeter.getTotalTimeInSeconds() then: 'test data is deleted in 1 second' diff --git a/integration-test/src/test/groovy/org/onap/cps/integration/performance/cps/CpsAdminServiceLimitsPerfTest.groovy b/integration-test/src/test/groovy/org/onap/cps/integration/performance/cps/CpsDataspaceServiceLimitsPerfTest.groovy similarity index 91% rename from integration-test/src/test/groovy/org/onap/cps/integration/performance/cps/CpsAdminServiceLimitsPerfTest.groovy rename to integration-test/src/test/groovy/org/onap/cps/integration/performance/cps/CpsDataspaceServiceLimitsPerfTest.groovy index 9ea7a7b53..e1235272f 100644 --- a/integration-test/src/test/groovy/org/onap/cps/integration/performance/cps/CpsAdminServiceLimitsPerfTest.groovy +++ b/integration-test/src/test/groovy/org/onap/cps/integration/performance/cps/CpsDataspaceServiceLimitsPerfTest.groovy @@ -20,14 +20,14 @@ package org.onap.cps.integration.performance.cps -import org.onap.cps.api.CpsAdminService +import org.onap.cps.api.CpsAnchorService import org.onap.cps.integration.performance.base.CpsPerfTestBase -class CpsAdminServiceLimitsPerfTest extends CpsPerfTestBase { +class CpsDataspaceServiceLimitsPerfTest extends CpsPerfTestBase { - CpsAdminService objectUnderTest + CpsAnchorService objectUnderTest - def setup() { objectUnderTest = cpsAdminService } + def setup() { objectUnderTest = cpsAnchorService } def 'Get anchors from multiple schema set names limit exceeded: 32,766 (~ 2^15) schema set names.'() { given: 'more than 32,766 schema set names' diff --git a/integration-test/src/test/groovy/org/onap/cps/integration/performance/cps/DeletePerfTest.groovy b/integration-test/src/test/groovy/org/onap/cps/integration/performance/cps/DeletePerfTest.groovy index 818c300a5..e7bfabefb 100644 --- a/integration-test/src/test/groovy/org/onap/cps/integration/performance/cps/DeletePerfTest.groovy +++ b/integration-test/src/test/groovy/org/onap/cps/integration/performance/cps/DeletePerfTest.groovy @@ -182,7 +182,7 @@ class DeletePerfTest extends CpsPerfTestBase { def anchorNames = (1..10).collect {'delete' + it} when: 'data nodes are deleted' resourceMeter.start() - cpsAdminService.deleteAnchors(CPS_PERFORMANCE_TEST_DATASPACE, anchorNames) + cpsAnchorService.deleteAnchors(CPS_PERFORMANCE_TEST_DATASPACE, anchorNames) resourceMeter.stop() def deleteDurationInSeconds = resourceMeter.getTotalTimeInSeconds() then: 'delete duration is within expected time and memory used is within limit' diff --git a/integration-test/src/test/groovy/org/onap/cps/integration/performance/cps/WritePerfTest.groovy b/integration-test/src/test/groovy/org/onap/cps/integration/performance/cps/WritePerfTest.groovy index 0c7107a56..2d38a0dfb 100644 --- a/integration-test/src/test/groovy/org/onap/cps/integration/performance/cps/WritePerfTest.groovy +++ b/integration-test/src/test/groovy/org/onap/cps/integration/performance/cps/WritePerfTest.groovy @@ -27,7 +27,7 @@ class WritePerfTest extends CpsPerfTestBase { def 'Writing openroadm data has linear time.'() { given: 'an empty anchor exists for openroadm' - cpsAdminService.createAnchor(CPS_PERFORMANCE_TEST_DATASPACE, LARGE_SCHEMA_SET, 'writeAnchor') + cpsAnchorService.createAnchor(CPS_PERFORMANCE_TEST_DATASPACE, LARGE_SCHEMA_SET, 'writeAnchor') and: 'a list of device nodes to add' def jsonData = generateOpenRoadData(totalNodes) when: 'device nodes are added' @@ -39,7 +39,7 @@ class WritePerfTest extends CpsPerfTestBase { recordAndAssertResourceUsage("Writing ${totalNodes} devices", expectedDuration, durationInSeconds, memoryLimit, resourceMeter.getTotalMemoryUsageInMB()) cleanup: cpsDataService.deleteDataNodes(CPS_PERFORMANCE_TEST_DATASPACE, 'writeAnchor', OffsetDateTime.now()) - cpsAdminService.deleteAnchor(CPS_PERFORMANCE_TEST_DATASPACE, 'writeAnchor') + cpsAnchorService.deleteAnchor(CPS_PERFORMANCE_TEST_DATASPACE, 'writeAnchor') where: totalNodes || expectedDuration | memoryLimit 50 || 4 | 100 @@ -50,7 +50,7 @@ class WritePerfTest extends CpsPerfTestBase { def 'Writing bookstore data has exponential time.'() { given: 'an anchor containing a bookstore with a single category' - cpsAdminService.createAnchor(CPS_PERFORMANCE_TEST_DATASPACE, BOOKSTORE_SCHEMA_SET, 'writeAnchor') + cpsAnchorService.createAnchor(CPS_PERFORMANCE_TEST_DATASPACE, BOOKSTORE_SCHEMA_SET, 'writeAnchor') def parentNodeData = '{"bookstore": { "categories": [{ "code": 1, "name": "Test", "books" : [] }] }}' cpsDataService.saveData(CPS_PERFORMANCE_TEST_DATASPACE, 'writeAnchor', parentNodeData, OffsetDateTime.now()) and: 'a list of books to add' @@ -64,7 +64,7 @@ class WritePerfTest extends CpsPerfTestBase { recordAndAssertResourceUsage("Writing ${totalBooks} books", expectedDuration, durationInSeconds, memoryLimit, resourceMeter.getTotalMemoryUsageInMB()) cleanup: cpsDataService.deleteDataNodes(CPS_PERFORMANCE_TEST_DATASPACE, 'writeAnchor', OffsetDateTime.now()) - cpsAdminService.deleteAnchor(CPS_PERFORMANCE_TEST_DATASPACE, 'writeAnchor') + cpsAnchorService.deleteAnchor(CPS_PERFORMANCE_TEST_DATASPACE, 'writeAnchor') where: totalBooks || expectedDuration | memoryLimit 800 || 1 | 50