Merge "Enable multithread for failsafe"
authorXue Gao <xg353y@intl.att.com>
Thu, 30 Jan 2020 12:50:32 +0000 (12:50 +0000)
committerGerrit Code Review <gerrit@onap.org>
Thu, 30 Jan 2020 12:50:32 +0000 (12:50 +0000)
17 files changed:
extra/sql/bulkload/create-tables.sql
src/main/java/org/onap/clamp/clds/model/dcae/DcaeInventoryCache.java
src/main/java/org/onap/clamp/clds/model/dcae/DcaeInventoryResponse.java
src/main/java/org/onap/clamp/loop/LoopController.java
src/main/java/org/onap/clamp/loop/components/external/DcaeComponent.java
src/main/java/org/onap/clamp/loop/template/LoopElementModel.java
src/main/java/org/onap/clamp/loop/template/LoopTemplate.java
src/main/java/org/onap/clamp/loop/template/PolicyModel.java
src/main/java/org/onap/clamp/policy/microservice/MicroServicePolicy.java
src/main/java/org/onap/clamp/policy/microservice/MicroServicePolicyService.java
src/main/resources/clds/camel/routes/dcae-flows.xml
src/main/resources/clds/camel/routes/policy-flows.xml
src/test/java/org/onap/clamp/clds/model/dcae/DcaeInventoryResponseCacheTestItCase.java [moved from src/test/java/org/onap/clamp/clds/model/dcae/DcaeInventoryResponseCacheTest.java with 60% similarity]
src/test/java/org/onap/clamp/loop/DcaeComponentTest.java
src/test/java/org/onap/clamp/loop/DeployFlowTestItCase.java [new file with mode: 0644]
src/test/resources/clds/camel/routes/dcae-flows.xml
src/test/resources/http-cache/third_party_proxy.py

index 2e626b6..352b661 100644 (file)
@@ -57,7 +57,7 @@
         created_timestamp datetime(6) not null,
         updated_by varchar(255),
         updated_timestamp datetime(6) not null,
-        blueprint_yaml MEDIUMTEXT not null,
+        blueprint_yaml MEDIUMTEXT,
         maximum_instances_allowed integer,
         svg_representation MEDIUMTEXT,
         service_uuid varchar(255),
         json_representation json not null,
         pdp_group varchar(255),
         context varchar(255),
+        dcae_blueprint_id varchar(255),
         dcae_deployment_id varchar(255),
         dcae_deployment_status_url varchar(255),
         device_type_scope varchar(255),
index 558102c..19bc23d 100644 (file)
@@ -36,7 +36,7 @@ import java.util.concurrent.ConcurrentHashMap;
  */
 public class DcaeInventoryCache {
 
-    private Map<String, Set<DcaeInventoryResponse>> blueprintsMap = new ConcurrentHashMap<>();
+    private static Map<String, Set<DcaeInventoryResponse>> blueprintsMap = new ConcurrentHashMap<>();
 
     /**
      * Add Dcae inventory response.
index bdf6e70..67bd026 100644 (file)
@@ -53,9 +53,6 @@ public class DcaeInventoryResponse implements Comparable<DcaeInventoryResponse>
     @Expose
     private String asdcResourceId;
 
-    @Expose
-    private String selfLink;
-
     public String getTypeName() {
         return typeName;
     }
@@ -96,14 +93,6 @@ public class DcaeInventoryResponse implements Comparable<DcaeInventoryResponse>
         this.asdcResourceId = asdcResourceId;
     }
 
-    public String getSelfLink() {
-        return selfLink;
-    }
-
-    public void setSelfLink(String selfLink) {
-        this.selfLink = selfLink;
-    }
-
     @Override
     public int compareTo(DcaeInventoryResponse otherResponse) {
         int thisResourceId = Integer.parseInt(this.asdcResourceId);
index 64874a3..c161c55 100644 (file)
@@ -40,10 +40,10 @@ import org.springframework.stereotype.Controller;
 public class LoopController {
 
     private final LoopService loopService;
-    private static final Type OPERATIONAL_POLICY_TYPE = new TypeToken<List<OperationalPolicy>>() {
-    }.getType();
-    private static final Type MICROSERVICE_POLICY_TYPE = new TypeToken<List<MicroServicePolicy>>() {
-    }.getType();
+    private static final Type OPERATIONAL_POLICY_TYPE = new TypeToken<List<OperationalPolicy>>() {}
+        .getType();
+    private static final Type MICROSERVICE_POLICY_TYPE = new TypeToken<List<MicroServicePolicy>>() {}
+        .getType();
 
     @Autowired
     public LoopController(LoopService loopService) {
index 9b13129..acb7190 100644 (file)
 package org.onap.clamp.loop.components.external;
 
 import com.google.gson.JsonObject;
-
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
 import java.util.UUID;
-
 import org.apache.camel.Exchange;
+import org.json.simple.JSONArray;
+import org.json.simple.JSONObject;
+import org.json.simple.parser.JSONParser;
+import org.json.simple.parser.ParseException;
+
+import org.onap.clamp.clds.model.dcae.DcaeInventoryResponse;
 import org.onap.clamp.clds.model.dcae.DcaeOperationStatusResponse;
 import org.onap.clamp.clds.util.JsonUtils;
 import org.onap.clamp.loop.Loop;
+import org.onap.clamp.policy.microservice.MicroServicePolicy;
 
 public class DcaeComponent extends ExternalComponent {
 
@@ -84,7 +92,6 @@ public class DcaeComponent extends ExternalComponent {
             return null;
         }
     }
-
     /**
      * Generate the deployment id, it's random.
      *
@@ -125,6 +132,27 @@ public class DcaeComponent extends ExternalComponent {
         return rootObject.toString();
     }
 
+    /**
+     * Return the deploy payload for DCAE.
+     *
+     * @param loop The loop object
+     * @param microServiceName The micro service name
+     * @return The payload used to send deploy closed loop request
+     */
+    public static String getDeployPayload(Loop loop, String microServiceName) {
+        JsonObject globalProp = loop.getGlobalPropertiesJson();
+        JsonObject deploymentProp = globalProp.getAsJsonObject(DEPLOYMENT_PARAMETER).getAsJsonObject(microServiceName);
+
+        String serviceTypeId = loop.getDcaeBlueprintId();
+
+        JsonObject rootObject = new JsonObject();
+        rootObject.addProperty(DCAE_SERVICETYPE_ID, serviceTypeId);
+        if (deploymentProp != null) {
+            rootObject.add(DCAE_INPUTS, deploymentProp);
+        }
+        return rootObject.toString();
+    }
+
     /**
      * Return the uninstallation payload for DCAE.
      *
@@ -137,6 +165,18 @@ public class DcaeComponent extends ExternalComponent {
         return rootObject.toString();
     }
 
+    /**
+     * Return the uninstallation payload for DCAE.
+     *
+     * @param microServicePolicy The microServicePolicy object
+     * @return The payload in string (json)
+     */
+    public static String getUndeployPayload(MicroServicePolicy policy) {
+        JsonObject rootObject = new JsonObject();
+        rootObject.addProperty(DCAE_SERVICETYPE_ID, policy.getDcaeBlueprintId());
+        return rootObject.toString();
+    }
+
     @Override
     public ExternalComponentState computeState(Exchange camelExchange) {
 
@@ -164,4 +204,26 @@ public class DcaeComponent extends ExternalComponent {
         }
         return this.getState();
     }
+
+    /**
+     * Convert the json response to a DcaeInventoryResponse.
+     *
+     * @param responseBody The DCAE response Json paylaod
+     * @return list of DcaeInventoryResponse
+     * @throws ParseException In case of issues with the Json parsing
+     */
+    public static List<DcaeInventoryResponse> convertToDcaeInventoryResponse(String responseBody)
+            throws ParseException {
+        JSONParser parser = new JSONParser();
+        JSONObject jsonObj = (JSONObject) parser.parse(responseBody);
+        JSONArray itemsArray = (JSONArray) jsonObj.get("items");
+        Iterator it = itemsArray.iterator();
+        List<DcaeInventoryResponse> inventoryResponseList = new LinkedList<>();
+        while (it.hasNext()) {
+            JSONObject item = (JSONObject) it.next();
+            DcaeInventoryResponse response = JsonUtils.GSON.fromJson(item.toString(), DcaeInventoryResponse.class);
+            inventoryResponseList.add(response);
+        }
+        return inventoryResponseList;
+    }
 }
