summaryrefslogtreecommitdiffstats
path: root/cps-ncmp-service/src
diff options
context:
space:
mode:
Diffstat (limited to 'cps-ncmp-service/src')
-rw-r--r--cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/notifications/avc/AvcEventConsumer.java2
-rw-r--r--cps-ncmp-service/src/main/java/org/onap/cps/ncmp/init/SubscriptionModelLoader.java32
-rw-r--r--cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/init/SubscriptionModelLoaderSpec.groovy35
-rw-r--r--cps-ncmp-service/src/test/resources/application.yml5
4 files changed, 68 insertions, 6 deletions
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 79a36bf50..58290a7e9 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 6713491e6..705c9d266 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 65c0497c9..907208228 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 e8b4be4bc..b7dfe86c1 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