Migrate policy api startup & config, controller to springboot
[policy/api.git] / main / src / main / java / org / onap / policy / api / main / startstop / ApiDatabaseInitializer.java
index cbd89cb..4aa2516 100644 (file)
@@ -2,8 +2,9 @@
  * ============LICENSE_START=======================================================
  * ONAP Policy API
  * ================================================================================
- * Copyright (C) 2019-2020 AT&T Intellectual Property. All rights reserved.
- * Modifications Copyright (C) 2019-2020 Nordix Foundation.
+ * Copyright (C) 2019-2021 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2019-2021 Nordix Foundation.
+ * Modifications Copyright (C) 2022 Bell Canada. All rights reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -26,101 +27,104 @@ package org.onap.policy.api.main.startstop;
 import java.util.LinkedHashMap;
 import java.util.LinkedList;
 import java.util.List;
+import javax.annotation.PostConstruct;
+import org.onap.policy.api.main.config.PolicyPreloadConfig;
 import org.onap.policy.api.main.exception.PolicyApiException;
-import org.onap.policy.api.main.parameters.ApiParameterGroup;
 import org.onap.policy.common.utils.coder.CoderException;
 import org.onap.policy.common.utils.coder.StandardYamlCoder;
 import org.onap.policy.common.utils.resources.ResourceUtils;
 import org.onap.policy.models.base.PfModelException;
 import org.onap.policy.models.base.PfModelRuntimeException;
 import org.onap.policy.models.provider.PolicyModelsProvider;
-import org.onap.policy.models.provider.PolicyModelsProviderFactory;
-import org.onap.policy.models.tosca.authorative.concepts.ToscaDataType;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaEntityFilter;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyType;
-import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyTypeFilter;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaTopologyTemplate;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.stereotype.Component;
 
 /**
  * This class creates initial policy types in the database.
  *
  * @author Chenfei Gao (cgao@research.att.com)
  */
