From b9a6531c7a5cfc5a9a544a21fe8c47914be9699b Mon Sep 17 00:00:00 2001
From: sebdet <sebastien.determe@intl.att.com>
Date: Tue, 28 Jan 2020 16:28:21 +0100
Subject: Change the Csar installer

Change the csar installer so that it installs a loop template instead of
a loop object

Issue-ID: CLAMP-592
Change-Id: I757f6411ce959573fcb3a82e48359a1a44f87410
Signed-off-by: sebdet <sebastien.determe@intl.att.com>
---
 .../java/org/onap/clamp/loop/CsarInstaller.java    | 94 +++++++++-------------
 src/main/java/org/onap/clamp/loop/Loop.java        | 16 +---
 .../clamp/loop/deploy/DcaeDeployParameters.java    | 25 +++---
 .../java/org/onap/clamp/loop/service/Service.java  | 14 ++++
 .../onap/clamp/loop/template/LoopElementModel.java | 24 +++++-
 .../org/onap/clamp/loop/template/LoopTemplate.java | 52 ++++++++++++
 6 files changed, 144 insertions(+), 81 deletions(-)

(limited to 'src/main/java')

diff --git a/src/main/java/org/onap/clamp/loop/CsarInstaller.java b/src/main/java/org/onap/clamp/loop/CsarInstaller.java
index ab8069f3..013d3419 100644
--- a/src/main/java/org/onap/clamp/loop/CsarInstaller.java
+++ b/src/main/java/org/onap/clamp/loop/CsarInstaller.java
@@ -25,10 +25,8 @@ package org.onap.clamp.loop;
 
 import com.att.eelf.configuration.EELFLogger;
 import com.att.eelf.configuration.EELFManager;
-import com.google.gson.JsonObject;
 
 import java.io.IOException;
-import java.util.Arrays;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map.Entry;
@@ -43,12 +41,12 @@ import org.onap.clamp.clds.sdc.controller.installer.ChainGenerator;
 import org.onap.clamp.clds.sdc.controller.installer.CsarHandler;
 import org.onap.clamp.clds.sdc.controller.installer.MicroService;
 import org.onap.clamp.clds.util.drawing.SvgFacade;
-import org.onap.clamp.loop.deploy.DcaeDeployParameters;
 import org.onap.clamp.loop.service.CsarServiceInstaller;
 import org.onap.clamp.loop.service.Service;
