From 69c24994501aead95d5ee9fa172fff659ae34fa4 Mon Sep 17 00:00:00 2001 From: xuegao Date: Fri, 6 Dec 2019 10:40:49 +0100 Subject: [PATCH] Update service object Seperate the procedure to install service and loops. Issue-ID: CLAMP-566 Change-Id: Ied7143ce8849baffda7678e82f4d6c4d9f1443d9 Signed-off-by: xuegao --- extra/sql/bulkload/create-tables.sql | 1 + .../config/spring/SdcControllerConfiguration.java | 4 +- .../clds/sdc/controller/SdcSingleController.java | 2 +- .../{LoopCsarInstaller.java => CsarInstaller.java} | 99 ++++++++++++++++------ src/main/java/org/onap/clamp/loop/Loop.java | 2 +- .../java/org/onap/clamp/loop/service/Service.java | 6 +- .../service/ServiceRepository.java} | 14 ++- .../sdc/controller/SdcSingleControllerItCase.java | 2 +- .../org/onap/clamp/loop/CsarInstallerItCase.java | 9 +- .../java/org/onap/clamp/loop/LoopToJsonTest.java | 2 +- src/test/java/org/onap/clamp/loop/ServiceTest.java | 6 +- ...OperationalPolicyRepresentationBuilderTest.java | 2 +- 12 files changed, 102 insertions(+), 47 deletions(-) rename src/main/java/org/onap/clamp/loop/{LoopCsarInstaller.java => CsarInstaller.java} (84%) rename src/main/java/org/onap/clamp/{clds/sdc/controller/installer/CsarInstaller.java => loop/service/ServiceRepository.java} (67%) diff --git a/extra/sql/bulkload/create-tables.sql b/extra/sql/bulkload/create-tables.sql index dafd8003..85b8f85f 100644 --- a/extra/sql/bulkload/create-tables.sql +++ b/extra/sql/bulkload/create-tables.sql @@ -57,6 +57,7 @@ name varchar(255) not null, resource_details json, service_details json, + version varchar(255), primary key (service_uuid) ) engine=InnoDB; diff --git a/src/main/java/org/onap/clamp/clds/config/spring/SdcControllerConfiguration.java b/src/main/java/org/onap/clamp/clds/config/spring/SdcControllerConfiguration.java index b4794c94..26128850 100644 --- a/src/main/java/org/onap/clamp/clds/config/spring/SdcControllerConfiguration.java +++ b/src/main/java/org/onap/clamp/clds/config/spring/SdcControllerConfiguration.java @@ -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; } diff --git a/src/main/java/org/onap/clamp/clds/sdc/controller/SdcSingleController.java b/src/main/java/org/onap/clamp/clds/sdc/controller/SdcSingleController.java index 3e684f42..bd18baea 100644 --- a/src/main/java/org/onap/clamp/clds/sdc/controller/SdcSingleController.java +++ b/src/main/java/org/onap/clamp/clds/sdc/controller/SdcSingleController.java @@ -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; diff --git a/src/main/java/org/onap/clamp/loop/LoopCsarInstaller.java b/src/main/java/org/onap/clamp/loop/CsarInstaller.java similarity index 84% rename from src/main/java/org/onap/clamp/loop/LoopCsarInstaller.java rename to src/main/java/org/onap/clamp/loop/CsarInstaller.java index 55009bc2..3f69e116 100644 --- a/src/main/java/org/onap/clamp/loop/LoopCsarInstaller.java +++ b/src/main/java/org/onap/clamp/loop/CsarInstaller.java @@ -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 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 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(); diff --git a/src/main/java/org/onap/clamp/loop/Loop.java b/src/main/java/org/onap/clamp/loop/Loop.java index ef70ba80..bf683660 100644 --- a/src/main/java/org/onap/clamp/loop/Loop.java +++ b/src/main/java/org/onap/clamp/loop/Loop.java @@ -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; 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 ac1216b9..115f9f76 100644 --- a/src/main/java/org/onap/clamp/loop/service/Service.java +++ b/src/main/java/org/onap/clamp/loop/service/Service.java @@ -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() { diff --git a/src/main/java/org/onap/clamp/clds/sdc/controller/installer/CsarInstaller.java b/src/main/java/org/onap/clamp/loop/service/ServiceRepository.java similarity index 67% rename from src/main/java/org/onap/clamp/clds/sdc/controller/installer/CsarInstaller.java rename to src/main/java/org/onap/clamp/loop/service/ServiceRepository.java index 10e2790f..a6c5ff18 100644 --- a/src/main/java/org/onap/clamp/clds/sdc/controller/installer/CsarInstaller.java +++ b/src/main/java/org/onap/clamp/loop/service/ServiceRepository.java @@ -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"); @@ -21,14 +21,12 @@ * */ -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 { - boolean isCsarAlreadyDeployed(CsarHandler csar) throws SdcArtifactInstallerException; - - public void installTheCsar(CsarHandler csar) throws SdcArtifactInstallerException, InterruptedException; } diff --git a/src/test/java/org/onap/clamp/clds/it/sdc/controller/SdcSingleControllerItCase.java b/src/test/java/org/onap/clamp/clds/it/sdc/controller/SdcSingleControllerItCase.java index 695b8516..2cbabbe8 100644 --- a/src/test/java/org/onap/clamp/clds/it/sdc/controller/SdcSingleControllerItCase.java +++ b/src/test/java/org/onap/clamp/clds/it/sdc/controller/SdcSingleControllerItCase.java @@ -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; diff --git a/src/test/java/org/onap/clamp/loop/CsarInstallerItCase.java b/src/test/java/org/onap/clamp/loop/CsarInstallerItCase.java index e3271c7a..df952aa1 100644 --- a/src/test/java/org/onap/clamp/loop/CsarInstallerItCase.java +++ b/src/test/java/org/onap/clamp/loop/CsarInstallerItCase.java @@ -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(); diff --git a/src/test/java/org/onap/clamp/loop/LoopToJsonTest.java b/src/test/java/org/onap/clamp/loop/LoopToJsonTest.java index b68bf48a..68fe487e 100644 --- a/src/test/java/org/onap/clamp/loop/LoopToJsonTest.java +++ b/src/test/java/org/onap/clamp/loop/LoopToJsonTest.java @@ -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); diff --git a/src/test/java/org/onap/clamp/loop/ServiceTest.java b/src/test/java/org/onap/clamp/loop/ServiceTest.java index 45de5385..2b6fab8b 100644 --- a/src/test/java/org/onap/clamp/loop/ServiceTest.java +++ b/src/test/java/org/onap/clamp/loop/ServiceTest.java @@ -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); diff --git a/src/test/java/org/onap/clamp/policy/operational/OperationalPolicyRepresentationBuilderTest.java b/src/test/java/org/onap/clamp/policy/operational/OperationalPolicyRepresentationBuilderTest.java index 673ac323..12ddbaa7 100644 --- a/src/test/java/org/onap/clamp/policy/operational/OperationalPolicyRepresentationBuilderTest.java +++ b/src/test/java/org/onap/clamp/policy/operational/OperationalPolicyRepresentationBuilderTest.java @@ -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); -- 2.16.6