+@Component
+@ConditionalOnProperty(value = "database.initialize", havingValue = "true", matchIfMissing = true)
 public class ApiDatabaseInitializer {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(ApiDatabaseInitializer.class);
 
     private static final StandardYamlCoder coder = new StandardYamlCoder();
-    private PolicyModelsProviderFactory factory;
 
-    /**
-     * Constructs the object.
-     */
-    public ApiDatabaseInitializer() {
-        factory = new PolicyModelsProviderFactory();
+    @Autowired
+    PolicyModelsProvider policyModelsProvider;
+
+    @Autowired
+    PolicyPreloadConfig policyPreloadConfig;
+
+    @PostConstruct
+    public void loadData() throws PolicyApiException {
+        initializeApiDatabase(policyPreloadConfig.getPolicyTypes(), policyPreloadConfig.getPolicies());
     }
 
     /**
      * Initializes database by preloading policy types and policies.
      *
-     * @param apiParameterGroup the apiParameterGroup parameters
+     * @param policyTypes List of policy types to preload.
+     * @param policies List of policies to preload.
      * @throws PolicyApiException in case of errors.
      */
-    public void initializeApiDatabase(final ApiParameterGroup apiParameterGroup) throws PolicyApiException {
-
-        try (PolicyModelsProvider databaseProvider =
-                factory.createPolicyModelsProvider(apiParameterGroup.getDatabaseProviderParameters())) {
-
-            if (alreadyExists(databaseProvider)) {
+    public void initializeApiDatabase(final List<String> policyTypes, final List<String> policies)
+        throws PolicyApiException {
+        try {
+            if (alreadyExists()) {
                 LOGGER.warn("DB already contains policy data - skipping preload");
                 return;
             }
 
-            ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate();
-            serviceTemplate.setDataTypes(new LinkedHashMap<String, ToscaDataType>());
-            serviceTemplate.setPolicyTypes(new LinkedHashMap<String, ToscaPolicyType>());
+            var serviceTemplate = new ToscaServiceTemplate();
+            serviceTemplate.setDataTypes(new LinkedHashMap<>());
+            serviceTemplate.setPolicyTypes(new LinkedHashMap<>());
             serviceTemplate.setToscaDefinitionsVersion("tosca_simple_yaml_1_1_0");
 
-            ToscaServiceTemplate createdPolicyTypes = preloadServiceTemplate(serviceTemplate,
-                    apiParameterGroup.getPreloadPolicyTypes(), databaseProvider::createPolicyTypes);
-            preloadServiceTemplate(createdPolicyTypes,
-                    apiParameterGroup.getPreloadPolicies(), databaseProvider::createPolicies);
+            ToscaServiceTemplate createdPolicyTypes =
+                    preloadServiceTemplate(serviceTemplate, policyTypes, policyModelsProvider::createPolicyTypes);
+            preloadServiceTemplate(createdPolicyTypes, policies, policyModelsProvider::createPolicies);
         } catch (final PolicyApiException | PfModelException | CoderException exp) {
             throw new PolicyApiException(exp);
         }
     }
 
-    private boolean alreadyExists(PolicyModelsProvider databaseProvider) throws PfModelException {
+    private boolean alreadyExists() throws PfModelException {
         try {
             ToscaServiceTemplate serviceTemplate =
-                            databaseProvider.getFilteredPolicyTypes(ToscaPolicyTypeFilter.builder().build());
+                    policyModelsProvider.getFilteredPolicyTypes(ToscaEntityFilter.<ToscaPolicyType>builder().build());
             if (!serviceTemplate.getPolicyTypes().isEmpty()) {
                 return true;
             }
-
         } catch (PfModelRuntimeException e) {
             LOGGER.trace("DB does not yet contain policy types", e);
         }
-
         return false;
     }
 
-    private ToscaServiceTemplate preloadServiceTemplate(ToscaServiceTemplate serviceTemplate,
-            List<String> entities, FunctionWithEx<ToscaServiceTemplate, ToscaServiceTemplate> getter)
-                    throws PolicyApiException, CoderException, PfModelException {
+    private ToscaServiceTemplate preloadServiceTemplate(ToscaServiceTemplate serviceTemplate, List<String> entities,
+            FunctionWithEx<ToscaServiceTemplate, ToscaServiceTemplate> getter)
+            throws PolicyApiException, CoderException, PfModelException {
 
         for (String entity : entities) {
-            String entityAsStringYaml = ResourceUtils.getResourceAsString(entity);
+            var entityAsStringYaml = ResourceUtils.getResourceAsString(entity);
             if (entityAsStringYaml == null) {
-                throw new PolicyApiException("Preloading entity cannot be found: " + entity);
+                LOGGER.warn("Preloading entity cannot be found: {}", entity);
+                continue;
             }
 
-            ToscaServiceTemplate singleEntity =
-                    coder.decode(entityAsStringYaml,  ToscaServiceTemplate.class);
+            ToscaServiceTemplate singleEntity = coder.decode(entityAsStringYaml, ToscaServiceTemplate.class);
             if (singleEntity == null) {
-                throw new PolicyApiException("Error deserializaing entity from file: " + entity);
+                throw new PolicyApiException("Error deserializing entity from file: " + entity);
             }
 
             // Consolidate data types and policy types
@@ -132,12 +136,12 @@ public class ApiDatabaseInitializer {
             }
 
             // Consolidate policies
-            ToscaTopologyTemplate topologyTemplate = singleEntity.getToscaTopologyTemplate();
+            var topologyTemplate = singleEntity.getToscaTopologyTemplate();
             if (topologyTemplate != null && topologyTemplate.getPolicies() != null) {
                 serviceTemplate.setToscaTopologyTemplate(new ToscaTopologyTemplate());
                 serviceTemplate.getToscaTopologyTemplate().setPolicies(new LinkedList<>());
                 serviceTemplate.getToscaTopologyTemplate().getPolicies()
-                    .addAll(singleEntity.getToscaTopologyTemplate().getPolicies());
+                        .addAll(singleEntity.getToscaTopologyTemplate().getPolicies());
             }
         }
         // Preload the specified entities