1 package org.openecomp.sdc.generator.core.utils;
3 import org.onap.sdc.tosca.datatypes.model.*;
4 import org.onap.sdc.tosca.services.ToscaExtensionYamlUtil;
5 import org.openecomp.sdc.tosca.datatypes.ToscaElementTypes;
6 import org.openecomp.sdc.tosca.datatypes.ToscaServiceModel;
7 import org.openecomp.sdc.tosca.services.DataModelUtil;
8 import org.openecomp.sdc.tosca.services.ToscaAnalyzerService;
9 import org.openecomp.sdc.tosca.services.ToscaUtil;
10 import org.openecomp.sdc.tosca.services.impl.ToscaAnalyzerServiceImpl;
14 import static org.openecomp.sdc.tosca.services.DataModelUtil.addSubstitutionNodeTypeRequirements;
17 * The type Generator utils.
19 public class GeneratorUtils {
21 private GeneratorUtils() {
22 // prevent instantiation
25 //TODO : Read from configuration
26 private static final List<String> SUPPORTED_CAPABILITIES = Arrays.asList("host", "os", "endpoint", "scalable");
27 private static final List<String> SUPPORTED_REQUIREMENTS = Collections.singletonList("link");
30 * Add service template to tosca service model.
32 * @param toscaServiceModel the tosca service model
33 * @param serviceTemplate the service template
35 public static void addServiceTemplateToToscaServiceModel(ToscaServiceModel toscaServiceModel,
36 ServiceTemplate serviceTemplate) {
38 String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate);
39 Map<String, ServiceTemplate> serviceTemplates = toscaServiceModel.getServiceTemplates();
40 if (!serviceTemplates.containsKey(serviceTemplateFileName)) {
41 ToscaUtil.addServiceTemplateToMapWithKeyFileName(serviceTemplates, serviceTemplate);
43 toscaServiceModel.setServiceTemplates(serviceTemplates);
47 * Gets substitution node type exposed connection points.
49 * @param substitutionNodeType the substitution node type
50 * @param substitutionServiceTemplate the substitution service template
51 * @param toscaServiceModel the tosca service model
52 * @return the substitution node type exposed connection points
54 public static Map<String, Map<String, List<String>>> getSubstitutionNodeTypeExposedConnectionPoints(NodeType substitutionNodeType,
55 ServiceTemplate substitutionServiceTemplate,
56 ToscaServiceModel toscaServiceModel) {
58 Map<String, NodeTemplate> nodeTemplates =
59 substitutionServiceTemplate.getTopology_template().getNode_templates();
60 String nodeTemplateId;
61 NodeTemplate nodeTemplate;
63 Map<String, Map<String, List<String>>> substitutionMapping = new HashMap<>();
64 if (nodeTemplates == null) {
65 return substitutionMapping;
69 Map<String, List<String>> capabilitySubstitutionMapping = new HashMap<>();
70 Map<String, List<String>> requirementSubstitutionMapping = new HashMap<>();
71 substitutionMapping.put("capability", capabilitySubstitutionMapping);
72 substitutionMapping.put("requirement", requirementSubstitutionMapping);
73 List<Map<String, RequirementDefinition>> nodeTypeRequirementsDefinition;
74 Map<String, RequirementAssignment> nodeTemplateRequirementsAssignment;
75 List<Map<String, RequirementDefinition>> exposedRequirementsDefinition;
76 Map<String, Map<String, RequirementAssignment>> fullFilledRequirementsDefinition = new HashMap<>();
77 Map<String, CapabilityDefinition> nodeTypeCapabilitiesDefinition = new HashMap<>();
78 Map<String, CapabilityDefinition> exposedCapabilitiesDefinition;
80 ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl();
81 for (Map.Entry<String, NodeTemplate> entry : nodeTemplates.entrySet()) {
82 nodeTemplateId = entry.getKey();
83 nodeTemplate = entry.getValue();
84 nodeType = nodeTemplate.getType();
85 NodeType flatNodeType = (NodeType) toscaAnalyzerService
86 .getFlatEntity(ToscaElementTypes.NODE_TYPE, nodeType,
87 substitutionServiceTemplate, toscaServiceModel)
90 nodeTypeRequirementsDefinition =
91 getNodeTypeRequirements(flatNodeType, nodeTemplateId, substitutionServiceTemplate,
92 requirementSubstitutionMapping);
93 nodeTemplateRequirementsAssignment = DataModelUtil.getNodeTemplateRequirements(nodeTemplate);
94 fullFilledRequirementsDefinition.put(nodeTemplateId, nodeTemplateRequirementsAssignment);
95 //set substitution node type requirements
96 exposedRequirementsDefinition = toscaAnalyzerService
97 .calculateExposedRequirements(nodeTypeRequirementsDefinition,
98 nodeTemplateRequirementsAssignment);
101 //Filter unsupported requirements
102 Iterator<Map<String, RequirementDefinition>> iterator = exposedRequirementsDefinition.iterator();
103 while (iterator.hasNext()) {
104 Map<String, RequirementDefinition> requirementDefinitionMap = iterator.next();
105 for (Map.Entry<String, RequirementDefinition> requirementDefinitionEntry : requirementDefinitionMap
107 String requirementKey = requirementDefinitionEntry.getKey();
108 if (!SUPPORTED_REQUIREMENTS.contains(requirementKey)) {
113 addSubstitutionNodeTypeRequirements(substitutionNodeType, exposedRequirementsDefinition,
116 addNodeTypeCapabilitiesToSubMapping(nodeTypeCapabilitiesDefinition, capabilitySubstitutionMapping,
117 nodeType, nodeTemplateId, substitutionServiceTemplate, toscaServiceModel);
120 exposedCapabilitiesDefinition = toscaAnalyzerService
121 .calculateExposedCapabilities(nodeTypeCapabilitiesDefinition,
122 fullFilledRequirementsDefinition);
124 //Filter unsupported capabilities
125 Iterator<Map.Entry<String, CapabilityDefinition>> iterator =
126 exposedCapabilitiesDefinition.entrySet().iterator();
127 while (iterator.hasNext()) {
128 Map.Entry<String, CapabilityDefinition> capabilityDefinitionEntry = iterator.next();
129 //Expected Capability is of the format <capabilityId>_<componentName>
130 String capabilityKey = capabilityDefinitionEntry.getKey().split("_")[0];
131 if (!SUPPORTED_CAPABILITIES.contains(capabilityKey)) {
136 DataModelUtil.addNodeTypeCapabilitiesDef(substitutionNodeType, exposedCapabilitiesDefinition);
137 } catch (Exception ex) {
140 return substitutionMapping;
144 * Gets node type requirements.
146 * @param flatNodeType the flat node type
147 * @param templateName the template name
148 * @param serviceTemplate the service template
149 * @param requirementSubstitutionMapping the requirement substitution mapping
150 * @return the node type requirements
152 public static List<Map<String, RequirementDefinition>> getNodeTypeRequirements(NodeType flatNodeType,
154 ServiceTemplate serviceTemplate,
155 Map<String, List<String>> requirementSubstitutionMapping) {
156 List<Map<String, RequirementDefinition>> requirementList = new ArrayList<>();
157 List<String> requirementMapping;
158 if (flatNodeType.getRequirements() != null) {
159 for (Map<String, RequirementDefinition> requirementMap : flatNodeType.getRequirements()) {
160 for (Map.Entry<String, RequirementDefinition> requirementNodeEntry : requirementMap.entrySet()) {
161 ToscaExtensionYamlUtil toscaExtensionYamlUtil = new ToscaExtensionYamlUtil();
162 RequirementDefinition requirementNodeEntryValue = toscaExtensionYamlUtil.yamlToObject(
163 toscaExtensionYamlUtil.objectToYaml(requirementNodeEntry.getValue()),
164 RequirementDefinition.class);
165 if (requirementNodeEntryValue.getOccurrences() == null) {
166 requirementNodeEntryValue.setOccurrences(new Object[] {1, 1});
168 Map<String, RequirementDefinition> requirementDef = new HashMap<>();
169 requirementDef.put(requirementNodeEntry.getKey(), requirementNodeEntryValue);
170 DataModelUtil.addRequirementToList(requirementList, requirementDef);
171 requirementMapping = new ArrayList<>();
172 requirementMapping.add(templateName);
173 requirementMapping.add(requirementNodeEntry.getKey());
174 requirementSubstitutionMapping
175 .put(requirementNodeEntry.getKey() + "_" + templateName, requirementMapping);
176 if (requirementNodeEntryValue.getNode() == null) {
177 requirementNodeEntryValue.setOccurrences(new Object[] {1, 1});
182 return requirementList;
185 private static void addNodeTypeCapabilitiesToSubMapping(Map<String, CapabilityDefinition> nodeTypeCapabilitiesDefinition,
186 Map<String, List<String>> capabilitySubstitutionMapping,
187 String type, String templateName,
188 ServiceTemplate substitutionServiceTemplate,
189 ToscaServiceModel toscaServiceModel) {
190 ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl();
191 NodeType flatNodeType = (NodeType) toscaAnalyzerService.getFlatEntity(ToscaElementTypes.NODE_TYPE, type,
192 substitutionServiceTemplate, toscaServiceModel).getFlatEntity();
193 String capabilityKey;
194 List<String> capabilityMapping;
195 if (flatNodeType.getCapabilities() != null) {
196 for (Map.Entry<String, CapabilityDefinition> capabilityNodeEntry : flatNodeType.getCapabilities()
198 capabilityKey = capabilityNodeEntry.getKey() + "_" + templateName;
199 nodeTypeCapabilitiesDefinition.put(capabilityKey, capabilityNodeEntry.getValue().clone());
200 capabilityMapping = new ArrayList<>();
201 capabilityMapping.add(templateName);
202 capabilityMapping.add(capabilityNodeEntry.getKey());
203 capabilitySubstitutionMapping.put(capabilityKey, capabilityMapping);