From 9e01ce3b97e602fa7236bd9bc8a484807382f83b Mon Sep 17 00:00:00 2001 From: xuegao Date: Mon, 27 Jan 2020 12:10:32 +0100 Subject: Update deploy-loop route Update deploy-loop to support multiple blueprint deployments Issue-ID: CLAMP-571 Change-Id: If98e9305c36a01f86a522db002174f92f6ff5996 Signed-off-by: xuegao --- extra/sql/bulkload/create-tables.sql | 3 +- .../java/org/onap/clamp/loop/LoopController.java | 8 +- .../loop/components/external/DcaeComponent.java | 23 ++- .../onap/clamp/loop/template/LoopElementModel.java | 8 +- .../org/onap/clamp/loop/template/LoopTemplate.java | 2 +- .../org/onap/clamp/loop/template/PolicyModel.java | 6 +- .../policy/microservice/MicroServicePolicy.java | 22 +++ .../microservice/MicroServicePolicyService.java | 33 ++-- .../resources/clds/camel/routes/dcae-flows.xml | 102 +++++++++++- .../org/onap/clamp/loop/DcaeComponentTest.java | 3 +- .../org/onap/clamp/loop/DeployFlowTestItCase.java | 138 ++++++++++++++++ .../resources/clds/camel/routes/dcae-flows.xml | 184 ++++++++++++++++++++- 12 files changed, 508 insertions(+), 24 deletions(-) create mode 100644 src/test/java/org/onap/clamp/loop/DeployFlowTestItCase.java diff --git a/extra/sql/bulkload/create-tables.sql b/extra/sql/bulkload/create-tables.sql index 2e626b6a0..352b66175 100644 --- a/extra/sql/bulkload/create-tables.sql +++ b/extra/sql/bulkload/create-tables.sql @@ -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), @@ -112,6 +112,7 @@ 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), diff --git a/src/main/java/org/onap/clamp/loop/LoopController.java b/src/main/java/org/onap/clamp/loop/LoopController.java index 64874a32d..c161c550e 100644 --- a/src/main/java/org/onap/clamp/loop/LoopController.java +++ b/src/main/java/org/onap/clamp/loop/LoopController.java @@ -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>() { - }.getType(); - private static final Type MICROSERVICE_POLICY_TYPE = new TypeToken>() { - }.getType(); + private static final Type OPERATIONAL_POLICY_TYPE = new TypeToken>() {} + .getType(); + private static final Type MICROSERVICE_POLICY_TYPE = new TypeToken>() {} + .getType(); @Autowired public LoopController(LoopService loopService) { diff --git a/src/main/java/org/onap/clamp/loop/components/external/DcaeComponent.java b/src/main/java/org/onap/clamp/loop/components/external/DcaeComponent.java index 9b131299b..5d62e7151 100644 --- a/src/main/java/org/onap/clamp/loop/components/external/DcaeComponent.java +++ b/src/main/java/org/onap/clamp/loop/components/external/DcaeComponent.java @@ -31,6 +31,7 @@ import org.apache.camel.Exchange; 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 +85,6 @@ public class DcaeComponent extends ExternalComponent { return null; } } - /** * Generate the deployment id, it's random. * @@ -125,6 +125,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. * 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 c22ca1a67..7f00c42ea 100644 --- a/src/main/java/org/onap/clamp/loop/template/LoopElementModel.java +++ b/src/main/java/org/onap/clamp/loop/template/LoopElementModel.java @@ -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) { 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 20574ff6c..7c059e19a 100644 --- a/src/main/java/org/onap/clamp/loop/template/LoopTemplate.java +++ b/src/main/java/org/onap/clamp/loop/template/LoopTemplate.java @@ -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 diff --git a/src/main/java/org/onap/clamp/loop/template/PolicyModel.java b/src/main/java/org/onap/clamp/loop/template/PolicyModel.java index 00d58a822..886e8c806 100644 --- a/src/main/java/org/onap/clamp/loop/template/PolicyModel.java +++ b/src/main/java/org/onap/clamp/loop/template/PolicyModel.java @@ -82,6 +82,8 @@ public class PolicyModel extends AuditEntity implements Serializable, Comparable private Set usedByElementModels = new HashSet<>(); /** + * usedByElementModels getter. + * * @return the usedByElementModels */ public Set 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; diff --git a/src/main/java/org/onap/clamp/policy/microservice/MicroServicePolicy.java b/src/main/java/org/onap/clamp/policy/microservice/MicroServicePolicy.java index 445c1d5dd..43c8d6e05 100644 --- a/src/main/java/org/onap/clamp/policy/microservice/MicroServicePolicy.java +++ b/src/main/java/org/onap/clamp/policy/microservice/MicroServicePolicy.java @@ -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; diff --git a/src/main/java/org/onap/clamp/policy/microservice/MicroServicePolicyService.java b/src/main/java/org/onap/clamp/policy/microservice/MicroServicePolicyService.java index c431767f0..29a4e56d0 100644 --- a/src/main/java/org/onap/clamp/policy/microservice/MicroServicePolicyService.java +++ b/src/main/java/org/onap/clamp/policy/microservice/MicroServicePolicyService.java @@ -47,7 +47,7 @@ public class MicroServicePolicyService implements PolicyService updatePolicies(Loop loop, List 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 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); + } } diff --git a/src/main/resources/clds/camel/routes/dcae-flows.xml b/src/main/resources/clds/camel/routes/dcae-flows.xml index fb3bc90ec..acaf897ff 100644 --- a/src/main/resources/clds/camel/routes/dcae-flows.xml +++ b/src/main/resources/clds/camel/routes/dcae-flows.xml @@ -1,6 +1,105 @@ + + + ${exchangeProperty['loopObject'].getLoopTemplate().getBlueprint()} != null + + + + + ${exchangeProperty['loopObject'].getLoopTemplate().getBlueprint()} == null + + + + + + + + + + + + ${exchangeProperty[loopObject].getMicroServicePolicies()} + + + ${body} + + + + false + + + + + + + + + PUT + + + application/json + + + ${exchangeProperty[X-ONAP-RequestID]} + + + + ${exchangeProperty[X-ONAP-InvocationID]} + + + + ${exchangeProperty[X-ONAP-PartnerName]} + + + + + + + + + + + + + + + java.lang.Exception + + false + + + DEPLOY loop status + (Dep-id:${exchangeProperty[dcaeDeploymentId]}, + StatusUrl:${exchangeProperty[dcaeStatusUrl]}) + + + + DCAE + + + + + + + + + + + @@ -41,6 +140,8 @@ + + @@ -64,7 +165,6 @@ - ", "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", "", "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 policyList = loopAfterTest.getMicroServicePolicies(); + for (MicroServicePolicy policy : policyList) { + assertThat(policy.getDcaeDeploymentStatusUrl()).isNotNull(); + assertThat(policy.getDcaeDeploymentId()).isNotNull(); + } + 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; + } +} diff --git a/src/test/resources/clds/camel/routes/dcae-flows.xml b/src/test/resources/clds/camel/routes/dcae-flows.xml index fb3bc90ec..7a85871f1 100644 --- a/src/test/resources/clds/camel/routes/dcae-flows.xml +++ b/src/test/resources/clds/camel/routes/dcae-flows.xml @@ -1,6 +1,187 @@ + + + ${exchangeProperty['loopObject'].getLoopTemplate().getBlueprint()} != null + + + + + ${exchangeProperty['loopObject'].getLoopTemplate().getBlueprint()} == null + + + + + + + + + + + + ${exchangeProperty[loopObject].getMicroServicePolicies()} + + + ${body} + + + + false + + + + + + + + + PUT + + + application/json + + + ${exchangeProperty[X-ONAP-RequestID]} + + + + ${exchangeProperty[X-ONAP-InvocationID]} + + + + ${exchangeProperty[X-ONAP-PartnerName]} + + + + + + + + + + + + + + + java.lang.Exception + + false + + + DEPLOY loop status + (Dep-id:${exchangeProperty[dcaeDeploymentId]}, + StatusUrl:${exchangeProperty[dcaeStatusUrl]}) + + + + DCAE + + + + + + + + + + + + @@ -41,6 +222,8 @@ + + @@ -64,7 +247,6 @@ -