index c22ca1a..7f00c42 100644 (file)
@@ -70,7 +70,7 @@ public class LoopElementModel extends AuditEntity implements Serializable {
     private String blueprint;
 
     /**
-     * The type of element
+     * The type of element.
      */
     @Column(nullable = false, name = "loop_element_type")
     private String loopElementType;
@@ -103,7 +103,7 @@ public class LoopElementModel extends AuditEntity implements Serializable {
     /**
      * Method to add a new policyModel to the list.
      * 
-     * @param policyModel
+     * @param policyModel The policy model
      */
     public void addPolicyModel(PolicyModel policyModel) {
         policyModels.add(policyModel);
@@ -147,6 +147,8 @@ public class LoopElementModel extends AuditEntity implements Serializable {
     }
 
     /**
+     * loopElementType getter.
+     * 
      * @return the loopElementType
      */
     public String getLoopElementType() {
@@ -154,6 +156,8 @@ public class LoopElementModel extends AuditEntity implements Serializable {
     }
 
     /**
+     * loopElementType setter.
+     * 
      * @param loopElementType the loopElementType to set
      */
     public void setLoopElementType(String loopElementType) {
index 20574ff..7c059e1 100644 (file)
@@ -62,7 +62,7 @@ public class LoopTemplate extends AuditEntity implements Serializable {
      * other option would be to have independent blueprint for each microservices.
      * In that case they are stored in each MicroServiceModel
      */
-    @Column(columnDefinition = "MEDIUMTEXT", nullable = false, name = "blueprint_yaml")
+    @Column(columnDefinition = "MEDIUMTEXT", name = "blueprint_yaml")
     private String blueprint;
 
     @Expose
index 00d58a8..886e8c8 100644 (file)
@@ -82,6 +82,8 @@ public class PolicyModel extends AuditEntity implements Serializable, Comparable
     private Set<LoopElementModel> usedByElementModels = new HashSet<>();
 
     /**
+     * usedByElementModels getter.
+     * 
      * @return the usedByElementModels
      */
     public Set<LoopElementModel> getUsedByElementModels() {
@@ -170,10 +172,10 @@ public class PolicyModel extends AuditEntity implements Serializable, Comparable
     /**
      * Constructor.
      * 
-     * @param policyType       The policyType (referenced in the blueprint)
+     * @param policyType       The policyType (referenced in the blueprint
      * @param policyModelTosca The policy tosca model in yaml
      * @param version          the version like 1.0.0
-     * @param policyVariant    Subtype for policy if it exists (could be used by UI)
+     * @param policyAcronym    Subtype for policy if it exists (could be used by UI)
      */
     public PolicyModel(String policyType, String policyModelTosca, String version, String policyAcronym) {
         this.policyModelType = policyType;
index 445c1d5..43c8d6e 100644 (file)
@@ -101,6 +101,10 @@ public class MicroServicePolicy extends Policy implements Serializable {
     @Column(name = "dcae_deployment_status_url")
     private String dcaeDeploymentStatusUrl;
 
+    @Expose
+    @Column(name = "dcae_blueprint_id")
+    private String dcaeBlueprintId;
+
     public MicroServicePolicy() {
         // serialization
     }
@@ -253,6 +257,24 @@ public class MicroServicePolicy extends Policy implements Serializable {
         this.dcaeDeploymentStatusUrl = dcaeDeploymentStatusUrl;
     }
 
+    /**
+     * dcaeBlueprintId getter.
+     * 
+     * @return the dcaeBlueprintId
+     */
+    public String getDcaeBlueprintId() {
+        return dcaeBlueprintId;
+    }
+
+    /**
+     * dcaeBlueprintId setter.
+     * 
+     * @param dcaeBlueprintId the dcaeBlueprintId to set
+     */
+    void setDcaeBlueprintId(String dcaeBlueprintId) {
+        this.dcaeBlueprintId = dcaeBlueprintId;
+    }
+
     @Override
     public int hashCode() {
         final int prime = 31;
index c431767..29a4e56 100644 (file)
@@ -47,7 +47,7 @@ public class MicroServicePolicyService implements PolicyService<MicroServicePoli
     @Override
     public Set<MicroServicePolicy> updatePolicies(Loop loop, List<MicroServicePolicy> newMicroservicePolicies) {
         return newMicroservicePolicies.stream().map(policy -> getAndUpdateMicroServicePolicy(loop, policy))
-            .collect(Collectors.toSet());
+                .collect(Collectors.toSet());
     }
 
     @Override
@@ -58,25 +58,38 @@ public class MicroServicePolicyService implements PolicyService<MicroServicePoli
     /**
      * Get and update the MicroService policy properties.
      *
-     * @param loop
-     *        The loop
-     * @param policy
-     *        The new MicroService policy
+     * @param loop   The loop
+     * @param policy The new MicroService policy
      * @return The updated MicroService policy
      */
     public MicroServicePolicy getAndUpdateMicroServicePolicy(Loop loop, MicroServicePolicy policy) {
-        return repository
-            .save(repository.findById(policy.getName()).map(p -> updateMicroservicePolicyProperties(p, policy, loop))
-                .orElse(new MicroServicePolicy(policy.getName(), policy.getModelType(), policy.getPolicyTosca(),
-                    policy.getShared(), policy.getJsonRepresentation(), Sets.newHashSet(loop))));
+        return repository.save(
+                repository.findById(policy.getName()).map(p -> updateMicroservicePolicyProperties(p, policy, loop))
+                        .orElse(new MicroServicePolicy(policy.getName(), policy.getModelType(), policy.getPolicyTosca(),
+                                policy.getShared(), policy.getJsonRepresentation(), Sets.newHashSet(loop))));
     }
 
     private MicroServicePolicy updateMicroservicePolicyProperties(MicroServicePolicy oldPolicy,
-        MicroServicePolicy newPolicy, Loop loop) {
+            MicroServicePolicy newPolicy, Loop loop) {
         oldPolicy.setConfigurationsJson(newPolicy.getConfigurationsJson());
         if (!oldPolicy.getUsedByLoops().contains(loop)) {
             oldPolicy.getUsedByLoops().add(loop);
         }
         return oldPolicy;
     }
+
+    /**
+     * Update the MicroService policy deployment related parameters.
+     *
+     * @param microServicePolicy The micro service policy
+     * @param deploymentId       The deployment ID as returned by DCAE
+     * @param deploymentUrl      The Deployment URL as returned by DCAE
+     * @throws MicroServicePolicy doesn't exist in DB
+     */
+    public void updateDcaeDeploymentFields(MicroServicePolicy microServicePolicy, String deploymentId,
+            String deploymentUrl) {
+        microServicePolicy.setDcaeDeploymentId(deploymentId);
+        microServicePolicy.setDcaeDeploymentStatusUrl(deploymentUrl);
+        repository.save(microServicePolicy);
+    }
 }
index fb3bc90..7137bab 100644 (file)
@@ -1,6 +1,112 @@
 <routes xmlns="http://camel.apache.org/schema/spring">
        <route id="deploy-loop">
                <from uri="direct:deploy-loop" />
+               <choice>
+                       <when>
+                               <simple>${exchangeProperty['loopObject'].getLoopTemplate().getBlueprint()} != null
+                               </simple>
+                               <to uri="direct:deploy-loop-single-blueprint" />
+                       </when>
+                       <when>
+                               <simple>${exchangeProperty['loopObject'].getLoopTemplate().getBlueprint()} == null
+                               </simple>
+                               <to uri="direct:deploy-loop-multi-blueprint" />
+                       </when>
+               </choice>
+       </route>
+       <route id="deploy-loop-multi-blueprint">
+               <from uri="direct:deploy-loop-multi-blueprint" />
+               <doTry>
+                       <log loggingLevel="INFO"
+                               message="Deploying the blueprints for loop: ${exchangeProperty[loopObject].getName()}" />
+                       <to
+                               uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('DCAE', 'Deploying the loop with multiple blueprints')" />
+                       <split>
+                                       <simple>${exchangeProperty[loopObject].getMicroServicePolicies()}
+                                       </simple>
+                                       <setProperty propertyName="microServicePolicy">
+                                               <simple>${body}</simple>
+                                       </setProperty>
+                                       <log
+                                               loggingLevel="INFO"
+                                               message="Processing Micro Service Policy: ${exchangeProperty[microServicePolicy].getName()}" />
+                                       <setProperty propertyName="raiseHttpExceptionFlag">
+                                               <simple resultType="java.lang.Boolean">false</simple>
+                                       </setProperty>
+                                       <setBody>
+                                               <method ref="org.onap.clamp.loop.components.external.DcaeComponent"
+                                                       method="getDeployPayload(${exchangeProperty[loopObject]},${exchangeProperty[microServicePolicy].getName()})" />
+                                       </setBody>
+                                       <setProperty propertyName="dcaeDeploymentId">
+                                               <method ref="org.onap.clamp.loop.components.external.DcaeComponent"
+                                                       method="generateDeploymentId()" />
+                                       </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 loop: {{clamp.config.dcae.deployment.url}}/dcae-deployments/${exchangeProperty[dcaeDeploymentId]}"></log>
+                                       <toD
+                                               uri="{{clamp.config.dcae.deployment.url}}/dcae-deployments/${exchangeProperty[dcaeDeploymentId]}?bridgeEndpoint=true&amp;useSystemProperties=true&amp;mapHttpMessageHeaders=false&amp;throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&amp;authUsername={{clamp.config.dcae.deployment.userName}}&amp;authPassword={{clamp.config.dcae.deployment.password}}&amp;connectionTimeToLive=5000&amp;httpClient.connectTimeout=10000&amp;httpClient.socketTimeout=300000&amp;authenticationPreemptive=true&amp;connectionClose=true" />
+                                       <convertBodyTo type="java.lang.String" />
+                                       <setProperty propertyName="dcaeResponse">
+                                               <method ref="org.onap.clamp.loop.components.external.DcaeComponent"
+                                                       method="convertDcaeResponse(${body})" />
+                                       </setProperty>
+                                       <setProperty propertyName="dcaeStatusUrl">
+                                               <method ref="org.onap.clamp.loop.components.external.DcaeComponent"
+                                                       method="getStatusUrl(${exchangeProperty[dcaeResponse]})" />
+                                       </setProperty>
+                                       <to
+                                               uri="bean:org.onap.clamp.policy.microservice.MicroServicePolicyService?method=updateDcaeDeploymentFields(${exchangeProperty[microServicePolicy]},${exchangeProperty[dcaeDeploymentId]},${exchangeProperty[dcaeStatusUrl]})" />
+                                       <setProperty propertyName="logMessage">
+                                               <simple>DEPLOY loop status
+                                                       (Dep-id:${exchangeProperty[dcaeDeploymentId]},
+                                                       StatusUrl:${exchangeProperty[dcaeStatusUrl]})
+                                               </simple>
+                                       </setProperty>
+                                       <setProperty propertyName="logComponent">
+                                               <simple>DCAE</simple>
+                                       </setProperty>
+                                       <to uri="direct:dump-loop-log-http-response" />
+                       </split>
+                       <doCatch>
+                               <setProperty propertyName="logMessage">
+                                       <simple>DEPLOY micro service failed 
+                                               (MicroService name:${exchangeProperty[microServicePolicy].getName()}),
+                                               Dep-id:${exchangeProperty[dcaeDeploymentId]},
+                                               StatusUrl:${exchangeProperty[dcaeStatusUrl]})
+                                       </simple>
+                               </setProperty>
+                               <setProperty propertyName="logComponent">
+                                       <simple>DCAE</simple>
+                               </setProperty>
+                               <to uri="direct:dump-loop-log-http-response" />
+                       </doCatch>
+                       <doFinally>
+                               <to uri="direct:reset-raise-http-exception-flag" />
+                               <to
+                                       uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()" />
+                       </doFinally>
+               </doTry>
+       </route>
+       <route id="deploy-loop-single-blueprint">
+               <from uri="direct:deploy-loop-single-blueprint" />
                <doTry>
                        <log loggingLevel="INFO"
                                message="Deploying the loop: ${exchangeProperty[loopObject].getName()}" />
                                <method ref="org.onap.clamp.loop.components.external.DcaeComponent"
                                        method="convertDcaeResponse(${body})" />
                        </setProperty>
+                       
+
                        <setProperty propertyName="dcaeStatusUrl">
                                <method ref="org.onap.clamp.loop.components.external.DcaeComponent"
                                        method="getStatusUrl(${exchangeProperty[dcaeResponse]})" />
                        </doFinally>
                </doTry>
        </route>
-
        <route id="undeploy-loop">
                <from uri="direct:undeploy-loop" />
+               <choice>
+                       <when>
+                               <simple>${exchangeProperty['loopObject'].getLoopTemplate().getBlueprint()} != null
+                               </simple>
+                               <to uri="direct:undeploy-loop-single-blueprint" />
+                       </when>
+                       <when>
+                               <simple>${exchangeProperty['loopObject'].getLoopTemplate().getBlueprint()} == null
+                               </simple>
+                               <to uri="direct:undeploy-loop-multi-blueprint" />
+                       </when>
+               </choice>
+       </route>
+       <route id="undeploy-loop-multi-blueprint">
+               <from uri="direct:undeploy-loop-multi-blueprint" />
+               <doTry>
+                       <log loggingLevel="INFO"
+                               message="Undeploying the blueprints for loop: ${exchangeProperty[loopObject].getName()}" />
+                       <to
+                               uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('DCAE', 'Undeploying the loop with multiple blueprints')" />
+                       <split>
+                               <simple>${exchangeProperty[loopObject].getMicroServicePolicies()}
+                               </simple>
+                               <setProperty propertyName="microServicePolicy">
+                                       <simple>${body}</simple>
+                               </setProperty>
+                               <log
+                                       loggingLevel="INFO"
+                                       message="Processing Micro Service Policy: ${exchangeProperty[microServicePolicy].getName()}" />
+                               <choice>
+                                       <when>
+                                               <simple>${exchangeProperty[microServicePolicy].getDcaeDeploymentId()} != null
+                                               </simple>
+                                               <setBody>
+                                                       <method ref="org.onap.clamp.loop.components.external.DcaeComponent"
+                                                               method="getUndeployPayload(${exchangeProperty[microServicePolicy]})" />
+                                               </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 loop: {{clamp.config.dcae.deployment.url}}/dcae-deployments/${exchangeProperty[microServicePolicy].getDcaeDeploymentId()}"></log>
+                                               <toD
+                                                       uri="{{clamp.config.dcae.deployment.url}}/dcae-deployments/${exchangeProperty[microServicePolicy].getDcaeDeploymentId()}?bridgeEndpoint=true&amp;useSystemProperties=true&amp;mapHttpMessageHeaders=false&amp;throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&amp;authUsername={{clamp.config.dcae.deployment.userName}}&amp;authPassword={{clamp.config.dcae.deployment.password}}&amp;connectionTimeToLive=5000&amp;httpClient.connectTimeout=10000&amp;httpClient.socketTimeout=300000&amp;authenticationPreemptive=true&amp;connectionClose=true" />
+                                               <convertBodyTo type="java.lang.String" />
+                                               <setProperty propertyName="dcaeResponse">
+                                                       <method ref="org.onap.clamp.loop.components.external.DcaeComponent"
+                                                               method="convertDcaeResponse(${body})" />
+                                               </setProperty>
+                                               <setProperty propertyName="dcaeStatusUrl">
+                                                       <method ref="org.onap.clamp.loop.components.external.DcaeComponent"
+                                                               method="getStatusUrl(${exchangeProperty[dcaeResponse]})" />
+                                               </setProperty>
+                                               <to
+                                                       uri="bean:org.onap.clamp.policy.microservice.MicroServicePolicyService?method=updateDcaeDeploymentFields(${exchangeProperty[microServicePolicy]},${exchangeProperty[microServicePolicy].getDcaeDeploymentId()},${exchangeProperty[dcaeStatusUrl]})" />
+                                               <setProperty propertyName="logMessage">
+                                                       <simple>UNDEPLOY micro service successful
+                                                               (MicroService name:${exchangeProperty[microServicePolicy].getName()})
+                                                       </simple>
+                                               </setProperty>
+                                               <setProperty propertyName="logComponent">
+                                                       <simple>DCAE</simple>
+                                               </setProperty>
+                                               <to uri="direct:dump-loop-log-http-response" />
+                                       </when>
+                                       <otherwise>
+                                               <log loggingLevel="WARNING"
+                                                       message="Cannot Undeploy for the micro service: ${exchangeProperty[microServicePolicy].getName()}, the Deployment ID does not exist !" />
+                                               <to
+                                                       uri="bean:org.onap.clamp.loop.log.LoopLogService?method=addLog('Cannot Undeploy for the micro service: ${exchangeProperty[microServicePolicy].getName()}, the Deployment ID does not exist !','WARNING',${exchangeProperty[loopObject]})" />
+                                       </otherwise>
+                               </choice>
+                       </split>
+                       <doCatch>
+                               <setProperty propertyName="logMessage">
+                                       <simple>UNDEPLOY micro service failed
+                                               (MicroService name:${exchangeProperty[microServicePolicy].getName()})
+                                       </simple>
+                               </setProperty>
+                               <setProperty propertyName="logComponent">
+                                       <simple>DCAE</simple>
+                               </setProperty>
+                               <to uri="direct:dump-loop-log-http-response" />
+                       </doCatch>
+                       <doFinally>
+                               <to uri="direct:reset-raise-http-exception-flag" />
+                               <to
+                                       uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()" />
+                       </doFinally>
+               </doTry>
+       </route>
+       <route id="undeploy-loop-single-blueprint">
+               <from uri="direct:undeploy-loop-single-blueprint" />
                <log loggingLevel="INFO"
                        message="Undeploying the loop: ${exchangeProperty[loopObject].getName()} : ${exchangeProperty[loopObject].getDcaeDeploymentId()}" />
                <to
                                        message="Cannot Undeploy for the loop: ${exchangeProperty[loopObject].getName()}, the Deployment ID does not exist !" />
                                <to
                                        uri="bean:org.onap.clamp.loop.log.LoopLogService?method=addLog('Cannot Undeploy for the loop: ${exchangeProperty[loopObject].getName()}, the Deployment ID does not exist !','WARNING',${exchangeProperty[loopObject]})" />
-
                        </otherwise>
                </choice>
        </route>
                </doTry>
 
        </route>
+       <route id="get-all-dcae-blueprint-inventory">
+               <from uri="direct:get-all-dcae-blueprint-inventory" />
+               <log loggingLevel="INFO"
+                        message="Getting all DCAE blueprint from inventory" />
+               <to uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('DCAE', 'Getting all blueprint from inventory')" />
+               <doTry>
+                       <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 Blueprints from DCAE inventory: {{clamp.config.dcae.inventory.url}}/dcae-service-types?${header[CamelHttpQuery]}"></log>
+                       <toD uri="{{clamp.config.dcae.inventory.url}}/dcae-service-types;bridgeEndpoint=true&amp;useSystemProperties=true&amp;throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&amp;authMethod=Basic&amp;authUsername={{clamp.config.dcae.deployment.userName}}&amp;authPassword={{clamp.config.dcae.deployment.password}}&amp;connectionTimeToLive=5000&amp;httpClient.connectTimeout=10000&amp;httpClient.socketTimeout=30000&amp;authenticationPreemptive=true&amp;connectionClose=true" />
+                       <convertBodyTo type="java.lang.String" />
+                       <setProperty propertyName="dcaeResponseList">
+                               <method ref="org.onap.clamp.loop.components.external.DcaeComponent"
+                                               method="convertToDcaeInventoryResponse(${body})" />
+                       </setProperty>
+                       <split>
+                               <simple>${exchangeProperty[dcaeResponseList]}</simple>
+                               <convertBodyTo type="org.onap.clamp.clds.model.dcae.DcaeInventoryResponse" />
+                               <setProperty propertyName="dcaeResponse">
+                                       <simple>${body}</simple>
+                               </setProperty>
+                               <to uri="bean:org.onap.clamp.clds.model.dcae.DcaeInventoryCache?method=addDcaeInventoryResponse(${exchangeProperty[dcaeResponse]})" />
+                       </split>
+                       <doFinally>
+                               <to uri="direct:reset-raise-http-exception-flag" />
+                               <to uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()" />
+                       </doFinally>
+               </doTry>
+       </route>
 </routes>
\ No newline at end of file
index 223498e..97416a6 100644 (file)
@@ -99,7 +99,7 @@
                        <log loggingLevel="INFO"
                                message="Endpoint to get policy deployment status: {{clamp.config.policy.pap.url}}/policy/pap/v1/policies/deployed/${exchangeProperty[policyName]}/1.0.0"></log>
                        <toD
-                               uri="{{clamp.config.policy.pap.url}}/policy/pap/v1/policies/${exchangeProperty[policyName]}/1.0.0?bridgeEndpoint=true&amp;useSystemProperties=true&amp;throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&amp;authMethod=Basic&amp;authUsername={{clamp.config.policy.api.userName}}&amp;authPassword={{clamp.config.policy.api.password}}&amp;connectionTimeToLive=5000&amp;httpClient.connectTimeout=10000&amp;httpClient.socketTimeout=20000&amp;authenticationPreemptive=true&amp;connectionClose=true" />
+                               uri="{{clamp.config.policy.pap.url}}/policy/pap/v1/policies/deployed/${exchangeProperty[policyName]}/1.0.0?bridgeEndpoint=true&amp;useSystemProperties=true&amp;throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&amp;authMethod=Basic&amp;authUsername={{clamp.config.policy.api.userName}}&amp;authPassword={{clamp.config.policy.api.password}}&amp;connectionTimeToLive=5000&amp;httpClient.connectTimeout=10000&amp;httpClient.socketTimeout=20000&amp;authenticationPreemptive=true&amp;connectionClose=true" />
                        <doFinally>
                                <to uri="direct:reset-raise-http-exception-flag" />
                                <to
 package org.onap.clamp.clds.model.dcae;
 
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertEquals;
 
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.ExchangeBuilder;
 import org.junit.BeforeClass;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.onap.clamp.clds.Application;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
 
-public class DcaeInventoryResponseCacheTest {
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = Application.class)
+public class DcaeInventoryResponseCacheTestItCase {
 
     public static DcaeInventoryCache inventoryCache = new DcaeInventoryCache();
 
+    @Autowired
+    CamelContext camelContext;
+
     /**
      * Initialize the responses.
      */
@@ -78,4 +95,32 @@ public class DcaeInventoryResponseCacheTest {
         }
     }
 
+    @Test
+    public void testDcaeInventoryResponse() {
+        Exchange exchange = ExchangeBuilder.anExchange(camelContext).build();
+        Exchange exchangeResponse = camelContext.createProducerTemplate()
+                .send("direct:get-all-dcae-blueprint-inventory", exchange);
+        assertThat(exchangeResponse.getIn().getHeader("CamelHttpResponseCode")).isEqualTo(200);
+        Set<DcaeInventoryResponse> blueprint = inventoryCache.getAllBlueprintsPerLoopId("testAsdcServiceId");
+        assertThat(blueprint.size()).isEqualTo(2);
+
+        DcaeInventoryResponse response1 = new DcaeInventoryResponse();
+        response1.setAsdcResourceId("0");
+        response1.setTypeName("testTypeName");
+        response1.setAsdcServiceId("testAsdcServiceId");
+        response1.setBlueprintTemplate("testBlueprintTemplate");
+        response1.setTypeId("testtypeId");
+        DcaeInventoryResponse response2 = new DcaeInventoryResponse();
+        response2.setAsdcResourceId("1");
+        response2.setTypeName("testTypeName2");
+        response2.setAsdcServiceId("testAsdcServiceId");
+        response2.setBlueprintTemplate("testBlueprintTemplate2");
+        response2.setTypeId("testtypeId2");
+
+        Set<DcaeInventoryResponse> expectedBlueprint = new HashSet<>();
+        expectedBlueprint.add(response1);
+        expectedBlueprint.add(response2);
+
+        assertEquals(blueprint, expectedBlueprint);
+    }
 }
index 9692151..9352e91 100644 (file)
@@ -30,11 +30,15 @@ import com.google.gson.JsonObject;
 
 import java.io.IOException;
 import java.util.HashSet;
+import java.util.List;
 
 import org.apache.camel.Exchange;
 import org.apache.camel.Message;
+import org.json.simple.parser.ParseException;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.mockito.Mockito;
+import org.onap.clamp.clds.model.dcae.DcaeInventoryResponse;
 import org.onap.clamp.clds.model.dcae.DcaeOperationStatusResponse;
 import org.onap.clamp.loop.components.external.DcaeComponent;
 import org.onap.clamp.loop.components.external.ExternalComponentState;
@@ -65,7 +69,8 @@ public class DcaeComponentTest {
 
     @Test
     public void convertDcaeResponseTest() throws IOException {
-        String dcaeFakeResponse = "{'requestId':'testId','operationType':'install','status':'state','error':'errorMessage', 'links':{'self':'selfUrl','uninstall':'uninstallUrl'}}";
+        String dcaeFakeResponse = "{'requestId':'testId','operationType':'install','status':'state','error':'errorMessage', "
+            + "'links':{'self':'selfUrl','uninstall':'uninstallUrl'}}";
         DcaeOperationStatusResponse responseObject = DcaeComponent.convertDcaeResponse(dcaeFakeResponse);
         assertThat(responseObject.getRequestId()).isEqualTo("testId");
         assertThat(responseObject.getOperationType()).isEqualTo("install");
@@ -151,4 +156,89 @@ public class DcaeComponentTest {
         ExternalComponentState state9 = dcae.computeState(exchange);
         assertThat(state9.getStateName()).isEqualTo("IN_ERROR");
     }
+
+    @Test
+    public void convertToDcaeInventoryResponseTest() throws IOException, ParseException {
+        String dcaeFakeResponse = "{\n"
+                + "  \"links\": {\n"
+                + "    \"previousLink\": {\n"
+                + "      \"title\": \"string\",\n"
+                + "      \"rel\": \"string\",\n"
+                + "      \"uri\": \"string\",\n"
+                + "      \"uriBuilder\": {},\n"
+                + "      \"rels\": [\n"
+                + "        \"string\"\n"
+                + "      ],\n"
+                + "      \"params\": {\n"
+                +  "        \"additionalProp1\": \"string\",\n"
+                + "        \"additionalProp2\": \"string\",\n"
+                + "        \"additionalProp3\": \"string\"\n"
+                + "      },\n"
+                + "      \"type\": \"string\"\n"
+                + "    },\n"
+                + "    \"nextLink\": {\n"
+                + "      \"title\": \"string\",\n"
+                + "      \"rel\": \"string\",\n"
+                + "      \"uri\": \"string\",\n"
+                + "      \"uriBuilder\": {},\n"
+                + "      \"rels\": [\n"
+                + "        \"string\"\n"
+                + "      ],\n"
+                + "      \"params\": {\n"
+                + "        \"additionalProp1\": \"string\",\n"
+                + "        \"additionalProp2\": \"string\",\n"
+                + "        \"additionalProp3\": \"string\"\n"
+                + "      },\n"
+                + "      \"type\": \"string\"\n"
+                + "    }\n"
+                + "  },\n"
+                + "  \"totalCount\": 0,\n"
+                + "  \"items\": [\n"
+                + "    {\n"
+                + "      \"owner\": \"testOwner\",\n"
+                + "      \"application\": \"testApplication\",\n"
+                + "      \"component\": \"testComponent\",\n"
+                + "      \"typeName\": \"testTypeName\",\n"
+                + "      \"typeVersion\": 0,\n"
+                + "      \"blueprintTemplate\": \"testBlueprintTemplate\",\n"
+                + "      \"serviceIds\": [\n"
+                + "        \"serviceId1\", \"serviceId2\"\n"
+                + "      ],\n"
+                + "      \"vnfTypes\": [\n"
+                + "        \"vnfType1\", \"vnfType2\"\n"
+                + "      ],\n"
+                + "      \"serviceLocations\": [\n"
+                + "        \"serviceLocation1\", \"serviceLocation2\"\n"
+                + "      ],\n"
+                + "      \"asdcServiceId\": \"testAsdcServiceId\",\n"
+                + "      \"asdcResourceId\": \"testAsdcResourceId\",\n"
+                + "      \"asdcServiceURL\": \"testAsdcServiceURL\",\n"
+                + "      \"typeId\": \"testTypeId\",\n"
+                + "      \"selfLink\": {\n"
+                + "        \"title\": \"selfLinkTitle\",\n"
+                + "        \"rel\": \"selfLinkRel\",\n"
+                + "        \"uri\": \"selfLinkUri\",\n"
+                + "        \"uriBuilder\": {},\n"
+                + "        \"rels\": [\n"
+                + "          \"string\"\n"
+                + "        ],\n"
+                + "        \"params\": {\n"
+                + "          \"additionalProp1\": \"string\",\n"
+                + "          \"additionalProp2\": \"string\",\n"
+                + "          \"additionalProp3\": \"string\"\n"
+                + "        },\n"
+                + "        \"type\": \"string\"\n"
+                + "      },\n"
+                + "      \"created\": \"2020-01-22T09:38:15.436Z\",\n"
+                + "      \"deactivated\": \"2020-01-22T09:38:15.437Z\"\n"
+                + "    }\n"
+                + "  ]\n"
+                + "}";
+        List<DcaeInventoryResponse> responseObject = DcaeComponent.convertToDcaeInventoryResponse(dcaeFakeResponse);
+        assertThat(responseObject.get(0).getAsdcResourceId()).isEqualTo("testAsdcResourceId");
+        assertThat(responseObject.get(0).getAsdcServiceId()).isEqualTo("testAsdcServiceId");
+        assertThat(responseObject.get(0).getTypeName()).isEqualTo("testTypeName");
+        assertThat(responseObject.get(0).getTypeId()).isEqualTo("testTypeId");
+        assertThat(responseObject.get(0).getBlueprintTemplate()).isEqualTo("testBlueprintTemplate");
+    }
 }
diff --git a/src/test/java/org/onap/clamp/loop/DeployFlowTestItCase.java b/src/test/java/org/onap/clamp/loop/DeployFlowTestItCase.java
new file mode 100644 (file)
index 0000000..d7c2eda
--- /dev/null
@@ -0,0 +1,208 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CLAMP
+ * ================================================================================
+ * 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END============================================
+ * ===================================================================
+ *
+ */
+
+package org.onap.clamp.loop;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonSyntaxException;
+
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.transaction.Transactional;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.ExchangeBuilder;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.onap.clamp.clds.Application;
+import org.onap.clamp.loop.template.LoopTemplate;
+import org.onap.clamp.policy.microservice.MicroServicePolicy;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = Application.class)
+public class DeployFlowTestItCase {
+    private Gson gson = new Gson();
+
+    @Autowired
+    CamelContext camelContext;
+
+    @Autowired
+    LoopService loopService;
+
+    @Test
+    @Transactional
+    public void deployWithSingleBlueprintTest() throws JsonSyntaxException, IOException {
+        Loop loopTest = createLoop("ControlLoopTest", "<xml></xml>", "yamlcontent", "{\"testname\":\"testvalue\"}",
+                 "UUID-blueprint");
+        LoopTemplate template = new LoopTemplate();
+        template.setName("templateName");
+        template.setBlueprint("yamlcontent");
+        loopTest.setLoopTemplate(template);
+        MicroServicePolicy microServicePolicy = getMicroServicePolicy("configPolicyTest", "",
+                "{\"configtype\":\"json\"}", "tosca_definitions_version: tosca_simple_yaml_1_0_0",
+                "{\"param1\":\"value1\"}", true);
+        loopTest.addMicroServicePolicy(microServicePolicy);
+        loopService.saveOrUpdateLoop(loopTest);
+        Exchange myCamelExchange = ExchangeBuilder.anExchange(camelContext)
+            .withProperty("loopObject", loopTest).build();
+
+        camelContext.createProducerTemplate()
+            .send("direct:deploy-loop", myCamelExchange);
+
+        Loop loopAfterTest = loopService.getLoop("ControlLoopTest");
+        assertThat(loopAfterTest.getDcaeDeploymentStatusUrl()).isNotNull();
+        assertThat(loopAfterTest.getDcaeDeploymentId()).isNotNull();
+    }
+
+    @Test
+    @Transactional
+    public void deployWithMultipleBlueprintTest() throws JsonSyntaxException, IOException {
+        Loop loopTest2 = createLoop("ControlLoopTest2", "<xml></xml>", "yamlcontent", "{\"dcaeDeployParameters\": {"
+            + "\"microService1\": {\"location_id\": \"\", \"policy_id\": \"TCA_h2NMX_v1_0_ResourceInstanceName1_tca\"},"
+            + "\"microService2\": {\"location_id\": \"\", \"policy_id\": \"TCA_h2NMX_v1_0_ResourceInstanceName2_tca\"}"
+            + "}}", "UUID-blueprint");
+        LoopTemplate template = new LoopTemplate();
+        template.setName("templateName");
+        loopTest2.setLoopTemplate(template);
+        MicroServicePolicy microServicePolicy1 = getMicroServicePolicy("microService1", "",
+                "{\"configtype\":\"json\"}", "tosca_definitions_version: tosca_simple_yaml_1_0_0",
+                "{\"param1\":\"value1\"}", true);
+        MicroServicePolicy microServicePolicy2 = getMicroServicePolicy("microService2", "",
+                "{\"configtype\":\"json\"}", "tosca_definitions_version: tosca_simple_yaml_1_0_0",
+                "{\"param1\":\"value1\"}", true);
+        loopTest2.addMicroServicePolicy(microServicePolicy1);
+        loopTest2.addMicroServicePolicy(microServicePolicy2);
+        loopService.saveOrUpdateLoop(loopTest2);
+        Exchange myCamelExchange = ExchangeBuilder.anExchange(camelContext)
+            .withProperty("loopObject", loopTest2).build();
+
+        camelContext.createProducerTemplate()
+            .send("direct:deploy-loop", myCamelExchange);
+
+        Loop loopAfterTest = loopService.getLoop("ControlLoopTest2");
+        Set<MicroServicePolicy> policyList = loopAfterTest.getMicroServicePolicies();
+        for (MicroServicePolicy policy : policyList) {
+            assertThat(policy.getDcaeDeploymentStatusUrl()).isNotNull();
+            assertThat(policy.getDcaeDeploymentId()).isNotNull();
+        }
+        assertThat(loopAfterTest.getDcaeDeploymentStatusUrl()).isNull();
+        assertThat(loopAfterTest.getDcaeDeploymentId()).isNull();
+    }
+
+    @Test
+    @Transactional
+    public void undeployWithSingleBlueprintTest() throws JsonSyntaxException, IOException {
+        Loop loopTest = createLoop("ControlLoopTest", "<xml></xml>", "yamlcontent", "{\"testname\":\"testvalue\"}",
+                 "UUID-blueprint");
+        LoopTemplate template = new LoopTemplate();
+        template.setName("templateName");
+        template.setBlueprint("yamlcontent");
+        loopTest.setLoopTemplate(template);
+        loopTest.setDcaeDeploymentId("testDeploymentId");
+        loopTest.setDcaeDeploymentStatusUrl("testUrl");
+        MicroServicePolicy microServicePolicy = getMicroServicePolicy("configPolicyTest", "",
+                "{\"configtype\":\"json\"}", "tosca_definitions_version: tosca_simple_yaml_1_0_0",
+                "{\"param1\":\"value1\"}", true);
+        loopTest.addMicroServicePolicy(microServicePolicy);
+        loopService.saveOrUpdateLoop(loopTest);
+        Exchange myCamelExchange = ExchangeBuilder.anExchange(camelContext)
+            .withProperty("loopObject", loopTest).build();
+
+        camelContext.createProducerTemplate()
+            .send("direct:undeploy-loop", myCamelExchange);
+
+        Loop loopAfterTest = loopService.getLoop("ControlLoopTest");
+        assertThat(loopAfterTest.getDcaeDeploymentStatusUrl().contains("/uninstall")).isTrue();
+    }
+
+    @Test
+    @Transactional
+    public void undeployWithMultipleBlueprintTest() throws JsonSyntaxException, IOException {
+        Loop loopTest2 = createLoop("ControlLoopTest2", "<xml></xml>", "yamlcontent", "{\"dcaeDeployParameters\": {"
+            + "\"microService1\": {\"location_id\": \"\", \"policy_id\": \"TCA_h2NMX_v1_0_ResourceInstanceName1_tca\"},"
+            + "\"microService2\": {\"location_id\": \"\", \"policy_id\": \"TCA_h2NMX_v1_0_ResourceInstanceName2_tca\"}"
+            + "}}", "UUID-blueprint");
+        LoopTemplate template = new LoopTemplate();
+        template.setName("templateName");
+        loopTest2.setLoopTemplate(template);
+        MicroServicePolicy microServicePolicy1 = getMicroServicePolicy("microService1", "",
+                "{\"configtype\":\"json\"}", "tosca_definitions_version: tosca_simple_yaml_1_0_0",
+                "{\"param1\":\"value1\"}", true, "testDeploymentId1", "testDeploymentStatusUrl1");
+        MicroServicePolicy microServicePolicy2 = getMicroServicePolicy("microService2", "",
+                "{\"configtype\":\"json\"}", "tosca_definitions_version: tosca_simple_yaml_1_0_0",
+                "{\"param1\":\"value1\"}", true, "testDeploymentId2", "testDeploymentStatusUrl2");
+        loopTest2.addMicroServicePolicy(microServicePolicy1);
+        loopTest2.addMicroServicePolicy(microServicePolicy2);
+        loopService.saveOrUpdateLoop(loopTest2);
+        Exchange myCamelExchange = ExchangeBuilder.anExchange(camelContext)
+            .withProperty("loopObject", loopTest2).build();
+
+        camelContext.createProducerTemplate()
+            .send("direct:undeploy-loop", myCamelExchange);
+
+        Loop loopAfterTest = loopService.getLoop("ControlLoopTest2");
+        Set<MicroServicePolicy> policyList = loopAfterTest.getMicroServicePolicies();
+        for (MicroServicePolicy policy : policyList) {
+            assertThat(policy.getDcaeDeploymentStatusUrl().contains("/uninstall")).isTrue();
+        }
+        assertThat(loopAfterTest.getDcaeDeploymentStatusUrl()).isNull();
+        assertThat(loopAfterTest.getDcaeDeploymentId()).isNull();
+    }
+
+    private Loop createLoop(String name, String svgRepresentation, String blueprint, String globalPropertiesJson,
+            String dcaeBlueprintId) throws JsonSyntaxException, IOException {
+        Loop loop = new Loop(name, blueprint, svgRepresentation);
+        loop.setGlobalPropertiesJson(new Gson().fromJson(globalPropertiesJson, JsonObject.class));
+        loop.setLastComputedState(LoopState.DESIGN);
+        loop.setDcaeBlueprintId(dcaeBlueprintId);
+        return loop;
+    }
+
+    private MicroServicePolicy getMicroServicePolicy(String name, String modelType, String jsonRepresentation,
+            String policyTosca, String jsonProperties, boolean shared) {
+        MicroServicePolicy microService = new MicroServicePolicy(name, modelType, policyTosca, shared,
+                gson.fromJson(jsonRepresentation, JsonObject.class), new HashSet<>());
+        microService.setConfigurationsJson(new Gson().fromJson(jsonProperties, JsonObject.class));
+        return microService;
+    }
+
+    private MicroServicePolicy getMicroServicePolicy(String name, String modelType, String jsonRepresentation,
+            String policyTosca, String jsonProperties, boolean shared, String deploymengId, String deploymentStatusUrl) {
+        MicroServicePolicy microService = getMicroServicePolicy(name, modelType, jsonRepresentation,
+                policyTosca, jsonProperties, shared);
+
+        microService.setDcaeDeploymentId(deploymengId);
+        microService.setDcaeDeploymentStatusUrl(deploymentStatusUrl);
+        return microService;
+    }
+}
index fb3bc90..48cda7a 100644 (file)
@@ -1,6 +1,106 @@
 <routes xmlns="http://camel.apache.org/schema/spring">
        <route id="deploy-loop">
                <from uri="direct:deploy-loop" />
+               <choice>
+                       <when>
+                               <simple>${exchangeProperty['loopObject'].getLoopTemplate().getBlueprint()} != null
+                               </simple>
+                               <to uri="direct:deploy-loop-single-blueprint" />
+                       </when>
+                       <when>
+                               <simple>${exchangeProperty['loopObject'].getLoopTemplate().getBlueprint()} == null
+                               </simple>
+                               <to uri="direct:deploy-loop-multi-blueprint" />
+                       </when>
+               </choice>
+       </route>
+       <route id="deploy-loop-multi-blueprint">
+               <from uri="direct:deploy-loop-multi-blueprint" />
+               <doTry>
+                       <log loggingLevel="INFO"
+                               message="Deploying the blueprints for loop: ${exchangeProperty[loopObject].getName()}" />
+                       <to
+                               uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('DCAE', 'Deploying the loop with multiple blueprints')" />
+                       <split>
+                                       <simple>${exchangeProperty[loopObject].getMicroServicePolicies()}
+                                       </simple>
+                                       <setProperty propertyName="microServicePolicy">
+                                               <simple>${body}</simple>
+                                       </setProperty>
+                                       <log
+                                               loggingLevel="INFO"
+                                               message="Processing Micro Service Policy: ${exchangeProperty[microServicePolicy].getName()}" />
+                                       <setProperty propertyName="raiseHttpExceptionFlag">
+                                               <simple resultType="java.lang.Boolean">false</simple>
+                                       </setProperty>
+                                       <setBody>
+                                               <method ref="org.onap.clamp.loop.components.external.DcaeComponent"
+                                                       method="getDeployPayload(${exchangeProperty[loopObject]},${exchangeProperty[microServicePolicy].getName()})" />
+                                       </setBody>
+                                       <setProperty propertyName="dcaeDeploymentId">
+                                               <method ref="org.onap.clamp.loop.components.external.DcaeComponent"
+                                                       method="generateDeploymentId()" />
+                                       </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 loop: {{clamp.config.dcae.deployment.url}}/dcae-deployments/${exchangeProperty[dcaeDeploymentId]}"></log>
+                                       <toD
+                                               uri="{{clamp.config.dcae.deployment.url}}/dcae-deployments/${exchangeProperty[dcaeDeploymentId]}?bridgeEndpoint=true&amp;useSystemProperties=true&amp;mapHttpMessageHeaders=false&amp;throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&amp;authUsername={{clamp.config.dcae.deployment.userName}}&amp;authPassword={{clamp.config.dcae.deployment.password}}&amp;connectionTimeToLive=5000&amp;httpClient.connectTimeout=10000&amp;httpClient.socketTimeout=300000&amp;authenticationPreemptive=true&amp;connectionClose=true" />
+                                       <convertBodyTo type="java.lang.String" />
+                                       <setProperty propertyName="dcaeResponse">
+                                               <method ref="org.onap.clamp.loop.components.external.DcaeComponent"
+                                                       method="convertDcaeResponse(${body})" />
+                                       </setProperty>
+                                       <setProperty propertyName="dcaeStatusUrl">
+                                               <method ref="org.onap.clamp.loop.components.external.DcaeComponent"
+                                                       method="getStatusUrl(${exchangeProperty[dcaeResponse]})" />
+                                       </setProperty>
+                                       <to
+                                               uri="bean:org.onap.clamp.policy.microservice.MicroServicePolicyService?method=updateDcaeDeploymentFields(${exchangeProperty[microServicePolicy]},${exchangeProperty[dcaeDeploymentId]},${exchangeProperty[dcaeStatusUrl]})" />
+                       </split>
+                       <doCatch>
+                               <exception>java.lang.Exception</exception>
+                               <handled>
+                                       <constant>false</constant>
+                               </handled>
+                               <setProperty propertyName="logMessage">
+                                       <simple>DEPLOY micro service failed 
+                                               (MicroService name:${exchangeProperty[microServicePolicy].getName()}),
+                                               Dep-id:${exchangeProperty[dcaeDeploymentId]},
+                                               StatusUrl:${exchangeProperty[dcaeStatusUrl]})
+                                       </simple>
+                               </setProperty>
+                               <setProperty propertyName="logComponent">
+                                       <simple>DCAE</simple>
+                               </setProperty>
+                               <to uri="direct:dump-loop-log-http-response" />
+                       </doCatch>
+                       <doFinally>
+                               <to uri="direct:reset-raise-http-exception-flag" />
+                               <to
+                                       uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()" />
+                       </doFinally>
+               </doTry>
+       </route>
+       <route id="deploy-loop-single-blueprint">
+               <from uri="direct:deploy-loop-single-blueprint" />
                <doTry>
                        <log loggingLevel="INFO"
                                message="Deploying the loop: ${exchangeProperty[loopObject].getName()}" />
                                <method ref="org.onap.clamp.loop.components.external.DcaeComponent"
                                        method="convertDcaeResponse(${body})" />
                        </setProperty>
+                       
+
                        <setProperty propertyName="dcaeStatusUrl">
                                <method ref="org.onap.clamp.loop.components.external.DcaeComponent"
                                        method="getStatusUrl(${exchangeProperty[dcaeResponse]})" />
                        </doFinally>
                </doTry>
        </route>
-
        <route id="undeploy-loop">
                <from uri="direct:undeploy-loop" />
+               <choice>
+                       <when>
+                               <simple>${exchangeProperty['loopObject'].getLoopTemplate().getBlueprint()} != null
+                               </simple>
+                               <to uri="direct:undeploy-loop-single-blueprint" />
+                       </when>
+                       <when>
+                               <simple>${exchangeProperty['loopObject'].getLoopTemplate().getBlueprint()} == null
+                               </simple>
+                               <to uri="direct:undeploy-loop-multi-blueprint" />
+                       </when>
+               </choice>
+       </route>
+       <route id="undeploy-loop-multi-blueprint">
+               <from uri="direct:undeploy-loop-multi-blueprint" />
+               <doTry>
+                       <log loggingLevel="INFO"
+                               message="Undeploying the blueprints for loop: ${exchangeProperty[loopObject].getName()}" />
+                       <to
+                               uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('DCAE', 'Undeploying the loop with multiple blueprints')" />
+                       <split>
+                               <simple>${exchangeProperty[loopObject].getMicroServicePolicies()}
+                               </simple>
+                               <setProperty propertyName="microServicePolicy">
+                                       <simple>${body}</simple>
+                               </setProperty>
+                               <log
+                                       loggingLevel="INFO"
+                                       message="Processing Micro Service Policy: ${exchangeProperty[microServicePolicy].getName()}" />
+                               <choice>
+                                       <when>
+                                               <simple>${exchangeProperty[microServicePolicy].getDcaeDeploymentId()} != null
+                                               </simple>
+                                               <setBody>
+                                                       <method ref="org.onap.clamp.loop.components.external.DcaeComponent"
+                                                               method="getUndeployPayload(${exchangeProperty[microServicePolicy]})" />
+                                               </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 loop: {{clamp.config.dcae.deployment.url}}/dcae-deployments/${exchangeProperty[microServicePolicy].getDcaeDeploymentId()}"></log>
+                                               <toD
+                                                       uri="{{clamp.config.dcae.deployment.url}}/dcae-deployments/${exchangeProperty[microServicePolicy].getDcaeDeploymentId()}?bridgeEndpoint=true&amp;useSystemProperties=true&amp;mapHttpMessageHeaders=false&amp;throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&amp;authUsername={{clamp.config.dcae.deployment.userName}}&amp;authPassword={{clamp.config.dcae.deployment.password}}&amp;connectionTimeToLive=5000&amp;httpClient.connectTimeout=10000&amp;httpClient.socketTimeout=300000&amp;authenticationPreemptive=true&amp;connectionClose=true" />
+                                               <convertBodyTo type="java.lang.String" />
+                                               <setProperty propertyName="dcaeResponse">
+                                                       <method ref="org.onap.clamp.loop.components.external.DcaeComponent"
+                                                               method="convertDcaeResponse(${body})" />
+                                               </setProperty>
+                                               <setProperty propertyName="dcaeStatusUrl">
+                                                       <method ref="org.onap.clamp.loop.components.external.DcaeComponent"
+                                                               method="getStatusUrl(${exchangeProperty[dcaeResponse]})" />
+                                               </setProperty>
+                                               <to
+                                                       uri="bean:org.onap.clamp.policy.microservice.MicroServicePolicyService?method=updateDcaeDeploymentFields(${exchangeProperty[microServicePolicy]},${exchangeProperty[microServicePolicy].getDcaeDeploymentId()},${exchangeProperty[dcaeStatusUrl]})" />
+                                       </when>
+                                       <otherwise>
+                                               <log loggingLevel="WARNING"
+                                                       message="Cannot Undeploy for the micro service: ${exchangeProperty[microServicePolicy].getName()}, the Deployment ID does not exist !" />
+                                               <to
+                                                       uri="bean:org.onap.clamp.loop.log.LoopLogService?method=addLog('Cannot Undeploy for the micro service: ${exchangeProperty[microServicePolicy].getName()}, the Deployment ID does not exist !','WARNING',${exchangeProperty[loopObject]})" />
+                                       </otherwise>
+                               </choice>
+                       </split>
+                       <doCatch>
+                               <exception>java.lang.Exception</exception>
+                               <handled>
+                                       <constant>false</constant>
+                               </handled>
+                               <setProperty propertyName="logMessage">
+                                       <simple>UNDEPLOY micro service failed
+                                               (MicroService name:${exchangeProperty[microServicePolicy].getName()})
+                                       </simple>
+                               </setProperty>
+                               <setProperty propertyName="logComponent">
+                                       <simple>DCAE</simple>
+                               </setProperty>
+                               <to uri="direct:dump-loop-log-http-response" />
+                       </doCatch>
+                       <doFinally>
+                               <to uri="direct:reset-raise-http-exception-flag" />
+                               <to
+                                       uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()" />
+                       </doFinally>
+               </doTry>
+       </route>
+       <route id="undeploy-loop-single-blueprint">
+               <from uri="direct:undeploy-loop-single-blueprint" />
                <log loggingLevel="INFO"
                        message="Undeploying the loop: ${exchangeProperty[loopObject].getName()} : ${exchangeProperty[loopObject].getDcaeDeploymentId()}" />
                <to
                                        message="Cannot Undeploy for the loop: ${exchangeProperty[loopObject].getName()}, the Deployment ID does not exist !" />
                                <to
                                        uri="bean:org.onap.clamp.loop.log.LoopLogService?method=addLog('Cannot Undeploy for the loop: ${exchangeProperty[loopObject].getName()}, the Deployment ID does not exist !','WARNING',${exchangeProperty[loopObject]})" />
-
                        </otherwise>
                </choice>
        </route>
                </doTry>
 
        </route>
+       <route id="get-all-dcae-blueprint-inventory">
+               <from uri="direct:get-all-dcae-blueprint-inventory" />
+               <log loggingLevel="INFO"
+                        message="Getting all DCAE blueprint from inventory" />
+               <to uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('DCAE', 'Getting all blueprint from inventory')" />
+               <doTry>
+                       <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 Blueprints from DCAE inventory: {{clamp.config.dcae.inventory.url}}/dcae-service-types?${header[CamelHttpQuery]}"></log>
+                       <toD uri="{{clamp.config.dcae.inventory.url}}/dcae-service-types;bridgeEndpoint=true&amp;useSystemProperties=true&amp;throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&amp;authMethod=Basic&amp;authUsername={{clamp.config.dcae.deployment.userName}}&amp;authPassword={{clamp.config.dcae.deployment.password}}&amp;connectionTimeToLive=5000&amp;httpClient.connectTimeout=10000&amp;httpClient.socketTimeout=30000&amp;authenticationPreemptive=true&amp;connectionClose=true" />
+                       <convertBodyTo type="java.lang.String" />
+                       <setProperty propertyName="dcaeResponseList">
+                               <method ref="org.onap.clamp.loop.components.external.DcaeComponent"
+                                               method="convertToDcaeInventoryResponse(${body})" />
+                       </setProperty>
+                       <split>
+                               <simple>${exchangeProperty[dcaeResponseList]}</simple>
+                               <convertBodyTo type="org.onap.clamp.clds.model.dcae.DcaeInventoryResponse" />
+                                       <setProperty propertyName="dcaeResponse">
+                                               <simple>${body}</simple>
+                                       </setProperty>
+                               <to uri="bean:org.onap.clamp.clds.model.dcae.DcaeInventoryCache?method=addDcaeInventoryResponse(${exchangeProperty[dcaeResponse]})" />
+                       </split>
+                       <doFinally>
+                               <to uri="direct:reset-raise-http-exception-flag" />
+                               <to uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()" />
+                       </doFinally>
+               </doTry>
+       </route>
 </routes>
\ No newline at end of file
index 9dcc4b3..32f7faf 100755 (executable)
@@ -249,6 +249,22 @@ class Proxy(SimpleHTTPServer.SimpleHTTPRequestHandler):
         with open(cached_file_content, 'w') as f:
             f.write(jsonGenerated)
         return True
+     elif self.path.startswith("/dcae-service-types") and http_type == "GET":
+        if not _file_available:
+            self.path = "/dcae-service-types"
+            cached_file_folder = '%s/%s' % (TMP_ROOT, self.path)
+            cached_file_content = self._get_cached_content_file_name(cached_file_folder)
+            cached_file_header = self._get_cached_header_file_name(cached_file_folder)
+            print "self.path start with /dcae-service-types, generating response json..."
+            response = "{\"links\": {\"previousLink\": {\"title\": \"string\",\"rel\": \"string\",\"uri\": \"string\",\"uriBuilder\": {},\"rels\": [\"string\"],\"params\": {\"additionalProp1\": \"string\",\"additionalProp2\": \"string\",\"additionalProp3\": \"string\"},\"type\": \"string\"},\"nextLink\": {\"title\": \"string\",\"rel\": \"string\",\"uri\": \"string\",\"uriBuilder\": {},\"rels\": [\"string\"],\"params\": {\"additionalProp1\": \"string\",\"additionalProp2\": \"string\",\"additionalProp3\": \"string\"},\"type\": \"string\"}},\"totalCount\": 1,\"items\": [{\"owner\": \"testOwner\",\"application\": \"testApplication\",\"component\": \"testComponent\",\"typeName\": \"testTypeName\",\"typeVersion\": 0,\"blueprintTemplate\": \"testBlueprintTemplate\",\"serviceIds\": [\"serviceId1\", \"serviceId2\"],\"vnfTypes\": [\"vnfType1\", \"vnfType2\"],\"serviceLocations\": [\"serviceLocation1\", \"serviceLocation2\"],\"asdcServiceId\": \"testAsdcServiceId\",\"asdcResourceId\": \"0\",\"asdcServiceURL\": \"testAsdcServiceURL\",\"typeId\": \"testtypeId\",\"selfLink\": {\"title\": \"selfLinkTitle\",\"rel\": \"selfLinkRel\",\"uri\": \"selfLinkUri\",\"uriBuilder\": {},\"rels\": [\"string\"],\"params\": {\"additionalProp1\": \"string\",\"additionalProp2\": \"string\",\"additionalProp3\": \"string\"},\"type\": \"string\"},\"created\": \"2020-01-22T09:38:15.436Z\",\"deactivated\": \"2020-01-22T09:38:15.437Z\"},{\"owner\": \"testOwner2\",\"application\": \"testApplication1\",\"component\": \"testComponent2\",\"typeName\": \"testTypeName2\",\"typeVersion\": 0,\"blueprintTemplate\": \"testBlueprintTemplate2\",\"serviceIds\": [\"serviceId3\", \"serviceId4\"],\"vnfTypes\": [\"vnfType13\", \"vnfType4\"],\"serviceLocations\": [\"serviceLocation3\", \"serviceLocation4\"],\"asdcServiceId\": \"testAsdcServiceId\",\"asdcResourceId\": \"1\",\"asdcServiceURL\": \"testAsdcServiceURL2\",\"typeId\": \"testtypeId2\",\"selfLink\": {\"title\": \"selfLinkTitle\",\"rel\": \"selfLinkRel\",\"uri\": \"selfLinkUri\",\"uriBuilder\": {},\"rels\": [\"string\"],\"params\": {\"additionalProp1\": \"string\",\"additionalProp2\": \"string\",\"additionalProp3\": \"string\"},\"type\": \"string\"},\"created\": \"2020-01-22T09:38:15.436Z\",\"deactivated\": \"2020-01-22T09:38:15.437Z\"}]}"
+            print "jsonGenerated: " + response
+
+            os.makedirs(cached_file_folder, 0777)
+            with open(cached_file_header, 'w') as f:
+                f.write("{\"Content-Length\": \"" + str(len(response)) + "\", \"Content-Type\": \"application/json\"}")
+            with open(cached_file_content, 'w') as f:
+                f.write(response)
+        return True
      else:
         return False
 
@@ -305,6 +321,9 @@ class Proxy(SimpleHTTPServer.SimpleHTTPRequestHandler):
         if self.path.startswith("/dcae-service-types?asdcResourceId="):
             print "DCAE case deleting folder created " + cached_file_folder
             shutil.rmtree(cached_file_folder, ignore_errors=False, onerror=None)
+        elif self.path.startswith("/dcae-service-types"):
+            print "DCAE case deleting folder created " + cached_file_folder
+            shutil.rmtree(cached_file_folder, ignore_errors=False, onerror=None)
         else:
             print "NOT in DCAE case deleting folder created " + cached_file_folder