aboutsummaryrefslogtreecommitdiffstats
path: root/openecomp-be/lib/openecomp-sdc-enrichment-lib/openecomp-sdc-enrichment-impl/src/main/java/org/openecomp/sdc/enrichment/impl/tosca/AbstractSubstituteToscaEnricher.java
diff options
context:
space:
mode:
Diffstat (limited to 'openecomp-be/lib/openecomp-sdc-enrichment-lib/openecomp-sdc-enrichment-impl/src/main/java/org/openecomp/sdc/enrichment/impl/tosca/AbstractSubstituteToscaEnricher.java')
-rw-r--r--openecomp-be/lib/openecomp-sdc-enrichment-lib/openecomp-sdc-enrichment-impl/src/main/java/org/openecomp/sdc/enrichment/impl/tosca/AbstractSubstituteToscaEnricher.java243
1 files changed, 243 insertions, 0 deletions
diff --git a/openecomp-be/lib/openecomp-sdc-enrichment-lib/openecomp-sdc-enrichment-impl/src/main/java/org/openecomp/sdc/enrichment/impl/tosca/AbstractSubstituteToscaEnricher.java b/openecomp-be/lib/openecomp-sdc-enrichment-lib/openecomp-sdc-enrichment-impl/src/main/java/org/openecomp/sdc/enrichment/impl/tosca/AbstractSubstituteToscaEnricher.java
new file mode 100644
index 0000000000..d75c83f24c
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-enrichment-lib/openecomp-sdc-enrichment-impl/src/main/java/org/openecomp/sdc/enrichment/impl/tosca/AbstractSubstituteToscaEnricher.java
@@ -0,0 +1,243 @@
+package org.openecomp.sdc.enrichment.impl.tosca;
+
+import static org.openecomp.sdc.enrichment.impl.util.EnrichmentConstants.HIGH_AVAIL_MODE;
+import static org.openecomp.sdc.enrichment.impl.util.EnrichmentConstants.MANDATORY;
+import static org.openecomp.sdc.enrichment.impl.util.EnrichmentConstants.MAX_INSTANCES;
+import static org.openecomp.sdc.enrichment.impl.util.EnrichmentConstants.MIN_INSTANCES;
+import static org.openecomp.sdc.enrichment.impl.util.EnrichmentConstants.VFC_NAMING_CODE;
+import static org.openecomp.sdc.enrichment.impl.util.EnrichmentConstants.VM_TYPE_TAG;
+import static org.openecomp.sdc.tosca.datatypes.ToscaCapabilityType.NATIVE_NODE;
+import static org.openecomp.sdc.tosca.datatypes.ToscaNodeType.VFC_ABSTRACT_SUBSTITUTE;
+import static org.openecomp.sdc.tosca.datatypes.ToscaRelationshipType.NATIVE_DEPENDS_ON;
+import static org.openecomp.sdc.tosca.services.ToscaConstants.SERVICE_TEMPLATE_FILTER_PROPERTY_NAME;
+import static org.openecomp.sdc.translator.services.heattotosca.Constants.ABSTRACT_NODE_TEMPLATE_ID_PREFIX;
+
+import org.apache.commons.lang3.StringUtils;
+import org.openecomp.sdc.datatypes.error.ErrorMessage;
+import org.openecomp.sdc.logging.context.impl.MdcDataDebugMessage;
+import org.openecomp.sdc.tosca.datatypes.ToscaServiceModel;
+import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate;
+import org.openecomp.sdc.tosca.datatypes.model.RequirementAssignment;
+import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate;
+import org.openecomp.sdc.tosca.services.ToscaAnalyzerService;
+import org.openecomp.sdc.tosca.services.impl.ToscaAnalyzerServiceImpl;
+import org.openecomp.sdc.versioning.dao.types.Version;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+
+public class AbstractSubstituteToscaEnricher {
+ private ToscaAnalyzerService toscaAnalyzerService ;
+ private static MdcDataDebugMessage mdcDataDebugMessage = new MdcDataDebugMessage();
+ private ComponentQuestionnaireData componentQuestionnaireData;
+
+
+ public Map<String,List<ErrorMessage>> enrich(ToscaServiceModel toscaModel, String vspId, Version
+ version) {
+
+ mdcDataDebugMessage.debugEntryMessage(vspId, version.toString());
+
+ componentQuestionnaireData = getComponentQuestionnaireData();
+ toscaAnalyzerService = new ToscaAnalyzerServiceImpl();
+
+ Map<String, Map<String, Object>> componentProperties =
+ componentQuestionnaireData.getPropertiesfromCompQuestionnaire(vspId, version);
+
+ final Map<String, List<String>> sourceToTargetDependencies =
+ componentQuestionnaireData.populateDependencies(vspId, version,
+ componentQuestionnaireData.getSourceToTargetComponent());
+
+ Map<String, List<ErrorMessage>> errors = new HashMap<>();
+
+ final ServiceTemplate serviceTemplate = toscaModel.getServiceTemplates()
+ .get(toscaModel.getEntryDefinitionServiceTemplate());
+
+ if (serviceTemplate == null) return errors;
+
+ final Map<String, NodeTemplate> node_templates =
+ serviceTemplate.getTopology_template().getNode_templates();
+
+ final Map<String, List<String>> componentDisplayNameToNodeTempalteIds =
+ populateAllNodeTemplateIdForComponent(node_templates, serviceTemplate, toscaModel);
+
+ node_templates.keySet()
+ .stream()
+ .forEach(nodeTemplateId -> {
+ final Optional<NodeTemplate> nodeTemplateById =
+ toscaAnalyzerService.getNodeTemplateById(serviceTemplate, nodeTemplateId);
+ final NodeTemplate nodeTemplate =
+ nodeTemplateById.isPresent() ? nodeTemplateById.get() : null;
+
+ if (toscaAnalyzerService.isTypeOf(nodeTemplate, VFC_ABSTRACT_SUBSTITUTE, serviceTemplate,
+ toscaModel)) {
+
+ String componentDisplayName = getComponentDisplayName(nodeTemplateId);
+
+ setProperty(nodeTemplate, VM_TYPE_TAG, componentDisplayName);
+
+ if (componentProperties != null && componentProperties.containsKey
+ (componentDisplayName)) {
+ final String mandatory =
+ getValueFromQuestionnaireDetails(componentProperties, componentDisplayName,
+ MANDATORY);
+
+ boolean isServiceTemplateFilterNotExists = false;
+ if (!StringUtils.isEmpty(mandatory)) {
+ Map innerProps = (Map<String, Object>) nodeTemplate.getProperties()
+ .get(SERVICE_TEMPLATE_FILTER_PROPERTY_NAME);
+
+ if (innerProps == null) {
+ innerProps = new HashMap<String, Object>();
+ isServiceTemplateFilterNotExists = true;
+ }
+
+ innerProps.put(MANDATORY, getValue(mandatory));
+
+ if(isServiceTemplateFilterNotExists)
+ nodeTemplate.getProperties().put(SERVICE_TEMPLATE_FILTER_PROPERTY_NAME,
+ innerProps);
+ }
+
+ setProperty(nodeTemplate, HIGH_AVAIL_MODE, getValueFromQuestionnaireDetails
+ (componentProperties, componentDisplayName, HIGH_AVAIL_MODE));
+
+ setProperty(nodeTemplate, VFC_NAMING_CODE, getValueFromQuestionnaireDetails
+ (componentProperties, componentDisplayName, VFC_NAMING_CODE));
+
+
+ if(componentProperties.get(componentDisplayName).get(MIN_INSTANCES) != null) {
+ nodeTemplate.getProperties().put(MIN_INSTANCES,
+ componentProperties.get(componentDisplayName).get(MIN_INSTANCES));
+ }
+
+ if(componentProperties.get(componentDisplayName).get(MAX_INSTANCES) != null) {
+ nodeTemplate.getProperties().put(MAX_INSTANCES,
+ componentProperties.get(componentDisplayName).get(MAX_INSTANCES));
+ }
+ }
+
+ enrichRequirements(sourceToTargetDependencies, componentDisplayName, nodeTemplate,
+ componentDisplayNameToNodeTempalteIds);
+ }
+ });
+
+ mdcDataDebugMessage.debugExitMessage(vspId, version.toString());
+ return errors;
+ }
+
+ private Map<String,List<String>> populateAllNodeTemplateIdForComponent(Map<String,
+ NodeTemplate> node_templates, ServiceTemplate serviceTemplate, ToscaServiceModel
+ toscaModel) {
+
+
+ Map<String,List<String>> componentDisplayNameToNodeTempalteIds = new HashMap<String,
+ List<String>>();
+
+ //set dependency target
+ node_templates.keySet()
+ .stream()
+ .forEach(nodeTemplateId -> {
+
+ final Optional<NodeTemplate> nodeTemplateById =
+ toscaAnalyzerService.getNodeTemplateById(serviceTemplate, nodeTemplateId);
+ final NodeTemplate nodeTemplate =
+ nodeTemplateById.isPresent() ? nodeTemplateById.get() : null;
+
+ if (toscaAnalyzerService.isTypeOf(nodeTemplate, VFC_ABSTRACT_SUBSTITUTE, serviceTemplate,
+ toscaModel)) {
+
+ String componentDisplayName = getComponentDisplayName(nodeTemplateId);
+
+ if (componentDisplayNameToNodeTempalteIds.containsKey(componentDisplayName)) {
+ componentDisplayNameToNodeTempalteIds.get(componentDisplayName).add(nodeTemplateId);
+ } else {
+ List<String> nodeTemplateIds = new ArrayList<String>();
+ nodeTemplateIds.add(nodeTemplateId);
+ componentDisplayNameToNodeTempalteIds.put(componentDisplayName, nodeTemplateIds);
+ }
+
+ }
+ });
+
+ return componentDisplayNameToNodeTempalteIds;
+ }
+
+ private void enrichRequirements(Map<String, List<String>> sourceToTargetDependencies,
+ String componentDisplayName, NodeTemplate nodeTemplate,
+ Map<String, List<String>> componentDisplayNameToNodeTempalteIds) {
+ List<Map<String, RequirementAssignment>> requirements =
+ nodeTemplate.getRequirements();
+
+ if(requirements == null) {
+ requirements = new ArrayList<Map<String, RequirementAssignment>>();
+ }
+
+ final List<String> targets = sourceToTargetDependencies.get(componentDisplayName);
+ if(targets != null) {
+ for (String target : targets) {
+ List<String> targetNodeTemplateIds = componentDisplayNameToNodeTempalteIds.get(target);
+ if(targetNodeTemplateIds != null) {
+ for (String targetNodeTemplateId : targetNodeTemplateIds) {
+ Map<String, RequirementAssignment> requirement = new HashMap<String,
+ RequirementAssignment>();
+ RequirementAssignment requirementAssignment = new RequirementAssignment();
+ requirementAssignment.setCapability(NATIVE_NODE);
+ requirementAssignment.setRelationship(NATIVE_DEPENDS_ON);
+ requirementAssignment.setNode(targetNodeTemplateId);
+ requirement.put("dependency", requirementAssignment);
+ requirements.add(requirement);
+ }
+ }
+ }
+ }
+
+ if (!requirements.isEmpty())
+ nodeTemplate.setRequirements(requirements);
+ }
+
+ private String getComponentDisplayName(String nodeTemplateId ) {
+ String componentDisplayName = null;
+ if (nodeTemplateId.contains(ABSTRACT_NODE_TEMPLATE_ID_PREFIX)) {
+ String removedPrefix = nodeTemplateId.split(ABSTRACT_NODE_TEMPLATE_ID_PREFIX)[1];
+ final String[] removedSuffix = removedPrefix.split("_\\d");
+ componentDisplayName = removedSuffix[0];
+ }
+ return componentDisplayName;
+ }
+
+ private String getValueFromQuestionnaireDetails(
+ Map<String, Map<String, Object>> componentTypetoParams, String componentDisplayName, String
+ propertyName) {
+ return (String) componentTypetoParams.get(componentDisplayName).get(propertyName);
+ }
+
+ private void setProperty(NodeTemplate nodeTemplate, String key, String value) {
+ if (!StringUtils.isEmpty(value)) {
+ //YamlUtil throws IllegalStateException("duplicate key: " + key) if key is already present.
+ // So first removing and then populating same key with new updated value
+ nodeTemplate.getProperties().remove(key);
+ nodeTemplate.getProperties().put(key, value);
+ }
+ }
+
+ private Boolean getValue(String value) {
+ String returnValue = null;
+ switch (value) {
+ case "YES" :
+ return true;
+ case "NO" :
+ return false;
+ default: return null;
+ }
+ }
+
+ private ComponentQuestionnaireData getComponentQuestionnaireData() {
+ if (componentQuestionnaireData == null) {
+ componentQuestionnaireData = new ComponentQuestionnaireData();
+ }
+ return componentQuestionnaireData;
+ }
+}