Fix dcae url status
[clamp.git] / src / main / java / org / onap / clamp / loop / LoopOperation.java
index f38b591..87effa5 100644 (file)
@@ -25,26 +25,21 @@ package org.onap.clamp.loop;
 
 import com.att.eelf.configuration.EELFLogger;
 import com.att.eelf.configuration.EELFManager;
-import com.google.gson.JsonArray;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonNull;
 import com.google.gson.JsonObject;
-import com.google.gson.JsonPrimitive;
 
 import java.io.IOException;
-import java.lang.reflect.Array;
-import java.util.Collection;
-import java.util.Map;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.UUID;
 
 import org.apache.camel.Exchange;
 import org.apache.camel.Message;
 import org.json.simple.JSONObject;
 import org.json.simple.parser.JSONParser;
 import org.json.simple.parser.ParseException;
-import org.onap.clamp.clds.config.ClampProperties;
+import org.onap.clamp.policy.operational.OperationalPolicy;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
-import org.yaml.snakeyaml.Yaml;
 
 /**
  * Closed loop operations.
@@ -56,13 +51,11 @@ public class LoopOperation {
     protected static final EELFLogger auditLogger = EELFManager.getInstance().getMetricsLogger();
     private static final String DCAE_LINK_FIELD = "links";
     private static final String DCAE_STATUS_FIELD = "status";
-    private static final String DCAE_DEPLOYMENT_TEMPLATE = "dcae.deployment.template";
     private static final String DCAE_SERVICETYPE_ID = "serviceTypeId";
     private static final String DCAE_INPUTS = "inputs";
-    private static final String DCAE_DEPLOYMENT_PREFIX = "closedLoop_";
-    private static final String DCAE_DEPLOYMENT_SUFIX = "_deploymentId";
+    private static final String DCAE_DEPLOYMENT_PREFIX = "CLAMP_";
+    private static final String DEPLOYMENT_PARA = "dcaeDeployParameters";
     private final LoopService loopService;
-    private final ClampProperties refProp;
 
     public enum TempLoopState {
         NOT_SUBMITTED, SUBMITTED, DEPLOYED, NOT_DEPLOYED, PROCESSING, IN_ERROR;
@@ -70,33 +63,36 @@ public class LoopOperation {
 
     /**
      * The constructor.
-     * @param loopService The loop service
-     * @param refProp The clamp properties
+     *
+     * @param loopService
+     *        The loop service
+     * @param refProp
+     *        The clamp properties
      */
     @Autowired
