Combine alreadyDefinedException classes
[cps.git] / cps-ncmp-service / src / main / java / org / onap / cps / ncmp / init / SubscriptionModelLoader.java
index 6713491..af9ee72 100644 (file)
@@ -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.onap.cps.spi.model.Dataspace;
+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,22 @@ public class SubscriptionModelLoader implements ModelLoader {
 
     private final CpsAdminService cpsAdminService;
     private final CpsModuleService cpsModuleService;
+    private final CpsDataService cpsDataService;
+    private static final String SUBSCRIPTION_MODEL_FILENAME = "subscription.yang";
+    private static final String SUBSCRIPTION_MODEL_RESOURCE_PATH = "model/" + SUBSCRIPTION_MODEL_FILENAME;
     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.maximum-attempt-count:20}")
+    private int maximumAttemptCount;
+
+    @Value("${ncmp.timers.model-loader.retry-time-ms:1000}")
+    private long retryTimeMs;
+
+    @Value("${ncmp.model-loader.subscription:true}")
+    private boolean subscriptionModelLoaderEnabled;
 
     /**
      * Method calls boarding subscription model when Application is ready.
@@ -51,31 +67,58 @@ public class SubscriptionModelLoader implements ModelLoader {
      * @param applicationReadyEvent the event to respond to
      */
     @Override
-    public void onApplicationEvent(@NonNull final ApplicationReadyEvent applicationReadyEvent) {
+    public void onApplicationEvent(final ApplicationReadyEvent applicationReadyEvent) {
         try {
-            onboardSubscriptionModel();
+            if (subscriptionModelLoaderEnabled) {
+                checkNcmpDataspaceExists();
+                onboardSubscriptionModel(createYangResourceToContentMap());
+            } 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);
         }
     }
 
+    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.
      */
-    private void onboardSubscriptionModel() {
-        final Map<String, String> yangResourceContentMap = createYangResourceToContentMap();
-        if (!yangResourceContentMap.get("subscription.yang").isEmpty()) {
-            createSchemaSet(SUBSCRIPTION_DATASPACE_NAME, SUBSCRIPTION_SCHEMASET_NAME, yangResourceContentMap);
-            createAnchor(SUBSCRIPTION_DATASPACE_NAME, SUBSCRIPTION_SCHEMASET_NAME, SUBSCRIPTION_ANCHOR_NAME);
-        }
+    private void onboardSubscriptionModel(final Map<String, String> yangResourceContentMap) {
+        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);
     }
 
 
     @Override
     public boolean createSchemaSet(final String dataspaceName,
-                                final String schemaSetName,
-                                final Map<String, String> yangResourceContentMap) {
+                                   final String schemaSetName,
+                                   final Map<String, String> yangResourceContentMap) {
         try {
             cpsModuleService.createSchemaSet(dataspaceName, schemaSetName, yangResourceContentMap);
         } catch (final AlreadyDefinedException exception) {
@@ -96,7 +139,7 @@ public class SubscriptionModelLoader implements ModelLoader {
      */
     @Override
     public boolean createAnchor(final String dataspaceName, final String schemaSetName,
-                             final String anchorName) {
+                                final String anchorName) {
         try {
             cpsAdminService.createAnchor(dataspaceName, schemaSetName, anchorName);
         } catch (final AlreadyDefinedException exception) {
@@ -108,17 +151,31 @@ public class SubscriptionModelLoader implements ModelLoader {
         return true;
     }
 
-    private String getFileContentAsString() {
-        try (InputStream inputStream = ClassLoader.getSystemClassLoader()
-                .getResourceAsStream("model/subscription.yang")) {
+    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(final String fileName) {
+        try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream(fileName)) {
             return new String(inputStream.readAllBytes(), StandardCharsets.UTF_8);
         } catch (final Exception exception) {
-            log.debug("Onboarding failed as unable to read file: {}", exception.getCause().toString());
-            throw new NcmpStartUpException("Onboarding failed as unable to read file: {}", exception.getMessage());
+            final String message = String.format("Onboarding failed as unable to read file: %s", fileName);
+            log.debug(message);
+            throw new NcmpStartUpException(message, exception.getMessage());
         }
     }
 
     private Map<String, String> createYangResourceToContentMap() {
-        return Map.of("subscription.yang", getFileContentAsString());
+        return Map.of(SUBSCRIPTION_MODEL_FILENAME, getFileContentAsString(SUBSCRIPTION_MODEL_RESOURCE_PATH));
     }
 }