Fix the get loop state logic

Fix the logic to get the loop state and update the CL deploy/undeploy
flow accordingly

Issue-ID: CLAMP-362
Change-Id: I34f83bd241b1029417453908bf932c0b69f9f5b2
Signed-off-by: xg353y <xg353y@intl.att.com>
diff --git a/src/main/java/org/onap/clamp/clds/model/properties/Holmes.java b/src/main/java/org/onap/clamp/clds/model/properties/Holmes.java
index a93b09c..a56c57d 100644
--- a/src/main/java/org/onap/clamp/clds/model/properties/Holmes.java
+++ b/src/main/java/org/onap/clamp/clds/model/properties/Holmes.java
@@ -26,11 +26,11 @@
 package org.onap.clamp.clds.model.properties;
 
 import com.google.gson.JsonObject;
+
 import org.onap.clamp.clds.util.JsonUtils;
 
 /**
- * Parse Holmes bpmn parameters json properties.
- * Example json:
+ * Parse Holmes bpmn parameters json properties. Example json:
  * [{"name":"correlationalLogic","value":"vcwx"},{"name":"configPolicyName","value":"cccc"}]
  */
 public class Holmes extends AbstractModelElement {
@@ -43,14 +43,18 @@
     /**
      * Default constructor for Holmes Element.
      *
-     * @param modelBpmn The model bpmn
-     * @param modelJson The model json
+     * @param modelBpmn
+     *        The model bpmn
+     * @param modelJson
+     *        The model json
      */
     public Holmes(ModelBpmn modelBpmn, JsonObject modelJson) {
         super(TYPE_HOLMES, modelBpmn, modelJson);
 
-        correlationLogic = JsonUtils.getStringValueByName(modelElementJsonNode, "correlationalLogic");
-        configPolicyName = JsonUtils.getStringValueByName(modelElementJsonNode, "configPolicyName");
+        if (modelElementJsonNode != null) {
+            correlationLogic = JsonUtils.getStringValueByName(modelElementJsonNode, "correlationalLogic");
+            configPolicyName = JsonUtils.getStringValueByName(modelElementJsonNode, "configPolicyName");
+        }
     }
 
     public static final String getType() {
diff --git a/src/main/java/org/onap/clamp/loop/LoopOperation.java b/src/main/java/org/onap/clamp/loop/LoopOperation.java
index 3f4c529..f38b591 100644
--- a/src/main/java/org/onap/clamp/loop/LoopOperation.java
+++ b/src/main/java/org/onap/clamp/loop/LoopOperation.java
@@ -31,23 +31,18 @@
 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.Date;
 import java.util.Map;
 
-import javax.servlet.http.HttpServletRequest;
-
 import org.apache.camel.Exchange;
-import org.onap.clamp.clds.client.DcaeDispatcherServices;
+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.clds.util.LoggingUtils;
-import org.onap.clamp.clds.util.ONAPLogConstants;
-import org.onap.clamp.exception.OperationException;
-import org.onap.clamp.util.HttpConnectionManager;
-import org.slf4j.event.Level;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.HttpStatus;
 import org.springframework.stereotype.Component;
 import org.yaml.snakeyaml.Yaml;
 
@@ -59,117 +54,179 @@
 
     protected static final EELFLogger logger = EELFManager.getInstance().getLogger(LoopOperation.class);
     protected static final EELFLogger auditLogger = EELFManager.getInstance().getMetricsLogger();
-    private final DcaeDispatcherServices dcaeDispatcherServices;
+    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 final LoopService loopService;
-    private LoggingUtils util = new LoggingUtils(logger);
+    private final ClampProperties refProp;
 
-    @Autowired
-    private HttpServletRequest request;
-
-    @Autowired
-    public LoopOperation(LoopService loopService, DcaeDispatcherServices dcaeDispatcherServices,
-        ClampProperties refProp, HttpConnectionManager httpConnectionManager) {
-        this.loopService = loopService;
-        this.dcaeDispatcherServices = dcaeDispatcherServices;
+    public enum TempLoopState {
+        NOT_SUBMITTED, SUBMITTED, DEPLOYED, NOT_DEPLOYED, PROCESSING, IN_ERROR;
     }
-    
+
     /**
-     * Deploy the closed loop.
-     *
-     * @param loopName
-     *        the loop name
-     * @return the updated loop
-     * @throws OperationException
-     *         Exception during the operation
+     * The constructor.
+     * @param loopService The loop service
+     * @param refProp The clamp properties
      */
-    public Loop deployLoop(Exchange camelExchange, String loopName) throws OperationException {
-        util.entering(request, "CldsService: Deploy model");
-        Date startTime = new Date();
-        Loop loop = loopService.getLoop(loopName);
+    @Autowired
+    public LoopOperation(LoopService loopService, ClampProperties refProp) {
+        this.loopService = loopService;
+        this.refProp = refProp;
+    }
 
-        if (loop == null) {
-            String msg = "Deploy loop exception: Not able to find closed loop:" + loopName;
-            util.exiting(HttpStatus.INTERNAL_SERVER_ERROR.toString(), msg, Level.INFO,
-                ONAPLogConstants.ResponseStatus.ERROR);
-            throw new OperationException(msg);
+    /**
+     * Get the payload used to send the deploy closed loop request.
+     *
+     * @param loop The loop
+     * @return The payload used to send deploy closed loop request
+     * @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();
+
+        String serviceTypeId = loop.getDcaeBlueprintId();
+
+        JsonObject rootObject = refProp.getJsonTemplate(DCAE_DEPLOYMENT_TEMPLATE).getAsJsonObject();
+        rootObject.addProperty(DCAE_SERVICETYPE_ID, serviceTypeId);
+        if (bluePrint != null) {
+            rootObject.add(DCAE_INPUTS, bluePrint);
         }
+        String apiBodyString = rootObject.toString();
+        logger.info("Dcae api Body String - " + apiBodyString);
 
-        // verify the current closed loop state
-        if (loop.getLastComputedState() != LoopState.SUBMITTED) {
-            String msg = "Deploy loop exception: This closed loop is in state:" + loop.getLastComputedState()
-                + ". It could be deployed only when it is in SUBMITTED state.";
-            util.exiting(HttpStatus.CONFLICT.toString(), msg, Level.INFO, ONAPLogConstants.ResponseStatus.ERROR);
-            throw new OperationException(msg);
-        }
+        return apiBodyString;
+    }
 
+    /**
+     * Get the deployment id.
+     *
+     * @param loop The loop
+     * @return The deployment id
+     * @throws IOException IOException
+     */
+    public String getDeploymentId(Loop loop) {
         // Set the deploymentId if not present yet
         String deploymentId = "";
         // If model is already deployed then pass same deployment id
         if (loop.getDcaeDeploymentId() != null && !loop.getDcaeDeploymentId().isEmpty()) {
             deploymentId = loop.getDcaeDeploymentId();
         } else {
-            loop.setDcaeDeploymentId(deploymentId = "closedLoop_" + loopName + "_deploymentId");
+            deploymentId = DCAE_DEPLOYMENT_PREFIX + loop.getName() + DCAE_DEPLOYMENT_SUFIX;
         }
-
-        Yaml yaml = new Yaml();
-        Map<String, Object> yamlMap = yaml.load(loop.getBlueprint());
-        JsonObject bluePrint = wrapSnakeObject(yamlMap).getAsJsonObject();
-
-        loop.setDcaeDeploymentStatusUrl(
-            dcaeDispatcherServices.createNewDeployment(deploymentId, loop.getDcaeBlueprintId(), bluePrint));
-        loop.setLastComputedState(LoopState.DEPLOYED);
-        // save the updated loop
-        loopService.saveOrUpdateLoop(loop);
-
-        // audit log
-        LoggingUtils.setTimeContext(startTime, new Date());
-        auditLogger.info("Deploy model completed");
-        util.exiting(HttpStatus.OK.toString(), "Successful", Level.INFO, ONAPLogConstants.ResponseStatus.COMPLETED);
-        return loop;
+        return deploymentId;
     }
 
     /**
-     * Un deploy closed loop.
+     * Update the loop info.
      *
-     * @param loopName
-     *        the loop name
-     * @return the updated loop
+     * @param camelExchange The camel exchange
+     * @param loop The loop
+     * @param deploymentId The deployment id
+     * @throws ParseException The parse exception
      */
-    public Loop unDeployLoop(String loopName) throws OperationException {
-        util.entering(request, "LoopOperation: Undeploy the closed loop");
-        Date startTime = new Date();
-        Loop loop = loopService.getLoop(loopName);
+    public void updateLoopInfo(Exchange camelExchange, Loop loop, String deploymentId) throws ParseException {
+        Message in = camelExchange.getIn();
+        String msg = in.getBody(String.class);
 
-        if (loop == null) {
-            String msg = "Undeploy loop exception: Not able to find closed loop:" + loopName;
-            util.exiting(HttpStatus.INTERNAL_SERVER_ERROR.toString(), msg, Level.INFO,
-                ONAPLogConstants.ResponseStatus.ERROR);
-            throw new OperationException(msg);
-        }
+        JSONParser parser = new JSONParser();
+        Object obj0 = parser.parse(msg);
+        JSONObject jsonObj = (JSONObject) obj0;
 
-        // verify the current closed loop state
-        if (loop.getLastComputedState() != LoopState.DEPLOYED) {
-            String msg = "Unploy loop exception: This closed loop is in state:" + loop.getLastComputedState()
-                + ". It could be undeployed only when it is in DEPLOYED state.";
-            util.exiting(HttpStatus.CONFLICT.toString(), msg, Level.INFO, ONAPLogConstants.ResponseStatus.ERROR);
-            throw new OperationException(msg);
-        }
+        JSONObject linksObj = (JSONObject) jsonObj.get(DCAE_LINK_FIELD);
+        String statusUrl = (String) linksObj.get(DCAE_STATUS_FIELD);
 
-        loop.setDcaeDeploymentStatusUrl(
-            dcaeDispatcherServices.deleteExistingDeployment(loop.getDcaeDeploymentId(), loop.getDcaeBlueprintId()));
+        // use http4 instead of http, because camel http4 component is used to do the http call
+        statusUrl.replace("http", "http4");
 
-        // clean the deployment ID
-        loop.setDcaeDeploymentId(null);
-        loop.setLastComputedState(LoopState.SUBMITTED);
-
-        // save the updated loop
+        loop.setDcaeDeploymentId(deploymentId);
+        loop.setDcaeDeploymentStatusUrl(statusUrl);
         loopService.saveOrUpdateLoop(loop);
+    }
 
-        // audit log
-        LoggingUtils.setTimeContext(startTime, new Date());
-        auditLogger.info("Undeploy model completed");
-        util.exiting(HttpStatus.OK.toString(), "Successful", Level.INFO, ONAPLogConstants.ResponseStatus.COMPLETED);
-        return loop;
+    /**
+     * Get the Closed Loop status based on the reply from Policy.
+     *
+     * @param statusCode The status code
+     * @return The state based on policy response
+     * @throws ParseException The parse exception
+     */
+    public String analysePolicyResponse(int statusCode) throws ParseException {
+        if (statusCode == 200) {
+            return TempLoopState.SUBMITTED.toString();
+        } else if (statusCode == 404) {
+            return TempLoopState.NOT_SUBMITTED.toString();
+        }
+        return TempLoopState.IN_ERROR.toString();
+    }
+
+    /**
+     * Get the Closed Loop status based on the reply from DCAE.
+     *
+     * @param camelExchange The camel exchange
+     * @return The state based on DCAE response
+     * @throws ParseException The parse exception
+     */
+    public String analyseDcaeResponse(Exchange camelExchange, Integer statusCode) throws ParseException {
+        if (statusCode == null) {
+            return TempLoopState.NOT_DEPLOYED.toString();
+        }
+        if (statusCode == 200) {
+            Message in = camelExchange.getIn();
+            String msg = in.getBody(String.class);
+
+            JSONParser parser = new JSONParser();
+            Object obj0 = parser.parse(msg);
+            JSONObject jsonObj = (JSONObject) obj0;
+
+            String opType = (String) jsonObj.get("operationType");
+            String status = (String) jsonObj.get("status");
+
+            // status = processing/successded/failed
+            if (status == "successed") {
+                if (opType == "install") {
+                    return TempLoopState.DEPLOYED.toString();
+                } else if (status == "successed") {
+                    return TempLoopState.NOT_DEPLOYED.toString();
+                }
+            } else if (status == "processing") {
+                return TempLoopState.PROCESSING.toString();
+            }
+        } else if (statusCode == 404) {
+            return TempLoopState.NOT_DEPLOYED.toString();
+        }
+        return TempLoopState.IN_ERROR.toString();
+    }
+
+    /**
+     * Get 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
+     */
+    public LoopState updateLoopStatus(TempLoopState policyState, TempLoopState dcaeState) {
+        LoopState clState = LoopState.IN_ERROR;
+        if (policyState == TempLoopState.SUBMITTED) {
+            if (dcaeState == TempLoopState.DEPLOYED) {
+                clState = LoopState.DEPLOYED;
+            } else if (dcaeState == TempLoopState.PROCESSING) {
+                clState = LoopState.WAITING;
+            } else if (dcaeState == TempLoopState.NOT_DEPLOYED) {
+                clState = LoopState.SUBMITTED;
+            }
+        } else if (policyState == TempLoopState.NOT_SUBMITTED) {
+            if (dcaeState == TempLoopState.NOT_DEPLOYED) {
+                clState = LoopState.DESIGN;
+            }
+        }
+        return clState;
     }
 
     private JsonElement wrapSnakeObject(Object obj) {
diff --git a/src/main/resources/application-noaaf.properties b/src/main/resources/application-noaaf.properties
index de3f7c0..52f79be 100644
--- a/src/main/resources/application-noaaf.properties
+++ b/src/main/resources/application-noaaf.properties
@@ -210,6 +210,11 @@
 clamp.config.dcae.dispatcher.retry.interval=20000
 clamp.config.dcae.dispatcher.retry.limit=30
 
+#DCAE Deployment Url Properties
+clamp.config.dcae.deployment.url=http4://dcae.api.simpledemo.onap.org:8188
+clamp.config.dcae.deployment.userName=test
+clamp.config.dcae.deployment.password=test
+
 #Define user permission related parameters, the permission type can be changed but MUST be redefined in clds-users.properties in that case !
 clamp.config.security.permission.type.cl=org.onap.clamp.clds.cl
 clamp.config.security.permission.type.cl.manage=org.onap.clamp.clds.cl.manage
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index f59b8ac..534dc48 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -228,6 +228,11 @@
 clamp.config.dcae.dispatcher.retry.interval=20000
 clamp.config.dcae.dispatcher.retry.limit=30
 
+#DCAE Deployment Url Properties
+clamp.config.dcae.deployment.url=http4://dcae.api.simpledemo.onap.org:8188
+clamp.config.dcae.deployment.userName=test
+clamp.config.dcae.deployment.password=test
+
 #Define user permission related parameters, the permission type can be changed but MUST be redefined in clds-users.properties in that case !
 clamp.config.security.permission.type.cl=org.onap.clamp.clds.cl
 clamp.config.security.permission.type.cl.manage=org.onap.clamp.clds.cl.manage
diff --git a/src/main/resources/clds/camel/rest/clamp-api-v2.xml b/src/main/resources/clds/camel/rest/clamp-api-v2.xml
index 5c5f122..2640d6b 100644
--- a/src/main/resources/clds/camel/rest/clamp-api-v2.xml
+++ b/src/main/resources/clds/camel/rest/clamp-api-v2.xml
@@ -206,7 +206,40 @@
 					<to
 						uri="bean:org.onap.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','update')" />
 					<to
-						uri="bean:org.onap.clamp.operation.LoopOperation?method=deployLoop(*,${header.loopName})" />
+						uri="direct:load-loop" />
+					<split>
+						<simple>${exchangeProperty[loopObject].getOperationalPolicies()}
+						</simple>
+						<setProperty propertyName="operationalPolicy">
+							<simple>${body}</simple>
+						</setProperty>
+						<to 
+							uri="direct:get-status-from-policy" />
+					</split>
+					<to 
+						uri="direct:get-status-from-dcae" />
+					<choice>
+					<log
+						loggingLevel="INFO"
+						message="policy status0: ${exchangeProperty[policyStatus]}"></log>
+					<log
+						loggingLevel="INFO"
+						message="dcae status0: ${exchangeProperty[dcaeStatus]}"></log>
+						<when>
+							<simple> ${exchangeProperty[policyStatus]} == 'SUBMITTED' and
+								${exchangeProperty[dcaeStatus]} == 'NOT_DEPLOYED'
+							</simple>
+							<to
+								uri="direct:deploy-closedloop" />
+						</when>
+						<otherwise>
+							<log
+								loggingLevel="INFO"
+								message="Closed Loop is in state ${exchangeProperty[policyStatus]}, it can only be deployed when in state SUBMIT" />
+							<to
+								uri="bean:org.onap.clamp.loop.log.LoopLogService?method=addLog('Closed Loop is in state ${exchangeProperty[policyStatus]}, it can only be deployed when in state SUBMIT','ERROR',${exchangeProperty[loopObject]})" />
+						</otherwise>
+					</choice>
 					<to
 						uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=endLog()" />
 					<doCatch>
@@ -216,6 +249,11 @@
 						</handled>
 						<to
 							uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=errorLog()" />
+						<log
+							loggingLevel="ERROR"
+							message="Deploy request failed for loop: ${header.loopName}" />
+						<to
+							uri="bean:org.onap.clamp.loop.log.LoopLogService?method=addLog('Deploy request failed','ERROR',${exchangeProperty[loopObject]})" />
 					</doCatch>
 				</doTry>
 			</route>
@@ -234,7 +272,24 @@
 					<to
 						uri="bean:org.onap.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','update')" />
 					<to
-						uri="bean:org.onap.clamp.operation.LoopOperation?method=unDeployLoop(${header.loopName})" />
+						uri="direct:load-loop" />
+					<to 
+						uri="direct:get-status-from-dcae" />
+					<choice>
+						<when>
+							<simple> ${exchangeProperty[dcaeStatus]} == 'DEPLOYED'
+							</simple>
+							<to
+								uri="direct:undeploy-closedloop" />
+						</when>
+						<otherwise>
+							<log
+								loggingLevel="INFO"
+								message="Closed Loop is in state ${exchangeProperty[dcaeStatus]}, it can only be undeployed when in state DEPLOYED" />
+							<to
+								uri="bean:org.onap.clamp.loop.log.LoopLogService?method=addLog('Closed Loop is in state ${exchangeProperty[dcaeStatus]}, it can only be deployed when in state DEPLOYED','ERROR',${exchangeProperty[loopObject]})" />
+						</otherwise>
+					</choice>
 					<to
 						uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=endLog()" />
 					<doCatch>
@@ -244,6 +299,11 @@
 						</handled>
 						<to
 							uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=errorLog()" />
+						<log
+							loggingLevel="ERROR"
+							message="Undeploy request failed for loop: $${header.loopName}" />
+						<to
+							uri="bean:org.onap.clamp.loop.log.LoopLogService?method=addLog('Undeploy request failed','ERROR',${exchangeProperty[loopObject]})" />
 					</doCatch>
 				</doTry>
 			</route>
@@ -526,5 +586,55 @@
 				</doTry>
 			</route>
 		</put>
+		<get
+			uri="/v2/loop/getstatus/{loopName}"
+			outType="org.onap.clamp.loop.Loop"
+			produces="application/json">
+			<route>
+				<removeHeaders pattern="*" excludePattern="loopName"/>
+				<doTry>
+					<log
+						loggingLevel="INFO"
+						message="Get current status for loop: ${header.loopName}" />
+					<to
+						uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=startLog(*, 'Get the closed loop status')" />
+					<to
+						uri="bean:org.onap.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','read')" />
+					<to uri="direct:load-loop" />
+					<to
+						uri="bean:org.onap.clamp.loop.log.LoopLogService?method=addLog('Receive GET STATUS request','INFO',${exchangeProperty[loopObject]})" />
+					<setProperty propertyName="raiseHttpExceptionFlag">
+						<simple resultType="java.lang.Boolean">false</simple>
+					</setProperty>
+					<to uri="direct:get-status-from-policy" />
+					<to uri="direct:get-status-from-dcae" />
+					<to
+						uri="bean:org.onap.clamp.loop.LoopOperation?method=updateLoopStatus(${exchangeProperty[policyStatus], ${exchangeProperty[dcaeStatus])" />
+
+					<log
+						loggingLevel="INFO"
+						message="Get Status request successfully executed for loop: ${body}" />
+					<to
+						uri="bean:org.onap.clamp.loop.log.LoopLogService?method=addLog('Get Status request successfully executed','INFO',${exchangeProperty[loopObject]})" />
+					<to
+						uri="bean:org.onap.clamp.loop.LoopController?method=getLoop(${header.loopName})" />
+					<to
+						uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=endLog()" />
+					<doCatch>
+						<exception>java.lang.Exception</exception>
+						<handled>
+							<constant>false</constant>
+						</handled>
+						<to
+							uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=errorLog()" />
+						<log
+							loggingLevel="ERROR"
+							message="Get Status request failed for loop: ${header.loopName}" />
+						<to
+							uri="bean:org.onap.clamp.loop.log.LoopLogService?method=addLog('Get Status request failed','ERROR',${exchangeProperty[loopObject]})" />
+					</doCatch>
+				</doTry>
+			</route>
+		</get>
 	</rest>
 </rests>
diff --git a/src/main/resources/clds/camel/routes/flexible-flow.xml b/src/main/resources/clds/camel/routes/flexible-flow.xml
index 75341de..6813800 100644
--- a/src/main/resources/clds/camel/routes/flexible-flow.xml
+++ b/src/main/resources/clds/camel/routes/flexible-flow.xml
@@ -490,7 +490,224 @@
 			</doFinally>
 		</doTry>
 	</route>
+	<route id="deploy-closedloop">
+		<from uri="direct:deploy-closedloop" />
+		<doTry>
+			<log
+				loggingLevel="INFO"
+				message="Deploy the closed loop: ${exchangeProperty[loopObject].getName()}" />
+			<to
+				uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('DCAE', 'Deploy closed loop')" />
+			<simple>${exchangeProperty[loopObject].getOperationalPolicies()}
+			</simple>
+			<setProperty propertyName="operationalPolicy">
+				<simple>${body}</simple>
+			</setProperty>
+			<setBody>
+				<method ref="org.onap.clamp.loop.LoopOperation"
+					method="getDeployPayload(${exchangeProperty[loopObject]})" />
+			</setBody>
+			<setProperty propertyName="deploymentId">
+				<method ref="org.onap.clamp.loop.LoopOperation"
+					method="getDeploymentId(${exchangeProperty[loopObject]})" />
+			</setProperty>
+			<setHeader headerName="CamelHttpMethod">
+				<constant>PUT</constant>
+			</setHeader>
+			<setHeader headerName="Content-Type">
+				<constant>application/json</constant>
+			</setHeader>
+			<setHeader headerName="X-ONAP-RequestID">
+				<simple>${exchangeProperty[X-ONAP-RequestID]}
+				</simple>
+			</setHeader>
+			<setHeader headerName="X-ONAP-InvocationID">
+				<simple>${exchangeProperty[X-ONAP-InvocationID]}
+				</simple>
+			</setHeader>
+			<setHeader headerName="X-ONAP-PartnerName">
+				<simple>${exchangeProperty[X-ONAP-PartnerName]}
+				</simple>
+			</setHeader>
+			<log
+				loggingLevel="INFO"
+				message="Endpoint to deploy closed loop: {{clamp.config.dcae.deployment.url}}/dcae-deployments/${exchangeProperty[deploymentId]}"></log>
+			<toD
+				uri="{{clamp.config.dcae.deployment.url}}/dcae-deployments/${exchangeProperty[deploymentId]}?bridgeEndpoint=true&amp;mapHttpMessageHeaders=false&amp;throwExceptionOnFailure=${exchangeProperty[RaiseHttpExceptionFlag]}&amp;httpClient.connectTimeout=10000&amp;authUsername={{clamp.config.dcae.deployment.userName}}&amp;authPassword={{clamp.config.dcae.deployment.password}}" />
+			<to
+				uri="bean:org.onap.clamp.loop.LoopOperation?method=updateLoopInfo(*,${exchangeProperty[loopObject]},${exchangeProperty[deploymentId]})" />
+			<doFinally>
+				<to uri="direct:reset-raise-http-exception-flag" />
+				<to
+					uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()" />
+				<setProperty propertyName="logMessage">
+					<simple>Deploy closed loop status</simple>
+				</setProperty>
+				<to uri="direct:dump-loop-log-http-response" />
+			</doFinally>
+		</doTry>
+	</route>
 
+	<route id="undeploy-closedloop">
+		<from uri="direct:undeploy-closedloop" />
+		<doTry>
+			<log
+				loggingLevel="INFO"
+				message="UNdeploy the closed loop: ${exchangeProperty[loopObject].getName()} : ${exchangeProperty[loopObject].getDcaeDeploymentId()}" />
+			<to
+				uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('DCAE', 'Undeploy closed loop')" />
+
+			<setBody>
+				<simple>{\"serviceTypeId\": \"${exchangeProperty[loopObject].getDcaeBlueprintId()}\"}
+				</simple>
+			</setBody>
+			<setHeader headerName="CamelHttpMethod">
+				<constant>DELETE</constant>
+			</setHeader>
+			<setHeader headerName="Content-Type">
+				<constant>application/json</constant>
+			</setHeader>
+			<setHeader headerName="X-ONAP-RequestID">
+				<simple>${exchangeProperty[X-ONAP-RequestID]}
+				</simple>
+			</setHeader>
+			<setHeader headerName="X-ONAP-InvocationID">
+				<simple>${exchangeProperty[X-ONAP-InvocationID]}
+				</simple>
+			</setHeader>
+			<setHeader headerName="X-ONAP-PartnerName">
+				<simple>${exchangeProperty[X-ONAP-PartnerName]}
+				</simple>
+			</setHeader>
+			<log
+				loggingLevel="INFO"
+				message="Endpoint to undeploy closed loop: {{clamp.config.dcae.deployment.url}}/dcae-deployments/${exchangeProperty[loopObject].getDcaeDeploymentId()}"></log>
+			<toD
+				uri="{{clamp.config.dcae.deployment.url}}/dcae-deployments/${exchangeProperty[loopObject].getDcaeDeploymentId()}?bridgeEndpoint=true&amp;mapHttpMessageHeaders=false&amp;throwExceptionOnFailure=${exchangeProperty[RaiseHttpExceptionFlag]}&amp;httpClient.connectTimeout=10000&amp;authUsername={{clamp.config.dcae.deployment.userName}}&amp;authPassword={{clamp.config.dcae.deployment.password}}" />
+			<to
+				uri="bean:org.onap.clamp.loop.LoopOperation?method=updateLoopInfo(*,${exchangeProperty[loopObject]},null)" />
+			<doFinally>
+				<to uri="direct:reset-raise-http-exception-flag" />
+				<to
+					uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()" />
+				<setProperty propertyName="logMessage">
+					<simple>Undeploy closed loop status</simple>
+				</setProperty>
+				<to uri="direct:dump-loop-log-http-response" />
+			</doFinally>
+		</doTry>
+	</route>
+	<route id="get-status-from-policy">
+		<from uri="direct:get-status-from-policy" />
+		<doTry>
+			<log
+				loggingLevel="INFO"
+				message="Query Closed Loop status from policy DPD: ${exchangeProperty[loopObject].getName()}" />
+			<to
+				uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Query operational policies to PDP group')" />
+			<setBody>
+				<constant>null</constant>
+			</setBody>
+			<setHeader headerName="CamelHttpMethod">
+				<constant>GET</constant>
+			</setHeader>
+			<setHeader headerName="X-ONAP-RequestID">
+				<simple>${exchangeProperty[X-ONAP-RequestID]}
+				</simple>
+			</setHeader>
+			<setHeader headerName="X-ONAP-InvocationID">
+				<simple>${exchangeProperty[X-ONAP-InvocationID]}
+				</simple>
+			</setHeader>
+			<setHeader headerName="X-ONAP-PartnerName">
+				<simple>${exchangeProperty[X-ONAP-PartnerName]}
+				</simple>
+			</setHeader>
+			<log
+				loggingLevel="INFO"
+				message="Endpoint to query from Policy DPD: {{clamp.config.policy.pap.url}}/policy/api/v1/policytypes/onap.policies.controlloop.operational/versions/1.0.0/policies/${exchangeProperty[operationalPolicy].getName()}/versions/deployed"></log>
+			<toD
+				uri="{{clamp.config.policy.pap.url}}/policy/api/v1/policytypes/onap.policies.controlloop.operational/versions/1.0.0/policies/${exchangeProperty[operationalPolicy].getName()}/versions/deployed?bridgeEndpoint=true&amp;throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&amp;httpClient.connectTimeout=10000&amp;authMethod=Basic&amp;authUsername={{clamp.config.policy.pap.userName}}&amp;authPassword={{clamp.config.policy.pap.password}}" />
+			<doFinally>
+				<to uri="direct:reset-raise-http-exception-flag" />
+				<to
+					uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()" />
+				<setProperty propertyName="logMessage">
+					<simple>Query closed loop from Policy status</simple>
+				</setProperty>
+				<setProperty propertyName="policyStatus">
+					<method ref="org.onap.clamp.loop.LoopOperation"
+					method="analysePolicyResponse(${header.CamelHttpResponseCode})" />
+				</setProperty>
+				<log
+						loggingLevel="INFO"
+						message="policy status: ${exchangeProperty[policyStatus]}"></log>
+				<to uri="direct:dump-loop-log-http-response" />
+			</doFinally>
+		</doTry>
+	</route>
+	<route id="get-status-from-dcae">
+		<from uri="direct:get-status-from-dcae" />
+		<log
+			loggingLevel="INFO"
+			message="Query Closed Loop status from DCAE ${exchangeProperty[loopObject].getName()}" />
+		<choice>
+			<when>
+				<simple>${exchangeProperty[loopObject].getDcaeDeploymentStatusUrl()} == null
+				</simple>
+				<setProperty propertyName="dcaeStatus">
+					<method ref="org.onap.clamp.loop.LoopOperation"
+					method="analyseDcaeResponse(*,null)" />
+				</setProperty>
+				<log
+						loggingLevel="INFO"
+						message="dcae status: ${exchangeProperty[dcaeStatus]}"></log>
+			</when>
+			<otherwise>
+				<doTry>
+					<log
+						loggingLevel="INFO"
+						message="Query Closed Loop status from Dcae" />
+					<setHeader headerName="CamelHttpMethod">
+						<constant>GET</constant>
+					</setHeader>
+					<setHeader headerName="X-ONAP-RequestID">
+						<simple>${exchangeProperty[X-ONAP-RequestID]}
+						</simple>
+					</setHeader>
+					<setHeader headerName="X-ONAP-InvocationID">
+						<simple>${exchangeProperty[X-ONAP-InvocationID]}
+						</simple>
+					</setHeader>
+					<setHeader headerName="X-ONAP-PartnerName">
+						<simple>${exchangeProperty[X-ONAP-PartnerName]}
+						</simple>
+					</setHeader>
+					<log
+						loggingLevel="INFO"
+						message="Endpoint to query Closed Loop status: ${exchangeProperty[loopObject].getDcaeDeploymentStatusUrl()}"></log>
+					<toD
+						uri="${exchangeProperty[loopObject].getDcaeDeploymentStatusUrl()}?bridgeEndpoint=true&amp;throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&amp;httpClient.connectTimeout=10000&amp;authMethod=Basic&amp;authUsername={{clamp.config.dcae.deployment.userName}}&amp;authPassword={{clamp.config.dcae.deployment.password}}" />
+					<doFinally>
+						<to uri="direct:reset-raise-http-exception-flag" />
+						<to
+							uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()" />
+						<setProperty propertyName="logMessage">
+							<simple>Query closed loop from DCAE status</simple>
+						</setProperty>
+						<setProperty propertyName="dcaeStatus">
+							<method ref="org.onap.clamp.loop.LoopOperation"
+							method="analyseDcaeResponse(*,${header.CamelHttpResponseCode})" />
+						</setProperty>
+						<log
+						loggingLevel="INFO"
+						message="dcae status: ${exchangeProperty[dcaeStatus]}"></log>
+						<to uri="direct:dump-loop-log-http-response" />
+					</doFinally>
+				</doTry>
+			</otherwise>
+		</choice>
+	</route>
 	<route id="reset-raise-http-exception-flag">
 		<from uri="direct:reset-raise-http-exception-flag" />
 		<setProperty propertyName="raiseHttpExceptionFlag">
diff --git a/src/test/resources/application.properties b/src/test/resources/application.properties
index ecc4033..061505a 100644
--- a/src/test/resources/application.properties
+++ b/src/test/resources/application.properties
@@ -217,6 +217,11 @@
 clamp.config.dcae.dispatcher.retry.interval=100

 clamp.config.dcae.dispatcher.retry.limit=1

 

+#DCAE Deployment Url Properties

+clamp.config.dcae.deployment.url=http4://localhost:${docker.http-cache.port.host}

+clamp.config.dcae.deployment.userName=test

+clamp.config.dcae.deployment.password=test

+

 #Define user permission related parameters, the permission type can be changed but MUST be redefined in clds-users.properties in that case !

 clamp.config.security.permission.type.cl=permission-type-cl

 clamp.config.security.permission.type.cl.manage=permission-type-cl-manage

diff --git a/src/test/resources/http-cache/third_party_proxy.py b/src/test/resources/http-cache/third_party_proxy.py
index f19aa0d..0db977b 100755
--- a/src/test/resources/http-cache/third_party_proxy.py
+++ b/src/test/resources/http-cache/third_party_proxy.py
@@ -199,6 +199,18 @@
         with open(cached_file_content, 'w+') as f:
                 f.write(self.data_string)
         return True
+     elif self.path.startswith("/policy/api/v1/policytypes/") and http_type == "GET":
+        print "self.path start with /policy/api/v1/policytypes/, generating response json..."
+        jsonGenerated =  "{\"policyTypeId\": \"onap.policies.controlloop.operational\",\"policyTypeVersion\": \"1.0.0\",\"policyId\": \"OPERATIONAL_z711F_v1_0_ResourceInstanceName1_tca\"}"
+        print "jsonGenerated: " + jsonGenerated
+        if not os.path.exists(cached_file_folder):
+            os.makedirs(cached_file_folder, 0777)
+
+        with open(cached_file_header, 'w') as f:
+            f.write("{\"Content-Length\": \"" + str(len(jsonGenerated)) + "\", \"Content-Type\": \"application/json\"}")
+        with open(cached_file_content, 'w') as f:
+            f.write(jsonGenerated)
+        return True
      else:
         return False