-    public LoopOperation(LoopService loopService, ClampProperties refProp) {
+    public LoopOperation(LoopService loopService) {
         this.loopService = loopService;
-        this.refProp = refProp;
     }
 
     /**
      * Get the payload used to send the deploy closed loop request.
      *
-     * @param loop The loop
+     * @param loop
+     *        The loop
      * @return The payload used to send deploy closed loop request
-     * @throws IOException IOException
+     * @throws IOException
+     *         IOException
      */
     public String getDeployPayload(Loop loop) throws IOException {
-        Yaml yaml = new Yaml();
-        Map<String, Object> yamlMap = yaml.load(loop.getBlueprint());
-        JsonObject bluePrint = wrapSnakeObject(yamlMap).getAsJsonObject();
+        JsonObject globalProp = loop.getGlobalPropertiesJson();
+        JsonObject deploymentProp = globalProp.getAsJsonObject(DEPLOYMENT_PARA);
 
         String serviceTypeId = loop.getDcaeBlueprintId();
 
-        JsonObject rootObject = refProp.getJsonTemplate(DCAE_DEPLOYMENT_TEMPLATE).getAsJsonObject();
+        JsonObject rootObject = new JsonObject();
         rootObject.addProperty(DCAE_SERVICETYPE_ID, serviceTypeId);
-        if (bluePrint != null) {
-            rootObject.add(DCAE_INPUTS, bluePrint);
+        if (deploymentProp != null) {
+            rootObject.add(DCAE_INPUTS, deploymentProp);
         }
         String apiBodyString = rootObject.toString();
         logger.info("Dcae api Body String - " + apiBodyString);
@@ -107,9 +103,11 @@ public class LoopOperation {
     /**
      * Get the deployment id.
      *
-     * @param loop The loop
+     * @param loop
+     *        The loop
      * @return The deployment id
-     * @throws IOException IOException
+     * @throws IOException
+     *         IOException
      */
     public String getDeploymentId(Loop loop) {
         // Set the deploymentId if not present yet
@@ -118,7 +116,7 @@ public class LoopOperation {
         if (loop.getDcaeDeploymentId() != null && !loop.getDcaeDeploymentId().isEmpty()) {
             deploymentId = loop.getDcaeDeploymentId();
         } else {
-            deploymentId = DCAE_DEPLOYMENT_PREFIX + loop.getName() + DCAE_DEPLOYMENT_SUFIX;
+            deploymentId = DCAE_DEPLOYMENT_PREFIX + UUID.randomUUID();
         }
         return deploymentId;
     }
@@ -126,10 +124,14 @@ public class LoopOperation {
     /**
      * Update the loop info.
      *
-     * @param camelExchange The camel exchange
-     * @param loop The loop
-     * @param deploymentId The deployment id
-     * @throws ParseException The parse exception
+     * @param camelExchange
+     *        The camel exchange
+     * @param loop
+     *        The loop
+     * @param deploymentId
+     *        The deployment id
+     * @throws ParseException
+     *         The parse exception
      */
     public void updateLoopInfo(Exchange camelExchange, Loop loop, String deploymentId) throws ParseException {
         Message in = camelExchange.getIn();
@@ -142,22 +144,26 @@ public class LoopOperation {
         JSONObject linksObj = (JSONObject) jsonObj.get(DCAE_LINK_FIELD);
         String statusUrl = (String) linksObj.get(DCAE_STATUS_FIELD);
 
-        // use http4 instead of http, because camel http4 component is used to do the http call
-        statusUrl.replace("http", "http4");
-
-        loop.setDcaeDeploymentId(deploymentId);
-        loop.setDcaeDeploymentStatusUrl(statusUrl);
+        if (deploymentId == null) {
+            loop.setDcaeDeploymentId(null);
+            loop.setDcaeDeploymentStatusUrl(null);
+        } else {
+            loop.setDcaeDeploymentId(deploymentId);
+            loop.setDcaeDeploymentStatusUrl(statusUrl.replaceAll("http:", "http4:").replaceAll("https:", "https4:"));
+        }
         loopService.saveOrUpdateLoop(loop);
     }
 
     /**
      * Get the Closed Loop status based on the reply from Policy.
      *
-     * @param statusCode The status code
+     * @param statusCode
+     *        The status code
      * @return The state based on policy response
-     * @throws ParseException The parse exception
+     * @throws ParseException
+     *         The parse exception
      */
-    public String analysePolicyResponse(int statusCode) throws ParseException {
+    public String analysePolicyResponse(int statusCode) {
         if (statusCode == 200) {
             return TempLoopState.SUBMITTED.toString();
         } else if (statusCode == 404) {
@@ -166,12 +172,31 @@ public class LoopOperation {
         return TempLoopState.IN_ERROR.toString();
     }
 
+    /**
+     * Get the name of the first Operational policy.
+     *
+     * @param loop
+     *        The closed loop
+     * @return The name of the first operational policy
+     */
+    public String getOperationalPolicyName(Loop loop) {
+        Set<OperationalPolicy> opSet = loop.getOperationalPolicies();
+        Iterator<OperationalPolicy> iterator = opSet.iterator();
+        while (iterator.hasNext()) {
+            OperationalPolicy policy = iterator.next();
+            return policy.getName();
+        }
+        return null;
+    }
+
     /**
      * Get the Closed Loop status based on the reply from DCAE.
      *
-     * @param camelExchange The camel exchange
+     * @param camelExchange
+     *        The camel exchange
      * @return The state based on DCAE response
-     * @throws ParseException The parse exception
+     * @throws ParseException
+     *         The parse exception
      */
     public String analyseDcaeResponse(Exchange camelExchange, Integer statusCode) throws ParseException {
         if (statusCode == null) {
@@ -189,13 +214,13 @@ public class LoopOperation {
             String status = (String) jsonObj.get("status");
 
             // status = processing/successded/failed
-            if (status == "successed") {
-                if (opType == "install") {
+            if (status.equals("succeeded")) {
+                if (opType.equals("install")) {
                     return TempLoopState.DEPLOYED.toString();
-                } else if (status == "successed") {
+                } else if (opType.equals("uninstall")) {
                     return TempLoopState.NOT_DEPLOYED.toString();
                 }
-            } else if (status == "processing") {
+            } else if (status.equals("processing")) {
                 return TempLoopState.PROCESSING.toString();
             }
         } else if (statusCode == 404) {
@@ -205,13 +230,19 @@ public class LoopOperation {
     }
 
     /**
-     * Get the status of the closed loop based on the response from Policy and DCAE.
+     * Update the status of the closed loop based on the response from Policy and
+     * DCAE.
      *
-     * @param policyState The state get from Policy
-     * @param dcaeState The state get from DCAE
-     * @throws ParseException The parse exception
+     * @param loop
+     *        The closed loop
+     * @param policyState
+     *        The state get from Policy
+     * @param dcaeState
+     *        The state get from DCAE
+     * @throws ParseException
+     *         The parse exception
      */
-    public LoopState updateLoopStatus(TempLoopState policyState, TempLoopState dcaeState) {
+    public LoopState updateLoopStatus(Loop loop, TempLoopState policyState, TempLoopState dcaeState) {
         LoopState clState = LoopState.IN_ERROR;
         if (policyState == TempLoopState.SUBMITTED) {
             if (dcaeState == TempLoopState.DEPLOYED) {
@@ -226,50 +257,9 @@ public class LoopOperation {
                 clState = LoopState.DESIGN;
             }
         }
+        loop.setLastComputedState(clState);
+        loopService.saveOrUpdateLoop(loop);
         return clState;
     }
 
-    private JsonElement wrapSnakeObject(Object obj) {
-        // NULL => JsonNull
-        if (obj == null) {
-            return JsonNull.INSTANCE;
-        }
-
-        // Collection => JsonArray
-        if (obj instanceof Collection) {
-            JsonArray array = new JsonArray();
-            for (Object childObj : (Collection<?>) obj) {
-                array.add(wrapSnakeObject(childObj));
-            }
-            return array;
-        }
-
-        // Array => JsonArray
-        if (obj.getClass().isArray()) {
-            JsonArray array = new JsonArray();
-
-            int length = Array.getLength(array);
-            for (int i = 0; i < length; i++) {
-                array.add(wrapSnakeObject(Array.get(array, i)));
-            }
-            return array;
-        }
-
-        // Map => JsonObject
-        if (obj instanceof Map) {
-            Map<?, ?> map = (Map<?, ?>) obj;
-
-            JsonObject jsonObject = new JsonObject();
-            for (final Map.Entry<?, ?> entry : map.entrySet()) {
-                final String name = String.valueOf(entry.getKey());
-                final Object value = entry.getValue();
-                jsonObject.add(name, wrapSnakeObject(value));
-            }
-            return jsonObject;
-        }
-
-        // otherwise take it as a string
-        return new JsonPrimitive(String.valueOf(obj));
-    }
-
 }