1 package org.openecomp.sdc.enrichment.impl.tosca;
3 import org.apache.commons.lang3.StringUtils;
4 import org.openecomp.sdc.datatypes.error.ErrorMessage;
5 import org.openecomp.sdc.logging.context.impl.MdcDataDebugMessage;
6 import org.openecomp.sdc.tosca.datatypes.ToscaServiceModel;
7 import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate;
8 import org.openecomp.sdc.tosca.datatypes.model.RequirementAssignment;
9 import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate;
10 import org.openecomp.sdc.tosca.services.ToscaAnalyzerService;
11 import org.openecomp.sdc.tosca.services.impl.ToscaAnalyzerServiceImpl;
12 import org.openecomp.sdc.versioning.dao.types.Version;
14 import java.util.ArrayList;
15 import java.util.HashMap;
16 import java.util.List;
18 import java.util.Optional;
20 import static org.openecomp.sdc.enrichment.impl.util.EnrichmentConstants.HIGH_AVAIL_MODE;
21 import static org.openecomp.sdc.enrichment.impl.util.EnrichmentConstants.MANDATORY;
22 import static org.openecomp.sdc.enrichment.impl.util.EnrichmentConstants.MAX_INSTANCES;
23 import static org.openecomp.sdc.enrichment.impl.util.EnrichmentConstants.MIN_INSTANCES;
24 import static org.openecomp.sdc.enrichment.impl.util.EnrichmentConstants.VFC_CODE;
25 import static org.openecomp.sdc.enrichment.impl.util.EnrichmentConstants.VFC_FUNCTION;
26 import static org.openecomp.sdc.enrichment.impl.util.EnrichmentConstants.VFC_NAMING_CODE;
27 import static org.openecomp.sdc.enrichment.impl.util.EnrichmentConstants.VM_TYPE_TAG;
28 import static org.openecomp.sdc.tosca.datatypes.ToscaCapabilityType.NATIVE_NODE;
29 import static org.openecomp.sdc.tosca.datatypes.ToscaNodeType.VFC_ABSTRACT_SUBSTITUTE;
30 import static org.openecomp.sdc.tosca.datatypes.ToscaRelationshipType.NATIVE_DEPENDS_ON;
31 import static org.openecomp.sdc.tosca.services.ToscaConstants.SERVICE_TEMPLATE_FILTER_PROPERTY_NAME;
32 import static org.openecomp.sdc.translator.services.heattotosca.Constants.ABSTRACT_NODE_TEMPLATE_ID_PREFIX;
34 public class AbstractSubstituteToscaEnricher {
35 private ToscaAnalyzerService toscaAnalyzerService ;
36 private static MdcDataDebugMessage mdcDataDebugMessage = new MdcDataDebugMessage();
37 private ComponentQuestionnaireData componentQuestionnaireData;
40 public Map<String,List<ErrorMessage>> enrich(ToscaServiceModel toscaModel, String vspId, Version
43 mdcDataDebugMessage.debugEntryMessage(vspId, version.toString());
45 componentQuestionnaireData = getComponentQuestionnaireData();
46 toscaAnalyzerService = new ToscaAnalyzerServiceImpl();
48 Map<String, Map<String, Object>> componentProperties =
49 componentQuestionnaireData.getPropertiesfromCompQuestionnaire(vspId, version);
51 final Map<String, List<String>> sourceToTargetDependencies =
52 componentQuestionnaireData.populateDependencies(vspId, version,
53 componentQuestionnaireData.getSourceToTargetComponent());
55 Map<String, List<ErrorMessage>> errors = new HashMap<>();
57 final ServiceTemplate serviceTemplate = toscaModel.getServiceTemplates()
58 .get(toscaModel.getEntryDefinitionServiceTemplate());
60 if (serviceTemplate == null) return errors;
62 final Map<String, NodeTemplate> node_templates =
63 serviceTemplate.getTopology_template().getNode_templates();
64 if(node_templates == null) return errors;
66 final Map<String, List<String>> componentDisplayNameToNodeTempalteIds =
67 populateAllNodeTemplateIdForComponent(node_templates, serviceTemplate, toscaModel);
69 node_templates.keySet()
71 .forEach(nodeTemplateId -> {
72 final Optional<NodeTemplate> nodeTemplateById =
73 toscaAnalyzerService.getNodeTemplateById(serviceTemplate, nodeTemplateId);
74 final NodeTemplate nodeTemplate =
75 nodeTemplateById.isPresent() ? nodeTemplateById.get() : null;
77 if (toscaAnalyzerService.isTypeOf(nodeTemplate, VFC_ABSTRACT_SUBSTITUTE, serviceTemplate,
80 String componentDisplayName = getComponentDisplayName(nodeTemplateId);
82 setProperty(nodeTemplate, VM_TYPE_TAG, componentDisplayName);
84 if (componentProperties != null && componentProperties.containsKey
85 (componentDisplayName)) {
86 final String mandatory =
87 getValueFromQuestionnaireDetails(componentProperties, componentDisplayName,
90 boolean isServiceTemplateFilterNotExists = false;
91 if (!StringUtils.isEmpty(mandatory)) {
92 Map innerProps = (Map<String, Object>) nodeTemplate.getProperties()
93 .get(SERVICE_TEMPLATE_FILTER_PROPERTY_NAME);
95 if (innerProps == null) {
96 innerProps = new HashMap<String, Object>();
97 isServiceTemplateFilterNotExists = true;
100 innerProps.put(MANDATORY, getValue(mandatory));
102 if(isServiceTemplateFilterNotExists)
103 nodeTemplate.getProperties().put(SERVICE_TEMPLATE_FILTER_PROPERTY_NAME,
107 setProperty(nodeTemplate, HIGH_AVAIL_MODE, getValueFromQuestionnaireDetails
108 (componentProperties, componentDisplayName, HIGH_AVAIL_MODE));
110 setProperty(nodeTemplate, VFC_NAMING_CODE, getValueFromQuestionnaireDetails
111 (componentProperties, componentDisplayName, VFC_NAMING_CODE));
113 setProperty(nodeTemplate, VFC_CODE, getValueFromQuestionnaireDetails
114 (componentProperties, componentDisplayName, VFC_CODE));
116 setProperty(nodeTemplate, VFC_FUNCTION, getValueFromQuestionnaireDetails
117 (componentProperties, componentDisplayName, VFC_FUNCTION));
119 if(componentProperties.get(componentDisplayName).get(MIN_INSTANCES) != null) {
120 nodeTemplate.getProperties().put(MIN_INSTANCES,
121 componentProperties.get(componentDisplayName).get(MIN_INSTANCES));
124 if(componentProperties.get(componentDisplayName).get(MAX_INSTANCES) != null) {
125 nodeTemplate.getProperties().put(MAX_INSTANCES,
126 componentProperties.get(componentDisplayName).get(MAX_INSTANCES));
130 enrichRequirements(sourceToTargetDependencies, componentDisplayName, nodeTemplate,
131 componentDisplayNameToNodeTempalteIds);
135 mdcDataDebugMessage.debugExitMessage(vspId, version.toString());
139 private Map<String,List<String>> populateAllNodeTemplateIdForComponent(Map<String,
140 NodeTemplate> node_templates, ServiceTemplate serviceTemplate, ToscaServiceModel
144 Map<String,List<String>> componentDisplayNameToNodeTempalteIds = new HashMap<String,
147 //set dependency target
148 node_templates.keySet()
150 .forEach(nodeTemplateId -> {
152 final Optional<NodeTemplate> nodeTemplateById =
153 toscaAnalyzerService.getNodeTemplateById(serviceTemplate, nodeTemplateId);
154 final NodeTemplate nodeTemplate =
155 nodeTemplateById.isPresent() ? nodeTemplateById.get() : null;
157 if (toscaAnalyzerService.isTypeOf(nodeTemplate, VFC_ABSTRACT_SUBSTITUTE, serviceTemplate,
160 String componentDisplayName = getComponentDisplayName(nodeTemplateId);
162 if (componentDisplayNameToNodeTempalteIds.containsKey(componentDisplayName)) {
163 componentDisplayNameToNodeTempalteIds.get(componentDisplayName).add(nodeTemplateId);
165 List<String> nodeTemplateIds = new ArrayList<String>();
166 nodeTemplateIds.add(nodeTemplateId);
167 componentDisplayNameToNodeTempalteIds.put(componentDisplayName, nodeTemplateIds);
173 return componentDisplayNameToNodeTempalteIds;
176 private void enrichRequirements(Map<String, List<String>> sourceToTargetDependencies,
177 String componentDisplayName, NodeTemplate nodeTemplate,
178 Map<String, List<String>> componentDisplayNameToNodeTempalteIds) {
179 List<Map<String, RequirementAssignment>> requirements =
180 nodeTemplate.getRequirements();
182 if(requirements == null) {
183 requirements = new ArrayList<Map<String, RequirementAssignment>>();
186 final List<String> targets = sourceToTargetDependencies.get(componentDisplayName);
187 if(targets != null) {
188 for (String target : targets) {
189 List<String> targetNodeTemplateIds = componentDisplayNameToNodeTempalteIds.get(target);
190 if(targetNodeTemplateIds != null) {
191 for (String targetNodeTemplateId : targetNodeTemplateIds) {
192 Map<String, RequirementAssignment> requirement = new HashMap<String,
193 RequirementAssignment>();
194 RequirementAssignment requirementAssignment = new RequirementAssignment();
195 requirementAssignment.setCapability(NATIVE_NODE);
196 requirementAssignment.setRelationship(NATIVE_DEPENDS_ON);
197 requirementAssignment.setNode(targetNodeTemplateId);
198 requirement.put("dependency", requirementAssignment);
199 requirements.add(requirement);
205 if (!requirements.isEmpty())
206 nodeTemplate.setRequirements(requirements);
209 private String getComponentDisplayName(String nodeTemplateId ) {
210 String componentDisplayName = null;
211 if (nodeTemplateId.contains(ABSTRACT_NODE_TEMPLATE_ID_PREFIX)) {
212 String removedPrefix = nodeTemplateId.split(ABSTRACT_NODE_TEMPLATE_ID_PREFIX)[1];
213 final String[] removedSuffix = removedPrefix.split("_\\d");
214 componentDisplayName = removedSuffix[0];
216 return componentDisplayName;
219 private String getValueFromQuestionnaireDetails(
220 Map<String, Map<String, Object>> componentTypetoParams, String componentDisplayName, String
222 return (String) componentTypetoParams.get(componentDisplayName).get(propertyName);
225 private void setProperty(NodeTemplate nodeTemplate, String key, String value) {
226 if (!StringUtils.isEmpty(value)) {
227 //YamlUtil throws IllegalStateException("duplicate key: " + key) if key is already present.
228 // So first removing and then populating same key with new updated value
229 nodeTemplate.getProperties().remove(key);
230 nodeTemplate.getProperties().put(key, value);
234 private Boolean getValue(String value) {
235 String returnValue = null;
241 default: return null;
245 private ComponentQuestionnaireData getComponentQuestionnaireData() {
246 if (componentQuestionnaireData == null) {
247 componentQuestionnaireData = new ComponentQuestionnaireData();
249 return componentQuestionnaireData;