Update service object 48/99248/3
authorxuegao <xg353y@intl.att.com>
Fri, 6 Dec 2019 09:40:49 +0000 (10:40 +0100)
committerxuegao <xg353y@intl.att.com>
Mon, 9 Dec 2019 13:31:19 +0000 (14:31 +0100)
Seperate the procedure to install service and loops.

Issue-ID: CLAMP-566
Change-Id: Ied7143ce8849baffda7678e82f4d6c4d9f1443d9
Signed-off-by: xuegao <xg353y@intl.att.com>
12 files changed:
extra/sql/bulkload/create-tables.sql
src/main/java/org/onap/clamp/clds/config/spring/SdcControllerConfiguration.java
src/main/java/org/onap/clamp/clds/sdc/controller/SdcSingleController.java
src/main/java/org/onap/clamp/loop/CsarInstaller.java [moved from src/main/java/org/onap/clamp/loop/LoopCsarInstaller.java with 84% similarity]
src/main/java/org/onap/clamp/loop/Loop.java
src/main/java/org/onap/clamp/loop/service/Service.java
src/main/java/org/onap/clamp/loop/service/ServiceRepository.java [moved from src/main/java/org/onap/clamp/clds/sdc/controller/installer/CsarInstaller.java with 67% similarity]
src/test/java/org/onap/clamp/clds/it/sdc/controller/SdcSingleControllerItCase.java
src/test/java/org/onap/clamp/loop/CsarInstallerItCase.java
src/test/java/org/onap/clamp/loop/LoopToJsonTest.java
src/test/java/org/onap/clamp/loop/ServiceTest.java
src/test/java/org/onap/clamp/policy/operational/OperationalPolicyRepresentationBuilderTest.java

index dafd800..85b8f85 100644 (file)
@@ -57,6 +57,7 @@
         name varchar(255) not null,
         resource_details json,
         service_details json,
+        version varchar(255),
         primary key (service_uuid)
     ) engine=InnoDB;
 
index b4794c9..2612885 100644 (file)
@@ -37,7 +37,7 @@ import org.onap.clamp.clds.config.sdc.SdcControllersConfiguration;
 import org.onap.clamp.clds.exception.sdc.controller.SdcControllerException;
 import org.onap.clamp.clds.sdc.controller.SdcSingleController;
 import org.onap.clamp.clds.sdc.controller.SdcSingleControllerStatus;
