X-Git-Url: https://gerrit.onap.org/r/gitweb?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Forg%2Fonap%2Fclamp%2Floop%2FLoop.java;h=dd6fbf0513e3a170745698da85f2908539d90a82;hb=723de7f63f0951d0cfe7a23956cf9d00128809b1;hp=37d597eebb48f45c0fb6027b321a7758c2eb9c05;hpb=f9e2ceeae29504505f631086e612fad4e1e16979;p=clamp.git diff --git a/src/main/java/org/onap/clamp/loop/Loop.java b/src/main/java/org/onap/clamp/loop/Loop.java index 37d597ee..dd6fbf05 100644 --- a/src/main/java/org/onap/clamp/loop/Loop.java +++ b/src/main/java/org/onap/clamp/loop/Loop.java @@ -26,9 +26,7 @@ package org.onap.clamp.loop; import com.att.eelf.configuration.EELFLogger; import com.att.eelf.configuration.EELFManager; import com.google.gson.JsonObject; -import com.google.gson.JsonSyntaxException; import com.google.gson.annotations.Expose; - import java.io.IOException; import java.io.Serializable; import java.util.HashMap; @@ -37,7 +35,6 @@ import java.util.Map; import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; - import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; @@ -48,27 +45,32 @@ import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.ManyToMany; +import javax.persistence.ManyToOne; import javax.persistence.OneToMany; import javax.persistence.Table; import javax.persistence.Transient; - import org.hibernate.annotations.SortNatural; import org.hibernate.annotations.Type; import org.hibernate.annotations.TypeDef; import org.hibernate.annotations.TypeDefs; +import org.onap.clamp.clds.tosca.update.ToscaConverterWithDictionarySupport; +import org.onap.clamp.clds.util.drawing.SvgLoopGenerator; import org.onap.clamp.dao.model.jsontype.StringJsonUserType; +import org.onap.clamp.loop.common.AuditEntity; import org.onap.clamp.loop.components.external.DcaeComponent; import org.onap.clamp.loop.components.external.ExternalComponent; import org.onap.clamp.loop.components.external.PolicyComponent; import org.onap.clamp.loop.log.LoopLog; +import org.onap.clamp.loop.service.Service; +import org.onap.clamp.loop.template.LoopElementModel; +import org.onap.clamp.loop.template.LoopTemplate; import org.onap.clamp.policy.microservice.MicroServicePolicy; import org.onap.clamp.policy.operational.OperationalPolicy; -import org.onap.clamp.policy.operational.OperationalPolicyRepresentationBuilder; @Entity @Table(name = "loops") -@TypeDefs({ @TypeDef(name = "json", typeClass = StringJsonUserType.class) }) -public class Loop implements Serializable { +@TypeDefs({@TypeDef(name = "json", typeClass = StringJsonUserType.class)}) +public class Loop extends AuditEntity implements Serializable { /** * The serial version id. @@ -91,30 +93,18 @@ public class Loop implements Serializable { @Column(name = "dcae_deployment_status_url") private String dcaeDeploymentStatusUrl; - @Expose - @Column(name = "dcae_blueprint_id") - private String dcaeBlueprintId; - @Column(columnDefinition = "MEDIUMTEXT", name = "svg_representation") private String svgRepresentation; - @Expose - @Type(type = "json") - @Column(columnDefinition = "json", name = "operational_policy_schema") - private JsonObject operationalPolicySchema; - @Expose @Type(type = "json") @Column(columnDefinition = "json", name = "global_properties_json") private JsonObject globalPropertiesJson; @Expose - @Type(type = "json") - @Column(columnDefinition = "json", name = "model_properties_json") - private JsonObject modelPropertiesJson; - - @Column(columnDefinition = "MEDIUMTEXT", nullable = false, name = "blueprint_yaml") - private String blueprint; + @ManyToOne(fetch = FetchType.EAGER, cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH}) + @JoinColumn(name = "service_uuid") + private Service modelService; @Expose @Column(nullable = false, name = "last_computed_state") @@ -126,19 +116,25 @@ public class Loop implements Serializable { private final Map components = new HashMap<>(); @Expose - @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "loop") + @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "loop", orphanRemoval = true) private Set operationalPolicies = new HashSet<>(); @Expose - @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) - @JoinTable(name = "loops_microservicepolicies", joinColumns = @JoinColumn(name = "loop_id"), inverseJoinColumns = @JoinColumn(name = "microservicepolicy_id")) + @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH}, fetch = FetchType.EAGER) + @JoinTable(name = "loops_to_microservicepolicies", joinColumns = @JoinColumn(name = "loop_name"), + inverseJoinColumns = @JoinColumn(name = "microservicepolicy_name")) private Set microServicePolicies = new HashSet<>(); @Expose - @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "loop") + @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "loop", orphanRemoval = true) @SortNatural private SortedSet loopLogs = new TreeSet<>(); + @Expose + @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH}, fetch = FetchType.EAGER) + @JoinColumn(name = "loop_template_name", nullable = false) + private LoopTemplate loopTemplate; + private void initializeExternalComponents() { this.addComponent(new PolicyComponent()); this.addComponent(new DcaeComponent()); @@ -154,15 +150,47 @@ public class Loop 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(); } + /** + * This constructor creates a loop from a loop template. + * + * @param name The loop name + * @param loopTemplate The loop template from which a new loop instance must be created + */ + public Loop(String name, LoopTemplate loopTemplate, ToscaConverterWithDictionarySupport toscaConverter) { + this(name, ""); + this.setLoopTemplate(loopTemplate); + this.setModelService(loopTemplate.getModelService()); + loopTemplate.getLoopElementModelsUsed().forEach(element -> { + if (LoopElementModel.MICRO_SERVICE_TYPE.equals(element.getLoopElementModel().getLoopElementType())) { + try { + this.addMicroServicePolicy((MicroServicePolicy) element.getLoopElementModel() + .createPolicyInstance(this, toscaConverter)); + } catch (IOException e) { + logger.error("Exception caught when creating the microservice policy instance of the loop " + + "instance", e); + } + } + else if (LoopElementModel.OPERATIONAL_POLICY_TYPE + .equals(element.getLoopElementModel().getLoopElementType())) { + try { + this.addOperationalPolicy((OperationalPolicy) element.getLoopElementModel() + .createPolicyInstance(this, toscaConverter)); + } catch (IOException e) { + logger.error("Exception caught when creating the operational policy instance of the loop instance", + e); + } + } + }); + } + public String getName() { return name; } @@ -195,14 +223,6 @@ public class Loop implements Serializable { this.svgRepresentation = svgRepresentation; } - public String getBlueprint() { - return blueprint; - } - - void setBlueprint(String blueprint) { - this.blueprint = blueprint; - } - public LoopState getLastComputedState() { return lastComputedState; } @@ -243,14 +263,39 @@ public class Loop implements Serializable { this.loopLogs = loopLogs; } - void addOperationalPolicy(OperationalPolicy opPolicy) { + /** + * This method adds an operational policy to the loop. + * It re-computes the Svg as well. + * + * @param opPolicy the operationalPolicy to add + */ + public void addOperationalPolicy(OperationalPolicy opPolicy) { operationalPolicies.add(opPolicy); opPolicy.setLoop(this); + this.setSvgRepresentation(SvgLoopGenerator.getSvgImage(this)); + } + + /** + * This method removes an operational policy to the loop. + * It re-computes the Svg as well. + * + * @param opPolicy the operationalPolicy to add + */ + public void removeOperationalPolicy(OperationalPolicy opPolicy) { + operationalPolicies.remove(opPolicy); + this.setSvgRepresentation(SvgLoopGenerator.getSvgImage(this)); } - void addMicroServicePolicy(MicroServicePolicy microServicePolicy) { + /** + * This method adds an micro service policy to the loop. + * It re-computes the Svg as well. + * + * @param microServicePolicy the micro service to add + */ + public void addMicroServicePolicy(MicroServicePolicy microServicePolicy) { microServicePolicies.add(microServicePolicy); microServicePolicy.getUsedByLoops().add(this); + this.setSvgRepresentation(SvgLoopGenerator.getSvgImage(this)); } public void addLog(LoopLog log) { @@ -258,34 +303,21 @@ public class Loop implements Serializable { this.loopLogs.add(log); } - public String getDcaeBlueprintId() { - return dcaeBlueprintId; - } - - void setDcaeBlueprintId(String dcaeBlueprintId) { - this.dcaeBlueprintId = dcaeBlueprintId; + public Service getModelService() { + return modelService; } - public JsonObject getModelPropertiesJson() { - return modelPropertiesJson; - } - - void setModelPropertiesJson(JsonObject modelPropertiesJson) { - this.modelPropertiesJson = modelPropertiesJson; - try { - this.operationalPolicySchema = OperationalPolicyRepresentationBuilder - .generateOperationalPolicySchema(this.getModelPropertiesJson()); - } catch (JsonSyntaxException | IOException | NullPointerException e) { - logger.error("Unable to generate the operational policy Schema ... ", e); - this.operationalPolicySchema = new JsonObject(); - } + void setModelService(Service modelService) { + this.modelService = modelService; } public Map getComponents() { + refreshDcaeComponents(); return components; } public ExternalComponent getComponent(String componentName) { + refreshDcaeComponents(); return this.components.get(componentName); } @@ -293,6 +325,25 @@ public class Loop implements Serializable { this.components.put(component.getComponentName(), component); } + public LoopTemplate getLoopTemplate() { + return loopTemplate; + } + + public void setLoopTemplate(LoopTemplate loopTemplate) { + this.loopTemplate = loopTemplate; + } + + private void refreshDcaeComponents() { + if (!this.loopTemplate.getUniqueBlueprint()) { + this.components.remove("DCAE"); + for (MicroServicePolicy policy : this.microServicePolicies) { + if (!this.components.containsKey("DCAE_" + policy.getName())) { + this.addComponent(new DcaeComponent(policy.getName())); + } + } + } + } + /** * Generate the loop name. * @@ -302,10 +353,10 @@ public class Loop implements Serializable { * @param blueprintFileName The blueprint file name * @return The generated loop name */ - static String generateLoopName(String serviceName, String serviceVersion, String resourceName, - String blueprintFilename) { + 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", "")); + .append("_").append(resourceName).append("_").append(blueprintFileName.replaceAll(".yaml", "")); return buffer.toString().replace('.', '_').replaceAll(" ", ""); } @@ -333,7 +384,8 @@ public class Loop implements Serializable { if (other.name != null) { return false; } - } else if (!name.equals(other.name)) { + } + else if (!name.equals(other.name)) { return false; } return true;