summaryrefslogtreecommitdiffstats
path: root/cps-ncmp-service
diff options
context:
space:
mode:
authoremaclee <lee.anjella.macabuhay@est.tech>2023-04-16 17:48:15 +0100
committerLee Anjella Macabuhay <lee.anjella.macabuhay@est.tech>2023-04-27 14:39:54 +0000
commit9c126615d93ada36299fbac36dfb20aedbe2add1 (patch)
tree50b0ba3603bbaf2a8b9f373db213b035243b6beb /cps-ncmp-service
parentccf2e5abd0a1eec25f90fa6f89ed3766fc9c068f (diff)
Add retry mechanism on Subscription loader
Issue-ID: CPS-1568 Signed-off-by: emaclee <lee.anjella.macabuhay@est.tech> Change-Id: I35697c260cc1a774f50d12552996b39f812fc2de
Diffstat (limited to 'cps-ncmp-service')
-rw-r--r--cps-ncmp-service/src/main/java/org/onap/cps/ncmp/init/SubscriptionModelLoader.java31
-rw-r--r--cps-ncmp-service/src/main/resources/model/subscription.yang2
-rw-r--r--cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/init/SubscriptionModelLoaderSpec.groovy36
3 files changed, 66 insertions, 3 deletions
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 231ba75b5..5a418fd31 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
@@ -31,6 +31,7 @@ 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.model.Dataspace;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.context.event.ApplicationReadyEvent;
@@ -51,6 +52,12 @@ public class SubscriptionModelLoader implements ModelLoader {
private static final String SUBSCRIPTION_SCHEMASET_NAME = "subscriptions";
private static final String SUBSCRIPTION_REGISTRY_DATANODE_NAME = "subscription-registry";
+ @Value("${ncmp.model-loader.maximumAttemptCount:20}")
+ private int maximumAttemptCount;
+
+ @Value("${ncmp.model-loader.retryTimeMs:1000}")
+ private long retryTimeMs;
+
@Value("${ncmp.model-loader.subscription:false}")
private boolean subscriptionModelLoaderEnabled;
@@ -63,6 +70,7 @@ public class SubscriptionModelLoader implements ModelLoader {
public void onApplicationEvent(final ApplicationReadyEvent applicationReadyEvent) {
try {
if (subscriptionModelLoaderEnabled) {
+ checkNcmpDataspaceExists();
onboardSubscriptionModel(createYangResourceToContentMap());
} else {
log.info("Subscription Model Loader is disabled");
@@ -73,6 +81,29 @@ public class SubscriptionModelLoader implements ModelLoader {
}
}
+ private void checkNcmpDataspaceExists() {
+ boolean ncmpDataspaceExists = false;
+ int attemptCount = 0;
+ while (!ncmpDataspaceExists) {
+ final Dataspace ncmpDataspace = cpsAdminService.getDataspace(SUBSCRIPTION_DATASPACE_NAME);
+ if (ncmpDataspace != null) {
+ ncmpDataspaceExists = true;
+ }
+ if (attemptCount < maximumAttemptCount) {
+ try {
+ Thread.sleep(attemptCount * retryTimeMs);
+ attemptCount++;
+ log.info("Retrieving NCMP dataspace... {} attempt(s) ", attemptCount);
+ } catch (final InterruptedException e) {
+ Thread.currentThread().interrupt();
+ }
+ } else {
+ throw new NcmpStartUpException("Retrieval of NCMP dataspace fails",
+ "NCMP dataspace does not exist");
+ }
+ }
+ }
+
/**
* Method to onboard subscription model for NCMP.
*/
diff --git a/cps-ncmp-service/src/main/resources/model/subscription.yang b/cps-ncmp-service/src/main/resources/model/subscription.yang
index 8ae1be664..e332a2898 100644
--- a/cps-ncmp-service/src/main/resources/model/subscription.yang
+++ b/cps-ncmp-service/src/main/resources/model/subscription.yang
@@ -4,7 +4,7 @@ module subscription {
prefix subs;
- revision "2023-21-03" {
+ revision "2023-03-21" {
description
"NCMP subscription model";
}
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 aa8bc53c9..a14a0f286 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
@@ -32,6 +32,7 @@ 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.onap.cps.spi.model.Dataspace
import org.springframework.boot.SpringApplication
import org.slf4j.LoggerFactory
import org.springframework.boot.context.event.ApplicationReadyEvent
@@ -73,9 +74,15 @@ class SubscriptionModelLoaderSpec extends Specification {
}
def 'Onboard subscription model successfully via application ready event'() {
- when:'model loader is enabled'
+ given: 'dataspace is ready for use'
+ mockCpsAdminService.getDataspace('NCMP-Admin') >> new Dataspace('NCMP-Admin')
+ and:'model loader is enabled'
objectUnderTest.subscriptionModelLoaderEnabled = true
- and: 'the application is ready'
+ and: 'maximum attempt count is set'
+ objectUnderTest.maximumAttemptCount = 20
+ and: 'retry time is set'
+ objectUnderTest.retryTimeMs = 100
+ when: 'the application is ready'
objectUnderTest.onApplicationEvent(applicationReadyEvent)
then: 'the module service to create schema set is called once'
1 * mockCpsModuleService.createSchemaSet('NCMP-Admin', 'subscriptions',sampleYangContentMap)
@@ -90,6 +97,8 @@ class SubscriptionModelLoaderSpec extends Specification {
objectUnderTest.subscriptionModelLoaderEnabled = false
and: 'application is ready'
objectUnderTest.onApplicationEvent(applicationReadyEvent)
+ and: 'dataspace is ready for use'
+ mockCpsAdminService.getDataspace('NCMP-Admin') >> new Dataspace('NCMP-Admin')
then: 'the module service to create schema set was not called'
0 * mockCpsModuleService.createSchemaSet(*_)
and: 'the admin service to create an anchor set was not called'
@@ -98,11 +107,34 @@ class SubscriptionModelLoaderSpec extends Specification {
0 * mockCpsDataService.saveData(*_)
}
+ def 'Onboard subscription model fails as NCMP dataspace does not exist' () {
+ given: 'model loader is enabled'
+ objectUnderTest.subscriptionModelLoaderEnabled = true
+ and: 'maximum attempt count is set'
+ objectUnderTest.maximumAttemptCount = 20
+ and: 'retry time is set'
+ objectUnderTest.retryTimeMs = 100
+ when: 'the application is ready'
+ objectUnderTest.onApplicationEvent(applicationReadyEvent)
+ then: 'the module service to create schema set was not called'
+ 0 * mockCpsModuleService.createSchemaSet(*_)
+ and: 'the admin service to create an anchor set was not called'
+ 0 * mockCpsAdminService.createAnchor(*_)
+ and: 'the data service to create a top level datanode was not called'
+ 0 * mockCpsDataService.saveData(*_)
+ and: 'the log message contains the correct exception message'
+ def logs = appender.list.toString()
+ assert logs.contains("Retrieval of NCMP dataspace fails")
+ }
+
+
def 'Exception occurred while schema set creation' () {
given: 'creating a schema set throws an exception'
mockCpsModuleService.createSchemaSet(*_) >> { throw new DataValidationException(*_) }
and: 'model loader is enabled'
objectUnderTest.subscriptionModelLoaderEnabled = true
+ and: 'dataspace is ready for use'
+ mockCpsAdminService.getDataspace('NCMP-Admin') >> new Dataspace('NCMP-Admin')
when: 'application is ready'
objectUnderTest.onApplicationEvent(applicationReadyEvent)
then: 'the admin service to create an anchor set was not called'