Fix blueprint installation
[clamp.git] / src / main / java / org / onap / clamp / loop / CsarInstaller.java
index 38a6f93..6752a1a 100644 (file)
@@ -25,35 +25,33 @@ 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;
-
 import org.json.simple.parser.ParseException;
 import org.onap.clamp.clds.client.DcaeInventoryServices;
+import org.onap.clamp.clds.client.PolicyEngineServices;
+import org.onap.clamp.clds.exception.sdc.controller.BlueprintParserException;
 import org.onap.clamp.clds.exception.sdc.controller.SdcArtifactInstallerException;
 import org.onap.clamp.clds.model.dcae.DcaeInventoryResponse;
 import org.onap.clamp.clds.sdc.controller.installer.BlueprintArtifact;
+import org.onap.clamp.clds.sdc.controller.installer.BlueprintMicroService;
 import org.onap.clamp.clds.sdc.controller.installer.BlueprintParser;
 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.cds.CdsDataInstaller;
 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.onap.clamp.loop.template.PolicyModelId;
+import org.onap.clamp.loop.template.PolicyModelsRepository;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Component;
-import org.springframework.transaction.annotation.Propagation;
-import org.springframework.transaction.annotation.Transactional;
 
 /**
  * This class will be instantiated by spring config, and used by Sdc Controller.
@@ -65,32 +63,31 @@ import org.springframework.transaction.annotation.Transactional;
 public class CsarInstaller {
 
     private static final EELFLogger logger = EELFManager.getInstance().getLogger(CsarInstaller.class);
-    public static final String CONTROL_NAME_PREFIX = "ClosedLoop-";
-    public static final String GET_INPUT_BLUEPRINT_PARAM = "get_input";
-    // This will be used later as the policy scope
-    public static final String MODEL_NAME_PREFIX = "Loop_";
 
     @Autowired
-    LoopsRepository loopRepository;
+    private PolicyModelsRepository policyModelsRepository;
 
     @Autowired
-    BlueprintParser blueprintParser;
+    private LoopTemplatesRepository loopTemplatesRepository;
 
     @Autowired
-    ChainGenerator chainGenerator;
+    private ChainGenerator chainGenerator;
 
     @Autowired
-    DcaeInventoryServices dcaeInventoryService;
+    private DcaeInventoryServices dcaeInventoryService;
 
     @Autowired
-    private SvgFacade svgFacade;
+    private CsarServiceInstaller csarServiceInstaller;
 
     @Autowired
-    CsarServiceInstaller csarServiceInstaller;
+    private CdsDataInstaller cdsDataInstaller;
+
+    @Autowired
+    private PolicyEngineServices policyEngineServices;
 
     /**
      * Verify whether Csar is deployed.
-     * 
+     *
      * @param csar The Csar Handler
      * @return The flag indicating whether Csar is deployed
      * @throws SdcArtifactInstallerException The SdcArtifactInstallerException
@@ -100,43 +97,50 @@ public class CsarInstaller {
 
         for (Entry<String, BlueprintArtifact> blueprint : csar.getMapOfBlueprints().entrySet()) {
             alreadyInstalled = alreadyInstalled
-                    && loopRepository.existsById(Loop.generateLoopName(csar.getSdcNotification().getServiceName(),
-                            csar.getSdcNotification().getServiceVersion(),
-                            blueprint.getValue().getResourceAttached().getResourceInstanceName(),
-                            blueprint.getValue().getBlueprintArtifactName()));
+                    && loopTemplatesRepository.existsById(LoopTemplate.generateLoopTemplateName(
+                    csar.getSdcNotification().getServiceName(), csar.getSdcNotification().getServiceVersion(),
+                    blueprint.getValue().getResourceAttached().getResourceInstanceName(),
+                    blueprint.getValue().getBlueprintArtifactName()));
         }
         return alreadyInstalled;
     }
 
     /**
-     * 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
      * @throws InterruptedException          The InterruptedException
+     * @throws BlueprintParserException      In case of issues with the blueprint
+     *                                       parsing
      */
-    public void installTheCsar(CsarHandler csar) throws SdcArtifactInstallerException, InterruptedException {
+    public void installTheCsar(CsarHandler csar)
+            throws SdcArtifactInstallerException, InterruptedException, BlueprintParserException {
         logger.info("Installing the CSAR " + csar.getFilePath());
-        installTheLoop(csar, csarServiceInstaller.installTheService(csar));
+        Service associatedService = csarServiceInstaller.installTheService(csar);
+        cdsDataInstaller.installCdsServiceProperties(csar, associatedService);
+
+        installTheLoopTemplates(csar, associatedService);
         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
+     * @throws BlueprintParserException      In case of issues with the blueprint
+     *                                       parsing
      */
-    @Transactional(propagation = Propagation.REQUIRES_NEW)
-    public void installTheLoop(CsarHandler csar, Service service)
-            throws SdcArtifactInstallerException, InterruptedException {
+    public void installTheLoopTemplates(CsarHandler csar, Service service)
+            throws SdcArtifactInstallerException, InterruptedException, BlueprintParserException {
         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) {
@@ -146,68 +150,53 @@ 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, BlueprintParserException,
+            SdcArtifactInstallerException {
+        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()));
+        List<BlueprintMicroService> microServicesChain = chainGenerator
+                .getChainOfMicroServices(BlueprintParser.getMicroServices(blueprintArtifact.getDcaeBlueprint()));
         if (microServicesChain.isEmpty()) {
-            microServicesChain = blueprintParser.fallbackToOneMicroService(blueprintArtifact.getDcaeBlueprint());
+            microServicesChain = BlueprintParser.fallbackToOneMicroService();
         }
-        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(blueprintArtifact, microServicesChain));
+        newLoopTemplate.setMaximumInstancesAllowed(0);
         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<>();
-
-        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());
+    private HashSet<LoopElementModel> createMicroServiceModels(BlueprintArtifact blueprintArtifact,
+                                                               List<BlueprintMicroService> microServicesChain)
+            throws SdcArtifactInstallerException {
+        HashSet<LoopElementModel> newSet = new HashSet<>();
+        for (BlueprintMicroService microService : microServicesChain) {
+            LoopElementModel loopElementModel =
+                    new LoopElementModel(microService.getModelType(), LoopElementModel.MICRO_SERVICE_TYPE,
+                            null);
+            newSet.add(loopElementModel);
+            PolicyModel newPolicyModel = policyEngineServices.createPolicyModelFromPolicyEngine(microService);
+            if (newPolicyModel != null) {
+                loopElementModel.addPolicyModel(newPolicyModel);
+            } else {
+                throw new SdcArtifactInstallerException(
+                        "Unable to find the policy specified in the blueprint " +
+                                blueprintArtifact.getBlueprintArtifactName() + ") on the Policy Engine:" +
+                                microService.getModelType() + "/" + microService.getModelVersion());
+            }
         }
         return newSet;
     }
 
-    private JsonObject createGlobalPropertiesJson(BlueprintArtifact blueprintArtifact, Loop newLoop) {
-        return DcaeDeployParameters.getDcaeDeploymentParametersInJson(blueprintArtifact, newLoop);
-    }
-
     /**
-     * ll get the latest version of the artifact (version can be specified to DCAE
-     * call).
+     * Get the service blueprint Id in the Dcae inventory using the SDC UUID.
      *
      * @return The DcaeInventoryResponse object containing the dcae values
      */