-import org.onap.clamp.policy.Policy;
-import org.onap.clamp.policy.microservice.MicroServicePolicy;
-import org.onap.clamp.policy.operational.OperationalPolicy;
+import org.onap.clamp.loop.template.LoopElementModel;
+import org.onap.clamp.loop.template.LoopTemplate;
+import org.onap.clamp.loop.template.LoopTemplatesRepository;
+import org.onap.clamp.loop.template.PolicyModel;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Component;
@@ -71,6 +69,9 @@ public class CsarInstaller {
     @Autowired
     LoopsRepository loopRepository;
 
+    @Autowired
+    LoopTemplatesRepository loopTemplatesRepository;
+
     @Autowired
     BlueprintParser blueprintParser;
 
@@ -98,8 +99,8 @@ public class CsarInstaller {
 
         for (Entry<String, BlueprintArtifact> blueprint : csar.getMapOfBlueprints().entrySet()) {
             alreadyInstalled = alreadyInstalled
-                    && loopRepository.existsById(Loop.generateLoopName(csar.getSdcNotification().getServiceName(),
-                            csar.getSdcNotification().getServiceVersion(),
+                    && loopTemplatesRepository.existsById(LoopTemplate.generateLoopTemplateName(
+                            csar.getSdcNotification().getServiceName(), csar.getSdcNotification().getServiceVersion(),
                             blueprint.getValue().getResourceAttached().getResourceInstanceName(),
                             blueprint.getValue().getBlueprintArtifactName()));
         }
@@ -107,7 +108,7 @@ public class CsarInstaller {
     }
 
     /**
-     * Install the service and loops from the csar.
+     * Install the service and loop templates from the csar.
      * 
      * @param csar The Csar Handler
      * @throws SdcArtifactInstallerException The SdcArtifactInstallerException
@@ -115,25 +116,25 @@ public class CsarInstaller {
      */
     public void installTheCsar(CsarHandler csar) throws SdcArtifactInstallerException, InterruptedException {
         logger.info("Installing the CSAR " + csar.getFilePath());
-        installTheLoop(csar, csarServiceInstaller.installTheService(csar));
+        installTheLoopTemplates(csar, csarServiceInstaller.installTheService(csar));
         logger.info("Successfully installed the CSAR " + csar.getFilePath());
     }
 
     /**
-     * Install the Loop from the csar.
+     * Install the loop templates from the csar.
      * 
      * @param csar    The Csar Handler
      * @param service The service object that is related to the loop
      * @throws SdcArtifactInstallerException The SdcArtifactInstallerException
      * @throws InterruptedException          The InterruptedException
      */
-    public void installTheLoop(CsarHandler csar, Service service)
+    public void installTheLoopTemplates(CsarHandler csar, Service service)
             throws SdcArtifactInstallerException, InterruptedException {
         try {
             logger.info("Installing the Loops");
             for (Entry<String, BlueprintArtifact> blueprint : csar.getMapOfBlueprints().entrySet()) {
                 logger.info("Processing blueprint " + blueprint.getValue().getBlueprintArtifactName());
-                loopRepository.save(createLoopFromBlueprint(csar, blueprint.getValue(), service));
+                loopTemplatesRepository.save(createLoopTemplateFromBlueprint(csar, blueprint.getValue(), service));
             }
             logger.info("Successfully installed the Loops ");
         } catch (IOException e) {
@@ -143,63 +144,48 @@ public class CsarInstaller {
         }
     }
 
-    private Loop createLoopFromBlueprint(CsarHandler csar, BlueprintArtifact blueprintArtifact, Service service)
-            throws IOException, ParseException, InterruptedException {
-        Loop newLoop = new Loop();
-        newLoop.setBlueprint(blueprintArtifact.getDcaeBlueprint());
-        newLoop.setName(Loop.generateLoopName(csar.getSdcNotification().getServiceName(),
+    private LoopTemplate createLoopTemplateFromBlueprint(CsarHandler csar, BlueprintArtifact blueprintArtifact,
+            Service service) throws IOException, ParseException, InterruptedException {
+        LoopTemplate newLoopTemplate = new LoopTemplate();
+        newLoopTemplate.setBlueprint(blueprintArtifact.getDcaeBlueprint());
+        newLoopTemplate.setName(LoopTemplate.generateLoopTemplateName(csar.getSdcNotification().getServiceName(),
                 csar.getSdcNotification().getServiceVersion(),
                 blueprintArtifact.getResourceAttached().getResourceInstanceName(),
                 blueprintArtifact.getBlueprintArtifactName()));
-        newLoop.setLastComputedState(LoopState.DESIGN);
-
         List<MicroService> microServicesChain = chainGenerator
                 .getChainOfMicroServices(blueprintParser.getMicroServices(blueprintArtifact.getDcaeBlueprint()));
         if (microServicesChain.isEmpty()) {
             microServicesChain = blueprintParser.fallbackToOneMicroService(blueprintArtifact.getDcaeBlueprint());
         }
-        newLoop.setModelService(service);
-        newLoop.setMicroServicePolicies(
-                createMicroServicePolicies(microServicesChain, csar, blueprintArtifact, newLoop));
-        newLoop.setOperationalPolicies(createOperationalPolicies(csar, blueprintArtifact, newLoop));
-
-        newLoop.setSvgRepresentation(svgFacade.getSvgImage(microServicesChain));
-        newLoop.setGlobalPropertiesJson(createGlobalPropertiesJson(blueprintArtifact, newLoop));
-
+        newLoopTemplate.setModelService(service);
+        newLoopTemplate.addLoopElementModels(createMicroServiceModels(microServicesChain, csar, blueprintArtifact));
+        newLoopTemplate.setMaximumInstancesAllowed(0);
+        newLoopTemplate.setSvgRepresentation(svgFacade.getSvgImage(microServicesChain));
         DcaeInventoryResponse dcaeResponse = queryDcaeToGetServiceTypeId(blueprintArtifact);
-        newLoop.setDcaeBlueprintId(dcaeResponse.getTypeId());
-        return newLoop;
+        newLoopTemplate.setDcaeBlueprintId(dcaeResponse.getTypeId());
+        return newLoopTemplate;
     }
 
-    private HashSet<OperationalPolicy> createOperationalPolicies(CsarHandler csar, BlueprintArtifact blueprintArtifact,
-            Loop newLoop) {
-        return new HashSet<>(Arrays.asList(new OperationalPolicy(Policy.generatePolicyName("OPERATIONAL",
-                csar.getSdcNotification().getServiceName(), csar.getSdcNotification().getServiceVersion(),
-                blueprintArtifact.getResourceAttached().getResourceInstanceName(),
-                blueprintArtifact.getBlueprintArtifactName()), newLoop, new JsonObject())));
-    }
-
-    private HashSet<MicroServicePolicy> createMicroServicePolicies(List<MicroService> microServicesChain,
-            CsarHandler csar, BlueprintArtifact blueprintArtifact, Loop newLoop) throws IOException {
-        HashSet<MicroServicePolicy> newSet = new HashSet<>();
-
+    private HashSet<LoopElementModel> createMicroServiceModels(List<MicroService> microServicesChain, CsarHandler csar,
+            BlueprintArtifact blueprintArtifact) throws IOException {
+        HashSet<LoopElementModel> newSet = new HashSet<>();
         for (MicroService microService : microServicesChain) {
-            MicroServicePolicy microServicePolicy = new MicroServicePolicy(
-                    Policy.generatePolicyName(microService.getName(), csar.getSdcNotification().getServiceName(),
-                            csar.getSdcNotification().getServiceVersion(),
-                            blueprintArtifact.getResourceAttached().getResourceInstanceName(),
-                            blueprintArtifact.getBlueprintArtifactName()),
-                    microService.getModelType(), csar.getPolicyModelYaml().orElse(""), false,
-                    new HashSet<>(Arrays.asList(newLoop)));
-
-            newSet.add(microServicePolicy);
-            microService.setMappedNameJpa(microServicePolicy.getName());
+            LoopElementModel loopElementModel = new LoopElementModel(microService.getModelType(), "CONFIG_POLICY",
+                    blueprintArtifact.getDcaeBlueprint());
+            newSet.add(loopElementModel);
+            loopElementModel.addPolicyModel(createPolicyModel(microService, csar));
         }
         return newSet;
     }
 
-    private JsonObject createGlobalPropertiesJson(BlueprintArtifact blueprintArtifact, Loop newLoop) {
-        return DcaeDeployParameters.getDcaeDeploymentParametersInJson(blueprintArtifact, newLoop);
+    private static String createPolicyAcronym(String policyType) {
+        String[] policyNameArray = policyType.split("\\.");
+        return policyNameArray[policyNameArray.length - 1];
+    }
+
+    private PolicyModel createPolicyModel(MicroService microService, CsarHandler csar) throws IOException {
+        return new PolicyModel(microService.getModelType(), csar.getPolicyModelYaml().orElse(""), "1.0",
+                createPolicyAcronym(microService.getModelType()));
     }
 
     /**
diff --git a/src/main/java/org/onap/clamp/loop/Loop.java b/src/main/java/org/onap/clamp/loop/Loop.java
index 6b9a924b..66fd5657 100644
--- a/src/main/java/org/onap/clamp/loop/Loop.java
+++ b/src/main/java/org/onap/clamp/loop/Loop.java
@@ -109,9 +109,6 @@ public class Loop extends AuditEntity implements Serializable {
     @JoinColumn(name = "service_uuid")
     private Service modelService;
 
-    @Column(columnDefinition = "MEDIUMTEXT", nullable = false, name = "blueprint_yaml")
-    private String blueprint;
-
     @Expose
     @Column(nullable = false, name = "last_computed_state")
     @Enumerated(EnumType.STRING)
@@ -156,10 +153,9 @@ public class Loop extends AuditEntity implements Serializable {
     /**
      * Constructor.
      */
-    public Loop(String name, String blueprint, String svgRepresentation) {
+    public Loop(String name, String svgRepresentation) {
         this.name = name;
         this.svgRepresentation = svgRepresentation;
-        this.blueprint = blueprint;
         this.lastComputedState = LoopState.DESIGN;
         this.globalPropertiesJson = new JsonObject();
         initializeExternalComponents();
@@ -197,14 +193,6 @@ public class Loop extends AuditEntity implements Serializable {
         this.svgRepresentation = svgRepresentation;
     }
 
-    public String getBlueprint() {
-        return blueprint;
-    }
-
-    void setBlueprint(String blueprint) {
-        this.blueprint = blueprint;
-    }
-
     public LoopState getLastComputedState() {
         return lastComputedState;
     }
@@ -305,7 +293,7 @@ public class Loop extends AuditEntity implements Serializable {
      * @param blueprintFileName The blueprint file name
      * @return The generated loop name
      */
-    static String generateLoopName(String serviceName, String serviceVersion, String resourceName,
+    public static String generateLoopName(String serviceName, String serviceVersion, String resourceName,
             String blueprintFilename) {
         StringBuilder buffer = new StringBuilder("LOOP_").append(serviceName).append("_v").append(serviceVersion)
                 .append("_").append(resourceName).append("_").append(blueprintFilename.replaceAll(".yaml", ""));
diff --git a/src/main/java/org/onap/clamp/loop/deploy/DcaeDeployParameters.java b/src/main/java/org/onap/clamp/loop/deploy/DcaeDeployParameters.java
index 1a75f71e..48349e79 100644
--- a/src/main/java/org/onap/clamp/loop/deploy/DcaeDeployParameters.java
+++ b/src/main/java/org/onap/clamp/loop/deploy/DcaeDeployParameters.java
@@ -28,6 +28,7 @@ import com.google.gson.JsonObject;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
 import java.util.Map;
+import java.util.Set;
 
 import org.onap.clamp.clds.sdc.controller.installer.BlueprintArtifact;
 import org.onap.clamp.clds.util.JsonUtils;
@@ -38,21 +39,21 @@ import org.yaml.snakeyaml.Yaml;
 /**
  * To decode the bluprint input parameters.
  */
-public class DcaeDeployParameters  {
+public class DcaeDeployParameters {
 
-    private static LinkedHashMap<String, JsonObject> init(LinkedHashSet<BlueprintArtifact> blueprintArtifactList,
-            Loop loop) {
-        LinkedHashMap<String, JsonObject> deploymentParamMap = new LinkedHashMap<String, JsonObject>();
+    private static LinkedHashMap<String, JsonObject> init(Set<BlueprintArtifact> blueprintArtifactList, Loop loop) {
+        LinkedHashMap<String, JsonObject> deploymentParamMap = new LinkedHashMap<>();
         String microServiceName = ((MicroServicePolicy) loop.getMicroServicePolicies().toArray()[0]).getName();
         // Add index to the microservice name from the 2nd blueprint artifact for now.
-        // Update the microservice names, when able to link the microserivce <-> blueprint in the future
+        // Update the microservice names, when able to link the microserivce <->
+        // blueprint in the future
         int index = 0;
-        for (BlueprintArtifact blueprintArtifact: blueprintArtifactList) {
+        for (BlueprintArtifact blueprintArtifact : blueprintArtifactList) {
             if (index > 0) {
-                deploymentParamMap.put(microServiceName + index, 
+                deploymentParamMap.put(microServiceName + index,
                         generateDcaeDeployParameter(blueprintArtifact, microServiceName));
             } else {
-                deploymentParamMap.put(microServiceName, 
+                deploymentParamMap.put(microServiceName,
                         generateDcaeDeployParameter(blueprintArtifact, microServiceName));
             }
             index++;
@@ -65,7 +66,7 @@ public class DcaeDeployParameters  {
         JsonObject deployJsonBody = new JsonObject();
         Yaml yaml = new Yaml();
         Map<String, Object> inputsNodes = ((Map<String, Object>) ((Map<String, Object>) yaml
-            .load(blueprintArtifact.getDcaeBlueprint())).get("inputs"));
+                .load(blueprintArtifact.getDcaeBlueprint())).get("inputs"));
         inputsNodes.entrySet().stream().filter(e -> !e.getKey().contains("policy_id")).forEach(elem -> {
             Object defaultValue = ((Map<String, Object>) elem.getValue()).get("default");
             if (defaultValue != null) {
@@ -98,13 +99,13 @@ public class DcaeDeployParameters  {
      *
      * @return The deploymentParameters in Json
      */
-    public static JsonObject getDcaeDeploymentParametersInJson(LinkedHashSet<BlueprintArtifact> blueprintArtifactList,
+    public static JsonObject getDcaeDeploymentParametersInJson(Set<BlueprintArtifact> blueprintArtifactList,
             Loop loop) {
         LinkedHashMap<String, JsonObject> deploymentParamMap = init(blueprintArtifactList, loop);
 
         JsonObject globalProperties = new JsonObject();
         JsonObject deployParamJson = new JsonObject();
-        for (Map.Entry<String, JsonObject> mapElement: deploymentParamMap.entrySet()) {
+        for (Map.Entry<String, JsonObject> mapElement : deploymentParamMap.entrySet()) {
             deployParamJson.add(mapElement.getKey(), mapElement.getValue());
         }
         globalProperties.add("dcaeDeployParameters", deployParamJson);
@@ -117,7 +118,7 @@ public class DcaeDeployParameters  {
      * @return The deploymentParameters in Json
      */
     public static JsonObject getDcaeDeploymentParametersInJson(BlueprintArtifact blueprintArtifact, Loop loop) {
-        LinkedHashSet<BlueprintArtifact> blueprintArtifactList = new LinkedHashSet<BlueprintArtifact>();
+        LinkedHashSet<BlueprintArtifact> blueprintArtifactList = new LinkedHashSet<>();
         blueprintArtifactList.add(blueprintArtifact);
         return getDcaeDeploymentParametersInJson(blueprintArtifactList, loop);
     }
diff --git a/src/main/java/org/onap/clamp/loop/service/Service.java b/src/main/java/org/onap/clamp/loop/service/Service.java
index 33b8e02d..89c0b2d4 100644
--- a/src/main/java/org/onap/clamp/loop/service/Service.java
+++ b/src/main/java/org/onap/clamp/loop/service/Service.java
@@ -119,6 +119,20 @@ public class Service implements Serializable {
         return (JsonObject) resourceDetails.get(type);
     }
 
+    /**
+     * @return the name
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * @return the version
+     */
+    public String getVersion() {
+        return version;
+    }
+
     @Override
     public int hashCode() {
         final int prime = 31;
diff --git a/src/main/java/org/onap/clamp/loop/template/LoopElementModel.java b/src/main/java/org/onap/clamp/loop/template/LoopElementModel.java
index 7f00c42e..e3f05a01 100644
--- a/src/main/java/org/onap/clamp/loop/template/LoopElementModel.java
+++ b/src/main/java/org/onap/clamp/loop/template/LoopElementModel.java
@@ -63,10 +63,14 @@ public class LoopElementModel extends AuditEntity implements Serializable {
     @Column(nullable = false, name = "name", unique = true)
     private String name;
 
+    @Expose
+    @Column(name = "dcae_blueprint_id")
+    private String dcaeBlueprintId;
+
     /**
      * Here we store the blueprint coming from DCAE.
      */
-    @Column(nullable = false, name = "blueprint_yaml")
+    @Column(columnDefinition = "MEDIUMTEXT", nullable = false, name = "blueprint_yaml")
     private String blueprint;
 
     /**
@@ -149,6 +153,24 @@ public class LoopElementModel extends AuditEntity implements Serializable {
     /**
      * loopElementType getter.
      * 
+     * dcaeBlueprintId getter.
+     * 
+     * @return the dcaeBlueprintId
+     */
+    public String getDcaeBlueprintId() {
+        return dcaeBlueprintId;
+    }
+
+    /**
+     * dcaeBlueprintId setter.
+     * 
+     * @param dcaeBlueprintId the dcaeBlueprintId to set
+     */
+    public void setDcaeBlueprintId(String dcaeBlueprintId) {
+        this.dcaeBlueprintId = dcaeBlueprintId;
+    }
+
+    /**
      * @return the loopElementType
      */
     public String getLoopElementType() {
diff --git a/src/main/java/org/onap/clamp/loop/template/LoopTemplate.java b/src/main/java/org/onap/clamp/loop/template/LoopTemplate.java
index 7c059e19..b8adebae 100644
--- a/src/main/java/org/onap/clamp/loop/template/LoopTemplate.java
+++ b/src/main/java/org/onap/clamp/loop/template/LoopTemplate.java
@@ -26,6 +26,7 @@ package org.onap.clamp.loop.template;
 import com.google.gson.annotations.Expose;
 
 import java.io.Serializable;
+import java.util.Set;
 import java.util.SortedSet;
 import java.util.TreeSet;
 
@@ -57,6 +58,10 @@ public class LoopTemplate extends AuditEntity implements Serializable {
     @Column(nullable = false, name = "name", unique = true)
     private String name;
 
+    @Expose
+    @Column(name = "dcae_blueprint_id")
+    private String dcaeBlueprintId;
+
     /**
      * This field is used when we have a blueprint defining all microservices. The
      * other option would be to have independent blueprint for each microservices.
@@ -110,6 +115,24 @@ public class LoopTemplate extends AuditEntity implements Serializable {
         return blueprint;
     }
 
+    /**
+     * dcaeBlueprintId getter.
+     * 
+     * @return the dcaeBlueprintId
+     */
+    public String getDcaeBlueprintId() {
+        return dcaeBlueprintId;
+    }
+
+    /**
+     * dcaeBlueprintId setter.
+     * 
+     * @param dcaeBlueprintId the dcaeBlueprintId to set
+     */
+    public void setDcaeBlueprintId(String dcaeBlueprintId) {
+        this.dcaeBlueprintId = dcaeBlueprintId;
+    }
+
     /**
      * blueprint setter.
      * 
@@ -164,6 +187,18 @@ public class LoopTemplate extends AuditEntity implements Serializable {
         this.maximumInstancesAllowed = maximumInstancesAllowed;
     }
 
+    /**
+     * Add list of loopElements to the current template, each loopElementModel is
+     * added at the end of the list so the flowOrder is computed automatically.
+     * 
+     * @param loopElementModels The loopElementModel set to add
+     */
+    public void addLoopElementModels(Set<LoopElementModel> loopElementModels) {
+        for (LoopElementModel loopElementModel : loopElementModels) {
+            addLoopElementModel(loopElementModel);
+        }
+    }
+
     /**
      * Add a loopElement to the current template, the loopElementModel is added at
      * the end of the list so the flowOrder is computed automatically.
@@ -266,4 +301,21 @@ public class LoopTemplate extends AuditEntity implements Serializable {
         }
         return true;
     }
+
+    /**
+     * Generate the loop template name.
+     *
+     * @param serviceName       The service name
+     * @param serviceVersion    The service version
+     * @param resourceName      The resource name
+     * @param blueprintFileName The blueprint file name
+     * @return The generated loop template name
+     */
+    public static String generateLoopTemplateName(String serviceName, String serviceVersion, String resourceName,
+            String blueprintFilename) {
+        StringBuilder buffer = new StringBuilder("LOOP_TEMPLATE_").append(serviceName).append("_v")
+                .append(serviceVersion).append("_").append(resourceName).append("_")
+                .append(blueprintFilename.replaceAll(".yaml", ""));
+        return buffer.toString().replace('.', '_').replaceAll(" ", "");
+    }
 }
-- 
cgit