Fix the bad request issue for operational policy
[clamp.git] / src / main / java / org / onap / clamp / clds / client / PolicyClient.java
index 1a1d314..e1ef0d9 100644 (file)
 
 package org.onap.clamp.clds.client;
 
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.Iterator;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 
+import javax.ws.rs.BadRequestException;
+
+import org.onap.clamp.clds.client.req.TcaRequestFormatter;
+import org.onap.clamp.clds.exception.policy.PolicyClientException;
 import org.onap.clamp.clds.model.prop.ModelProperties;
 import org.onap.clamp.clds.model.refprop.RefProp;
+import org.onap.clamp.clds.util.LoggingUtils;
 import org.onap.policy.api.AttributeType;
 import org.onap.policy.api.ConfigRequestParameters;
 import org.onap.policy.api.DeletePolicyCondition;
 import org.onap.policy.api.DeletePolicyParameters;
 import org.onap.policy.api.PolicyChangeResponse;
 import org.onap.policy.api.PolicyConfig;
+import org.onap.policy.api.PolicyConfigException;
 import org.onap.policy.api.PolicyConfigType;
 import org.onap.policy.api.PolicyEngine;
+import org.onap.policy.api.PolicyEngineException;
 import org.onap.policy.api.PolicyParameters;
 import org.onap.policy.api.PolicyType;
 import org.onap.policy.api.PushPolicyParameters;
@@ -48,40 +59,43 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.ApplicationContext;
 