-import org.onap.clamp.clds.sdc.controller.installer.CsarInstaller;
+import org.onap.clamp.loop.CsarInstaller;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Bean;
@@ -58,7 +58,7 @@ public class SdcControllerConfiguration {
 
     @Autowired
     public SdcControllerConfiguration(ClampProperties clampProp,
-            @Qualifier("loopInstaller") CsarInstaller csarInstaller) {
+            @Qualifier("csarInstaller") CsarInstaller csarInstaller) {
         this.clampProp = clampProp;
         this.csarInstaller = csarInstaller;
     }
index 3e684f4..bd18bae 100644 (file)
@@ -39,8 +39,8 @@ import org.onap.clamp.clds.exception.sdc.controller.SdcControllerException;
 import org.onap.clamp.clds.exception.sdc.controller.SdcDownloadException;
 import org.onap.clamp.clds.sdc.controller.installer.BlueprintArtifact;
 import org.onap.clamp.clds.sdc.controller.installer.CsarHandler;
-import org.onap.clamp.clds.sdc.controller.installer.CsarInstaller;
 import org.onap.clamp.clds.util.LoggingUtils;
+import org.onap.clamp.loop.CsarInstaller;
 import org.onap.sdc.api.IDistributionClient;
 import org.onap.sdc.api.consumer.IDistributionStatusMessage;
 import org.onap.sdc.api.consumer.INotificationCallback;
@@ -42,11 +42,11 @@ import org.onap.clamp.clds.sdc.controller.installer.BlueprintArtifact;
 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.CsarInstaller;
 import org.onap.clamp.clds.sdc.controller.installer.MicroService;
 import org.onap.clamp.clds.util.JsonUtils;
 import org.onap.clamp.clds.util.drawing.SvgFacade;
 import org.onap.clamp.loop.service.Service;
+import org.onap.clamp.loop.service.ServiceRepository;
 import org.onap.clamp.policy.Policy;
 import org.onap.clamp.policy.microservice.MicroServicePolicy;
 import org.onap.clamp.policy.operational.OperationalPolicy;
@@ -70,10 +70,10 @@ import org.yaml.snakeyaml.Yaml;
  * received from SDC in DB.
  */
 @Component
-@Qualifier("loopInstaller")
-public class LoopCsarInstaller implements CsarInstaller {
+@Qualifier("csarInstaller")
+public class CsarInstaller {
 
-    private static final EELFLogger logger = EELFManager.getInstance().getLogger(LoopCsarInstaller.class);
+    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
@@ -82,6 +82,9 @@ public class LoopCsarInstaller implements CsarInstaller {
     @Autowired
     LoopsRepository loopRepository;
 
+    @Autowired
+    ServiceRepository serviceRepository;
+
     @Autowired
     BlueprintParser blueprintParser;
 
@@ -94,9 +97,20 @@ public class LoopCsarInstaller implements CsarInstaller {
     @Autowired
     private SvgFacade svgFacade;
 
-    @Override
+   /**
+    * Verify whether Csar is deployed.
+    * 
+    * @param csar The Csar Handler
+    * @return The flag indicating whether Csar is deployed
+    * @throws SdcArtifactInstallerException The SdcArtifactInstallerException
+    */
     public boolean isCsarAlreadyDeployed(CsarHandler csar) throws SdcArtifactInstallerException {
         boolean alreadyInstalled = true;
+        JsonObject serviceDetails = JsonUtils.GSON.fromJson(
+                JsonUtils.GSON.toJson(csar.getSdcCsarHelper().getServiceMetadataAllProperties()), JsonObject.class);
+        alreadyInstalled = alreadyInstalled
+                && serviceRepository.existsById(serviceDetails.get("UUID").getAsString());
+
         for (Entry<String, BlueprintArtifact> blueprint : csar.getMapOfBlueprints().entrySet()) {
             alreadyInstalled = alreadyInstalled
                     && loopRepository.existsById(Loop.generateLoopName(csar.getSdcNotification().getServiceName(),
@@ -104,27 +118,73 @@ public class LoopCsarInstaller implements CsarInstaller {
                             blueprint.getValue().getResourceAttached().getResourceInstanceName(),
                             blueprint.getValue().getBlueprintArtifactName()));
         }
+        
         return alreadyInstalled;
     }
 
-    @Override
-    @Transactional(propagation = Propagation.REQUIRED)
+    /**
+     * Install the service and loops from the csar.
+     * 
+     * @param csar The Csar Handler
+     * @throws SdcArtifactInstallerException The SdcArtifactInstallerException
+     * @throws InterruptedException The InterruptedException
+     */
     public void installTheCsar(CsarHandler csar) throws SdcArtifactInstallerException, InterruptedException {
+        logger.info("Installing the CSAR " + csar.getFilePath());
+        installTheLoop(csar, installTheService(csar));
+        logger.info("Successfully installed the CSAR " + csar.getFilePath());
+    }
+
+    /**
+     * Install the Loop 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
+     */
+    @Transactional(propagation = Propagation.REQUIRED)
+    public void installTheLoop(CsarHandler csar, Service service) 
+            throws SdcArtifactInstallerException, InterruptedException {
         try {
-            logger.info("Installing the CSAR " + csar.getFilePath());
+            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()));
+                loopRepository.save(createLoopFromBlueprint(csar, blueprint.getValue(), service));
             }
-            logger.info("Successfully installed the CSAR " + csar.getFilePath());
+            logger.info("Successfully installed the Loops ");
         } catch (IOException e) {
-            throw new SdcArtifactInstallerException("Exception caught during the Csar installation in database", e);
+            throw new SdcArtifactInstallerException("Exception caught during the Loop installation in database", e);
         } catch (ParseException e) {
             throw new SdcArtifactInstallerException("Exception caught during the Dcae query to get ServiceTypeId", e);
         }
     }
 
-    private Loop createLoopFromBlueprint(CsarHandler csar, BlueprintArtifact blueprintArtifact)
+    /**
+     * Install the Service from the csar.
+     * 
+     * @param csar The Csar Handler
+     * @return The service object
+     */
+    @Transactional
+    public Service installTheService(CsarHandler csar) {
+        logger.info("Start to install the Service from csar");
+        JsonObject serviceDetails = JsonUtils.GSON.fromJson(
+                JsonUtils.GSON.toJson(csar.getSdcCsarHelper().getServiceMetadataAllProperties()), JsonObject.class);
+
+        // Add properties details for each type, VfModule, VF, VFC, ....
+        JsonObject resourcesProp = createServicePropertiesByType(csar);
+        resourcesProp.add("VFModule", createVfModuleProperties(csar));
+
+        Service modelService = new Service(serviceDetails, resourcesProp, 
+                csar.getSdcNotification().getServiceVersion());
+
+        serviceRepository.save(modelService);
+        logger.info("Successfully installed the Service");
+        return modelService;
+    }
+
+    private Loop createLoopFromBlueprint(CsarHandler csar, BlueprintArtifact blueprintArtifact, Service service)
             throws IOException, ParseException, InterruptedException {
         Loop newLoop = new Loop();
         newLoop.setBlueprint(blueprintArtifact.getDcaeBlueprint());
@@ -139,7 +199,7 @@ public class LoopCsarInstaller implements CsarInstaller {
         if (microServicesChain.isEmpty()) {
             microServicesChain = blueprintParser.fallbackToOneMicroService(blueprintArtifact.getDcaeBlueprint());
         }
-        newLoop.setModelService(createServiceModel(csar));
+        newLoop.setModelService(service);
         newLoop.setMicroServicePolicies(
                 createMicroServicePolicies(microServicesChain, csar, blueprintArtifact, newLoop));
         newLoop.setOperationalPolicies(createOperationalPolicies(csar, blueprintArtifact, newLoop));
@@ -220,19 +280,6 @@ public class LoopCsarInstaller implements CsarInstaller {
         return resourcesProp;
     }
 
-    private Service createServiceModel(CsarHandler csar) {
-        JsonObject serviceDetails = JsonUtils.GSON.fromJson(
-                JsonUtils.GSON.toJson(csar.getSdcCsarHelper().getServiceMetadataAllProperties()), JsonObject.class);
-
-        // Add properties details for each type, VfModule, VF, VFC, ....
-        JsonObject resourcesProp = createServicePropertiesByType(csar);
-        resourcesProp.add("VFModule", createVfModuleProperties(csar));
-
-        Service modelService = new Service(serviceDetails, resourcesProp);
-
-        return modelService;
-    }
-
     private JsonObject getAllBlueprintParametersInJson(BlueprintArtifact blueprintArtifact, Loop newLoop) {
         JsonObject node = new JsonObject();
         Yaml yaml = new Yaml();
index ef70ba8..bf68366 100644 (file)
@@ -111,7 +111,7 @@ public class Loop implements Serializable {
     private JsonObject globalPropertiesJson;
 
     @Expose
-    @ManyToOne(fetch = FetchType.EAGER,cascade = CascadeType.ALL)
+    @ManyToOne(fetch = FetchType.EAGER)
     @JoinColumn(name = "service_uuid")
     private Service modelService;
 
index ac1216b..115f9f7 100644 (file)
@@ -62,6 +62,9 @@ public class Service implements Serializable {
     @Column(nullable = false, name = "name")
     private String name;
 
+    @Column(name = "version")
+    private String version;
+
     @Expose
     @Type(type = "json")
     @Column(columnDefinition = "json", name = "service_details")
@@ -81,11 +84,12 @@ public class Service implements Serializable {
     /**
      * Constructor.
      */
-    public Service(JsonObject serviceDetails, JsonObject resourceDetails) {
+    public Service(JsonObject serviceDetails, JsonObject resourceDetails, String version) {
         this.name = serviceDetails.get("name").getAsString();
         this.serviceUuid = serviceDetails.get("UUID").getAsString();
         this.serviceDetails = serviceDetails;
         this.resourceDetails = resourceDetails;
+        this.version = version;
     }
 
     public String getServiceUuid() {
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP CLAMP
  * ================================================================================
- * Copyright (C) 2018 AT&T Intellectual Property. All rights
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights
  *                             reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  *
  */
 
-package org.onap.clamp.clds.sdc.controller.installer;
+package org.onap.clamp.loop.service;
 
-import org.onap.clamp.clds.exception.sdc.controller.SdcArtifactInstallerException;
+import org.springframework.data.repository.CrudRepository;
+import org.springframework.stereotype.Repository;
 
-public interface CsarInstaller {
-    String TEMPLATE_NAME_PREFIX = "DCAE-Designer-Template-";
+@Repository
+public interface ServiceRepository extends CrudRepository<Service, String> {
 
-    boolean isCsarAlreadyDeployed(CsarHandler csar) throws SdcArtifactInstallerException;
-
-    public void installTheCsar(CsarHandler csar) throws SdcArtifactInstallerException, InterruptedException;
 }
index 695b851..2cbabbe 100644 (file)
@@ -45,7 +45,7 @@ import org.onap.clamp.clds.exception.sdc.controller.SdcControllerException;
 import org.onap.clamp.clds.sdc.controller.SdcSingleController;
 import org.onap.clamp.clds.sdc.controller.SdcSingleControllerStatus;
 import org.onap.clamp.clds.sdc.controller.installer.CsarHandler;
-import org.onap.clamp.clds.sdc.controller.installer.CsarInstaller;
+import org.onap.clamp.loop.CsarInstaller;
 import org.onap.sdc.api.notification.IArtifactInfo;
 import org.onap.sdc.api.notification.INotificationData;
 import org.onap.sdc.api.notification.IResourceInstance;
index e3271c7..df952aa 100644 (file)
@@ -48,9 +48,9 @@ import org.onap.clamp.clds.exception.sdc.controller.CsarHandlerException;
 import org.onap.clamp.clds.exception.sdc.controller.SdcArtifactInstallerException;
 import org.onap.clamp.clds.sdc.controller.installer.BlueprintArtifact;
 import org.onap.clamp.clds.sdc.controller.installer.CsarHandler;
-import org.onap.clamp.clds.sdc.controller.installer.CsarInstaller;
 import org.onap.clamp.clds.util.JsonUtils;
 import org.onap.clamp.clds.util.ResourceFileUtil;
+import org.onap.clamp.loop.service.ServiceRepository;
 import org.onap.clamp.policy.microservice.MicroServicePolicy;
 import org.onap.sdc.api.notification.IArtifactInfo;
 import org.onap.sdc.api.notification.INotificationData;
@@ -83,7 +83,10 @@ public class CsarInstallerItCase {
     private LoopsRepository loopsRepo;
 
     @Autowired
-    @Qualifier("loopInstaller")
+    ServiceRepository serviceRepository;
+
+    @Autowired
+    @Qualifier("csarInstaller")
     private CsarInstaller csarInstaller;
 
     private BlueprintArtifact buildFakeBuildprintArtifact(String instanceName, String invariantResourceUuid,
@@ -186,6 +189,8 @@ public class CsarInstallerItCase {
         String generatedName = RandomStringUtils.randomAlphanumeric(5);
         CsarHandler csar = buildFakeCsarHandler(generatedName);
         csarInstaller.installTheCsar(csar);
+        assertThat(serviceRepository
+                .existsById("63cac700-ab9a-4115-a74f-7eac85e3fce0")).isTrue();
         assertThat(loopsRepo
                 .existsById(Loop.generateLoopName(generatedName, "1.0", RESOURCE_INSTANCE_NAME_RESOURCE1, "tca.yaml")))
                         .isTrue();
index b68bf48..68fe487 100644 (file)
@@ -126,7 +126,7 @@ public class LoopToJsonTest {
         JsonObject jsonModel = new GsonBuilder().create()
                 .fromJson(ResourceFileUtil.getResourceAsString("tosca/model-properties.json"), JsonObject.class);
         Service service = new Service(jsonModel.get("serviceDetails").getAsJsonObject(),
-                jsonModel.get("resourceDetails").getAsJsonObject());
+                jsonModel.get("resourceDetails").getAsJsonObject(), "1.0");
         loopTest2.setModelService(service);
 
         String jsonSerialized = JsonUtils.GSON_JPA_MODEL.toJson(loopTest2);
index 45de538..2b6fab8 100644 (file)
@@ -41,12 +41,12 @@ public class ServiceTest {
         String resourceStr = "{\"CP\": {}}";
 
         Service service1 = new Service(JsonUtils.GSON.fromJson(serviceStr1, JsonObject.class), 
-                JsonUtils.GSON.fromJson(resourceStr, JsonObject.class));
+                JsonUtils.GSON.fromJson(resourceStr, JsonObject.class), "1.0");
 
-        Service service2 = new Service(JsonUtils.GSON.fromJson(serviceStr2, JsonObject.class), null);
+        Service service2 = new Service(JsonUtils.GSON.fromJson(serviceStr2, JsonObject.class), null, "1.0");
 
         Service service3 = new Service(JsonUtils.GSON.fromJson(serviceStr3, JsonObject.class), 
-                JsonUtils.GSON.fromJson(resourceStr, JsonObject.class));
+                JsonUtils.GSON.fromJson(resourceStr, JsonObject.class), "1.0");
 
         assertThat(service1.equals(service2)).isEqualTo(true);
         assertThat(service1.equals(service3)).isEqualTo(false);
index 673ac32..12ddbaa 100644 (file)
@@ -42,7 +42,7 @@ public class OperationalPolicyRepresentationBuilderTest {
         JsonObject jsonModel = new GsonBuilder().create()
                 .fromJson(ResourceFileUtil.getResourceAsString("tosca/model-properties.json"), JsonObject.class);
         Service service = new Service(jsonModel.get("serviceDetails").getAsJsonObject(),
-                jsonModel.get("resourceDetails").getAsJsonObject());
+                jsonModel.get("resourceDetails").getAsJsonObject(), "1.0");
 
         JsonObject jsonSchema = OperationalPolicyRepresentationBuilder.generateOperationalPolicySchema(service);