diff options
Diffstat (limited to 'cps-ncmp-service')
5 files changed, 69 insertions, 7 deletions
diff --git a/cps-ncmp-service/pom.xml b/cps-ncmp-service/pom.xml index 67bc313585..57cd1c6fd5 100644 --- a/cps-ncmp-service/pom.xml +++ b/cps-ncmp-service/pom.xml @@ -27,7 +27,7 @@ <parent> <groupId>org.onap.cps</groupId> <artifactId>cps-parent</artifactId> - <version>3.2.4-SNAPSHOT</version> + <version>3.2.6-SNAPSHOT</version> <relativePath>../cps-parent/pom.xml</relativePath> </parent> diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/notifications/avc/AvcEventConsumer.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/notifications/avc/AvcEventConsumer.java index 79a36bf506..58290a7e9d 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/notifications/avc/AvcEventConsumer.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/notifications/avc/AvcEventConsumer.java @@ -44,7 +44,7 @@ public class AvcEventConsumer { * @param avcEvent the event to be consumed and produced. */ @KafkaListener( - topics = "dmi-cm-events", + topics = "${app.dmi.cm-events.topic}", properties = {"spring.json.value.default.type=org.onap.cps.ncmp.event.model.AvcEvent"}) public void consumeAndForward(final AvcEvent avcEvent) { log.debug("Consuming AVC event {} ...", avcEvent); diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/init/SubscriptionModelLoader.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/init/SubscriptionModelLoader.java index 6713491e6e..705c9d2664 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/init/SubscriptionModelLoader.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/init/SubscriptionModelLoader.java @@ -22,14 +22,17 @@ package org.onap.cps.ncmp.init; import java.io.InputStream; import java.nio.charset.StandardCharsets; +import java.time.OffsetDateTime; 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.CpsDataService; import org.onap.cps.api.CpsModuleService; import org.onap.cps.ncmp.api.impl.exception.NcmpStartUpException; import org.onap.cps.spi.exceptions.AlreadyDefinedException; +import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.stereotype.Component; @@ -41,9 +44,14 @@ public class SubscriptionModelLoader implements ModelLoader { private final CpsAdminService cpsAdminService; private final CpsModuleService cpsModuleService; + private final CpsDataService cpsDataService; private static final String SUBSCRIPTION_DATASPACE_NAME = "NCMP-Admin"; private static final String SUBSCRIPTION_ANCHOR_NAME = "AVC-Subscriptions"; private static final String SUBSCRIPTION_SCHEMASET_NAME = "subscriptions"; + private static final String SUBSCRIPTION_REGISTRY_DATANODE_NAME = "subscription-registry"; + + @Value("${ncmp.model-loader.subscription:false}") + private boolean subscriptionModelLoaderEnabled; /** * Method calls boarding subscription model when Application is ready. @@ -53,7 +61,11 @@ public class SubscriptionModelLoader implements ModelLoader { @Override public void onApplicationEvent(@NonNull final ApplicationReadyEvent applicationReadyEvent) { try { - onboardSubscriptionModel(); + if (subscriptionModelLoaderEnabled) { + onboardSubscriptionModel(); + } else { + log.info("Subscription Model Loader is disabled"); + } } catch (final NcmpStartUpException ncmpStartUpException) { log.debug("Onboarding model for NCMP failed: {} ", ncmpStartUpException.getMessage()); SpringApplication.exit(applicationReadyEvent.getApplicationContext(), () -> 1); @@ -68,6 +80,8 @@ public class SubscriptionModelLoader implements ModelLoader { if (!yangResourceContentMap.get("subscription.yang").isEmpty()) { createSchemaSet(SUBSCRIPTION_DATASPACE_NAME, SUBSCRIPTION_SCHEMASET_NAME, yangResourceContentMap); createAnchor(SUBSCRIPTION_DATASPACE_NAME, SUBSCRIPTION_SCHEMASET_NAME, SUBSCRIPTION_ANCHOR_NAME); + createTopLevelDataNode(SUBSCRIPTION_DATASPACE_NAME, SUBSCRIPTION_ANCHOR_NAME, + SUBSCRIPTION_REGISTRY_DATANODE_NAME); } } @@ -108,8 +122,22 @@ public class SubscriptionModelLoader implements ModelLoader { return true; } + private void createTopLevelDataNode(final String dataspaceName, + final String anchorName, + final String dataNodeName) { + final String nodeData = "{\"" + dataNodeName + "\":{}}"; + try { + cpsDataService.saveData(dataspaceName, anchorName, nodeData, OffsetDateTime.now()); + } catch (final AlreadyDefinedException exception) { + log.info("Creating new data node {} failed as data node already exists", dataNodeName); + } catch (final Exception exception) { + log.debug("Creating data node for subscription model failed: {}", exception.getMessage()); + throw new NcmpStartUpException("Creating data node failed", exception.getMessage()); + } + } + private String getFileContentAsString() { - try (InputStream inputStream = ClassLoader.getSystemClassLoader() + try (InputStream inputStream = getClass().getClassLoader() .getResourceAsStream("model/subscription.yang")) { return new String(inputStream.readAllBytes(), StandardCharsets.UTF_8); } catch (final Exception exception) { diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/init/SubscriptionModelLoaderSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/init/SubscriptionModelLoaderSpec.groovy index 65c0497c9a..907208228c 100644 --- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/init/SubscriptionModelLoaderSpec.groovy +++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/init/SubscriptionModelLoaderSpec.groovy @@ -26,9 +26,11 @@ import ch.qos.logback.core.read.ListAppender import org.junit.jupiter.api.AfterEach import org.junit.jupiter.api.BeforeEach 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.exception.NcmpStartUpException import org.onap.cps.spi.exceptions.AlreadyDefinedException +import org.onap.cps.spi.exceptions.DataValidationException import org.onap.cps.spi.exceptions.SchemaSetNotFoundException import org.springframework.boot.SpringApplication import org.slf4j.LoggerFactory @@ -39,11 +41,13 @@ class SubscriptionModelLoaderSpec extends Specification { def mockCpsAdminService = Mock(CpsAdminService) def mockCpsModuleService = Mock(CpsModuleService) - def objectUnderTest = new SubscriptionModelLoader(mockCpsAdminService, mockCpsModuleService) + def mockCpsDataService = Mock(CpsDataService) + def objectUnderTest = new SubscriptionModelLoader(mockCpsAdminService, mockCpsModuleService, mockCpsDataService) def SUBSCRIPTION_DATASPACE_NAME = objectUnderTest.SUBSCRIPTION_DATASPACE_NAME; def SUBSCRIPTION_ANCHOR_NAME = objectUnderTest.SUBSCRIPTION_ANCHOR_NAME; def SUBSCRIPTION_SCHEMASET_NAME = objectUnderTest.SUBSCRIPTION_SCHEMASET_NAME; + def SUBSCRIPTION_REGISTRY_DATANODE_NAME = objectUnderTest.SUBSCRIPTION_REGISTRY_DATANODE_NAME; def sampleYangContentMap = ['subscription.yang':'module subscription { *sample content* }'] @@ -67,12 +71,16 @@ class SubscriptionModelLoaderSpec extends Specification { } def 'Onboard subscription model successfully via application ready event'() { - when: 'the application is ready' + when:'model loader is enabled' + objectUnderTest.subscriptionModelLoaderEnabled = true + and: 'the application is ready' objectUnderTest.onApplicationEvent(applicationReadyEvent) then: 'the module service to create schema set is called once' 1 * mockCpsModuleService.createSchemaSet(SUBSCRIPTION_DATASPACE_NAME, SUBSCRIPTION_SCHEMASET_NAME,sampleYangContentMap) and: 'the admin service to create an anchor set is called once' 1 * mockCpsAdminService.createAnchor(SUBSCRIPTION_DATASPACE_NAME, SUBSCRIPTION_SCHEMASET_NAME, SUBSCRIPTION_ANCHOR_NAME) + and: 'the data service to create a top level datanode is called once' + 1 * mockCpsDataService.saveData(SUBSCRIPTION_DATASPACE_NAME, SUBSCRIPTION_ANCHOR_NAME, '{"' + SUBSCRIPTION_REGISTRY_DATANODE_NAME + '":{}}', _) } def 'Create schema set from model file'() { @@ -136,6 +144,29 @@ class SubscriptionModelLoaderSpec extends Specification { thrown(NcmpStartUpException) } + def 'Create top level node fails due to an AlreadyDefined exception'() { + given: 'the saving of the node data will throw an Already Defined exception' + mockCpsDataService.saveData(*_) >> + { AlreadyDefinedException.forDataNode('/xpath', "sampleContextName", null) } + when: 'the method to onboard model is called' + objectUnderTest.onboardSubscriptionModel() + then: 'no exception thrown' + noExceptionThrown() + } + + def 'Create top level node fails due to any other exception'() { + given: 'the saving of the node data will throw an exception' + mockCpsDataService.saveData(*_) >> + { throw new DataValidationException("Invalid JSON", "JSON Data is invalid") } + when: 'the method to onboard model is called' + objectUnderTest.onboardSubscriptionModel() + then: 'the log message contains the correct exception message' + def debugMessage = appender.list[0].toString() + assert debugMessage.contains("Creating data node for subscription model failed: Invalid JSON") + and: 'exception is thrown' + thrown(NcmpStartUpException) + } + def 'Get file content as string'() { when: 'the method to get yang content is called' def response = objectUnderTest.getFileContentAsString() diff --git a/cps-ncmp-service/src/test/resources/application.yml b/cps-ncmp-service/src/test/resources/application.yml index e8b4be4bcf..b7dfe86c10 100644 --- a/cps-ncmp-service/src/test/resources/application.yml +++ b/cps-ncmp-service/src/test/resources/application.yml @@ -31,4 +31,7 @@ ncmp: modules-sync-watchdog: async-executor: - parallelism-level: 3
\ No newline at end of file + parallelism-level: 3 + + model-loader: + subscription: true
\ No newline at end of file |