TOSCA Compliant Guard Policies
[policy/models.git] / models-tosca / src / main / java / org / onap / policy / models / tosca / legacy / provider / LegacyProvider.java
index 42343e1..314c772 100644 (file)
@@ -1,6 +1,7 @@
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2019 Nordix Foundation.
+ *  Copyright (C) 2020 AT&T Intellectual Property. 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.
 
 package org.onap.policy.models.tosca.legacy.provider;
 
-import java.util.ArrayList;
 import java.util.List;
 
 import javax.ws.rs.core.Response;
 
 import lombok.NonNull;
 
+import org.onap.policy.models.base.PfConceptKey;
 import org.onap.policy.models.base.PfModelException;
 import org.onap.policy.models.base.PfModelRuntimeException;
 import org.onap.policy.models.dao.PfDao;
-import org.onap.policy.models.tosca.legacy.concepts.LegacyGuardPolicy;
 import org.onap.policy.models.tosca.legacy.concepts.LegacyOperationalPolicy;
 import org.onap.policy.models.tosca.legacy.mapping.LegacyOperationalPolicyMapper;
-import org.onap.policy.models.tosca.simple.concepts.ToscaPolicies;
-import org.onap.policy.models.tosca.simple.concepts.ToscaPolicy;
-import org.onap.policy.models.tosca.simple.concepts.ToscaServiceTemplate;
-import org.onap.policy.models.tosca.simple.concepts.ToscaTopologyTemplate;
+import org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicies;
+import org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicy;
+import org.onap.policy.models.tosca.simple.concepts.JpaToscaServiceTemplate;
+import org.onap.policy.models.tosca.simple.concepts.JpaToscaTopologyTemplate;
 import org.onap.policy.models.tosca.simple.provider.SimpleToscaProvider;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -49,37 +49,31 @@ import org.slf4j.LoggerFactory;
 public class LegacyProvider {
     private static final Logger LOGGER = LoggerFactory.getLogger(LegacyProvider.class);
 
-    private static final String FIRST_POLICY_VERSION = "1";
+    public static final String LEGACY_MINOR_PATCH_SUFFIX = ".0.0";
 
     // Recurring constants
-    private static final String NO_POLICY_FOUND_FOR_POLICY_ID = "no policy found for policy ID: ";
+    private static final String NO_POLICY_FOUND_FOR_POLICY = "no policy found for policy: ";
 
     /**
      * Get legacy operational policy.
      *
      * @param dao the DAO to use to access the database
      * @param policyId ID of the policy.
+     * @param policyVersion version of the policy.
      * @return the policies found
      * @throws PfModelException on errors getting policies
      */
-    public LegacyOperationalPolicy getOperationalPolicy(@NonNull final PfDao dao, @NonNull final String policyId)
-            throws PfModelException {
+    public LegacyOperationalPolicy getOperationalPolicy(@NonNull final PfDao dao, @NonNull final String policyId,
+            final String policyVersion) throws PfModelException {
 
-        ToscaPolicy newestPolicy = getLatestPolicy(dao, policyId);
+        LOGGER.debug("->getOperationalPolicy: policyId={}, policyVersion={}", policyId, policyVersion);
 
-        if (newestPolicy == null) {
-            String errorMessage = NO_POLICY_FOUND_FOR_POLICY_ID + policyId;
-            LOGGER.warn(errorMessage);
-            throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, errorMessage);
-        }
-
-        // Create the structure of the TOSCA service template to contain the policy type
-        ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate();
-        serviceTemplate.setTopologyTemplate(new ToscaTopologyTemplate());
-        serviceTemplate.getTopologyTemplate().setPolicies(new ToscaPolicies());
-        serviceTemplate.getTopologyTemplate().getPolicies().getConceptMap().put(newestPolicy.getKey(), newestPolicy);
+        LegacyOperationalPolicy legacyOperationalPolicy = new LegacyOperationalPolicyMapper()
+                .fromToscaServiceTemplate(getLegacyPolicy(dao, policyId, policyVersion));
 
-        return new LegacyOperationalPolicyMapper().fromToscaServiceTemplate(serviceTemplate);
+        LOGGER.debug("<-getOperationalPolicy: policyId={}, policyVersion={}, legacyOperationalPolicy={}", policyId,
+                policyVersion, legacyOperationalPolicy);
+        return legacyOperationalPolicy;
     }
 
     /**
@@ -93,22 +87,18 @@ public class LegacyProvider {
     public LegacyOperationalPolicy createOperationalPolicy(@NonNull final PfDao dao,
             @NonNull final LegacyOperationalPolicy legacyOperationalPolicy) throws PfModelException {
 
-        // We need to find the latest policy and update the major version, if there is no policy with this ID, then
-        // we set it to the first version
-        ToscaPolicy newestPolicy = getLatestPolicy(dao, legacyOperationalPolicy.getPolicyId());
-
-        if (newestPolicy == null) {
-            legacyOperationalPolicy.setPolicyVersion(FIRST_POLICY_VERSION);
-        } else {
-            legacyOperationalPolicy.setPolicyVersion(Integer.toString(newestPolicy.getKey().getMajorVersion() + 1));
-        }
+        LOGGER.debug("->createOperationalPolicy: legacyOperationalPolicy={}", legacyOperationalPolicy);
 
-        ToscaServiceTemplate incomingServiceTemplate =
+        JpaToscaServiceTemplate legacyOperationalServiceTemplate =
                 new LegacyOperationalPolicyMapper().toToscaServiceTemplate(legacyOperationalPolicy);
-        ToscaServiceTemplate outgoingingServiceTemplate =
-                new SimpleToscaProvider().createPolicies(dao, incomingServiceTemplate);
 
-        return new LegacyOperationalPolicyMapper().fromToscaServiceTemplate(outgoingingServiceTemplate);
+        new SimpleToscaProvider().createPolicies(dao, legacyOperationalServiceTemplate);
+
+        LegacyOperationalPolicy createdLegacyOperationalPolicy =
+                new LegacyOperationalPolicyMapper().fromToscaServiceTemplate(legacyOperationalServiceTemplate);
+
+        LOGGER.debug("<-createOperationalPolicy: createdLegacyOperationalPolicy={}", createdLegacyOperationalPolicy);
+        return createdLegacyOperationalPolicy;
     }
 
     /**
@@ -122,24 +112,17 @@ public class LegacyProvider {
     public LegacyOperationalPolicy updateOperationalPolicy(@NonNull final PfDao dao,
             @NonNull final LegacyOperationalPolicy legacyOperationalPolicy) throws PfModelException {
 
-        // We need to find the latest policy and use the major version, if there is no policy with this ID, then
-        // we have an error
-        ToscaPolicy newestPolicy = getLatestPolicy(dao, legacyOperationalPolicy.getPolicyId());
-
-        if (newestPolicy == null) {
-            String errorMessage = NO_POLICY_FOUND_FOR_POLICY_ID + legacyOperationalPolicy.getPolicyId();
-            LOGGER.warn(errorMessage);
-            throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, errorMessage);
-        } else {
-            legacyOperationalPolicy.setPolicyVersion(Integer.toString(newestPolicy.getKey().getMajorVersion()));
-        }
-
-        ToscaServiceTemplate incomingServiceTemplate =
+        LOGGER.debug("->updateOperationalPolicy: legacyOperationalPolicy={}", legacyOperationalPolicy);
+        JpaToscaServiceTemplate incomingServiceTemplate =
                 new LegacyOperationalPolicyMapper().toToscaServiceTemplate(legacyOperationalPolicy);
-        ToscaServiceTemplate outgoingingServiceTemplate =
-                new SimpleToscaProvider().createPolicies(dao, incomingServiceTemplate);
+        JpaToscaServiceTemplate outgoingingServiceTemplate =
+                new SimpleToscaProvider().updatePolicies(dao, incomingServiceTemplate);
+
+        LegacyOperationalPolicy updatedLegacyOperationalPolicy =
+                new LegacyOperationalPolicyMapper().fromToscaServiceTemplate(outgoingingServiceTemplate);
 
-        return new LegacyOperationalPolicyMapper().fromToscaServiceTemplate(outgoingingServiceTemplate);
+        LOGGER.debug("<-updateOperationalPolicy: updatedLegacyOperationalPolicy={}", updatedLegacyOperationalPolicy);
+        return updatedLegacyOperationalPolicy;
     }
 
     /**
@@ -147,95 +130,87 @@ public class LegacyProvider {
      *
      * @param dao the DAO to use to access the database
      * @param policyId ID of the policy.
+     * @param policyVersion version of the policy.
      * @return the deleted policy
      * @throws PfModelException on errors deleting policies
      */
-    public LegacyOperationalPolicy deleteOperationalPolicy(@NonNull final PfDao dao, @NonNull final String policyId)
-            throws PfModelException {
+    public LegacyOperationalPolicy deleteOperationalPolicy(@NonNull final PfDao dao, @NonNull final String policyId,
+            @NonNull final String policyVersion) throws PfModelException {
 
-        // Get all the policies in the database and check the policy ID against the policies returned
-        List<ToscaPolicy> policyList = dao.getAll(ToscaPolicy.class);
+        LOGGER.debug("->deleteOperationalPolicy: policyId={}, policyVersion={}", policyId, policyVersion);
 
-        // Find the latest policy that matches the ID
-        List<ToscaPolicy> policyDeleteList = new ArrayList<>();
+        LegacyOperationalPolicy legacyOperationalPolicy = new LegacyOperationalPolicyMapper()
+                .fromToscaServiceTemplate(deleteLegacyPolicy(dao, policyId, policyVersion));
 
-        for (ToscaPolicy policy : policyList) {
-            if (policyId.equals(policy.getKey().getName())) {
-                policyDeleteList.add(policy);
-            }
+        LOGGER.debug("<-deleteOperationalPolicy: policyId={}, policyVersion={}, legacyOperationalPolicy={}", policyId,
+                policyVersion, legacyOperationalPolicy);
+        return legacyOperationalPolicy;
+    }
+
+    /**
+     * Get the JPA Policy for a policy ID and version.
+     *
+     * @param dao The DAO to search
+     * @param policyId the policy ID to search for
+     * @param policyVersion the policy version to search for
+     * @return the JPA policy found
+     * @throws PfModelRuntimeException if a policy is not found
+     */
+    private JpaToscaServiceTemplate getLegacyPolicy(final PfDao dao, final String policyId,
+            final String policyVersion) {
+        JpaToscaPolicy foundPolicy = null;
+        if (policyVersion == null) {
+            foundPolicy = getLatestPolicy(dao, policyId);
+        } else {
+            foundPolicy = dao.get(JpaToscaPolicy.class,
+                    new PfConceptKey(policyId, policyVersion + LEGACY_MINOR_PATCH_SUFFIX));
         }
 
-        if (policyDeleteList.isEmpty()) {
-            String errorMessage = NO_POLICY_FOUND_FOR_POLICY_ID + policyId;
+        if (foundPolicy == null) {
+            String errorMessage = NO_POLICY_FOUND_FOR_POLICY + policyId + ':' + policyVersion;
             LOGGER.warn(errorMessage);
             throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, errorMessage);
         }
 
         // Create the structure of the TOSCA service template to contain the policy type
-        ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate();
-        serviceTemplate.setTopologyTemplate(new ToscaTopologyTemplate());
-        serviceTemplate.getTopologyTemplate().setPolicies(new ToscaPolicies());
-
-        for (ToscaPolicy deletePolicy : policyDeleteList) {
-            dao.delete(deletePolicy);
-            serviceTemplate.getTopologyTemplate().getPolicies().getConceptMap().put(deletePolicy.getKey(),
-                    deletePolicy);
-        }
+        JpaToscaServiceTemplate serviceTemplate = new JpaToscaServiceTemplate();
+        serviceTemplate.setTopologyTemplate(new JpaToscaTopologyTemplate());
+        serviceTemplate.getTopologyTemplate().setPolicies(new JpaToscaPolicies());
+        serviceTemplate.getTopologyTemplate().getPolicies().getConceptMap().put(foundPolicy.getKey(), foundPolicy);
 
-        return new LegacyOperationalPolicyMapper().fromToscaServiceTemplate(serviceTemplate);
+        return serviceTemplate;
     }
 
     /**
-     * Get legacy guard policy.
+     * Delete a legacy policy.
      *
-     * @param dao the DAO to use to access the database
-     * @param policyId ID of the policy.
-     * @return the policies found
-     * @throws PfModelException on errors getting policies
+     * @param dao the DAO to use for the deletion
+     * @param policyId the policy ID
+     * @param policyVersion the policy version
+     * @return a service template containing the policy that has been deleted
      */
-    public LegacyGuardPolicy getGuardPolicy(@NonNull final PfDao dao, @NonNull final String policyId)
-            throws PfModelException {
-        return null;
-    }
+    private JpaToscaServiceTemplate deleteLegacyPolicy(final PfDao dao, final String policyId,
+            final String policyVersion) {
 
-    /**
-     * Create legacy guard policy.
-     *
-     * @param dao the DAO to use to access the database
-     * @param legacyGuardPolicy the definition of the policy to be created.
-     * @return the created policy
-     * @throws PfModelException on errors creating policies
-     */
-    public LegacyGuardPolicy createGuardPolicy(@NonNull final PfDao dao,
-            @NonNull final LegacyGuardPolicy legacyGuardPolicy) throws PfModelException {
-        return null;
-    }
+        final JpaToscaPolicy deletePolicy =
+                dao.get(JpaToscaPolicy.class, new PfConceptKey(policyId, policyVersion + LEGACY_MINOR_PATCH_SUFFIX));
 
-    /**
-     * Update legacy guard policy.
-     *
-     * @param dao the DAO to use to access the database
-     * @param legacyGuardPolicy the definition of the policy to be updated
-     * @return the updated policy
-     * @throws PfModelException on errors updating policies
-     */
-    public LegacyGuardPolicy updateGuardPolicy(@NonNull final PfDao dao,
-            @NonNull final LegacyGuardPolicy legacyGuardPolicy) throws PfModelException {
-        return null;
-    }
+        if (deletePolicy == null) {
+            String errorMessage = NO_POLICY_FOUND_FOR_POLICY + policyId + ':' + policyVersion;
+            LOGGER.warn(errorMessage);
+            throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, errorMessage);
+        }
 
+        // Delete the policy
+        dao.delete(deletePolicy);
 
-    /**
-     * Delete legacy guard policy.
-     *
-     * @param dao the DAO to use to access the database
-     * @param policyId ID of the policy.
-     * @return the deleted policy
-     * @throws PfModelException on errors deleting policies
-     */
-    public LegacyGuardPolicy deleteGuardPolicy(@NonNull final PfDao dao, @NonNull final String policyId)
-            throws PfModelException {
-        return null;
+        // Create the structure of the TOSCA service template to contain the policy type
+        JpaToscaServiceTemplate serviceTemplate = new JpaToscaServiceTemplate();
+        serviceTemplate.setTopologyTemplate(new JpaToscaTopologyTemplate());
+        serviceTemplate.getTopologyTemplate().setPolicies(new JpaToscaPolicies());
+        serviceTemplate.getTopologyTemplate().getPolicies().getConceptMap().put(deletePolicy.getKey(), deletePolicy);
+
+        return serviceTemplate;
     }
 
     /**
@@ -245,14 +220,14 @@ public class LegacyProvider {
      * @param policyId the ID of the policy
      * @return the policy
      */
-    private ToscaPolicy getLatestPolicy(final PfDao dao, final String policyId) {
+    private JpaToscaPolicy getLatestPolicy(final PfDao dao, final String policyId) {
         // Get all the policies in the database and check the policy ID against the policies returned
-        List<ToscaPolicy> policyList = dao.getAll(ToscaPolicy.class);
+        List<JpaToscaPolicy> policyList = dao.getAll(JpaToscaPolicy.class);
 
         // Find the latest policy that matches the ID
-        ToscaPolicy newestPolicy = null;
+        JpaToscaPolicy newestPolicy = null;
 
-        for (ToscaPolicy policy : policyList) {
+        for (JpaToscaPolicy policy : policyList) {
             if (!policyId.equals(policy.getKey().getName())) {
                 continue;
             }
@@ -265,4 +240,5 @@ public class LegacyProvider {
         }
         return newestPolicy;
     }
+
 }