1 package org.openecomp.sdc.generator.core.utils;
3 import org.openecomp.sdc.datatypes.error.ErrorLevel;
4 import org.openecomp.sdc.logging.types.LoggerConstants;
5 import org.openecomp.sdc.logging.types.LoggerErrorCode;
6 import org.openecomp.sdc.logging.types.LoggerTragetServiceName;
7 import org.openecomp.sdc.tosca.datatypes.ToscaElementTypes;
8 import org.openecomp.sdc.tosca.datatypes.ToscaServiceModel;
9 import org.openecomp.sdc.tosca.datatypes.model.CapabilityDefinition;
10 import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate;
11 import org.openecomp.sdc.tosca.datatypes.model.NodeType;
12 import org.openecomp.sdc.tosca.datatypes.model.RequirementAssignment;
13 import org.openecomp.sdc.tosca.datatypes.model.RequirementDefinition;
14 import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate;
15 import org.openecomp.sdc.tosca.services.DataModelUtil;
16 import org.openecomp.sdc.tosca.services.ToscaAnalyzerService;
17 import org.openecomp.sdc.tosca.services.ToscaExtensionYamlUtil;
18 import org.openecomp.sdc.tosca.services.ToscaUtil;
19 import org.openecomp.sdc.tosca.services.impl.ToscaAnalyzerServiceImpl;
21 import java.util.ArrayList;
22 import java.util.Arrays;
23 import java.util.HashMap;
24 import java.util.Iterator;
25 import java.util.List;
28 import static org.openecomp.sdc.tosca.services.DataModelUtil.addSubstitutionNodeTypeRequirements;
31 * The type Generator utils.
33 public class GeneratorUtils {
35 private static List<String> supportedCapabilities = new ArrayList<>();
36 private static List<String> supportedRequirements = new ArrayList<>();
38 //TODO : Read from configuration
39 supportedCapabilities.addAll(Arrays.asList("host", "os", "endpoint", "scalable"));
40 supportedRequirements.addAll(Arrays.asList("link"));
45 * Add service template to tosca service model.
47 * @param toscaServiceModel the tosca service model
48 * @param serviceTemplate the service template
50 public static void addServiceTemplateToToscaServiceModel(ToscaServiceModel toscaServiceModel,
51 ServiceTemplate serviceTemplate) {
53 String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate);
54 Map<String, ServiceTemplate> serviceTemplates = toscaServiceModel.getServiceTemplates();
55 if (!serviceTemplates.containsKey(serviceTemplateFileName)) {
56 ToscaUtil.addServiceTemplateToMapWithKeyFileName(serviceTemplates, serviceTemplate);
58 toscaServiceModel.setServiceTemplates(serviceTemplates);
62 * Gets substitution node type exposed connection points.
64 * @param substitutionNodeType the substitution node type
65 * @param substitutionServiceTemplate the substitution service template
66 * @param toscaServiceModel the tosca service model
67 * @return the substitution node type exposed connection points
69 public static Map<String, Map<String, List<String>>>
70 getSubstitutionNodeTypeExposedConnectionPoints(NodeType substitutionNodeType,
71 ServiceTemplate substitutionServiceTemplate,
72 ToscaServiceModel toscaServiceModel) {
74 Map<String, NodeTemplate> nodeTemplates =
75 substitutionServiceTemplate.getTopology_template().getNode_templates();
76 String nodeTemplateId;
77 NodeTemplate nodeTemplate;
79 Map<String, Map<String, List<String>>> substitutionMapping = new HashMap<>();
80 if (nodeTemplates == null) {
81 return substitutionMapping;
85 Map<String, List<String>> capabilitySubstitutionMapping = new HashMap<>();
86 Map<String, List<String>> requirementSubstitutionMapping = new HashMap<>();
87 substitutionMapping.put("capability", capabilitySubstitutionMapping);
88 substitutionMapping.put("requirement", requirementSubstitutionMapping);
89 List<Map<String, RequirementDefinition>> nodeTypeRequirementsDefinition;
90 Map<String, RequirementAssignment> nodeTemplateRequirementsAssignment;
91 List<Map<String, RequirementDefinition>> exposedRequirementsDefinition;
92 Map<String, Map<String, RequirementAssignment>> fullFilledRequirementsDefinition =
94 Map<String, CapabilityDefinition> nodeTypeCapabilitiesDefinition = new HashMap<>();
95 Map<String, CapabilityDefinition> exposedCapabilitiesDefinition;
97 ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl();
98 for (Map.Entry<String, NodeTemplate> entry : nodeTemplates.entrySet()) {
99 nodeTemplateId = entry.getKey();
100 nodeTemplate = entry.getValue();
101 nodeType = nodeTemplate.getType();
102 NodeType flatNodeType = (NodeType) toscaAnalyzerService
103 .getFlatEntity(ToscaElementTypes.NODE_TYPE, nodeType, substitutionServiceTemplate,
106 nodeTypeRequirementsDefinition =
107 getNodeTypeRequirements(flatNodeType, nodeTemplateId, substitutionServiceTemplate,
108 requirementSubstitutionMapping);
109 nodeTemplateRequirementsAssignment =
110 DataModelUtil.getNodeTemplateRequirements(nodeTemplate);
111 fullFilledRequirementsDefinition.put(nodeTemplateId, nodeTemplateRequirementsAssignment);
112 //set substitution node type requirements
113 exposedRequirementsDefinition =
114 toscaAnalyzerService.calculateExposedRequirements(nodeTypeRequirementsDefinition,
115 nodeTemplateRequirementsAssignment);
118 //Filter unsupported requirements
119 Iterator<Map<String, RequirementDefinition>> iterator =
120 exposedRequirementsDefinition.iterator();
121 while (iterator.hasNext()) {
122 Map<String, RequirementDefinition> requirementDefinitionMap = iterator.next();
123 for (Map.Entry<String, RequirementDefinition> requirementDefinitionEntry :
124 requirementDefinitionMap.entrySet()) {
125 String requirementKey = requirementDefinitionEntry.getKey();
126 if (!supportedRequirements.contains(requirementKey)) {
131 addSubstitutionNodeTypeRequirements(substitutionNodeType, exposedRequirementsDefinition,
134 addNodeTypeCapabilitiesToSubMapping(nodeTypeCapabilitiesDefinition,
135 capabilitySubstitutionMapping, nodeType,
136 nodeTemplateId, substitutionServiceTemplate, toscaServiceModel);
139 exposedCapabilitiesDefinition =
140 toscaAnalyzerService.calculateExposedCapabilities(nodeTypeCapabilitiesDefinition,
141 fullFilledRequirementsDefinition);
143 //Filter unsupported capabilities
144 Iterator<Map.Entry<String, CapabilityDefinition>> iterator = exposedCapabilitiesDefinition
145 .entrySet().iterator();
146 while (iterator.hasNext()) {
147 Map.Entry<String, CapabilityDefinition> capabilityDefinitionEntry = iterator.next();
148 //Expected Capability is of the format <capabilityId>_<componentName>
149 String capabilityKey = capabilityDefinitionEntry.getKey().split("_")[0];
150 if (!supportedCapabilities.contains(capabilityKey)) {
155 DataModelUtil.addNodeTypeCapabilitiesDef(substitutionNodeType, exposedCapabilitiesDefinition);
156 } catch (Exception ex) {
159 return substitutionMapping;
163 * Gets node type requirements.
165 * @param flatNodeType the flat node type
166 * @param templateName the template name
167 * @param serviceTemplate the service template
168 * @param requirementSubstitutionMapping the requirement substitution mapping
169 * @return the node type requirements
171 public static List<Map<String, RequirementDefinition>> getNodeTypeRequirements(
172 NodeType flatNodeType,
174 ServiceTemplate serviceTemplate,
175 Map<String, List<String>> requirementSubstitutionMapping) {
176 List<Map<String, RequirementDefinition>> requirementList = new ArrayList<>();
177 List<String> requirementMapping;
178 if (flatNodeType.getRequirements() != null) {
179 for (Map<String, RequirementDefinition> requirementMap : flatNodeType.getRequirements()) {
180 for (Map.Entry<String, RequirementDefinition> requirementNodeEntry : requirementMap
182 ToscaExtensionYamlUtil toscaExtensionYamlUtil = new ToscaExtensionYamlUtil();
183 RequirementDefinition requirementNodeEntryValue = toscaExtensionYamlUtil
184 .yamlToObject(toscaExtensionYamlUtil.objectToYaml(requirementNodeEntry.getValue()),
185 RequirementDefinition.class);
186 if (requirementNodeEntryValue.getOccurrences() == null) {
187 requirementNodeEntryValue.setOccurrences(new Object[]{1, 1});
189 Map<String, RequirementDefinition> requirementDef = new HashMap<>();
190 requirementDef.put(requirementNodeEntry.getKey(), requirementNodeEntryValue);
191 DataModelUtil.addRequirementToList(requirementList, requirementDef);
192 requirementMapping = new ArrayList<>();
193 requirementMapping.add(templateName);
194 requirementMapping.add(requirementNodeEntry.getKey());
195 requirementSubstitutionMapping
196 .put(requirementNodeEntry.getKey() + "_" + templateName, requirementMapping);
197 if (requirementNodeEntryValue.getNode() == null) {
198 requirementNodeEntryValue.setOccurrences(new Object[]{1, 1});
203 return requirementList;
206 private static void addNodeTypeCapabilitiesToSubMapping(
207 Map<String, CapabilityDefinition> nodeTypeCapabilitiesDefinition,
208 Map<String, List<String>> capabilitySubstitutionMapping, String type, String templateName,
209 ServiceTemplate substitutionServiceTemplate, ToscaServiceModel toscaServiceModel) {
210 ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl();
211 NodeType flatNodeType = (NodeType) toscaAnalyzerService
212 .getFlatEntity(ToscaElementTypes.NODE_TYPE, type, substitutionServiceTemplate,
214 String capabilityKey;
215 List<String> capabilityMapping;
216 if (flatNodeType.getCapabilities() != null) {
217 for (Map.Entry<String, CapabilityDefinition> capabilityNodeEntry : flatNodeType
220 capabilityKey = capabilityNodeEntry.getKey() + "_" + templateName;
221 nodeTypeCapabilitiesDefinition.put(capabilityKey, capabilityNodeEntry.getValue().clone());
222 capabilityMapping = new ArrayList<>();
223 capabilityMapping.add(templateName);
224 capabilityMapping.add(capabilityNodeEntry.getKey());
225 capabilitySubstitutionMapping.put(capabilityKey, capabilityMapping);