-import com.att.eelf.configuration.EELFLogger;
-import com.att.eelf.configuration.EELFManager;
-
 /**
  * Policy utility methods - specifically, send the policy.
  */
 public class PolicyClient {
-    protected static final EELFLogger logger        = EELFManager.getInstance().getLogger(PolicyClient.class);
-    protected static final EELFLogger metricsLogger = EELFManager.getInstance().getMetricsLogger();
+    protected static final String     POLICY_PREFIX_BASE         = "Config_";
+    protected static final String     POLICY_PREFIX_BRMS_PARAM   = "Config_BRMS_Param_";
+    protected static final String     POLICY_PREFIX_MICROSERVICE = "Config_MS_";
+
+    protected static final String     LOG_POLICY_PREFIX          = "Response is ";
+
+    protected static final EELFLogger logger                     = EELFManager.getInstance()
+            .getLogger(PolicyClient.class);
+    protected static final EELFLogger metricsLogger              = EELFManager.getInstance().getMetricsLogger();
 
     @Value("${org.onap.clamp.config.files.cldsPolicyConfig:'classpath:/clds/clds-policy-config.properties'}")
-    protected String                cldsPolicyConfigFile;
+    protected String                  cldsPolicyConfigFile;
 
     @Autowired
-    protected ApplicationContext    appContext;
+    protected ApplicationContext      appContext;
 
     @Autowired
-    protected RefProp               refProp;
-
-    public PolicyClient() {
-
-    }
+    protected RefProp                 refProp;
 
     /**
-     * Perform send of microservice policy
+     * Perform BRMS policy type.
      *
      * @param attributes
+     *            A map of attributes
      * @param prop
-     * @param policyRequestUUID
-     * @return
-     * @throws Exception
+     *            The ModelProperties
+     * @param policyRequestUuid
+     *            PolicyRequest UUID
+     * @return The response message of policy
+     * 
      */
-    public String sendBrms(Map<AttributeType, Map<String, String>> attributes, ModelProperties prop,
-            String policyRequestUUID) throws Exception {
+    public String sendBrmsPolicy(Map<AttributeType, Map<String, String>> attributes, ModelProperties prop,
+            String policyRequestUuid) {
 
         PolicyParameters policyParameters = new PolicyParameters();
 
@@ -99,9 +113,9 @@ public class PolicyClient {
         policyParameters.setAttributes(attributes);
 
         // Set a random UUID(Mandatory)
-        policyParameters.setRequestID(UUID.fromString(policyRequestUUID));
+        policyParameters.setRequestID(UUID.fromString(policyRequestUuid));
         String policyNamePrefix = refProp.getStringValue("policy.op.policyNamePrefix");
-               String rtnMsg = send(policyParameters, prop, policyNamePrefix);
+        String rtnMsg = send(policyParameters, prop, policyNamePrefix);
 
         String policyType = refProp.getStringValue("policy.op.type");
         push(policyType, prop);
@@ -110,32 +124,110 @@ public class PolicyClient {
     }
 
     /**
-     * Perform send of microservice policy
+     * Perform send of microservice policy in JSON.
      *
      * @param policyJson
+     *            The policy JSON
      * @param prop
-     * @param policyRequestUUID
-     * @return
-     * @throws Exception
+     *            The ModelProperties
+     * @param policyRequestUuid
+     *            The policy Request UUID
+     * @return The response message of policy
      */
-    public String sendMicroService(String policyJson, ModelProperties prop, String policyRequestUUID) throws Exception {
+    public String sendMicroServiceInJson(String policyJson, ModelProperties prop, String policyRequestUuid) {
 
         PolicyParameters policyParameters = new PolicyParameters();
 
         // Set Policy Type
         policyParameters.setPolicyConfigType(PolicyConfigType.MicroService);
-        policyParameters.setOnapName(refProp.getStringValue("policy.ecomp.name"));
+        policyParameters.setEcompName(refProp.getStringValue("policy.onap.name"));
         policyParameters.setPolicyName(prop.getCurrentPolicyScopeAndPolicyName());
 
         policyParameters.setConfigBody(policyJson);
         policyParameters.setConfigBodyType(PolicyType.JSON);
 
-        policyParameters.setRequestID(UUID.fromString(policyRequestUUID));
+        policyParameters.setRequestID(UUID.fromString(policyRequestUuid));
         String policyNamePrefix = refProp.getStringValue("policy.ms.policyNamePrefix");
-               prop.setPolicyUniqueId("");//Adding this line to clear the policy id from policy name while pushing to policy engine
-               String rtnMsg = send(policyParameters, prop, policyNamePrefix);
-               String policyType = refProp.getStringValue("policy.ms.type");
-               push(policyType, prop);
+
+        // Adding this line to clear the policy id from policy name while
+        // pushing to policy engine
+        prop.setPolicyUniqueId("");
+
+        String rtnMsg = send(policyParameters, prop, policyNamePrefix);
+        String policyType = refProp.getStringValue("policy.ms.type");
+        push(policyType, prop);
+
+        return rtnMsg;
+    }
+
+    /**
+     * Perform send of base policy in OTHER type.
+     *
+     * @param configBody
+     *            The config policy string body
+     * @param configPolicyName
+     *            The config policy name of the component that has been pre-deployed in DCAE
+     * @param prop
+     *            The ModelProperties
+     * @param policyRequestUuid
+     *            The policy request UUID
+     * @return The answer from policy call
+     */
+    public String sendBasePolicyInOther(String configBody, String configPolicyName, ModelProperties prop, String policyRequestUuid) {
+
+        PolicyParameters policyParameters = new PolicyParameters();
+
+        // Set Policy Type
+        policyParameters.setPolicyConfigType(PolicyConfigType.Base);
+        policyParameters.setEcompName(refProp.getStringValue("policy.onap.name"));
+        policyParameters.setPolicyName(prop.getCurrentPolicyScopeAndPolicyName());
+
+        policyParameters.setConfigBody(configBody);
+        policyParameters.setConfigBodyType(PolicyType.OTHER);
+        policyParameters.setConfigName("HolmesPolicy");
+        policyParameters.setPolicyName(configPolicyName);
+
+        policyParameters.setRequestID(UUID.fromString(policyRequestUuid));
+
+        // Adding this line to clear the policy id from policy name while
+        // pushing to policy engine
+        prop.setPolicyUniqueId("");
+
+        String rtnMsg = send(policyParameters, prop, POLICY_PREFIX_BASE);
+        push(PolicyConfigType.Base.toString(), prop);
+
+        return rtnMsg;
+    }
+
+    /**
+     * Perform send of Microservice policy in OTHER type.
+     * 
+     * @param configBody
+     *            The config policy string body
+     * @param prop
+     *            The ModelProperties
+     * @param policyRequestUuid
+     *            The policy request UUID
+     * @return The answer from policy call
+     */
+    public String sendMicroServiceInOther(String configBody, ModelProperties prop, String policyRequestUuid) {
+
+        PolicyParameters policyParameters = new PolicyParameters();
+        // Set Policy Type 
+        policyParameters.setPolicyConfigType(PolicyConfigType.MicroService);
+        policyParameters.setOnapName("DCAE");
+        policyParameters.setEcompName(refProp.getStringValue("policy.onap.name"));
+        policyParameters.setPolicyName(prop.getCurrentPolicyScopeAndPolicyName());
+        policyParameters.setConfigBody(configBody);
+        String policyNamePrefix = refProp.getStringValue("policy.ms.policyNamePrefix");
+
+        // Adding this line to clear the policy id from policy name while
+        // pushing to policy engine
+        prop.setPolicyUniqueId("");
+
+        String rtnMsg = send(policyParameters, prop, policyNamePrefix);
+        String policyType = refProp.getStringValue("policy.ms.type");
+        push(policyType, prop);
 
         return rtnMsg;
     }
@@ -144,43 +236,49 @@ public class PolicyClient {
      * Perform send of policy.
      *
      * @param policyParameters
+     *            The PolicyParameters
      * @param prop
-     * @return
-     * @throws Exception
+     *            The ModelProperties
+     * @return The response message of Policy
      */
-    protected String send(PolicyParameters policyParameters, ModelProperties prop, String policyNamePrefix) throws Exception {
-       // Verify whether it is triggered by Validation Test button from UI
-               if ( prop.isTest() ) {
-                       return "send not executed for test action";
-               }
-
-        PolicyEngine policyEngine = new PolicyEngine(
-                appContext.getResource(cldsPolicyConfigFile).getFile().getAbsolutePath()); 
+    protected String send(PolicyParameters policyParameters, ModelProperties prop, String policyNamePrefix) {
+        // Verify whether it is triggered by Validation Test button from UI
+        if (prop.isTest()) {
+            return "send not executed for test action";
+        }
 
         // API method to create or update Policy.
         PolicyChangeResponse response = null;
-        String responseMessage;
+        String responseMessage = "";
+        Date startTime = new Date();
         try {
-               List<Integer> versions = getVersions(policyNamePrefix, prop);
-                       if (versions.size() <= 0) {
+            List<Integer> versions = getVersions(policyNamePrefix, prop);
+            if (versions.isEmpty()) {
+                LoggingUtils.setTargetContext("Policy", "createPolicy");
                 logger.info("Attempting to create policy for action=" + prop.getActionCd());
-                response = policyEngine.createPolicy(policyParameters);
+                response = getPolicyEngine().createPolicy(policyParameters);
                 responseMessage = response.getResponseMessage();
             } else {
+                LoggingUtils.setTargetContext("Policy", "updatePolicy");
                 logger.info("Attempting to update policy for action=" + prop.getActionCd());
-                response = policyEngine.updatePolicy(policyParameters);
+                response = getPolicyEngine().updatePolicy(policyParameters);
                 responseMessage = response.getResponseMessage();
             }
         } catch (Exception e) {
-            responseMessage = e.toString();
+            logger.error("Exception occurred during policy communication", e);
+            throw new PolicyClientException("Exception while communicating with Policy", e);
         }
-        logger.info("response is " + responseMessage);
+        logger.info(LOG_POLICY_PREFIX + responseMessage);
 
-        if (response != null && response.getResponseCode() == 200) {
+        LoggingUtils.setTimeContext(startTime, new Date());
+
+        if (response.getResponseCode() == 200) {
             logger.info("Policy send successful");
+            metricsLogger.info("Policy send success");
         } else {
             logger.warn("Policy send failed: " + responseMessage);
-            throw new Exception("Policy send failed: " + responseMessage);
+            metricsLogger.info("Policy send failure");
+            throw new BadRequestException("Policy send failed: " + responseMessage);
         }
 
         return responseMessage;
@@ -190,17 +288,18 @@ public class PolicyClient {
      * Format and send push of policy.
      *
      * @param policyType
+     *            The policy Type
      * @param prop
-     * @return
-     * @throws Exception
+     *            The ModelProperties
+     * @return The response message of policy
      */
-    protected String push(String policyType, ModelProperties prop) throws Exception {
-       // Verify whether it is triggered by Validation Test button from UI
-       if ( prop.isTest() ) {
-                       return "push not executed for test action";
-               }
+    protected String push(String policyType, ModelProperties prop) {
+        // Verify whether it is triggered by Validation Test button from UI
+        if (prop.isTest()) {
+            return "push not executed for test action";
+        }
 
-       PushPolicyParameters pushPolicyParameters = new PushPolicyParameters();
+        PushPolicyParameters pushPolicyParameters = new PushPolicyParameters();
 
         // Parameter arguments
         if (prop.getPolicyUniqueId() != null && !prop.getPolicyUniqueId().isEmpty()) {
@@ -214,26 +313,23 @@ public class PolicyClient {
         pushPolicyParameters.setPdpGroup(refProp.getStringValue("policy.pdp.group"));
         pushPolicyParameters.setRequestID(null);
 
-        PolicyEngine policyEngine = new PolicyEngine(
-                appContext.getResource(cldsPolicyConfigFile).getFile().getAbsolutePath());
-
         // API method to create or update Policy.
         PolicyChangeResponse response = null;
-        String responseMessage;
+        String responseMessage = "";
         try {
             logger.info("Attempting to push policy...");
-            response = policyEngine.pushPolicy(pushPolicyParameters);
+            response = getPolicyEngine().pushPolicy(pushPolicyParameters);
             responseMessage = response.getResponseMessage();
         } catch (Exception e) {
-            responseMessage = e.toString();
+            logger.error("Exception occurred during policy communication", e);
         }
-        logger.info("response is " + responseMessage);
+        logger.info(LOG_POLICY_PREFIX + responseMessage);
 
         if (response != null && (response.getResponseCode() == 200 || response.getResponseCode() == 204)) {
             logger.info("Policy push successful");
         } else {
             logger.warn("Policy push failed: " + responseMessage);
-            throw new Exception("Policy push failed: " + responseMessage);
+            throw new BadRequestException("Policy push failed: " + responseMessage);
         }
 
         return responseMessage;
@@ -244,11 +340,14 @@ public class PolicyClient {
      * versions in sorted order. Return empty list if none found.
      *
      * @param policyNamePrefix
+     *            The Policy Name Prefix
      * @param prop
-     * @return
-     * @throws Exception
+     *            The ModelProperties
+     * @return The response message from policy
+     * @throws PolicyConfigException
+     *             In case of issues with policy engine
      */
-    protected List<Integer> getVersions(String policyNamePrefix, ModelProperties prop) throws Exception {
+    protected List<Integer> getVersions(String policyNamePrefix, ModelProperties prop) throws PolicyConfigException {
 
         ArrayList<Integer> versions = new ArrayList<>();
         ConfigRequestParameters configRequestParameters = new ConfigRequestParameters();
@@ -262,70 +361,83 @@ public class PolicyClient {
 
         logger.info("policyName=" + policyName);
         configRequestParameters.setPolicyName(policyName);
+        try {
+            Collection<PolicyConfig> response = getPolicyEngine().getConfig(configRequestParameters);
+            for (PolicyConfig policyConfig : response) {
+                Integer version = Integer.valueOf(policyConfig.getPolicyVersion());
+                versions.add(version);
+            }
+            Collections.sort(versions);
+            logger.info("Policy versions.size()=" + versions.size());
+        } catch (PolicyConfigException e) {
+            // just print warning - if no policy version found
+            logger.warn("warning: policy not found...policy name - " + policyName, e.getMessage());
+        }
+        return versions;
 
-        PolicyEngine policyEngine = new PolicyEngine(
-                appContext.getResource(cldsPolicyConfigFile).getFile().getAbsolutePath());
-
-               try {
-                       Collection<PolicyConfig> response = policyEngine.getConfig(configRequestParameters);
-                       Iterator<PolicyConfig> itrResp = response.iterator();
-
-                       while (itrResp.hasNext()) {
-                               PolicyConfig policyConfig = itrResp.next();
-               try {
-                       Integer version = new Integer(policyConfig.getPolicyVersion());
-                       versions.add(version);
-               } catch (Exception e) {
-                       // just print warning - if n;o policies, version may be null
-                       logger.warn(
-                        "warning: failed to parse policyConfig.getPolicyVersion()=" + policyConfig.getPolicyVersion());
-               }
-                       }
-                       Collections.sort(versions);
-                       logger.info("Policy versions.size()=" + versions.size());       
-               } catch (Exception e) {
-                       // just print warning - if no policy version found
-                       logger.warn("warning: policy not found...policy name - " + policyName);
-               }
+    }
 
-        return versions;
+    /**
+     * This method create a new policy engine.
+     * 
+     * @return A new policy engine
+     */
+    private PolicyEngine getPolicyEngine() {
+        PolicyEngine policyEngine;
+        try {
+            policyEngine = new PolicyEngine(appContext.getResource(cldsPolicyConfigFile).getFile().getAbsolutePath());
+        } catch (IOException e1) {
+            throw new PolicyClientException("Exception when opening policy config file", e1);
+        } catch (PolicyEngineException e) {
+            throw new PolicyClientException("Exception when creating a new policy engine", e);
+        }
+        return policyEngine;
     }
 
     /**
-     * Format and send delete Micro Service requests to Policy
+     * Format and send delete Micro Service requests to Policy.
      *
      * @param prop
-     * @return
-     * @throws Exception
+     *            The ModelProperties
+     * @return The response message from Policy
      */
-    public String deleteMicrosService(ModelProperties prop) throws Exception {
-        String policyNamePrefix = refProp.getStringValue("policy.ms.policyNamePrefix");
+    public String deleteMicrosService(ModelProperties prop) {
         String policyType = refProp.getStringValue("policy.ms.type");
-        return deletePolicy(policyNamePrefix, prop, policyType);
+        return deletePolicy(prop, policyType);
     }
 
     /**
-     * Format and send delete BRMS requests to Policy
+     * This method delete the Base policy.
      *
      * @param prop
-     * @return
-     * @throws Exception
+     *            The model Properties
+     * @return A string with the answer from policy
      */
-    public String deleteBrms(ModelProperties prop) throws Exception {
-        String policyNamePrefix = refProp.getStringValue("policy.op.policyNamePrefix");
+    public String deleteBasePolicy(ModelProperties prop) {
+        return deletePolicy(prop, PolicyConfigType.Base.toString());
+    }
+
+    /**
+     * Format and send delete BRMS requests to Policy.
+     *
+     * @param prop
+     *            The ModelProperties
+     * @return The response message from policy
+     */
+    public String deleteBrms(ModelProperties prop) {
         String policyType = refProp.getStringValue("policy.op.type");
-        return deletePolicy(policyNamePrefix, prop, policyType);
+        return deletePolicy(prop, policyType);
     }
 
     /**
-     * Format and send delete PAP and PDP requests to Policy
+     * Format and send delete PAP and PDP requests to Policy.
      *
-     * @param policyNamePrefix
      * @param prop
-     * @return
-     * @throws Exception
+     *            The ModelProperties
+     *
+     * @return The response message from policy
      */
-    protected String deletePolicy(String policyNamePrefix, ModelProperties prop, String policyType) throws Exception {
+    protected String deletePolicy(ModelProperties prop, String policyType) {
         DeletePolicyParameters deletePolicyParameters = new DeletePolicyParameters();
 
         if (prop.getPolicyUniqueId() != null && !prop.getPolicyUniqueId().isEmpty()) {
@@ -339,53 +451,50 @@ public class PolicyClient {
         deletePolicyParameters.setPdpGroup(refProp.getStringValue("policy.pdp.group"));
         deletePolicyParameters.setPolicyType(policyType);
         // send delete request
-        String responseMessage = null;
-        responseMessage = sendDeletePolicy(deletePolicyParameters, prop);
+        StringBuilder responseMessage = new StringBuilder(sendDeletePolicy(deletePolicyParameters, prop));
 
         logger.info("Deleting policy from PAP...");
         deletePolicyParameters.setPolicyComponent("PAP");
         deletePolicyParameters.setDeleteCondition(DeletePolicyCondition.ALL);
 
         // send delete request
-        responseMessage = sendDeletePolicy(deletePolicyParameters, prop);
+        responseMessage.append(sendDeletePolicy(deletePolicyParameters, prop));
 
-        return responseMessage;
+        return responseMessage.toString();
     }
 
     /**
-     * Send delete request to Policy
+     * Send delete request to Policy.
      *
      * @param deletePolicyParameters
+     *            The DeletePolicyParameters
      * @param prop
-     * @return
-     * @throws Exception
+     *            The ModelProperties
+     * @return The response message from policy
      */
-    protected String sendDeletePolicy(DeletePolicyParameters deletePolicyParameters, ModelProperties prop)
-            throws Exception {
-       // Verify whether it is triggered by Validation Test button from UI
-               if ( prop.isTest() ) {
-                       return "delete not executed for test action";
-               }               
-        PolicyEngine policyEngine = new PolicyEngine(
-                appContext.getResource(cldsPolicyConfigFile).getFile().getAbsolutePath());
+    protected String sendDeletePolicy(DeletePolicyParameters deletePolicyParameters, ModelProperties prop) {
+        // Verify whether it is triggered by Validation Test button from UI
+        if (prop.isTest()) {
+            return "delete not executed for test action";
+        }
 
         // API method to create or update Policy.
         PolicyChangeResponse response = null;
-        String responseMessage;
+        String responseMessage = "";
         try {
             logger.info("Attempting to delete policy...");
-            response = policyEngine.deletePolicy(deletePolicyParameters);
+            response = getPolicyEngine().deletePolicy(deletePolicyParameters);
             responseMessage = response.getResponseMessage();
         } catch (Exception e) {
-            responseMessage = e.toString();
+            logger.error("Exception occurred during policy communnication", e);
         }
-        logger.info("response is " + responseMessage);
+        logger.info(LOG_POLICY_PREFIX + responseMessage);
 
         if (response != null && response.getResponseCode() == 200) {
             logger.info("Policy delete successful");
         } else {
             logger.warn("Policy delete failed: " + responseMessage);
-            throw new Exception("Policy delete failed: " + responseMessage);
+            throw new BadRequestException("Policy delete failed: " + responseMessage);
         }
 
         return responseMessage;