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.tosca.datatypes.ToscaServiceModel;
6 import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate;
7 import org.openecomp.sdc.tosca.datatypes.model.RequirementAssignment;
8 import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate;
9 import org.openecomp.sdc.tosca.services.ToscaAnalyzerService;
10 import org.openecomp.sdc.tosca.services.impl.ToscaAnalyzerServiceImpl;
11 import org.openecomp.sdc.versioning.dao.types.Version;
13 import java.util.ArrayList;
14 import java.util.HashMap;
15 import java.util.List;
17 import java.util.Optional;
19 import static org.openecomp.sdc.enrichment.impl.util.EnrichmentConstants.HIGH_AVAIL_MODE;
20 import static org.openecomp.sdc.enrichment.impl.util.EnrichmentConstants.MANDATORY;
21 import static org.openecomp.sdc.enrichment.impl.util.EnrichmentConstants.MAX_INSTANCES;
22 import static org.openecomp.sdc.enrichment.impl.util.EnrichmentConstants.MIN_INSTANCES;
23 import static org.openecomp.sdc.enrichment.impl.util.EnrichmentConstants.VFC_CODE;
24 import static org.openecomp.sdc.enrichment.impl.util.EnrichmentConstants.VFC_FUNCTION;
25 import static org.openecomp.sdc.enrichment.impl.util.EnrichmentConstants.VFC_NAMING_CODE;
26 import static org.openecomp.sdc.enrichment.impl.util.EnrichmentConstants.VM_TYPE_TAG;
27 import static org.openecomp.sdc.tosca.datatypes.ToscaCapabilityType.NATIVE_NODE;
28 import static org.openecomp.sdc.tosca.datatypes.ToscaNodeType.VFC_ABSTRACT_SUBSTITUTE;
29 import static org.openecomp.sdc.tosca.datatypes.ToscaRelationshipType.NATIVE_DEPENDS_ON;
30 import static org.openecomp.sdc.tosca.services.ToscaConstants.SERVICE_TEMPLATE_FILTER_PROPERTY_NAME;
31 import static org.openecomp.sdc.translator.services.heattotosca.Constants.ABSTRACT_NODE_TEMPLATE_ID_PREFIX;
33 public class AbstractSubstituteToscaEnricher {
34 private ToscaAnalyzerService toscaAnalyzerService ;
35 private ComponentQuestionnaireData componentQuestionnaireData;
38 public Map<String,List<ErrorMessage>> enrich(ToscaServiceModel toscaModel, String vspId, Version
40 componentQuestionnaireData = getComponentQuestionnaireData();
41 toscaAnalyzerService = new ToscaAnalyzerServiceImpl();
43 Map<String, Map<String, Object>> componentProperties =
44 componentQuestionnaireData.getPropertiesfromCompQuestionnaire(vspId, version);
46 final Map<String, List<String>> sourceToTargetDependencies =
47 componentQuestionnaireData.populateDependencies(vspId, version,
48 componentQuestionnaireData.getSourceToTargetComponent());
50 Map<String, List<ErrorMessage>> errors = new HashMap<>();
52 final ServiceTemplate serviceTemplate = toscaModel.getServiceTemplates()
53 .get(toscaModel.getEntryDefinitionServiceTemplate());
55 if (serviceTemplate == null) return errors;
57 final Map<String, NodeTemplate> node_templates =
58 serviceTemplate.getTopology_template().getNode_templates();
59 if(node_templates == null) return errors;
61 final Map<String, List<String>> componentDisplayNameToNodeTempalteIds =
62 populateAllNodeTemplateIdForComponent(node_templates, serviceTemplate, toscaModel);
64 node_templates.keySet()
66 .forEach(nodeTemplateId -> {
67 final Optional<NodeTemplate> nodeTemplateById =
68 toscaAnalyzerService.getNodeTemplateById(serviceTemplate, nodeTemplateId);
69 final NodeTemplate nodeTemplate =
70 nodeTemplateById.isPresent() ? nodeTemplateById.get() : null;
72 if (toscaAnalyzerService.isTypeOf(nodeTemplate, VFC_ABSTRACT_SUBSTITUTE, serviceTemplate,
75 String componentDisplayName = getComponentDisplayName(nodeTemplateId, nodeTemplate);
77 setProperty(nodeTemplate, VM_TYPE_TAG, componentDisplayName);
79 if (componentProperties != null && componentProperties.containsKey
80 (componentDisplayName)) {
81 final String mandatory =
82 getValueFromQuestionnaireDetails(componentProperties, componentDisplayName,
85 boolean isServiceTemplateFilterNotExists = false;
86 if (!StringUtils.isEmpty(mandatory)) {
87 Map innerProps = (Map<String, Object>) nodeTemplate.getProperties()
88 .get(SERVICE_TEMPLATE_FILTER_PROPERTY_NAME);
90 if (innerProps == null) {
91 innerProps = new HashMap<String, Object>();
92 isServiceTemplateFilterNotExists = true;
95 innerProps.put(MANDATORY, getValue(mandatory));
97 if(isServiceTemplateFilterNotExists)
98 nodeTemplate.getProperties().put(SERVICE_TEMPLATE_FILTER_PROPERTY_NAME,
102 setProperty(nodeTemplate, HIGH_AVAIL_MODE, getValueFromQuestionnaireDetails
103 (componentProperties, componentDisplayName, HIGH_AVAIL_MODE));
105 setProperty(nodeTemplate, VFC_NAMING_CODE, getValueFromQuestionnaireDetails
106 (componentProperties, componentDisplayName, VFC_NAMING_CODE));
108 setProperty(nodeTemplate, VFC_CODE, getValueFromQuestionnaireDetails
109 (componentProperties, componentDisplayName, VFC_CODE));
111 setProperty(nodeTemplate, VFC_FUNCTION, getValueFromQuestionnaireDetails
112 (componentProperties, componentDisplayName, VFC_FUNCTION));
114 if(componentProperties.get(componentDisplayName).get(MIN_INSTANCES) != null) {
115 nodeTemplate.getProperties().put(MIN_INSTANCES,
116 componentProperties.get(componentDisplayName).get(MIN_INSTANCES));
119 if(componentProperties.get(componentDisplayName).get(MAX_INSTANCES) != null) {
120 nodeTemplate.getProperties().put(MAX_INSTANCES,
121 componentProperties.get(componentDisplayName).get(MAX_INSTANCES));
125 enrichRequirements(sourceToTargetDependencies, componentDisplayName, nodeTemplate,
126 componentDisplayNameToNodeTempalteIds);
132 private Map<String,List<String>> populateAllNodeTemplateIdForComponent(Map<String,
133 NodeTemplate> node_templates, ServiceTemplate serviceTemplate, ToscaServiceModel
137 Map<String,List<String>> componentDisplayNameToNodeTempalteIds = new HashMap<String,
140 //set dependency target
141 node_templates.keySet()
143 .forEach(nodeTemplateId -> {
145 final Optional<NodeTemplate> nodeTemplateById =
146 toscaAnalyzerService.getNodeTemplateById(serviceTemplate, nodeTemplateId);
147 final NodeTemplate nodeTemplate =
148 nodeTemplateById.isPresent() ? nodeTemplateById.get() : null;
150 if (toscaAnalyzerService.isTypeOf(nodeTemplate, VFC_ABSTRACT_SUBSTITUTE, serviceTemplate,
153 String componentDisplayName = getComponentDisplayName(nodeTemplateId, nodeTemplate);
155 if (componentDisplayNameToNodeTempalteIds.containsKey(componentDisplayName)) {
156 componentDisplayNameToNodeTempalteIds.get(componentDisplayName).add(nodeTemplateId);
158 List<String> nodeTemplateIds = new ArrayList<String>();
159 nodeTemplateIds.add(nodeTemplateId);
160 componentDisplayNameToNodeTempalteIds.put(componentDisplayName, nodeTemplateIds);
166 return componentDisplayNameToNodeTempalteIds;
169 private void enrichRequirements(Map<String, List<String>> sourceToTargetDependencies,
170 String componentDisplayName, NodeTemplate nodeTemplate,
171 Map<String, List<String>> componentDisplayNameToNodeTempalteIds) {
172 List<Map<String, RequirementAssignment>> requirements =
173 nodeTemplate.getRequirements();
175 if(requirements == null) {
176 requirements = new ArrayList<Map<String, RequirementAssignment>>();
179 final List<String> targets = sourceToTargetDependencies.get(componentDisplayName);
180 if(targets != null) {
181 for (String target : targets) {
182 List<String> targetNodeTemplateIds = componentDisplayNameToNodeTempalteIds.get(target);
183 if(targetNodeTemplateIds != null) {
184 for (String targetNodeTemplateId : targetNodeTemplateIds) {
185 Map<String, RequirementAssignment> requirement = new HashMap<String,
186 RequirementAssignment>();
187 RequirementAssignment requirementAssignment = new RequirementAssignment();
188 requirementAssignment.setCapability(NATIVE_NODE);
189 requirementAssignment.setRelationship(NATIVE_DEPENDS_ON);
190 requirementAssignment.setNode(targetNodeTemplateId);
191 requirement.put("dependency", requirementAssignment);
192 requirements.add(requirement);
198 if (!requirements.isEmpty())
199 nodeTemplate.setRequirements(requirements);
202 private String getComponentDisplayName(String nodeTemplateId, NodeTemplate nodeTemplate) {
203 String componentDisplayName = null;
204 if (nodeTemplateId.contains(ABSTRACT_NODE_TEMPLATE_ID_PREFIX)) {
205 String removedPrefix = nodeTemplateId.split(ABSTRACT_NODE_TEMPLATE_ID_PREFIX)[1];
206 final String[] removedSuffix = removedPrefix.split("_\\d");
207 componentDisplayName = removedSuffix[0];
209 final String type = nodeTemplate.getType();
210 final String[] splitted = type.split("\\.");
211 componentDisplayName = splitted[splitted.length - 1];
214 return componentDisplayName;
217 private String getValueFromQuestionnaireDetails(
218 Map<String, Map<String, Object>> componentTypetoParams, String componentDisplayName, String
220 return (String) componentTypetoParams.get(componentDisplayName).get(propertyName);
223 private void setProperty(NodeTemplate nodeTemplate, String key, String value) {
224 if (!StringUtils.isEmpty(value)) {
225 //YamlUtil throws IllegalStateException("duplicate key: " + key) if key is already present.
226 // So first removing and then populating same key with new updated value
227 nodeTemplate.getProperties().remove(key);
228 nodeTemplate.getProperties().put(key, value);
232 private Boolean getValue(String value) {
233 String returnValue = null;
239 default: return null;
243 private ComponentQuestionnaireData getComponentQuestionnaireData() {
244 if (componentQuestionnaireData == null) {
245 componentQuestionnaireData = new ComponentQuestionnaireData();
247 return componentQuestionnaireData;