2 * Copyright © 2016-2018 European Support Limited
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 package org.openecomp.sdc.translator.services.heattotosca;
19 import static org.openecomp.sdc.tosca.datatypes.ToscaFunctions.GET_INPUT;
20 import static org.openecomp.sdc.tosca.datatypes.ToscaNodeType.GROUP_TYPE_PREFIX;
21 import static org.openecomp.sdc.tosca.datatypes.ToscaNodeType.VFC_INSTANCE_GROUP;
22 import static org.openecomp.sdc.tosca.services.DataModelUtil.getClonedObject;
23 import static org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.UnifiedCompositionEntity.COMPUTE;
24 import static org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.UnifiedCompositionEntity.PORT;
25 import static org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.UnifiedCompositionEntity.SUB_INTERFACE;
26 import static org.openecomp.sdc.translator.services.heattotosca.Constants.ABSTRACT_NODE_TEMPLATE_ID_PREFIX;
27 import static org.openecomp.sdc.translator.services.heattotosca.Constants.COMPUTE_IDENTICAL_VALUE_PROPERTY_PREFIX;
28 import static org.openecomp.sdc.translator.services.heattotosca.Constants.COMPUTE_IDENTICAL_VALUE_PROPERTY_SUFFIX;
29 import static org.openecomp.sdc.translator.services.heattotosca.Constants.GROUP;
30 import static org.openecomp.sdc.translator.services.heattotosca.Constants.PORT_IDENTICAL_VALUE_PROPERTY_PREFIX;
31 import static org.openecomp.sdc.translator.services.heattotosca.Constants.SUB_INTERFACE_PROPERTY_VALUE_PREFIX;
32 import static org.openecomp.sdc.translator.services.heattotosca.Constants.SUB_INTERFACE_ROLE;
33 import static org.openecomp.sdc.translator.services.heattotosca.Constants.VFC_PARENT_PORT_ROLE;
34 import static org.openecomp.sdc.translator.services.heattotosca.UnifiedCompositionUtil.getComputeTypeSuffix;
35 import static org.openecomp.sdc.translator.services.heattotosca.UnifiedCompositionUtil.getConnectedComputeConsolidationData;
36 import static org.openecomp.sdc.translator.services.heattotosca.UnifiedCompositionUtil.getNewComputeNodeTemplateId;
37 import static org.openecomp.sdc.translator.services.heattotosca.UnifiedCompositionUtil.getNewPortNodeTemplateId;
38 import static org.openecomp.sdc.translator.services.heattotosca.UnifiedCompositionUtil.getNewSubInterfaceNodeTemplateId;
39 import static org.openecomp.sdc.translator.services.heattotosca.UnifiedCompositionUtil.getSubInterfaceTemplateConsolidationDataList;
40 import static org.openecomp.sdc.translator.services.heattotosca.UnifiedCompositionUtil.getSubInterfaceTypeSuffix;
42 import com.google.common.collect.ArrayListMultimap;
43 import com.google.common.collect.ListMultimap;
44 import com.google.common.collect.Multimap;
46 import java.util.ArrayList;
47 import java.util.Collection;
48 import java.util.EnumMap;
49 import java.util.HashMap;
50 import java.util.HashSet;
51 import java.util.LinkedHashMap;
52 import java.util.List;
54 import java.util.Objects;
55 import java.util.Optional;
57 import java.util.regex.Pattern;
58 import java.util.stream.Collectors;
60 import org.apache.commons.collections.map.HashedMap;
61 import org.apache.commons.collections4.CollectionUtils;
62 import org.apache.commons.collections4.MapUtils;
63 import org.apache.commons.lang3.StringUtils;
64 import org.apache.commons.lang3.tuple.ImmutablePair;
65 import org.apache.commons.lang3.tuple.Pair;
66 import org.onap.config.api.Configuration;
67 import org.onap.config.api.ConfigurationManager;
68 import org.onap.sdc.tosca.datatypes.model.AttributeDefinition;
69 import org.onap.sdc.tosca.datatypes.model.CapabilityDefinition;
70 import org.onap.sdc.tosca.datatypes.model.Constraint;
71 import org.onap.sdc.tosca.datatypes.model.EntrySchema;
72 import org.onap.sdc.tosca.datatypes.model.GroupDefinition;
73 import org.onap.sdc.tosca.datatypes.model.NodeTemplate;
74 import org.onap.sdc.tosca.datatypes.model.NodeType;
75 import org.onap.sdc.tosca.datatypes.model.ParameterDefinition;
76 import org.onap.sdc.tosca.datatypes.model.PropertyDefinition;
77 import org.onap.sdc.tosca.datatypes.model.PropertyType;
78 import org.onap.sdc.tosca.datatypes.model.RelationshipTemplate;
79 import org.onap.sdc.tosca.datatypes.model.RequirementAssignment;
80 import org.onap.sdc.tosca.datatypes.model.ServiceTemplate;
81 import org.onap.sdc.tosca.datatypes.model.SubstitutionMapping;
82 import org.onap.sdc.tosca.datatypes.model.heatextend.PropertyTypeExt;
83 import org.openecomp.core.utilities.CommonMethods;
84 import org.openecomp.sdc.common.utils.CommonUtil;
85 import org.openecomp.sdc.datatypes.configuration.ImplementationConfiguration;
86 import org.openecomp.sdc.heat.services.HeatConstants;
87 import org.openecomp.sdc.tosca.datatypes.ToscaFunctions;
88 import org.openecomp.sdc.tosca.datatypes.ToscaGroupType;
89 import org.openecomp.sdc.tosca.datatypes.ToscaNodeType;
90 import org.openecomp.sdc.tosca.datatypes.ToscaRelationshipType;
91 import org.openecomp.sdc.tosca.services.DataModelUtil;
92 import org.openecomp.sdc.tosca.services.ToscaAnalyzerService;
93 import org.openecomp.sdc.tosca.services.ToscaConstants;
94 import org.openecomp.sdc.tosca.services.ToscaUtil;
95 import org.openecomp.sdc.tosca.services.impl.ToscaAnalyzerServiceImpl;
96 import org.openecomp.sdc.translator.datatypes.heattotosca.TranslationContext;
97 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.UnifiedCompositionData;
98 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.UnifiedCompositionEntity;
99 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.UnifiedCompositionMode;
100 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.UnifiedSubstitutionData;
101 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.commands.CommandImplNames;
102 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.commands.UnifiedSubstitutionNodeTemplateIdGenerator;
103 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.to.UnifiedCompositionTo;
104 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.ComputeTemplateConsolidationData;
105 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.ConsolidationData;
106 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.EntityConsolidationData;
107 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.FileComputeConsolidationData;
108 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.FilePortConsolidationData;
109 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.GetAttrFuncData;
110 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.NestedTemplateConsolidationData;
111 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.PortTemplateConsolidationData;
112 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.RequirementAssignmentData;
113 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.SubInterfaceTemplateConsolidationData;
114 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.TypeComputeConsolidationData;
116 public class UnifiedCompositionService {
118 private static final Map<String, ImplementationConfiguration> unifiedCompositionImplMap;
120 private static final EnumMap<UnifiedCompositionEntity, String> unifiedSubstitutionNodeTemplateIdGeneratorImplMap;
121 private static final String SUB_INTERFACE_INDICATOR_PROPERTY = "subinterface_indicator";
122 private final ConsolidationService consolidationService = new ConsolidationService();
125 Configuration config = ConfigurationManager.lookup();
126 unifiedCompositionImplMap =
127 config.populateMap(ConfigConstants.MANDATORY_UNIFIED_MODEL_NAMESPACE,
128 ConfigConstants.UNIFIED_COMPOSITION_IMPL_KEY, ImplementationConfiguration.class);
129 unifiedSubstitutionNodeTemplateIdGeneratorImplMap = new EnumMap<>(UnifiedCompositionEntity.class);
130 initNodeTemplateIdGeneratorImplMap();
133 private static void initNodeTemplateIdGeneratorImplMap() {
134 unifiedSubstitutionNodeTemplateIdGeneratorImplMap.put(COMPUTE, CommandImplNames
135 .COMPUTE_NEW_NODE_TEMPLATE_ID_GENERATOR_IMPL);
136 unifiedSubstitutionNodeTemplateIdGeneratorImplMap.put(PORT, CommandImplNames
137 .PORT_NEW_NODE_TEMPLATE_ID_GENERATOR_IMPL);
138 unifiedSubstitutionNodeTemplateIdGeneratorImplMap.put(SUB_INTERFACE, CommandImplNames
139 .SUB_INTERFACE_NEW_NODE_TEMPLATE_ID_GENERATOR_IMPL);
142 private static List<EntityConsolidationData> getPortConsolidationDataList(
143 List<String> portIds,
144 List<UnifiedCompositionData> unifiedCompositionDataList) {
145 return unifiedCompositionDataList.stream()
146 .flatMap(unifiedCompositionData -> unifiedCompositionData.getPortTemplateConsolidationDataList().stream())
147 .filter(portTemplateConsolidationData -> portIds.contains(portTemplateConsolidationData.getNodeTemplateId()))
148 .collect(Collectors.toList());
152 * Create unified composition.
154 * @param serviceTemplate the service template
155 * @param nestedServiceTemplate the nested service template
156 * @param unifiedCompositionDataList the unified composition data list. In case no consolidation,
157 * one entry will be in this list, in case of having
158 * consolidation, all entries in the list are the once which
159 * need to be consolidated.
160 * @param mode the mode
161 * @param context the context
163 public void createUnifiedComposition(ServiceTemplate serviceTemplate,
164 ServiceTemplate nestedServiceTemplate,
165 List<UnifiedCompositionData> unifiedCompositionDataList,
166 UnifiedCompositionMode mode, TranslationContext context) {
167 Optional<UnifiedComposition> unifiedCompositionInstance = getUnifiedCompositionInstance(mode);
168 if (!unifiedCompositionInstance.isPresent()) {
171 unifiedCompositionInstance.get()
172 .createUnifiedComposition(serviceTemplate, nestedServiceTemplate,
173 unifiedCompositionDataList, context);
177 * Create unified substitution service template according to the input service template, based on
178 * the unified composition data.
180 * @param serviceTemplate the service template
181 * @param unifiedCompositionDataList the unified composition data list. In case no consolidation,
182 * one entry will be in this list, in case of having
183 * consolidation, all entries in the list are the once which
184 * need to be consolidated.
185 * @param context the translation context
186 * @return the substitution service template
188 public Optional<ServiceTemplate> createUnifiedSubstitutionServiceTemplate(
189 ServiceTemplate serviceTemplate,
190 List<UnifiedCompositionData> unifiedCompositionDataList,
191 TranslationContext context,
192 String substitutionNodeTypeId,
194 if (CollectionUtils.isEmpty(unifiedCompositionDataList)) {
195 return Optional.empty();
197 String templateName = getTemplateName(substitutionNodeTypeId, index);
198 ServiceTemplate substitutionServiceTemplate =
199 HeatToToscaUtil.createInitSubstitutionServiceTemplate(templateName);
201 createIndexInputParameter(substitutionServiceTemplate);
203 String computeNodeType =
204 handleCompute(serviceTemplate, substitutionServiceTemplate, unifiedCompositionDataList,
206 handlePorts(serviceTemplate, substitutionServiceTemplate, unifiedCompositionDataList,
207 computeNodeType, context);
209 UnifiedCompositionTo unifiedCompositionTo = new UnifiedCompositionTo(serviceTemplate,
210 substitutionServiceTemplate, unifiedCompositionDataList, context, null);
211 handleSubInterfaces(unifiedCompositionTo);
212 createOutputParameters(unifiedCompositionTo, computeNodeType);
213 NodeType substitutionGlobalNodeType =
214 handleSubstitutionGlobalNodeType(serviceTemplate, substitutionServiceTemplate,
215 context, substitutionNodeTypeId);
217 HeatToToscaUtil.handleSubstitutionMapping(context,
218 substitutionNodeTypeId,
219 substitutionServiceTemplate, substitutionGlobalNodeType);
221 context.getTranslatedServiceTemplates().put(templateName, substitutionServiceTemplate);
222 return Optional.of(substitutionServiceTemplate);
227 * Create abstract substitute node template that can be substituted by the input
228 * substitutionServiceTemplate.
230 * @param serviceTemplate the service template
231 * @param substitutionServiceTemplate the subtitution service template
232 * @param unifiedCompositionDataList the unified composition data list. In case no consolidation,
233 * one entry will be in this list, in case of having
234 * consolidation, all entries in the list are the once which
235 * need to be consolidated.
236 * @param context the translation context
237 * @return the abstract substitute node template id
239 public String createAbstractSubstituteNodeTemplate(
240 ServiceTemplate serviceTemplate,
241 ServiceTemplate substitutionServiceTemplate,
242 List<UnifiedCompositionData> unifiedCompositionDataList,
243 String substituteNodeTypeId,
244 TranslationContext context,
247 NodeTemplate substitutionNodeTemplate = new NodeTemplate();
248 List<String> directiveList = new ArrayList<>();
249 directiveList.add(ToscaConstants.NODE_TEMPLATE_DIRECTIVE_SUBSTITUTABLE);
250 substitutionNodeTemplate.setDirectives(directiveList);
251 substitutionNodeTemplate.setType(substituteNodeTypeId);
252 Map<String, ParameterDefinition> substitutionTemplateInputs = DataModelUtil
253 .getInputParameters(substitutionServiceTemplate);
254 Optional<Map<String, Object>> abstractSubstitutionProperties = Optional.empty();
255 if (Objects.nonNull(substitutionTemplateInputs)) {
256 abstractSubstitutionProperties = createAbstractSubstitutionProperties(serviceTemplate,
257 substitutionTemplateInputs, unifiedCompositionDataList, context);
259 abstractSubstitutionProperties.ifPresent(substitutionNodeTemplate::setProperties);
261 //Add substitution filtering property
262 String substitutionServiceTemplateName = ToscaUtil.getServiceTemplateFileName(
263 substitutionServiceTemplate);
264 int count = unifiedCompositionDataList.size();
265 DataModelUtil.addSubstitutionFilteringProperty(substitutionServiceTemplateName,
266 substitutionNodeTemplate, count);
267 //Add index_value property
268 addIndexValueProperty(substitutionNodeTemplate);
269 String substituteNodeTemplateId = getSubstituteNodeTemplateId(substituteNodeTypeId, index);
270 //Add node template id and related abstract node template id in context
271 addUnifiedSubstitionData(context, serviceTemplate, unifiedCompositionDataList,
272 substituteNodeTemplateId);
274 .addNodeTemplate(serviceTemplate, substituteNodeTemplateId, substitutionNodeTemplate);
275 return substituteNodeTemplateId;
279 public void createVfcInstanceGroup(String abstractNodeTemplateId,
280 ServiceTemplate serviceTemplate,
281 List<UnifiedCompositionData> unifiedCompositionDataList,
282 TranslationContext context) {
283 if (!TranslationContext.isVfcInstanceGroupingEnabled()) {
286 UnifiedCompositionTo unifiedCompositionTo = new UnifiedCompositionTo(serviceTemplate, null,
287 unifiedCompositionDataList, context, null);
288 unifiedCompositionDataList.forEach(unifiedCompositionData ->
289 createSubInterfaceVfcInstanceGroup(abstractNodeTemplateId, unifiedCompositionTo, unifiedCompositionData));
292 private void createSubInterfaceVfcInstanceGroup(String abstractNodeTemplateId,
293 UnifiedCompositionTo unifiedCompositionTo,
294 UnifiedCompositionData unifiedCompositionData) {
295 List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList =
296 getSubInterfaceTemplateConsolidationDataList(unifiedCompositionData);
297 for (SubInterfaceTemplateConsolidationData subInterface : subInterfaceTemplateConsolidationDataList) {
298 Optional<String> parentPortNetworkRole;
299 if (Objects.isNull(unifiedCompositionTo.getSubstitutionServiceTemplate())) {
300 parentPortNetworkRole = subInterface.getParentPortNetworkRole(unifiedCompositionTo.getServiceTemplate(),
301 unifiedCompositionTo.getContext());
303 parentPortNetworkRole = subInterface.getParentPortNetworkRole(unifiedCompositionTo
304 .getSubstitutionServiceTemplate(), unifiedCompositionTo.getContext());
306 String subInterfaceNetworkRole = subInterface.getNetworkRole();
307 if (Objects.nonNull(subInterfaceNetworkRole) && parentPortNetworkRole.isPresent()) {
308 createVfcInstanceGroupPerSubInterfaceNetworkRole(abstractNodeTemplateId, subInterfaceNetworkRole,
309 parentPortNetworkRole.get(), unifiedCompositionTo.getServiceTemplate());
314 private void createVfcInstanceGroupPerSubInterfaceNetworkRole(String abstractNodeTemplateId,
315 String subInterfaceNetworkRole,
316 String parentPortNetworkRole,
317 ServiceTemplate serviceTemplate) {
318 String vfcNetworkRoleGroupId = getVfcNetworkRoleGroupId(subInterfaceNetworkRole);
319 Map<String, GroupDefinition> groups = DataModelUtil.getGroups(serviceTemplate);
320 if (!groups.containsKey(vfcNetworkRoleGroupId)) {
321 createNewVfcInstanceGroup(serviceTemplate, parentPortNetworkRole, subInterfaceNetworkRole, vfcNetworkRoleGroupId);
323 DataModelUtil.addGroupMember(serviceTemplate, vfcNetworkRoleGroupId, abstractNodeTemplateId);
326 private void createNewVfcInstanceGroup(ServiceTemplate serviceTemplate,
327 String parentPortNetworkRole,
328 String subInterfaceNetworkRole,
329 String vfcNetworkRoleGroupId) {
330 Map<String, Object> properties = new HashMap<>();
331 properties.put(SUB_INTERFACE_ROLE, subInterfaceNetworkRole);
332 properties.put(VFC_PARENT_PORT_ROLE, parentPortNetworkRole);
334 updateVfcInstanceGroupExposedProperties(subInterfaceNetworkRole,
335 serviceTemplate, properties);
337 GroupDefinition groupDefinition = new GroupDefinition();
338 groupDefinition.setType(GROUP_TYPE_PREFIX + VFC_INSTANCE_GROUP);
339 groupDefinition.setProperties(properties);
341 DataModelUtil.addGroupDefinitionToTopologyTemplate(serviceTemplate,
342 vfcNetworkRoleGroupId, groupDefinition);
345 private void updateVfcInstanceGroupExposedProperties(String subInterfaceNetworkRole,
346 ServiceTemplate serviceTemplate,
347 Map<String, Object> properties) {
348 List<String> exposedVfcInstanceGroupingProperties =
349 TranslationContext.getExposedVfcInstanceGroupingProperties();
351 if (CollectionUtils.isEmpty(exposedVfcInstanceGroupingProperties)) {
355 for (String propertyName : exposedVfcInstanceGroupingProperties) {
356 Map<String, Object> getInputMap = new HashMap<>();
357 String vfcGroupPropertyInputName = subInterfaceNetworkRole + "_" + propertyName;
358 getInputMap.put(GET_INPUT.getDisplayName(), vfcGroupPropertyInputName);
359 properties.put(propertyName, getInputMap);
361 addInputParameter(vfcGroupPropertyInputName, PropertyType.STRING.getDisplayName(), null,
366 private String getVfcNetworkRoleGroupId(String subInterfaceNetworkRole) {
367 StringBuilder sb = new StringBuilder();
368 sb.append(subInterfaceNetworkRole).append("_").append(GROUP);
369 return sb.toString();
373 * Update the connectivity from/to the "moved" nodes from the original service template to the new
374 * substitution service template.
376 * @param serviceTemplate the service template
377 * @param unifiedCompositionDataList the unified composition data list. In case no consolidation,
378 * one entry will be in this list, in case of having
379 * consolidation, all entries in the list are the once which
380 * need to be consolidated.
381 * @param context the translation context
383 public void updateCompositionConnectivity(ServiceTemplate serviceTemplate,
384 List<UnifiedCompositionData> unifiedCompositionDataList,
385 TranslationContext context) {
386 updOutputParamGetAttrInConnectivity(serviceTemplate, unifiedCompositionDataList, context);
387 updNodesGetAttrInConnectivity(serviceTemplate, unifiedCompositionDataList, context);
388 updNodesConnectedOutConnectivity(serviceTemplate, unifiedCompositionDataList, context);
389 updNodesConnectedInConnectivity(serviceTemplate, unifiedCompositionDataList, context);
390 updVolumeConnectivity(serviceTemplate, unifiedCompositionDataList, context);
391 updGroupsConnectivity(serviceTemplate, unifiedCompositionDataList, context);
395 * Delete the "moved" nodes from the original service template to the new substitution service
398 * @param serviceTemplate the service template
399 * @param unifiedCompositionDataList the unified composition data list. In case no consolidation,
400 * one entry will be in this list, in case of having
401 * consolidation, all entries in the list are the once which
402 * need to be consolidated.
403 * @param context the translation context
405 public void cleanUnifiedCompositionEntities(
406 ServiceTemplate serviceTemplate,
407 List<UnifiedCompositionData> unifiedCompositionDataList,
408 TranslationContext context) {
409 for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) {
410 //Clean compute node template data from top level service template
411 ComputeTemplateConsolidationData computeTemplateConsolidationData =
412 unifiedCompositionData.getComputeTemplateConsolidationData();
413 cleanServiceTemplate(serviceTemplate, computeTemplateConsolidationData, context);
415 //Clean port node template data from top level service template
416 List<PortTemplateConsolidationData> portTemplateConsolidationDataList =
417 getPortTemplateConsolidationDataList(unifiedCompositionData);
418 for (PortTemplateConsolidationData portTemplateConsolidationData :
419 portTemplateConsolidationDataList) {
420 cleanServiceTemplate(serviceTemplate, portTemplateConsolidationData, context);
423 //Clean sub-interface node template data from top level service template
424 List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList =
425 getSubInterfaceTemplateConsolidationDataList(unifiedCompositionData);
426 for (SubInterfaceTemplateConsolidationData subInterfaceTemplateConsolidationData :
427 subInterfaceTemplateConsolidationDataList) {
428 cleanServiceTemplate(serviceTemplate, subInterfaceTemplateConsolidationData, context);
436 * @param serviceTemplate the service template
437 * @param unifiedCompositionDataList the unified composition data list
438 * @param context the context
440 public void cleanNodeTypes(ServiceTemplate serviceTemplate,
441 List<UnifiedCompositionData> unifiedCompositionDataList,
442 TranslationContext context) {
443 for (UnifiedCompositionData unifiedData : unifiedCompositionDataList) {
444 removeCleanedNodeType(
445 unifiedData.getComputeTemplateConsolidationData().getNodeTemplateId(), serviceTemplate,
448 if (MapUtils.isEmpty(serviceTemplate.getNode_types())) {
449 serviceTemplate.setNode_types(null);
453 public void updateSubstitutionNodeTypePrefix(ServiceTemplate substitutionServiceTemplate) {
454 Map<String, NodeTemplate> nodeTemplates =
455 substitutionServiceTemplate.getTopology_template().getNode_templates();
457 for (Map.Entry<String, NodeTemplate> nodeTemplateEntry : nodeTemplates.entrySet()) {
458 String nodeTypeId = nodeTemplateEntry.getValue().getType();
459 NodeType origNodeType = substitutionServiceTemplate.getNode_types().get(nodeTypeId);
460 if (Objects.nonNull(origNodeType)
461 && nodeTypeId.startsWith(ToscaNodeType.VFC_TYPE_PREFIX)
462 && origNodeType.getDerived_from().equals(ToscaNodeType.NOVA_SERVER)) {
463 substitutionServiceTemplate.getNode_types().remove(nodeTypeId);
465 String newNodeTypeId =
466 nodeTypeId.replace(ToscaNodeType.VFC_TYPE_PREFIX, ToscaNodeType.COMPUTE_TYPE_PREFIX);
467 nodeTemplateEntry.getValue().setType(newNodeTypeId);
469 .addNodeTemplate(substitutionServiceTemplate, nodeTemplateEntry.getKey(),
470 nodeTemplateEntry.getValue());
471 substitutionServiceTemplate.getNode_types().put(newNodeTypeId, origNodeType);
477 * Update unified abstract nodes connectivity.
479 * @param serviceTemplate the service template
480 * @param context the context
482 public void updateUnifiedAbstractNodesConnectivity(ServiceTemplate serviceTemplate,
483 TranslationContext context) {
486 String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate);
487 UnifiedSubstitutionData unifiedSubstitutionData = context.getUnifiedSubstitutionData()
488 .get(serviceTemplateFileName);
490 if (Objects.nonNull(unifiedSubstitutionData)) {
491 //Handle get attribute in connectivity for abstarct node to abstract node templates
492 Set<String> abstractNodeIds =
493 new HashSet<>(unifiedSubstitutionData.getAllRelatedAbstractNodeIds());
494 handleGetAttrInConnectivity(serviceTemplate, abstractNodeIds, context);
495 //Handle get attribute in connectivity for abstract node templates to nested node template
496 Set<String> nestedNodeIds =
497 new HashSet<>(unifiedSubstitutionData.getAllUnifiedNestedNodeTemplateIds());
498 handleGetAttrInConnectivity(serviceTemplate, nestedNodeIds, context);
503 * Handle unified nested definition.
505 * @param unifiedCompositionTo the unified composition data transfer object
506 * @param unifiedCompositionData the unified composition data
508 public void handleUnifiedNestedDefinition(UnifiedCompositionTo unifiedCompositionTo,
509 UnifiedCompositionData unifiedCompositionData) {
510 handleUnifiedNestedNodeType(unifiedCompositionTo.getServiceTemplate(), unifiedCompositionTo
511 .getSubstitutionServiceTemplate(), unifiedCompositionTo.getContext());
512 updateUnifiedNestedTemplates(unifiedCompositionTo.getServiceTemplate(), unifiedCompositionTo
513 .getSubstitutionServiceTemplate(), unifiedCompositionData, unifiedCompositionTo.getContext());
516 private void handleGetAttrInConnectivity(ServiceTemplate serviceTemplate,
517 Set<String> unifiedNodeIds,
518 TranslationContext context) {
519 Map<String, NodeTemplate> nodeTemplates =
520 serviceTemplate.getTopology_template().getNode_templates();
521 String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate);
522 for (String unifiedNodeId : unifiedNodeIds) {
523 NodeTemplate nodeTemplate = nodeTemplates.get(unifiedNodeId);
524 handleGetAttrInAbstractNodeTemplate(serviceTemplate, context, serviceTemplateFileName,
529 private void handleUnifiedNestedNodeType(ServiceTemplate mainServiceTemplate,
530 ServiceTemplate nestedServiceTemplate,
531 TranslationContext context) {
534 SubstitutionMapping substitutionMappings =
535 nestedServiceTemplate.getTopology_template().getSubstitution_mappings();
536 String nodeTypeId = substitutionMappings.getNode_type();
538 Optional<String> newNestedNodeTypeId = getNewNestedNodeTypeId(nestedServiceTemplate, context);
540 ServiceTemplate globalSubstitutionServiceTemplate =
541 context.getGlobalSubstitutionServiceTemplate();
543 if (isNestedServiceTemplateWasHandled(globalSubstitutionServiceTemplate, nestedServiceTemplate,
545 newNestedNodeTypeId)) {
547 .updateHandledComputeType(ToscaUtil.getServiceTemplateFileName(mainServiceTemplate),
548 newNestedNodeTypeId.get(),
549 ToscaUtil.getServiceTemplateFileName(nestedServiceTemplate));
554 newNestedNodeTypeId.ifPresent(
555 newNestedNodeTypeIdVal -> handleNestedNodeType(nodeTypeId, newNestedNodeTypeIdVal,
556 nestedServiceTemplate, mainServiceTemplate, globalSubstitutionServiceTemplate,
561 private boolean isNestedServiceTemplateWasHandled(ServiceTemplate mainServiceTemplate,
562 ServiceTemplate nestedServiceTemplate,
563 TranslationContext context,
564 Optional<String> newNestedNodeTypeId) {
565 return newNestedNodeTypeId.isPresent()
566 && context.isNestedServiceTemplateWasHandled(
567 ToscaUtil.getServiceTemplateFileName(mainServiceTemplate),
568 ToscaUtil.getServiceTemplateFileName(nestedServiceTemplate));
571 private void handleNestedNodeType(String nodeTypeId, String newNestedNodeTypeId,
572 ServiceTemplate nestedServiceTemplate,
573 ServiceTemplate mainServiceTemplate,
574 ServiceTemplate globalSubstitutionServiceTemplate,
575 TranslationContext context) {
576 updateNestedServiceTemplate(nestedServiceTemplate, context);
577 updateNestedNodeType(nodeTypeId, newNestedNodeTypeId, nestedServiceTemplate,
579 globalSubstitutionServiceTemplate, context);
584 private void updateNestedServiceTemplate(ServiceTemplate nestedServiceTemplate,
585 TranslationContext context) {
586 enrichPortProperties(nestedServiceTemplate, context);
589 private void enrichPortProperties(ServiceTemplate nestedServiceTemplate,
590 TranslationContext context) {
591 String nestedServiceTemplateFileName =
592 ToscaUtil.getServiceTemplateFileName(nestedServiceTemplate);
593 FilePortConsolidationData filePortConsolidationData =
594 context.getConsolidationData().getPortConsolidationData().getFilePortConsolidationData
595 (nestedServiceTemplateFileName);
597 if (Objects.nonNull(filePortConsolidationData)) {
598 Set<String> portNodeTemplateIds = filePortConsolidationData.getAllPortNodeTemplateIds();
599 if (Objects.nonNull(portNodeTemplateIds)) {
600 for (String portNodeTemplateId : portNodeTemplateIds) {
601 NodeTemplate portNodeTemplate = DataModelUtil.getNodeTemplate(nestedServiceTemplate,
603 List<EntityConsolidationData> portEntityConsolidationDataList = new ArrayList<>();
604 portEntityConsolidationDataList.add(filePortConsolidationData
605 .getPortTemplateConsolidationData(portNodeTemplateId));
607 handleNodeTypeProperties(nestedServiceTemplate,
608 portEntityConsolidationDataList, portNodeTemplate, UnifiedCompositionEntity.PORT,
610 //Add subinterface_indicator property to PORT
611 addPortSubInterfaceIndicatorProperty(portNodeTemplate.getProperties(),
612 filePortConsolidationData.getPortTemplateConsolidationData(portNodeTemplateId));
618 private void updateNestedNodeType(String nodeTypeId, String newNestedNodeTypeId,
619 ServiceTemplate nestedServiceTemplate,
620 ServiceTemplate mainServiceTemplate,
621 ServiceTemplate globalSubstitutionServiceTemplate,
622 TranslationContext context) {
623 String indexedNewNestedNodeTypeId =
624 updateNodeTypeId(nodeTypeId, newNestedNodeTypeId, nestedServiceTemplate,
626 globalSubstitutionServiceTemplate, context);
628 updateNodeTypeProperties(nestedServiceTemplate, globalSubstitutionServiceTemplate,
629 indexedNewNestedNodeTypeId);
632 private void updateNodeTypeProperties(ServiceTemplate nestedServiceTemplate,
633 ServiceTemplate globalSubstitutionServiceTemplate,
635 ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl();
636 Map<String, PropertyDefinition> nodeTypePropertiesDefinition =
637 toscaAnalyzerService.manageSubstitutionNodeTypeProperties(nestedServiceTemplate);
638 NodeType nestedNodeType =
639 DataModelUtil.getNodeType(globalSubstitutionServiceTemplate, nodeTypeId);
640 nestedNodeType.setProperties(nodeTypePropertiesDefinition);
643 private String updateNodeTypeId(String nodeTypeId, String newNestedNodeTypeId,
644 ServiceTemplate nestedServiceTemplate,
645 ServiceTemplate mainServiceTemplate,
646 ServiceTemplate globalSubstitutionServiceTemplate,
647 TranslationContext context) {
648 String indexedNewNestedNodeTypeId =
649 handleNestedNodeTypeInGlobalSubstitutionTemplate(nodeTypeId, newNestedNodeTypeId,
650 globalSubstitutionServiceTemplate, context);
652 handleSubstitutionMappingInNestedServiceTemplate(indexedNewNestedNodeTypeId,
653 nestedServiceTemplate, context);
656 .updateHandledComputeType(
657 ToscaUtil.getServiceTemplateFileName(mainServiceTemplate),
658 ToscaUtil.getServiceTemplateFileName(nestedServiceTemplate),
659 newNestedNodeTypeId);
660 return indexedNewNestedNodeTypeId;
663 private String handleNestedNodeTypeInGlobalSubstitutionTemplate(String nodeTypeId,
664 String newNestedNodeTypeId,
665 ServiceTemplate globalSubstitutionServiceTemplate,
666 TranslationContext context) {
667 String indexedNodeType =
668 getIndexedGlobalNodeTypeId(newNestedNodeTypeId, context);
669 context.updateUsedTimesForNestedComputeNodeType(
670 ToscaUtil.getServiceTemplateFileName(globalSubstitutionServiceTemplate),
671 newNestedNodeTypeId);
672 handleNestedNodeTypesInGlobalSubstituteServiceTemplate(nodeTypeId, indexedNodeType,
673 globalSubstitutionServiceTemplate, context);
674 return indexedNodeType;
677 private String getIndexedGlobalNodeTypeId(String newNestedNodeTypeId,
678 TranslationContext context) {
679 int globalNodeTypeIndex =
680 context.getGlobalNodeTypeIndex(
681 ToscaUtil.getServiceTemplateFileName(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME),
682 newNestedNodeTypeId);
683 return globalNodeTypeIndex > 0 ? newNestedNodeTypeId + "_"
684 + globalNodeTypeIndex : newNestedNodeTypeId;
687 private void updateUnifiedNestedTemplates(ServiceTemplate mainServiceTemplate,
688 ServiceTemplate nestedServiceTemplate,
689 UnifiedCompositionData unifiedCompositionData,
690 TranslationContext context) {
692 NestedTemplateConsolidationData nestedTemplateConsolidationData =
693 unifiedCompositionData.getNestedTemplateConsolidationData();
694 if (Objects.isNull(nestedTemplateConsolidationData)) {
697 handleNestedNodeTemplateInMainServiceTemplate(
698 nestedTemplateConsolidationData.getNodeTemplateId(), mainServiceTemplate,
699 nestedServiceTemplate, context);
703 * Update connectivity for unified nested patterns.
705 * @param unifiedCompositionTo the unified composition data transfer object
706 * @param unifiedCompositionData the unified composition data
708 public void updateUnifiedNestedConnectivity(UnifiedCompositionTo unifiedCompositionTo,
709 UnifiedCompositionData unifiedCompositionData) {
711 updNestedCompositionNodesConnectedInConnectivity(unifiedCompositionTo.getServiceTemplate(), unifiedCompositionData,
712 unifiedCompositionTo.getContext());
713 updNestedCompositionNodesConnectedOutConnectivity(unifiedCompositionTo.getServiceTemplate(),
714 unifiedCompositionTo.getSubstitutionServiceTemplate(), unifiedCompositionData, unifiedCompositionTo
716 updNestedCompositionNodesGetAttrInConnectivity(unifiedCompositionTo.getServiceTemplate(), unifiedCompositionData,
717 unifiedCompositionTo.getContext());
718 updNestedCompositionOutputParamGetAttrInConnectivity(unifiedCompositionTo.getServiceTemplate(),
719 unifiedCompositionData, unifiedCompositionTo.getContext());
724 * Clean unified nested entities. Update the heat stack group with the new node template ids.
726 * @param unifiedCompositionTo the unified composition data transfer object
727 * @param unifiedCompositionData the unified composition data
729 public void cleanUnifiedNestedEntities(UnifiedCompositionTo unifiedCompositionTo,
730 UnifiedCompositionData unifiedCompositionData) {
731 EntityConsolidationData entityConsolidationData =
732 unifiedCompositionData.getNestedTemplateConsolidationData();
733 updateHeatStackGroupNestedComposition(unifiedCompositionTo.getServiceTemplate(), entityConsolidationData,
734 unifiedCompositionTo.getContext());
738 public void createNestedVfcInstanceGroup(String nestedNodeTemplateId,
739 UnifiedCompositionTo unifiedCompositionTo,
740 UnifiedCompositionData unifiedCompositionData) {
741 if (!TranslationContext.isVfcInstanceGroupingEnabled()) {
744 createSubInterfaceVfcInstanceGroup(nestedNodeTemplateId, unifiedCompositionTo, unifiedCompositionData);
747 public void handleComplexVfcType(ServiceTemplate serviceTemplate, TranslationContext context) {
748 SubstitutionMapping substitutionMapping =
749 serviceTemplate.getTopology_template().getSubstitution_mappings();
751 if (Objects.isNull(substitutionMapping)) {
755 ServiceTemplate globalSubstitutionServiceTemplate =
756 context.getGlobalSubstitutionServiceTemplate();
758 String substitutionNT = substitutionMapping.getNode_type();
759 if (globalSubstitutionServiceTemplate.getNode_types().containsKey(substitutionNT)) {
760 //This needs to be done when catalog is ready for complex VFC
765 protected void updNodesConnectedOutConnectivity(ServiceTemplate serviceTemplate,
766 List<UnifiedCompositionData>
767 unifiedCompositionDataList,
768 TranslationContext context) {
769 for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) {
770 ComputeTemplateConsolidationData computeTemplateConsolidationData = unifiedCompositionData
771 .getComputeTemplateConsolidationData();
772 //Add requirements in the abstract node template for nodes connected out for computes
773 String newComputeNodeTemplateId = getNewComputeNodeTemplateId(serviceTemplate,
774 computeTemplateConsolidationData.getNodeTemplateId());
775 Multimap<String, RequirementAssignmentData> computeNodesConnectedOut =
776 computeTemplateConsolidationData.getNodesConnectedOut();
777 if (computeNodesConnectedOut != null) {
778 updateRequirementInAbstractNodeTemplate(serviceTemplate, computeTemplateConsolidationData,
779 newComputeNodeTemplateId, computeNodesConnectedOut, context);
781 String computeType = getComputeTypeSuffix(serviceTemplate, computeTemplateConsolidationData
782 .getNodeTemplateId());
783 //Add requirements in the abstract node template for nodes connected out for ports
784 List<PortTemplateConsolidationData> portTemplateConsolidationDataList =
785 getPortTemplateConsolidationDataList(unifiedCompositionData);
786 for (PortTemplateConsolidationData portTemplateConsolidationData :
787 portTemplateConsolidationDataList) {
788 String newPortNodeTemplateId = getNewPortNodeTemplateId(portTemplateConsolidationData
789 .getNodeTemplateId(), computeType, computeTemplateConsolidationData);
790 Multimap<String, RequirementAssignmentData> portNodesConnectedOut =
791 portTemplateConsolidationData.getNodesConnectedOut();
792 if (portNodesConnectedOut != null) {
793 updateRequirementInAbstractNodeTemplate(serviceTemplate, portTemplateConsolidationData,
794 newPortNodeTemplateId, portNodesConnectedOut, context);
798 //Add requirements in the abstract node template for nodes connected out for ports
799 updateSubInterfaceNodesConnectedOut(serviceTemplate, unifiedCompositionData,
800 computeTemplateConsolidationData, computeType, context);
804 private void updateSubInterfaceNodesConnectedOut(ServiceTemplate serviceTemplate,
805 UnifiedCompositionData unifiedCompositionData,
806 ComputeTemplateConsolidationData computeTemplateConsolidationData,
808 TranslationContext context) {
809 List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList =
810 getSubInterfaceTemplateConsolidationDataList(unifiedCompositionData);
811 for (SubInterfaceTemplateConsolidationData subInterfaceTemplateConsolidationData :
812 subInterfaceTemplateConsolidationDataList) {
813 String newSubInterfaceNodeTemplateId = getNewSubInterfaceNodeTemplateId(serviceTemplate, computeType,
814 computeTemplateConsolidationData, subInterfaceTemplateConsolidationData, context);
815 Multimap<String, RequirementAssignmentData> subInterfaceNodesConnectedOut =
816 subInterfaceTemplateConsolidationData.getNodesConnectedOut();
817 if (subInterfaceNodesConnectedOut != null) {
818 updateRequirementInAbstractNodeTemplate(serviceTemplate, subInterfaceTemplateConsolidationData,
819 newSubInterfaceNodeTemplateId, subInterfaceNodesConnectedOut, context);
824 private void updNestedCompositionNodesConnectedOutConnectivity(ServiceTemplate serviceTemplate,
825 ServiceTemplate nestedServiceTemplate,
826 UnifiedCompositionData unifiedCompositionData,
827 TranslationContext context) {
828 NestedTemplateConsolidationData nestedTemplateConsolidationData =
829 unifiedCompositionData.getNestedTemplateConsolidationData();
830 Multimap<String, RequirementAssignmentData> nodesConnectedOut =
831 Objects.isNull(nestedTemplateConsolidationData) ? ArrayListMultimap.create()
832 : nestedTemplateConsolidationData.getNodesConnectedOut();
834 FileComputeConsolidationData nestedFileComputeConsolidationData =
835 context.getConsolidationData().getComputeConsolidationData().getFileComputeConsolidationData
836 (ToscaUtil.getServiceTemplateFileName(nestedServiceTemplate));
838 if (Objects.isNull(nestedFileComputeConsolidationData)) {
842 TypeComputeConsolidationData computeType =
843 nestedFileComputeConsolidationData.getAllTypeComputeConsolidationData().iterator().next();
844 if (Objects.isNull(computeType)) {
848 String singleComputeId = computeType.getAllComputeNodeTemplateIds().iterator().next();
849 if (Objects.nonNull(singleComputeId) && (Objects.nonNull(nestedTemplateConsolidationData))) {
850 updateRequirementInNestedNodeTemplate(serviceTemplate, nestedTemplateConsolidationData,
851 singleComputeId, nodesConnectedOut);
855 private void updNodesConnectedInConnectivity(ServiceTemplate serviceTemplate,
856 List<UnifiedCompositionData>
857 unifiedCompositionDataList,
858 TranslationContext context) {
859 for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) {
860 ComputeTemplateConsolidationData computeTemplateConsolidationData = unifiedCompositionData
861 .getComputeTemplateConsolidationData();
862 //Update requirements in the node template which pointing to the computes
863 String newComputeNodeTemplateId = getNewComputeNodeTemplateId(serviceTemplate,
864 computeTemplateConsolidationData.getNodeTemplateId());
865 updNodesConnectedInConnectivity(serviceTemplate, computeTemplateConsolidationData,
866 newComputeNodeTemplateId, context, false);
868 String computeType = getComputeTypeSuffix(serviceTemplate, computeTemplateConsolidationData
869 .getNodeTemplateId());
870 //Update requirements in the node template which pointing to the ports
871 List<PortTemplateConsolidationData> portTemplateConsolidationDataList =
872 getPortTemplateConsolidationDataList(unifiedCompositionData);
873 for (PortTemplateConsolidationData portTemplateConsolidationData :
874 portTemplateConsolidationDataList) {
875 String newPortNodeTemplateId = getNewPortNodeTemplateId(portTemplateConsolidationData
876 .getNodeTemplateId(), computeType, computeTemplateConsolidationData);
877 updNodesConnectedInConnectivity(serviceTemplate, portTemplateConsolidationData,
878 newPortNodeTemplateId, context, false);
881 //Update requirements in the node template which pointing to the sub-interface
882 updateSubInterfaceNodesConnectedIn(serviceTemplate, unifiedCompositionData,
883 computeTemplateConsolidationData, computeType, context);
887 private void updNodesConnectedInConnectivity(ServiceTemplate serviceTemplate,
888 EntityConsolidationData entityConsolidationData,
889 String newNodeTemplateId,
890 TranslationContext context,
892 Multimap<String, RequirementAssignmentData> nodesConnectedIn =
893 entityConsolidationData.getNodesConnectedIn();
894 if (nodesConnectedIn == null) {
895 //No nodes connected in info
899 for (String key : nodesConnectedIn.keySet()) {
900 Collection<RequirementAssignmentData> requirementAssignmentDataList = nodesConnectedIn.get(key);
901 for (RequirementAssignmentData requirementAssignmentData : requirementAssignmentDataList) {
902 RequirementAssignment requirementAssignment = requirementAssignmentData
903 .getRequirementAssignment();
904 if (!requirementAssignment.getNode().equals(entityConsolidationData
905 .getNodeTemplateId())) {
906 //The requirement assignment target node should be the one which we are handling in the
907 //consolidation object
910 //Update the requirement assignment object in the original node template
912 updateRequirementForNestedCompositionNodesConnectedIn(serviceTemplate,
913 requirementAssignmentData, newNodeTemplateId);
915 updateRequirementForNodesConnectedIn(serviceTemplate, requirementAssignmentData,
916 entityConsolidationData, key, newNodeTemplateId, context);
923 private void updateSubInterfaceNodesConnectedIn(ServiceTemplate serviceTemplate,
924 UnifiedCompositionData unifiedCompositionData,
925 ComputeTemplateConsolidationData computeTemplateConsolidationData,
927 TranslationContext context) {
928 List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList =
929 getSubInterfaceTemplateConsolidationDataList(unifiedCompositionData);
930 for (SubInterfaceTemplateConsolidationData subInterfaceTemplateConsolidationData :
931 subInterfaceTemplateConsolidationDataList) {
932 String newSubInterfaceNodeTemplateId = getNewSubInterfaceNodeTemplateId(serviceTemplate, computeType,
933 computeTemplateConsolidationData, subInterfaceTemplateConsolidationData, context);
934 updNodesConnectedInConnectivity(serviceTemplate, subInterfaceTemplateConsolidationData,
935 newSubInterfaceNodeTemplateId, context, false);
939 protected void updNestedCompositionNodesConnectedInConnectivity(
940 ServiceTemplate serviceTemplate,
941 UnifiedCompositionData unifiedCompositionData,
942 TranslationContext context) {
943 NestedTemplateConsolidationData nestedTemplateConsolidationData = unifiedCompositionData
944 .getNestedTemplateConsolidationData();
945 //Update requirements in the node template which pointing to the nested nodes
946 String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate);
947 Optional<String> newNestedNodeTemplateId = context.getUnifiedNestedNodeTemplateId(
948 serviceTemplateFileName, nestedTemplateConsolidationData.getNodeTemplateId());
949 newNestedNodeTemplateId.ifPresent(
950 newNestedNodeTemplateIdVal -> updNodesConnectedInConnectivity(serviceTemplate,
951 nestedTemplateConsolidationData,
952 newNestedNodeTemplateIdVal, context, true));
956 private void updVolumeConnectivity(ServiceTemplate serviceTemplate,
957 List<UnifiedCompositionData>
958 unifiedCompositionDataList,
959 TranslationContext context) {
960 for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) {
961 ComputeTemplateConsolidationData computeTemplateConsolidationData = unifiedCompositionData
962 .getComputeTemplateConsolidationData();
963 //Add requirements in the abstract node template for compute volumes
964 String newComputeNodeTemplateId = getNewComputeNodeTemplateId(serviceTemplate,
965 computeTemplateConsolidationData.getNodeTemplateId());
966 Multimap<String, RequirementAssignmentData> computeVolumes =
967 computeTemplateConsolidationData.getVolumes();
968 if (computeVolumes != null) {
969 updateRequirementInAbstractNodeTemplate(serviceTemplate, computeTemplateConsolidationData,
970 newComputeNodeTemplateId, computeVolumes, context);
975 private void updGroupsConnectivity(ServiceTemplate serviceTemplate,
976 List<UnifiedCompositionData>
977 unifiedCompositionDataList,
978 TranslationContext context) {
979 for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) {
980 ComputeTemplateConsolidationData computeTemplateConsolidationData = unifiedCompositionData
981 .getComputeTemplateConsolidationData();
982 //Add requirements in the abstract node template for nodes connected in for computes
983 updGroupsConnectivity(serviceTemplate, computeTemplateConsolidationData, context);
985 //Add requirements in the abstract node template for nodes connected in for ports
986 List<PortTemplateConsolidationData> portTemplateConsolidationDataList =
987 getPortTemplateConsolidationDataList(unifiedCompositionData);
988 for (PortTemplateConsolidationData portTemplateConsolidationData :
989 portTemplateConsolidationDataList) {
990 updGroupsConnectivity(serviceTemplate, portTemplateConsolidationData, context);
993 //Add requirements in the abstract node template for nodes connected in for subInterface
994 List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList =
995 getSubInterfaceTemplateConsolidationDataList(unifiedCompositionData);
996 for (SubInterfaceTemplateConsolidationData subInterfaceTemplateConsolidationData :
997 subInterfaceTemplateConsolidationDataList) {
998 updGroupsConnectivity(serviceTemplate, subInterfaceTemplateConsolidationData, context);
1003 private void updGroupsConnectivity(ServiceTemplate serviceTemplate, EntityConsolidationData
1004 entityConsolidationData, TranslationContext context) {
1005 List<String> groupIds = entityConsolidationData.getGroupIds();
1006 if (groupIds == null) {
1009 String oldNodeTemplateId = entityConsolidationData.getNodeTemplateId();
1010 String abstractNodeTemplateId = context.getUnifiedAbstractNodeTemplateId(
1011 serviceTemplate, entityConsolidationData.getNodeTemplateId());
1012 Map<String, GroupDefinition> groups = serviceTemplate.getTopology_template().getGroups();
1013 if (groups == null) {
1016 for (String groupId : groupIds) {
1017 GroupDefinition groupDefinition = groups.get(groupId);
1018 if (groupDefinition == null) {
1021 List<String> groupMembers = groupDefinition.getMembers();
1022 if (groupMembers.contains(oldNodeTemplateId)) {
1023 //Replace the old node template id
1024 groupMembers.remove(oldNodeTemplateId);
1025 if (!groupMembers.contains(abstractNodeTemplateId)) {
1026 //Add the abstract node template id if not already present
1027 groupMembers.add(abstractNodeTemplateId);
1033 private void updOutputParamGetAttrInConnectivity(
1034 ServiceTemplate serviceTemplate, List<UnifiedCompositionData> unifiedComposotionDataList,
1035 TranslationContext context) {
1036 for (UnifiedCompositionData unifiedCompositionData : unifiedComposotionDataList) {
1037 ComputeTemplateConsolidationData computeTemplateConsolidationData =
1038 unifiedCompositionData.getComputeTemplateConsolidationData();
1039 String newComputeNodeTemplateId = getNewComputeNodeTemplateId(serviceTemplate,
1040 computeTemplateConsolidationData.getNodeTemplateId());
1042 updOutputParamGetAttrInConnectivity(serviceTemplate, computeTemplateConsolidationData,
1043 computeTemplateConsolidationData.getNodeTemplateId(), newComputeNodeTemplateId,
1046 String computeType =
1047 getComputeTypeSuffix(serviceTemplate,
1048 computeTemplateConsolidationData.getNodeTemplateId());
1049 List<PortTemplateConsolidationData> portTemplateConsolidationDataList =
1050 getPortTemplateConsolidationDataList(unifiedCompositionData);
1051 for (PortTemplateConsolidationData portTemplateConsolidationData :
1052 portTemplateConsolidationDataList) {
1053 String newPortNodeTemplateId =
1054 getNewPortNodeTemplateId(portTemplateConsolidationData.getNodeTemplateId(), computeType,
1055 computeTemplateConsolidationData);
1057 updOutputParamGetAttrInConnectivity(serviceTemplate, portTemplateConsolidationData,
1058 portTemplateConsolidationData.getNodeTemplateId(), newPortNodeTemplateId, context,
1062 updateSubInterfaceOutputParamGetAttrIn(serviceTemplate, unifiedCompositionData,
1063 computeTemplateConsolidationData, computeType, context);
1067 private void updateSubInterfaceOutputParamGetAttrIn(ServiceTemplate serviceTemplate,
1068 UnifiedCompositionData unifiedCompositionData,
1069 ComputeTemplateConsolidationData computeTemplateConsolidationData,
1071 TranslationContext context) {
1072 List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList =
1073 getSubInterfaceTemplateConsolidationDataList(unifiedCompositionData);
1074 for (SubInterfaceTemplateConsolidationData subInterfaceTemplateConsolidationData :
1075 subInterfaceTemplateConsolidationDataList) {
1076 String newSubInterfaceNodeTemplateId = getNewSubInterfaceNodeTemplateId(serviceTemplate, computeType,
1077 computeTemplateConsolidationData, subInterfaceTemplateConsolidationData, context);
1078 updOutputParamGetAttrInConnectivity(serviceTemplate, subInterfaceTemplateConsolidationData,
1079 subInterfaceTemplateConsolidationData.getNodeTemplateId(), newSubInterfaceNodeTemplateId, context,
1084 private void updNodesGetAttrInConnectivity(
1085 ServiceTemplate serviceTemplate,
1086 List<UnifiedCompositionData> unifiedComposotionDataList,
1087 TranslationContext context) {
1088 Map<String, UnifiedCompositionEntity> consolidationNodeTemplateIdAndType =
1089 getAllConsolidationNodeTemplateIdAndType(unifiedComposotionDataList);
1090 for (UnifiedCompositionData unifiedCompositionData : unifiedComposotionDataList) {
1091 ComputeTemplateConsolidationData computeTemplateConsolidationData =
1092 unifiedCompositionData.getComputeTemplateConsolidationData();
1093 String newComputeNodeTemplateId = getNewComputeNodeTemplateId(serviceTemplate,
1094 computeTemplateConsolidationData.getNodeTemplateId());
1096 updNodeGetAttrInConnectivity(serviceTemplate, computeTemplateConsolidationData,
1097 computeTemplateConsolidationData.getNodeTemplateId(),
1098 newComputeNodeTemplateId, context, consolidationNodeTemplateIdAndType, false);
1100 String computeType =
1101 getComputeTypeSuffix(serviceTemplate,
1102 computeTemplateConsolidationData.getNodeTemplateId());
1104 List<PortTemplateConsolidationData> portTemplateConsolidationDataList =
1105 getPortTemplateConsolidationDataList(unifiedCompositionData);
1106 for (PortTemplateConsolidationData portTemplateConsolidationData :
1107 portTemplateConsolidationDataList) {
1108 String newPotNodeTemplateId =
1109 getNewPortNodeTemplateId(portTemplateConsolidationData.getNodeTemplateId(), computeType,
1110 computeTemplateConsolidationData);
1112 updNodeGetAttrInConnectivity(serviceTemplate, portTemplateConsolidationData,
1113 portTemplateConsolidationData.getNodeTemplateId(),
1114 newPotNodeTemplateId, context, consolidationNodeTemplateIdAndType, false);
1117 updateSubInterfaceNodesGetAttrIn(serviceTemplate, unifiedCompositionData,
1118 computeTemplateConsolidationData, computeType, consolidationNodeTemplateIdAndType, context);
1122 private void updateSubInterfaceNodesGetAttrIn(ServiceTemplate serviceTemplate,
1123 UnifiedCompositionData unifiedCompositionData,
1124 ComputeTemplateConsolidationData computeTemplateConsolidationData,
1126 Map<String, UnifiedCompositionEntity> consolidationNodeTemplateIdAndType,
1127 TranslationContext context) {
1128 List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList =
1129 getSubInterfaceTemplateConsolidationDataList(unifiedCompositionData);
1130 for (SubInterfaceTemplateConsolidationData subInterfaceTemplateConsolidationData :
1131 subInterfaceTemplateConsolidationDataList) {
1132 String newSubInterfaceNodeTemplateId = getNewSubInterfaceNodeTemplateId(serviceTemplate, computeType,
1133 computeTemplateConsolidationData, subInterfaceTemplateConsolidationData, context);
1134 updNodeGetAttrInConnectivity(serviceTemplate, subInterfaceTemplateConsolidationData,
1135 subInterfaceTemplateConsolidationData.getNodeTemplateId(),
1136 newSubInterfaceNodeTemplateId, context,
1137 consolidationNodeTemplateIdAndType, false);
1141 protected void updNestedCompositionOutputParamGetAttrInConnectivity(
1142 ServiceTemplate serviceTemplate, UnifiedCompositionData unifiedCompositionData,
1143 TranslationContext context) {
1144 NestedTemplateConsolidationData nestedTemplateConsolidationData =
1145 unifiedCompositionData.getNestedTemplateConsolidationData();
1146 if (Objects.isNull(nestedTemplateConsolidationData)) {
1149 String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate);
1150 Optional<String> newNestedNodeTemplateId = context.getUnifiedNestedNodeTemplateId(
1151 serviceTemplateFileName, nestedTemplateConsolidationData.getNodeTemplateId());
1153 newNestedNodeTemplateId.ifPresent(
1154 newNestedNodeTemplateIdVal -> updOutputParamGetAttrInConnectivity(serviceTemplate,
1155 nestedTemplateConsolidationData, nestedTemplateConsolidationData.getNodeTemplateId(),
1156 newNestedNodeTemplateIdVal, context, true));
1159 protected void updNestedCompositionNodesGetAttrInConnectivity(
1160 ServiceTemplate serviceTemplate,
1161 UnifiedCompositionData unifiedCompositionData,
1162 TranslationContext context) {
1163 NestedTemplateConsolidationData nestedTemplateConsolidationData =
1164 unifiedCompositionData.getNestedTemplateConsolidationData();
1165 if (Objects.isNull(nestedTemplateConsolidationData)) {
1168 String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate);
1169 Optional<String> newNestedNodeTemplateId = context.getUnifiedNestedNodeTemplateId(
1170 serviceTemplateFileName, nestedTemplateConsolidationData.getNodeTemplateId());
1172 newNestedNodeTemplateId.ifPresent(
1173 newNestedNodeTemplateIdVal -> updNodeGetAttrInConnectivity(serviceTemplate,
1174 nestedTemplateConsolidationData, nestedTemplateConsolidationData.getNodeTemplateId(),
1175 newNestedNodeTemplateIdVal, context, null, true));
1178 private void updateRequirementForNodesConnectedIn(
1179 ServiceTemplate serviceTemplate,
1180 RequirementAssignmentData requirementAssignmentData,
1181 EntityConsolidationData entityConsolidationData,
1182 String originalNodeTemplateId,
1183 String newNodeTemplateId,
1184 TranslationContext context) {
1185 ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl();
1186 RequirementAssignment requirementAssignment = requirementAssignmentData
1187 .getRequirementAssignment();
1188 String newAbstractUnifiedNodeTemplateId = context.getUnifiedAbstractNodeTemplateId(
1189 serviceTemplate, entityConsolidationData.getNodeTemplateId());
1190 NodeTemplate abstractUnifiedNodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate,
1191 newAbstractUnifiedNodeTemplateId);
1192 Optional<String> newCapabilityId = getNewCapabilityForNodesConnectedIn(serviceTemplate,
1193 abstractUnifiedNodeTemplate, requirementAssignment, newNodeTemplateId, context);
1194 if (newCapabilityId.isPresent()) {
1195 //Creating a copy of the requirement object and checking if it already exists in the
1196 // original node template
1197 RequirementAssignment requirementAssignmentCopy = (RequirementAssignment) getClonedObject(
1198 requirementAssignmentData.getRequirementAssignment(), RequirementAssignment.class);
1199 NodeTemplate originalNodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate,
1200 originalNodeTemplateId);
1201 requirementAssignmentCopy.setCapability(newCapabilityId.get());
1202 requirementAssignmentCopy.setNode(newAbstractUnifiedNodeTemplateId);
1203 if (!toscaAnalyzerService.isRequirementExistInNodeTemplate(originalNodeTemplate,
1204 requirementAssignmentData.getRequirementId(), requirementAssignmentCopy)) {
1205 //Update the existing requirement
1206 requirementAssignmentData.getRequirementAssignment().setCapability(newCapabilityId
1208 requirementAssignmentData.getRequirementAssignment()
1209 .setNode(newAbstractUnifiedNodeTemplateId);
1211 //The updated requirement already exists in the node template so simply remove the
1213 DataModelUtil.removeRequirementAssignment(originalNodeTemplate, requirementAssignmentData
1214 .getRequirementId(), requirementAssignmentData.getRequirementAssignment());
1219 private void updateRequirementForNestedCompositionNodesConnectedIn(
1220 ServiceTemplate serviceTemplate,
1221 RequirementAssignmentData requirementAssignmentData,
1222 String newNodeTemplateId) {
1223 ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl();
1224 String newAbstractUnifiedNodeTemplateId = newNodeTemplateId;
1225 RequirementAssignment requirementAssignment = requirementAssignmentData
1226 .getRequirementAssignment();
1227 //Creating a copy of the requirement object and checking if it already exists in the
1228 // original node template
1229 RequirementAssignment requirementAssignmentCopy = (RequirementAssignment) getClonedObject(
1230 requirementAssignmentData.getRequirementAssignment(), RequirementAssignment.class);
1231 NodeTemplate unifiedAbstractNestedNodeTemplate = DataModelUtil
1232 .getNodeTemplate(serviceTemplate, newAbstractUnifiedNodeTemplateId);
1233 requirementAssignmentCopy.setCapability(requirementAssignment.getCapability());
1234 requirementAssignmentCopy.setNode(newAbstractUnifiedNodeTemplateId);
1235 if (!toscaAnalyzerService.isRequirementExistInNodeTemplate(unifiedAbstractNestedNodeTemplate,
1236 requirementAssignmentData.getRequirementId(), requirementAssignmentCopy)) {
1237 //Update the existing requirement
1238 requirementAssignmentData.getRequirementAssignment()
1239 .setNode(newAbstractUnifiedNodeTemplateId);
1241 //The updated requirement already exists in the node template so simply remove the
1243 DataModelUtil.removeRequirementAssignment(unifiedAbstractNestedNodeTemplate,
1244 requirementAssignmentData.getRequirementId(), requirementAssignmentData
1245 .getRequirementAssignment());
1249 private Optional<String> getNewCapabilityForNodesConnectedIn(ServiceTemplate serviceTemplate,
1250 NodeTemplate unifiedNodeTemplate,
1251 RequirementAssignment
1252 requirementAssignment,
1253 String newNodeTemplateId,
1254 TranslationContext context) {
1255 ServiceTemplate globalSubstitutionServiceTemplate =
1256 HeatToToscaUtil.fetchGlobalSubstitutionServiceTemplate(serviceTemplate, context);
1257 Map<String, NodeType> nodeTypes = globalSubstitutionServiceTemplate.getNode_types();
1258 String unifiedNodeTemplateType = unifiedNodeTemplate.getType();
1259 NodeType unifiedNodeType = nodeTypes.get(unifiedNodeTemplateType);
1260 Map<String, CapabilityDefinition> abstractNodeTypeCapabilities = unifiedNodeType
1262 for (Map.Entry<String, CapabilityDefinition> entry : abstractNodeTypeCapabilities.entrySet()) {
1263 String capabilityId = entry.getKey();
1264 CapabilityDefinition capabilityDefinition = entry.getValue();
1265 String capabilityType = capabilityDefinition.getType();
1266 if (capabilityType.equals(requirementAssignment.getCapability())
1267 && capabilityId.endsWith(newNodeTemplateId)) {
1268 //Matching capability type found..Check if the id ends with new node template id
1269 return Optional.ofNullable(capabilityId);
1272 return Optional.empty();
1276 private void updateRequirementInAbstractNodeTemplate(ServiceTemplate serviceTemplate,
1277 EntityConsolidationData
1278 entityConsolidationData,
1279 String newNodeTemplateId,
1280 Multimap<String, RequirementAssignmentData>
1281 requirementAssignmentDataMap,
1282 TranslationContext context) {
1283 ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl();
1284 for (String key : requirementAssignmentDataMap.keySet()) {
1285 String abstractNodeTemplateId = context.getUnifiedAbstractNodeTemplateId(
1286 serviceTemplate, entityConsolidationData.getNodeTemplateId());
1287 NodeTemplate abstractNodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate,
1288 abstractNodeTemplateId);
1289 if (abstractNodeTemplate == null) {
1290 //The abstract node template is not found from id in the context
1293 Collection<RequirementAssignmentData> requirementAssignmentDataList = requirementAssignmentDataMap.get(key);
1294 for (RequirementAssignmentData requirementAssignmentData : requirementAssignmentDataList) {
1295 String oldRequirementId = requirementAssignmentData.getRequirementId();
1296 RequirementAssignment abstractRequirementAssignment = (RequirementAssignment)
1297 getClonedObject(requirementAssignmentData.getRequirementAssignment(),
1298 RequirementAssignment.class);
1299 String newRequirementId = oldRequirementId + "_" + newNodeTemplateId;
1300 //Check if the requirement is not already present in the list of requirements of the
1301 // abstract node template
1302 if (!toscaAnalyzerService.isRequirementExistInNodeTemplate(abstractNodeTemplate,
1303 newRequirementId, abstractRequirementAssignment)) {
1304 DataModelUtil.addRequirementAssignment(abstractNodeTemplate, newRequirementId,
1305 abstractRequirementAssignment);
1306 //Update the volume relationship template if required
1307 updateVolumeRelationshipTemplate(serviceTemplate, abstractRequirementAssignment
1308 .getRelationship(), context);
1314 private void updateRequirementInNestedNodeTemplate(ServiceTemplate serviceTemplate,
1315 EntityConsolidationData entityConsolidationData,
1316 String newNodeTemplateId,
1317 Multimap<String, RequirementAssignmentData>
1318 requirementAssignmentDataMap) {
1319 ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl();
1321 if (CommonUtil.isMultimapEmpty(requirementAssignmentDataMap)) {
1325 for (String key : requirementAssignmentDataMap.keySet()) {
1326 String nodeTemplateId = entityConsolidationData.getNodeTemplateId();
1327 NodeTemplate nodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate, nodeTemplateId);
1328 if (nodeTemplate == null) {
1329 //The node template is not found from id in the context
1332 Collection<RequirementAssignmentData> requirementAssignmentDataList = requirementAssignmentDataMap.get(key);
1333 for (RequirementAssignmentData requirementAssignmentData : requirementAssignmentDataList) {
1334 String oldRequirementId = requirementAssignmentData.getRequirementId();
1335 RequirementAssignment clonedRequirementAssignment = (RequirementAssignment)
1336 getClonedObject(requirementAssignmentData.getRequirementAssignment(),
1337 RequirementAssignment.class);
1338 String newRequirementId = oldRequirementId + "_" + newNodeTemplateId;
1339 //Check if the requirement is not already present in the list of requirements of the
1341 if (!toscaAnalyzerService.isRequirementExistInNodeTemplate(nodeTemplate,
1342 newRequirementId, clonedRequirementAssignment)) {
1343 DataModelUtil.removeRequirementAssignment(nodeTemplate, oldRequirementId,
1344 requirementAssignmentData.getRequirementAssignment());
1345 DataModelUtil.addRequirementAssignment(nodeTemplate, newRequirementId,
1346 clonedRequirementAssignment);
1352 private void updNodeGetAttrInConnectivity(
1353 ServiceTemplate serviceTemplate,
1354 EntityConsolidationData entityConsolidationData,
1355 String oldNodeTemplateId, String newNodeTemplateId,
1356 TranslationContext context,
1357 Map<String, UnifiedCompositionEntity> consolidationNodeTemplateIdAndType,
1359 Map<String, List<GetAttrFuncData>> nodesGetAttrIn = entityConsolidationData.getNodesGetAttrIn();
1360 if (MapUtils.isEmpty(nodesGetAttrIn)) {
1364 for (Map.Entry<String, List<GetAttrFuncData>> nodesGetAttrInEntry : nodesGetAttrIn.entrySet()) {
1365 String sourceNodeTemplateId = nodesGetAttrInEntry.getKey();
1366 NodeTemplate sourceNodeTemplate =
1367 DataModelUtil.getNodeTemplate(serviceTemplate, sourceNodeTemplateId);
1368 if (!isNested && consolidationNodeTemplateIdAndType.keySet().contains(sourceNodeTemplateId)) {
1371 List<GetAttrFuncData> getAttrFuncDataList = nodesGetAttrInEntry.getValue();
1372 for (GetAttrFuncData getAttrFuncData : getAttrFuncDataList) {
1373 Object propertyValue =
1374 DataModelUtil.getPropertyValue(sourceNodeTemplate, getAttrFuncData.getFieldName());
1375 String newAttrName = null;
1376 String newGetAttrAbstractNodeTemplateId = newNodeTemplateId;
1378 newGetAttrAbstractNodeTemplateId =
1379 context.getUnifiedAbstractNodeTemplateId(serviceTemplate, oldNodeTemplateId);
1380 newAttrName = getNewSubstitutionOutputParameterId(newNodeTemplateId, getAttrFuncData
1381 .getAttributeName());
1383 List<List<Object>> getAttrFuncValueList = extractGetAttrFunction(propertyValue);
1384 updateGetAttrValue(oldNodeTemplateId, getAttrFuncData, newGetAttrAbstractNodeTemplateId,
1385 newAttrName, getAttrFuncValueList, isNested);
1390 private void updateGetAttrValue(String oldNodeTemplateId, GetAttrFuncData getAttrFuncData,
1391 String newNodeTemplateId, String newAttrName,
1392 List<List<Object>> getAttrFuncValueList, boolean isNested) {
1393 for (List<Object> getAttrFuncValue : getAttrFuncValueList) {
1394 if (oldNodeTemplateId.equals(getAttrFuncValue.get(0))
1395 && getAttrFuncData.getAttributeName().equals(getAttrFuncValue.get(1))) {
1396 getAttrFuncValue.set(0, newNodeTemplateId);
1398 getAttrFuncValue.set(1, newAttrName);
1404 private String getTemplateName(String nodeTypeId,
1406 String computeType = getComputeTypeSuffix(nodeTypeId);
1407 String templateName = "Nested_" + computeType;
1408 if (Objects.nonNull(index)) {
1409 templateName = templateName + "_" + index.toString();
1411 return templateName;
1414 private void updOutputParamGetAttrInConnectivity(ServiceTemplate serviceTemplate,
1415 EntityConsolidationData entityConsolidationData,
1416 String oldNodeTemplateId,
1417 String newNodeTemplateId,
1418 TranslationContext context,
1420 List<GetAttrFuncData> outputParametersGetAttrIn =
1421 entityConsolidationData.getOutputParametersGetAttrIn();
1422 if (CollectionUtils.isEmpty(outputParametersGetAttrIn)) {
1425 for (GetAttrFuncData getAttrFuncData : outputParametersGetAttrIn) {
1426 Object outputParamValue =
1427 DataModelUtil.getOuputParameter(serviceTemplate, getAttrFuncData.getFieldName())
1429 String newAttrName = null;
1430 String newGetAttrAbstractNodeTemplateId = newNodeTemplateId;
1432 newGetAttrAbstractNodeTemplateId =
1433 context.getUnifiedAbstractNodeTemplateId(serviceTemplate, oldNodeTemplateId);
1434 newAttrName = getNewSubstitutionOutputParameterId(newNodeTemplateId, getAttrFuncData
1435 .getAttributeName());
1437 List<List<Object>> getAttrFuncValueList = extractGetAttrFunction(outputParamValue);
1438 updateGetAttrValue(oldNodeTemplateId, getAttrFuncData, newGetAttrAbstractNodeTemplateId,
1440 getAttrFuncValueList, isNested);
1445 private List<List<Object>> extractGetAttrFunction(Object valueObject) {
1447 List<List<Object>> getAttrValueList = new ArrayList<>();
1449 if (valueObject instanceof Map) {
1450 if (((Map) valueObject).containsKey(ToscaFunctions.GET_ATTRIBUTE.getDisplayName())) {
1451 getAttrValueList.add(
1452 (List<Object>) ((Map) valueObject).get(ToscaFunctions.GET_ATTRIBUTE.getDisplayName()));
1455 for (Object key : ((Map) valueObject).keySet()) {
1456 getAttrValueList.addAll(extractGetAttrFunction(((Map) valueObject).get(key)));
1460 } else if (valueObject instanceof List) {
1461 for (Object valueEntity : (List) valueObject) {
1462 getAttrValueList.addAll(extractGetAttrFunction(valueEntity));
1465 return getAttrValueList;
1468 private boolean isIncludeToscaFunc(Object valueObject, ToscaFunctions toscaFunction) {
1469 if (valueObject instanceof Map) {
1470 if (((Map) valueObject).containsKey(toscaFunction.getDisplayName())) {
1474 Set<Map.Entry<String, Object>> entries = ((Map<String, Object>) valueObject).entrySet();
1475 for (Map.Entry<String, Object> valueObjectEntry : entries) {
1476 if (isIncludeToscaFunc(valueObjectEntry.getValue(), toscaFunction)) {
1480 } else if (valueObject instanceof List) {
1481 for (Object valueEntity : (List) valueObject) {
1482 if (isIncludeToscaFunc(valueEntity, toscaFunction)) {
1490 private void createOutputParameters(UnifiedCompositionTo unifiedCompositionTo,
1491 String computeNodeType) {
1493 createOutputParametersForCompute(unifiedCompositionTo.getServiceTemplate(),
1494 unifiedCompositionTo.getSubstitutionServiceTemplate(), unifiedCompositionTo.getUnifiedCompositionDataList(),
1495 unifiedCompositionTo.getContext());
1496 createOutputParameterForPorts(unifiedCompositionTo.getSubstitutionServiceTemplate(),
1497 unifiedCompositionTo.getUnifiedCompositionDataList(), computeNodeType, unifiedCompositionTo.getContext());
1498 createOutputParameterForSubInterfaces(unifiedCompositionTo, computeNodeType);
1501 private void createOutputParameterForPorts(
1502 ServiceTemplate substitutionServiceTemplate,
1503 List<UnifiedCompositionData> unifiedCompositionDataList,
1504 String connectedComputeNodeType,
1505 TranslationContext context) {
1506 for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) {
1507 List<PortTemplateConsolidationData> portTemplateConsolidationDataList =
1508 getPortTemplateConsolidationDataList(unifiedCompositionData);
1509 if (CollectionUtils.isEmpty(portTemplateConsolidationDataList)) {
1513 for (PortTemplateConsolidationData portTemplateConsolidationData :
1514 portTemplateConsolidationDataList) {
1515 String newPortNodeTemplateId =
1516 getNewPortNodeTemplateId(portTemplateConsolidationData.getNodeTemplateId(),
1517 connectedComputeNodeType,
1518 unifiedCompositionData.getComputeTemplateConsolidationData());
1519 addOutputParameters(portTemplateConsolidationData, newPortNodeTemplateId,
1520 substitutionServiceTemplate, unifiedCompositionDataList, context);
1525 private void createOutputParameterForSubInterfaces(UnifiedCompositionTo unifiedCompositionTo,
1526 String connectedComputeNodeType) {
1527 for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionTo.getUnifiedCompositionDataList()) {
1528 List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList =
1529 getSubInterfaceTemplateConsolidationDataList(unifiedCompositionData);
1530 if (CollectionUtils.isEmpty(subInterfaceTemplateConsolidationDataList)) {
1534 for (SubInterfaceTemplateConsolidationData subInterfaceTemplateConsolidationData :
1535 subInterfaceTemplateConsolidationDataList) {
1536 String newSubInterfaceNodeTemplateId = getNewSubInterfaceNodeTemplateId(unifiedCompositionTo
1537 .getServiceTemplate(), connectedComputeNodeType, unifiedCompositionData
1538 .getComputeTemplateConsolidationData(), subInterfaceTemplateConsolidationData,
1539 unifiedCompositionTo.getContext());
1540 addOutputParameters(subInterfaceTemplateConsolidationData, newSubInterfaceNodeTemplateId,
1541 unifiedCompositionTo.getSubstitutionServiceTemplate(), unifiedCompositionTo.getUnifiedCompositionDataList(),
1542 unifiedCompositionTo.getContext());
1547 private void createOutputParametersForCompute(
1548 ServiceTemplate serviceTemplate,
1549 ServiceTemplate substitutionServiceTemplate,
1550 List<UnifiedCompositionData>
1551 unifiedCompositionDataList,
1552 TranslationContext context) {
1553 List<EntityConsolidationData> computeConsolidationDataList =
1554 getComputeConsolidationDataList(unifiedCompositionDataList);
1556 for (EntityConsolidationData computeTemplateConsolidationData : computeConsolidationDataList) {
1557 String newComputeNodeTemplateId =
1558 getNewComputeNodeTemplateId(serviceTemplate,
1559 computeTemplateConsolidationData.getNodeTemplateId());
1560 addOutputParameters(computeTemplateConsolidationData, newComputeNodeTemplateId,
1561 substitutionServiceTemplate, unifiedCompositionDataList, context);
1565 private void addOutputParameters(EntityConsolidationData entityConsolidationData,
1566 String newNodeTemplateId,
1567 ServiceTemplate substitutionServiceTemplate,
1568 List<UnifiedCompositionData> unifiedCompositionDataList,
1569 TranslationContext context) {
1570 handleNodesGetAttrIn(entityConsolidationData, newNodeTemplateId, substitutionServiceTemplate,
1571 unifiedCompositionDataList, context);
1573 handleOutputParamGetAttrIn(entityConsolidationData, newNodeTemplateId,
1574 substitutionServiceTemplate, context);
1577 private void handleOutputParamGetAttrIn(EntityConsolidationData entityConsolidationData,
1578 String newNodeTemplateId,
1579 ServiceTemplate substitutionServiceTemplate,
1580 TranslationContext context) {
1581 List<GetAttrFuncData> outputParametersGetAttrIn =
1582 entityConsolidationData.getOutputParametersGetAttrIn();
1583 if (!CollectionUtils.isEmpty(outputParametersGetAttrIn)) {
1584 for (GetAttrFuncData getAttrFuncData : outputParametersGetAttrIn) {
1585 createAndAddOutputParameter(newNodeTemplateId,
1586 substitutionServiceTemplate, getAttrFuncData, context);
1591 private void handleNodesGetAttrIn(EntityConsolidationData entityConsolidationData,
1592 String newNodeTemplateId,
1593 ServiceTemplate substitutionServiceTemplate,
1594 List<UnifiedCompositionData> unifiedCompositionDataList,
1595 TranslationContext context) {
1596 Map<String, List<GetAttrFuncData>> getAttrIn = entityConsolidationData.getNodesGetAttrIn();
1597 if (MapUtils.isEmpty(getAttrIn)) {
1600 Map<String, UnifiedCompositionEntity> consolidationNodeTemplateIdAndType =
1601 getAllConsolidationNodeTemplateIdAndType(unifiedCompositionDataList);
1602 for (Map.Entry<String, List<GetAttrFuncData>> getAttrInEntry : getAttrIn.entrySet()) {
1603 String sourceNodeTemplateId = getAttrInEntry.getKey();
1604 if (!consolidationNodeTemplateIdAndType.keySet().contains(sourceNodeTemplateId)) {
1605 List<GetAttrFuncData> getAttrFuncDataList = getAttrInEntry.getValue();
1606 for (GetAttrFuncData getAttrFuncData : getAttrFuncDataList) {
1607 createAndAddOutputParameter(newNodeTemplateId,
1608 substitutionServiceTemplate, getAttrFuncData, context);
1614 private void createAndAddOutputParameter(String newNodeTemplateId,
1615 ServiceTemplate substitutionServiceTemplate,
1616 GetAttrFuncData getAttrFuncData,
1617 TranslationContext context) {
1618 Map<String, List<Object>> parameterValue = new HashMap<>();
1619 List<Object> valueList = new ArrayList<>();
1620 valueList.add(newNodeTemplateId);
1621 valueList.add(getAttrFuncData.getAttributeName());
1622 parameterValue.put(ToscaFunctions.GET_ATTRIBUTE.getDisplayName(), valueList);
1623 ParameterDefinition outputParameter = new ParameterDefinition();
1624 outputParameter.setValue(parameterValue);
1625 setOutputParameterType(substitutionServiceTemplate, newNodeTemplateId, getAttrFuncData
1626 .getAttributeName(), outputParameter, context);
1627 DataModelUtil.addOutputParameterToTopologyTemplate(substitutionServiceTemplate,
1628 getNewSubstitutionOutputParameterId(newNodeTemplateId, getAttrFuncData.getAttributeName()),
1632 private void setOutputParameterType(ServiceTemplate substitutionServiceTemplate,
1633 String newNodeTemplateId,
1634 String outputParameterName,
1635 ParameterDefinition outputParameter,
1636 TranslationContext context) {
1637 NodeTemplate nodeTemplate = DataModelUtil.getNodeTemplate(substitutionServiceTemplate,
1639 //Get the type and entry schema of the output parameter from the node type flat hierarchy
1640 String outputParameterType;
1641 EntrySchema outputParameterEntrySchema;
1642 NodeType nodeTypeWithFlatHierarchy =
1643 HeatToToscaUtil.getNodeTypeWithFlatHierarchy(nodeTemplate.getType(),
1644 substitutionServiceTemplate, context);
1645 //Check if the parameter is present in the attributes
1646 AttributeDefinition outputParameterDefinitionFromAttributes =
1647 getOutputParameterDefinitionFromAttributes(nodeTypeWithFlatHierarchy, outputParameterName);
1648 if (Objects.nonNull(outputParameterDefinitionFromAttributes)) {
1649 outputParameterType = outputParameterDefinitionFromAttributes.getType();
1650 outputParameterEntrySchema = outputParameterDefinitionFromAttributes.getEntry_schema();
1652 //If the below fails due to null pointer then we need to check if the heatToToscaMapping
1653 // properties and global types are in sync. Ideally the parameter should be found in either
1654 // properties or attributes collected from global types
1655 PropertyDefinition outputParameterDefinitionFromProperties =
1656 nodeTypeWithFlatHierarchy.getProperties().get(outputParameterName);
1657 outputParameterType = outputParameterDefinitionFromProperties.getType();
1658 outputParameterEntrySchema = outputParameterDefinitionFromProperties.getEntry_schema();
1660 //Set the type and entry schema for the output param obtained from the node type hierarchy
1661 outputParameter.setType(outputParameterType);
1662 outputParameter.setEntry_schema(outputParameterEntrySchema);
1665 private AttributeDefinition getOutputParameterDefinitionFromAttributes(NodeType
1666 nodeTypeWithFlatHierarchy,
1667 String outputParameterName) {
1668 AttributeDefinition outputParameterDefinition = null;
1669 if ((Objects.nonNull(nodeTypeWithFlatHierarchy.getAttributes()))
1670 && (nodeTypeWithFlatHierarchy.getAttributes().containsKey(outputParameterName))) {
1671 outputParameterDefinition =
1672 nodeTypeWithFlatHierarchy.getAttributes().get(outputParameterName);
1674 return outputParameterDefinition;
1677 private String getNewSubstitutionOutputParameterId(String newNodeTemplateId,
1678 String attributeName) {
1679 return newNodeTemplateId + "_" + attributeName;
1682 private void addUnifiedSubstitionData(TranslationContext context, ServiceTemplate
1683 serviceTemplate, List<UnifiedCompositionData> unifiedCompositionDataList, String
1684 substituteNodeTemplateId) {
1685 String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate);
1686 for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) {
1687 //Add compute node template mapping information
1688 ComputeTemplateConsolidationData computeTemplateConsolidationData =
1689 unifiedCompositionData.getComputeTemplateConsolidationData();
1690 String computeNodeTemplateId = computeTemplateConsolidationData.getNodeTemplateId();
1691 context.addUnifiedSubstitutionData(serviceTemplateFileName, computeNodeTemplateId,
1692 substituteNodeTemplateId);
1693 //Add Port template mapping information
1694 List<PortTemplateConsolidationData> portTemplateConsolidationDataList =
1695 getPortTemplateConsolidationDataList(unifiedCompositionData);
1697 if (CollectionUtils.isNotEmpty(portTemplateConsolidationDataList)) {
1698 for (PortTemplateConsolidationData portTemplateConsolidationData :
1699 portTemplateConsolidationDataList) {
1700 String oldPortNodeTemplateId = portTemplateConsolidationData.getNodeTemplateId();
1701 context.addUnifiedSubstitutionData(serviceTemplateFileName, oldPortNodeTemplateId,
1702 substituteNodeTemplateId);
1705 //Add Sub-interface template mapping information
1706 List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList =
1707 getSubInterfaceTemplateConsolidationDataList(unifiedCompositionData);
1708 if (CollectionUtils.isNotEmpty(subInterfaceTemplateConsolidationDataList)) {
1709 for (SubInterfaceTemplateConsolidationData subInterfaceTemplateConsolidationData :
1710 subInterfaceTemplateConsolidationDataList) {
1711 context.addUnifiedSubstitutionData(serviceTemplateFileName,
1712 subInterfaceTemplateConsolidationData.getNodeTemplateId(), substituteNodeTemplateId);
1718 private void addIndexValueProperty(NodeTemplate nodeTemplate) {
1719 List<String> indexValueGetPropertyValue = new ArrayList<>();
1720 indexValueGetPropertyValue.add(ToscaConstants.MODELABLE_ENTITY_NAME_SELF);
1721 indexValueGetPropertyValue.add(ToscaConstants.SERVICE_TEMPLATE_FILTER_PROPERTY_NAME);
1722 indexValueGetPropertyValue.add(ToscaConstants.INDEX_VALUE_PROPERTY_NAME);
1724 Map<String, Object> indexPropertyValue = new HashMap<>();
1725 Map<String, Object> properties = nodeTemplate.getProperties();
1726 indexPropertyValue.put(ToscaFunctions.GET_PROPERTY.getDisplayName(),
1727 indexValueGetPropertyValue);
1728 properties.put(ToscaConstants.INDEX_VALUE_PROPERTY_NAME,
1729 indexPropertyValue);
1730 nodeTemplate.setProperties(properties);
1733 private String getSubstituteNodeTemplateId(String nodeTypeId,
1735 String nodeTemplateId = ABSTRACT_NODE_TEMPLATE_ID_PREFIX + DataModelUtil
1736 .getNamespaceSuffix(nodeTypeId);
1737 if (Objects.nonNull(index)) {
1738 nodeTemplateId = nodeTemplateId + "_" + index.toString();
1740 return nodeTemplateId;
1744 * Gets substitution node type id.
1746 * @param serviceTemplate the service template
1747 * @param unifiedCompositionData the unified composition data
1748 * @param index the index
1749 * @return the substitution node type id
1751 public String getSubstitutionNodeTypeId(ServiceTemplate serviceTemplate,
1752 UnifiedCompositionData unifiedCompositionData,
1754 TranslationContext context) {
1755 String computeNodeTemplateId =
1756 unifiedCompositionData.getComputeTemplateConsolidationData().getNodeTemplateId();
1757 NodeTemplate computeNodeTemplate =
1758 DataModelUtil.getNodeTemplate(serviceTemplate, computeNodeTemplateId);
1759 String computeType = computeNodeTemplate.getType();
1760 String globalSTName = ToscaUtil.getServiceTemplateFileName(Constants
1761 .GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME);
1763 String nodeTypeId = ToscaNodeType.ABSTRACT_NODE_TYPE_PREFIX
1764 + DataModelUtil.getNamespaceSuffix(getIndexedGlobalNodeTypeId(computeType, context));
1766 context.updateUsedTimesForNestedComputeNodeType(globalSTName, computeType);
1768 if (Objects.nonNull(index)) {
1769 nodeTypeId = nodeTypeId + "_" + index.toString();
1774 private NodeType handleSubstitutionGlobalNodeType(ServiceTemplate serviceTemplate,
1775 ServiceTemplate substitutionServiceTemplate,
1776 TranslationContext context,
1777 String substitutionNodeTypeId) {
1778 NodeType substitutionNodeType = new ToscaAnalyzerServiceImpl()
1779 .createInitSubstitutionNodeType(substitutionServiceTemplate,
1780 ToscaNodeType.VFC_ABSTRACT_SUBSTITUTE);
1781 ServiceTemplate globalSubstitutionServiceTemplate =
1782 HeatToToscaUtil.fetchGlobalSubstitutionServiceTemplate(serviceTemplate, context);
1783 DataModelUtil.addNodeType(globalSubstitutionServiceTemplate, substitutionNodeTypeId,
1784 substitutionNodeType);
1786 return substitutionNodeType;
1789 private void handlePorts(ServiceTemplate serviceTemplate,
1790 ServiceTemplate substitutionServiceTemplate,
1791 List<UnifiedCompositionData> unifiedCompositionDataList,
1792 String connectedComputeNodeType,
1793 TranslationContext context) {
1795 if (unifiedCompositionDataList.size() > 1) {
1796 handleConsolidationPorts(serviceTemplate, substitutionServiceTemplate,
1797 unifiedCompositionDataList, connectedComputeNodeType, context);
1799 handleSinglePorts(serviceTemplate, substitutionServiceTemplate, connectedComputeNodeType,
1800 unifiedCompositionDataList, context);
1804 private void handleSinglePorts(ServiceTemplate serviceTemplate,
1805 ServiceTemplate substitutionServiceTemplate,
1806 String connectedComputeNodeType,
1807 List<UnifiedCompositionData> unifiedCompositionDataList,
1808 TranslationContext context) {
1809 UnifiedCompositionData unifiedCompositionData = unifiedCompositionDataList.get(0);
1810 List<PortTemplateConsolidationData> portTemplateConsolidationDataList =
1811 getPortTemplateConsolidationDataList(unifiedCompositionData);
1812 if (CollectionUtils.isEmpty(portTemplateConsolidationDataList)) {
1815 for (PortTemplateConsolidationData portTemplateConsolidationData :
1816 portTemplateConsolidationDataList) {
1817 List<EntityConsolidationData> portConsolidationDataList = new ArrayList<>();
1818 portConsolidationDataList.add(portTemplateConsolidationData);
1819 handlePortNodeTemplate(serviceTemplate, substitutionServiceTemplate,
1820 portConsolidationDataList, connectedComputeNodeType,
1821 unifiedCompositionData.getComputeTemplateConsolidationData(),
1822 unifiedCompositionDataList, context);
1826 private void handleConsolidationPorts(ServiceTemplate serviceTemplate,
1827 ServiceTemplate substitutionServiceTemplate,
1828 List<UnifiedCompositionData> unifiedCompositionDataList,
1829 String connectedComputeNodeType,
1830 TranslationContext context) {
1831 Map<String, List<String>> portIdsPerPortType =
1832 UnifiedCompositionUtil.collectAllPortsOfEachTypeFromComputes(unifiedCompositionDataList);
1834 for (Map.Entry<String, List<String>> portIdsPerPortTypeEntry : portIdsPerPortType.entrySet()) {
1835 List<EntityConsolidationData> portTemplateConsolidationDataList =
1836 getPortConsolidationDataList(portIdsPerPortTypeEntry.getValue(), unifiedCompositionDataList);
1837 if (CollectionUtils.isEmpty(portTemplateConsolidationDataList)) {
1841 handlePortNodeTemplate(serviceTemplate, substitutionServiceTemplate, portTemplateConsolidationDataList,
1842 connectedComputeNodeType, unifiedCompositionDataList.get(0).getComputeTemplateConsolidationData(),
1843 unifiedCompositionDataList, context);
1847 private void handlePortNodeTemplate(
1848 ServiceTemplate serviceTemplate,
1849 ServiceTemplate substitutionServiceTemplate,
1850 List<EntityConsolidationData> portTemplateConsolidationDataList,
1851 String connectedComputeNodeType,
1852 ComputeTemplateConsolidationData computeTemplateConsolidationData,
1853 List<UnifiedCompositionData> unifiedCompositionDataList,
1854 TranslationContext context) {
1855 EntityConsolidationData portTemplateConsolidationData =
1856 portTemplateConsolidationDataList.get(0);
1857 NodeTemplate newPortNodeTemplate = getNodeTemplate(
1858 portTemplateConsolidationData.getNodeTemplateId(), serviceTemplate, context).clone();
1860 removeConnectivityOut(portTemplateConsolidationData, newPortNodeTemplate);
1861 handleProperties(serviceTemplate, newPortNodeTemplate,
1862 substitutionServiceTemplate, UnifiedCompositionEntity.PORT,
1863 portTemplateConsolidationDataList, computeTemplateConsolidationData,
1864 unifiedCompositionDataList, context);
1866 //Add subinterface_indicator property to PORT
1867 portTemplateConsolidationDataList.forEach(entity ->
1868 addPortSubInterfaceIndicatorProperty(newPortNodeTemplate.getProperties(), entity));
1870 String newPortNodeTemplateId =
1871 getNewPortNodeTemplateId(portTemplateConsolidationData
1872 .getNodeTemplateId(), connectedComputeNodeType,
1873 computeTemplateConsolidationData);
1874 //Update requirements for relationships between the consolidation entities
1875 handleConsolidationEntitiesRequirementConnectivity(newPortNodeTemplate,
1876 serviceTemplate, context);
1877 DataModelUtil.addNodeTemplate(substitutionServiceTemplate, newPortNodeTemplateId,
1878 newPortNodeTemplate);
1880 //Add the node template mapping in the context for handling requirement updation
1881 for (EntityConsolidationData data : portTemplateConsolidationDataList) {
1882 String newPortTemplateId = getNewPortNodeTemplateId(data.getNodeTemplateId(),
1883 connectedComputeNodeType, computeTemplateConsolidationData);
1884 context.addSubstitutionServiceTemplateUnifiedSubstitutionData(ToscaUtil
1885 .getServiceTemplateFileName(serviceTemplate), data.getNodeTemplateId(),
1891 private void handleSubInterfaces(UnifiedCompositionTo unifiedCompositionTo) {
1892 if (unifiedCompositionTo.getUnifiedCompositionDataList().size() > 1) {
1893 handleConsolidationSubInterfaces(unifiedCompositionTo);
1895 handleSingleSubInterfaces(unifiedCompositionTo);
1899 private void handleSingleSubInterfaces(UnifiedCompositionTo unifiedCompositionTo) {
1900 UnifiedCompositionData unifiedCompositionData = unifiedCompositionTo.getUnifiedCompositionDataList().get(0);
1901 List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList =
1902 getSubInterfaceTemplateConsolidationDataList(unifiedCompositionData);
1903 for (SubInterfaceTemplateConsolidationData subInterfaceTemplateConsolidationData :
1904 subInterfaceTemplateConsolidationDataList) {
1905 List<SubInterfaceTemplateConsolidationData> subInterfaceDataList = new ArrayList<>();
1906 subInterfaceDataList.add(subInterfaceTemplateConsolidationData);
1907 createSubInterfaceSubstitutionNodeTemplate(unifiedCompositionTo, subInterfaceDataList);
1911 private void handleConsolidationSubInterfaces(UnifiedCompositionTo unifiedCompositionTo) {
1912 Map<String, List<String>> portIdsPerPortType =
1913 UnifiedCompositionUtil.collectAllPortsOfEachTypeFromComputes(
1914 unifiedCompositionTo.getUnifiedCompositionDataList());
1916 for (Map.Entry<String, List<String>> portIdsPerPortTypeEntry : portIdsPerPortType.entrySet()) {
1917 List<EntityConsolidationData> portEntityConsolidationDataList =
1918 getPortConsolidationDataList(portIdsPerPortTypeEntry.getValue(),
1919 unifiedCompositionTo.getUnifiedCompositionDataList());
1920 if (CollectionUtils.isEmpty(portEntityConsolidationDataList)) {
1924 List<PortTemplateConsolidationData> portTemplateConsolidationDataList =
1925 portEntityConsolidationDataList.stream().map(data -> (PortTemplateConsolidationData) data)
1926 .collect(Collectors.toList());
1928 ListMultimap<String, SubInterfaceTemplateConsolidationData> subInterfacesByType =
1929 UnifiedCompositionUtil.collectAllSubInterfacesOfEachTypesFromPorts(
1930 portTemplateConsolidationDataList);
1931 Set<String> subInterfaceTypes = subInterfacesByType.keySet();
1932 for (String subInterfaceType : subInterfaceTypes) {
1933 List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList =
1934 subInterfacesByType.get(subInterfaceType);
1935 createSubInterfaceSubstitutionNodeTemplate(unifiedCompositionTo,
1936 subInterfaceTemplateConsolidationDataList);
1941 private void createSubInterfaceSubstitutionNodeTemplate(UnifiedCompositionTo unifiedCompositionTo,
1942 List<SubInterfaceTemplateConsolidationData>
1943 subInterfaceTemplateConsolidationDataList) {
1944 SubInterfaceTemplateConsolidationData subInterfaceTemplateConsolidationData =
1945 subInterfaceTemplateConsolidationDataList.get(0);
1946 Optional<PortTemplateConsolidationData> portTemplateConsolidationDataOptional =
1947 subInterfaceTemplateConsolidationData.getParentPortTemplateConsolidationData(unifiedCompositionTo
1948 .getServiceTemplate(), unifiedCompositionTo.getContext());
1949 if (!portTemplateConsolidationDataOptional.isPresent()) {
1952 PortTemplateConsolidationData portTemplateConsolidationData = portTemplateConsolidationDataOptional.get();
1953 String originalSubInterfaceNodeTemplateId = subInterfaceTemplateConsolidationDataList.get(0)
1954 .getNodeTemplateId();
1955 NodeTemplate originalSubInterfaceNodeTemplate = DataModelUtil.getNodeTemplate(unifiedCompositionTo
1956 .getServiceTemplate(), originalSubInterfaceNodeTemplateId);
1957 if (Objects.isNull(originalSubInterfaceNodeTemplate)) {
1960 NodeTemplate newSubInterfaceNodeTemplate = originalSubInterfaceNodeTemplate.clone();
1961 ComputeTemplateConsolidationData connectedComputeConsolidationData =
1962 getConnectedComputeConsolidationData(unifiedCompositionTo.getUnifiedCompositionDataList(),
1963 portTemplateConsolidationData.getNodeTemplateId());
1964 if (Objects.nonNull(connectedComputeConsolidationData)) {
1965 NodeTemplate connectedComputeNodeTemplate = DataModelUtil.getNodeTemplate(unifiedCompositionTo
1966 .getServiceTemplate(), connectedComputeConsolidationData.getNodeTemplateId());
1967 String newSubInterfaceNodeTemplateId = getNewSubInterfaceNodeTemplateId(unifiedCompositionTo
1968 .getServiceTemplate(), connectedComputeNodeTemplate.getType(), connectedComputeConsolidationData,
1969 subInterfaceTemplateConsolidationData, unifiedCompositionTo.getContext());
1970 DataModelUtil.addNodeTemplate(unifiedCompositionTo.getSubstitutionServiceTemplate(),
1971 newSubInterfaceNodeTemplateId, newSubInterfaceNodeTemplate);
1972 List<EntityConsolidationData> entityConsolidationDataList =
1973 new ArrayList<>(subInterfaceTemplateConsolidationDataList);
1974 //Remove all the existing properties as we are going to create new based on the
1975 // naming convention for the substitution
1976 handleSubInterfaceProperties(unifiedCompositionTo, originalSubInterfaceNodeTemplateId,
1977 newSubInterfaceNodeTemplate, entityConsolidationDataList, portTemplateConsolidationData);
1978 //Update requirements for relationships between the consolidation entities
1979 handleConsolidationEntitiesRequirementConnectivity(newSubInterfaceNodeTemplate, unifiedCompositionTo
1980 .getServiceTemplate(), unifiedCompositionTo.getContext());
1981 removeConnectivityOut(subInterfaceTemplateConsolidationData,newSubInterfaceNodeTemplate);
1985 private void handleSubInterfaceProperties(UnifiedCompositionTo unifiedCompositionTo,
1986 String subInterfaceNodeTemplateId,
1987 NodeTemplate newSubInterfaceNodeTemplate,
1988 List<EntityConsolidationData>
1989 entityConsolidationDataList,
1990 PortTemplateConsolidationData
1991 portTemplateConsolidationData) {
1992 UnifiedCompositionData unifiedCompositionData = unifiedCompositionTo.getUnifiedCompositionDataList().get(0);
1993 ServiceTemplate serviceTemplate = unifiedCompositionTo.getServiceTemplate();
1994 TranslationContext context = unifiedCompositionTo.getContext();
1995 newSubInterfaceNodeTemplate.setProperties(new HashMap<>());
1996 for (EntityConsolidationData entityConsolidationData : entityConsolidationDataList) {
1997 String nodeTemplateId = entityConsolidationData.getNodeTemplateId();
1998 Optional<List<String>> indexVarProperties =
1999 context.getIndexVarProperties(ToscaUtil.getServiceTemplateFileName(serviceTemplate),
2001 Map<String, Object> properties =
2002 DataModelUtil.getNodeTemplateProperties(serviceTemplate, nodeTemplateId);
2003 if (MapUtils.isEmpty(properties)) {
2007 for (Map.Entry<String, Object> propertyEntry : properties.entrySet()) {
2008 NodeType nodeTypeWithFlatHierarchy =
2009 HeatToToscaUtil.getNodeTypeWithFlatHierarchy(newSubInterfaceNodeTemplate.getType(),
2010 serviceTemplate, context);
2011 PropertyDefinition propertyDefinition =
2012 nodeTypeWithFlatHierarchy.getProperties().get(propertyEntry.getKey());
2013 String propertyType = propertyDefinition.getType();
2014 //Handle service_template_filter property for subinterface as we should not create inputs
2015 // for this property
2016 if (propertyEntry.getKey().equals(ToscaConstants.SERVICE_TEMPLATE_FILTER_PROPERTY_NAME)) {
2017 handleSubInterfaceServiceTemplateFilterProperty(subInterfaceNodeTemplateId, newSubInterfaceNodeTemplate,
2018 propertyEntry.getKey(), propertyEntry.getValue(), portTemplateConsolidationData,
2019 unifiedCompositionTo.getSubstitutionServiceTemplate());
2020 } else if (indexVarProperties.isPresent()
2021 && indexVarProperties.get().contains(propertyEntry.getKey())) {
2022 //Handle index property
2023 handleIndexVarProperty(propertyEntry.getKey(), propertyEntry.getValue(),
2024 newSubInterfaceNodeTemplate);
2026 Optional<String> parameterId =
2027 updateProperty(serviceTemplate, nodeTemplateId, newSubInterfaceNodeTemplate,
2028 propertyEntry, UnifiedCompositionEntity.SUB_INTERFACE, unifiedCompositionData
2029 .getComputeTemplateConsolidationData(), portTemplateConsolidationData,
2030 unifiedCompositionTo.getUnifiedCompositionDataList(), context);
2031 parameterId.ifPresent(
2032 parameterIdValue -> addPropertyInputParameter(propertyType,
2033 unifiedCompositionTo.getSubstitutionServiceTemplate(),
2034 propertyDefinition.getEntry_schema(), parameterIdValue));
2040 private NodeTemplate getNodeTemplate(String nodeTemplateId, ServiceTemplate serviceTemplate,
2041 TranslationContext context) {
2043 NodeTemplate nodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate, nodeTemplateId);
2045 if (Objects.isNull(nodeTemplate)) {
2046 nodeTemplate = context
2047 .getCleanedNodeTemplate(ToscaUtil.getServiceTemplateFileName(serviceTemplate),
2051 return nodeTemplate;
2055 private String handleCompute(ServiceTemplate serviceTemplate,
2056 ServiceTemplate substitutionServiceTemplate,
2057 List<UnifiedCompositionData> unifiedCompositionDataList,
2058 TranslationContext context) {
2059 ComputeTemplateConsolidationData computeTemplateConsolidationData =
2060 unifiedCompositionDataList.get(0).getComputeTemplateConsolidationData();
2061 handleComputeNodeTemplate(serviceTemplate, substitutionServiceTemplate,
2062 unifiedCompositionDataList, context);
2063 return handleComputeNodeType(serviceTemplate, substitutionServiceTemplate,
2064 computeTemplateConsolidationData);
2067 private String handleComputeNodeType(
2068 ServiceTemplate serviceTemplate,
2069 ServiceTemplate substitutionServiceTemplate,
2070 ComputeTemplateConsolidationData computeTemplateConsolidationData) {
2071 NodeTemplate computeNodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate,
2072 computeTemplateConsolidationData.getNodeTemplateId());
2073 String computeNodeTypeId = computeNodeTemplate.getType();
2074 NodeType computeNodeType =
2075 DataModelUtil.getNodeType(serviceTemplate, computeNodeTypeId);
2077 .addNodeType(substitutionServiceTemplate, computeNodeTypeId, computeNodeType);
2079 return computeNodeTypeId;
2082 private void handleComputeNodeTemplate(ServiceTemplate serviceTemplate,
2083 ServiceTemplate substitutionServiceTemplate,
2084 List<UnifiedCompositionData> unifiedCompositionDataList,
2085 TranslationContext context) {
2086 ComputeTemplateConsolidationData computeTemplateConsolidationData =
2087 unifiedCompositionDataList.get(0).getComputeTemplateConsolidationData();
2088 NodeTemplate newComputeNodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate,
2089 computeTemplateConsolidationData.getNodeTemplateId()).clone();
2091 removeConnectivityOut(computeTemplateConsolidationData, newComputeNodeTemplate);
2092 removeVolumeConnectivity(computeTemplateConsolidationData, newComputeNodeTemplate);
2094 List<EntityConsolidationData> computeConsolidationDataList =
2095 getComputeConsolidationDataList(unifiedCompositionDataList);
2097 handleProperties(serviceTemplate, newComputeNodeTemplate,
2098 substitutionServiceTemplate, COMPUTE,
2099 computeConsolidationDataList, computeTemplateConsolidationData, unifiedCompositionDataList,
2102 String newComputeNodeTemplateId = getNewComputeNodeTemplateId(serviceTemplate,
2103 computeTemplateConsolidationData.getNodeTemplateId());
2104 //Update requirements for relationships between the consolidation entities
2105 handleConsolidationEntitiesRequirementConnectivity(
2106 newComputeNodeTemplate,
2107 serviceTemplate, context);
2109 .addNodeTemplate(substitutionServiceTemplate,
2110 newComputeNodeTemplateId, newComputeNodeTemplate);
2111 //Add the node template mapping in the context for handling requirement updation
2112 for (EntityConsolidationData data : computeConsolidationDataList) {
2113 String newComputeTemplateId = getNewComputeNodeTemplateId(serviceTemplate,
2114 computeTemplateConsolidationData.getNodeTemplateId());
2115 context.addSubstitutionServiceTemplateUnifiedSubstitutionData(ToscaUtil
2116 .getServiceTemplateFileName(serviceTemplate), data.getNodeTemplateId(),
2117 newComputeTemplateId);
2121 private List<EntityConsolidationData> getComputeConsolidationDataList(
2122 List<UnifiedCompositionData> unifiedCompositionDataList) {
2123 return unifiedCompositionDataList.stream()
2124 .map(UnifiedCompositionData::getComputeTemplateConsolidationData)
2125 .collect(Collectors.toList());
2129 private void handleProperties(ServiceTemplate serviceTemplate,
2130 NodeTemplate nodeTemplate,
2131 ServiceTemplate substitutionServiceTemplate,
2132 UnifiedCompositionEntity unifiedCompositionEntity,
2133 List<EntityConsolidationData> entityConsolidationDataList,
2134 ComputeTemplateConsolidationData computeTemplateConsolidationData,
2135 List<UnifiedCompositionData> unifiedCompositionDataList,
2136 TranslationContext context) {
2137 nodeTemplate.setProperties(new HashedMap());
2138 UnifiedCompositionTo unifiedCompositionTo = new UnifiedCompositionTo(serviceTemplate, substitutionServiceTemplate,unifiedCompositionDataList, context, nodeTemplate);
2139 handleNodeTemplateProperties(unifiedCompositionTo, unifiedCompositionEntity, entityConsolidationDataList, computeTemplateConsolidationData);
2140 //Add enrich properties from openecomp node type as input to global and substitution ST
2141 handleNodeTypeProperties(substitutionServiceTemplate,
2142 entityConsolidationDataList, nodeTemplate, unifiedCompositionEntity,
2143 computeTemplateConsolidationData, context);
2146 private void addPortSubInterfaceIndicatorProperty(Map<String, Object> properties,
2147 EntityConsolidationData entityConsolidationData) {
2148 properties.put(SUB_INTERFACE_INDICATOR_PROPERTY,
2149 ((PortTemplateConsolidationData) entityConsolidationData).isPortBoundToSubInterface());
2152 private void handleNodeTemplateProperties(UnifiedCompositionTo unifiedCompositionTo,
2153 UnifiedCompositionEntity unifiedCompositionEntity,
2154 List<EntityConsolidationData>
2155 entityConsolidationDataList,
2156 ComputeTemplateConsolidationData
2157 computeTemplateConsolidationData
2159 List<String> propertiesWithIdenticalVal =
2160 consolidationService.getPropertiesWithIdenticalVal(unifiedCompositionEntity);
2162 for (EntityConsolidationData entityConsolidationData : entityConsolidationDataList) {
2163 String nodeTemplateId = entityConsolidationData.getNodeTemplateId();
2164 Optional<List<String>> indexVarProperties =
2165 unifiedCompositionTo.getContext().getIndexVarProperties(ToscaUtil.getServiceTemplateFileName(unifiedCompositionTo.getServiceTemplate()),
2167 Map<String, Object> properties =
2168 DataModelUtil.getNodeTemplateProperties(unifiedCompositionTo.getServiceTemplate(),
2170 if (MapUtils.isEmpty(properties)) {
2174 for (Map.Entry<String, Object> propertyEntry : properties.entrySet()) {
2175 NodeType nodeTypeWithFlatHierarchy =
2176 HeatToToscaUtil.getNodeTypeWithFlatHierarchy(unifiedCompositionTo.getNodeTemplate().getType(),
2177 unifiedCompositionTo.getServiceTemplate(), unifiedCompositionTo.getContext());
2178 PropertyDefinition propertyDefinition =
2179 nodeTypeWithFlatHierarchy.getProperties().get(propertyEntry.getKey());
2180 String propertyType = propertyDefinition.getType();
2182 if (propertiesWithIdenticalVal.contains(propertyEntry.getKey())) {
2183 String parameterId =
2184 updateIdenticalProperty(nodeTemplateId, propertyEntry.getKey(),
2185 unifiedCompositionTo.getNodeTemplate(),unifiedCompositionEntity, unifiedCompositionTo.getUnifiedCompositionDataList());
2188 parameterId, propertyType,
2189 propertyType.equals(PropertyType.LIST.getDisplayName()) ? propertyDefinition
2190 .getEntry_schema() : null,
2191 unifiedCompositionTo.getSubstitutionServiceTemplate());
2192 } else if (indexVarProperties.isPresent()
2193 && indexVarProperties.get().contains(propertyEntry.getKey())) {
2194 //Handle index property
2195 handleIndexVarProperty(propertyEntry.getKey(), propertyEntry.getValue(),
2196 unifiedCompositionTo.getNodeTemplate());
2198 Optional<String> parameterId =
2199 updateProperty(unifiedCompositionTo.getServiceTemplate(), nodeTemplateId, unifiedCompositionTo.getNodeTemplate(), propertyEntry,
2200 unifiedCompositionEntity, computeTemplateConsolidationData, null,
2201 unifiedCompositionTo.getUnifiedCompositionDataList(),
2202 unifiedCompositionTo.getContext());
2203 parameterId.ifPresent(
2204 parameterIdValue -> addPropertyInputParameter(propertyType,
2205 unifiedCompositionTo.getSubstitutionServiceTemplate(),
2206 propertyDefinition.getEntry_schema(), parameterIdValue));
2212 private void handleIndexVarProperty(String propertyKey, Object propertyValue,
2213 NodeTemplate nodeTemplate) {
2214 //Retain properties translated from %index% value in heat
2215 nodeTemplate.getProperties().put(propertyKey, propertyValue);
2218 private void handleSubInterfaceServiceTemplateFilterProperty(String subInterfaceNodeTemplateId,
2219 NodeTemplate nodeTemplate,
2221 Object propertyValue,
2222 PortTemplateConsolidationData
2223 portTemplateConsolidationData,
2224 ServiceTemplate substitutionServiceTemplate) {
2225 //Retain service_template_filter (Can be present in a sub-interface resource-def)
2226 if (propertyValue instanceof Map) {
2227 Map<String, Object> serviceTemplateFilterPropertyMap = new HashMap<>((Map<String, Object>) propertyValue);
2228 handleCountProperty(subInterfaceNodeTemplateId, nodeTemplate, portTemplateConsolidationData,
2229 substitutionServiceTemplate, serviceTemplateFilterPropertyMap);
2230 DataModelUtil.addNodeTemplateProperty(nodeTemplate, propertyKey, serviceTemplateFilterPropertyMap);
2234 private void handleCountProperty(String subInterfaceNodeTemplateId, NodeTemplate nodeTemplate,
2235 PortTemplateConsolidationData portTemplateConsolidationData,
2236 ServiceTemplate substitutionServiceTemplate,
2237 Map<String, Object> serviceTemplatePropertyMap) {
2238 String countInputParameterId = getSubInterfaceInputParameterId(nodeTemplate.getType(), subInterfaceNodeTemplateId,
2239 ToscaConstants.SERVICE_TEMPLATE_FILTER_COUNT, portTemplateConsolidationData);
2240 EntrySchema entrySchema = new EntrySchema();
2241 entrySchema.setType(PropertyType.FLOAT.getDisplayName());
2242 addInputParameter(countInputParameterId, PropertyType.LIST.getDisplayName(), entrySchema,
2243 substitutionServiceTemplate);
2244 Map<String, List<String>> countPropertyValueInputParam = getPropertyValueInputParam(countInputParameterId);
2245 serviceTemplatePropertyMap.remove(ToscaConstants.COUNT_PROPERTY_NAME);
2246 serviceTemplatePropertyMap.put(ToscaConstants.COUNT_PROPERTY_NAME, countPropertyValueInputParam);
2249 private void handleNodeTypeProperties(ServiceTemplate substitutionServiceTemplate,
2250 List<EntityConsolidationData> entityConsolidationDataList,
2251 NodeTemplate nodeTemplate,
2252 UnifiedCompositionEntity compositionEntity,
2253 ComputeTemplateConsolidationData
2254 computeTemplateConsolidationData,
2255 TranslationContext context) {
2256 ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl();
2257 Optional<NodeType> enrichNodeType;
2258 List<String> enrichProperties;
2260 if (compositionEntity.equals(UnifiedCompositionEntity.PORT)) {
2262 toscaAnalyzerService.fetchNodeType(ToscaNodeType.NETWORK_PORT,
2263 context.getGlobalServiceTemplates().values());
2264 enrichProperties = TranslationContext.getEnrichPortResourceProperties();
2265 if (!enrichNodeType.isPresent() || Objects.isNull(enrichProperties)) {
2272 Map<String, Object> nodeTemplateProperties = nodeTemplate.getProperties();
2273 Map<String, PropertyDefinition> enrichNodeTypeProperties = enrichNodeType.get().getProperties();
2274 if (Objects.nonNull(enrichNodeTypeProperties)) {
2275 for (String enrichPropertyName : enrichProperties) {
2276 handleEntityConsolidationDataNodeTypeProperties(
2277 enrichPropertyName, substitutionServiceTemplate,
2278 enrichNodeType.get(), nodeTemplate, compositionEntity, computeTemplateConsolidationData,
2279 entityConsolidationDataList, nodeTemplateProperties, context);
2284 private void handleEntityConsolidationDataNodeTypeProperties(String enrichPropertyName,
2285 ServiceTemplate substitutionServiceTemplate,
2286 NodeType enrichNodeType,
2287 NodeTemplate nodeTemplate,
2288 UnifiedCompositionEntity compositionEntity,
2289 ComputeTemplateConsolidationData computeTemplateConsolidationData,
2290 List<EntityConsolidationData> entityConsolidationDataList,
2291 Map<String, Object> nodeTemplateProperties,
2292 TranslationContext context) {
2294 String propertyType;
2296 for (EntityConsolidationData entityConsolidationData : entityConsolidationDataList) {
2297 String nodeTemplateId = entityConsolidationData.getNodeTemplateId();
2299 String inputParamId =
2300 getParameterId(nodeTemplateId, nodeTemplate, enrichPropertyName,
2301 compositionEntity, computeTemplateConsolidationData, null);
2302 Map<String, String> propertyValMap = new HashMap<>();
2305 .addNewPropertyIdToNodeTemplate(
2306 ToscaUtil.getServiceTemplateFileName(substitutionServiceTemplate),
2307 inputParamId, nodeTemplateProperties.get(enrichPropertyName));
2309 if (nodeTemplateProperties.containsKey(enrichPropertyName)) {
2310 handleExistingEnrichedProperty(enrichPropertyName, nodeTemplateProperties, inputParamId);
2312 propertyValMap.put(ToscaFunctions.GET_INPUT.getDisplayName(), inputParamId);
2313 nodeTemplate.getProperties().put(enrichPropertyName, propertyValMap);
2316 enrichNodeType.getProperties().get(enrichPropertyName).getType();
2318 addPropertyInputParameter(propertyType, substitutionServiceTemplate, enrichNodeType
2319 .getProperties().get(enrichPropertyName).getEntry_schema(),
2325 private void handleExistingEnrichedProperty(String enrichPropertyName,
2326 Map<String, Object> nodeTemplateProperties,
2327 String inputParamId) {
2328 Object enrichedProperty = nodeTemplateProperties.get(enrichPropertyName);
2329 if (!isPropertyContainsToscaFunction(enrichedProperty)) {
2330 Map<String, Object> propertyWithGetInput = new HashMap<>();
2331 propertyWithGetInput.put(ToscaFunctions.GET_INPUT.getDisplayName(), inputParamId);
2332 nodeTemplateProperties.put(enrichPropertyName, propertyWithGetInput);
2337 private boolean isPropertyContainsToscaFunction(Object propertyValue) {
2338 ToscaFunctions[] values = ToscaFunctions.values();
2339 for (ToscaFunctions toscaFunction : values) {
2340 if (isIncludeToscaFunc(propertyValue, toscaFunction)) {
2349 private void addPropertyInputParameter(String propertyType,
2350 ServiceTemplate substitutionServiceTemplate,
2351 EntrySchema entrySchema, String parameterId) {
2352 if (Objects.isNull(propertyType)) {
2355 if (isParameterBelongsToEnrichedPortProperties(parameterId)) {
2356 addInputParameter(parameterId,
2358 propertyType.equals(PropertyType.LIST.getDisplayName()) ? entrySchema : null,
2359 substitutionServiceTemplate);
2360 } else if (isPropertySimpleType(propertyType)) {
2361 addInputParameter(parameterId, PropertyType.LIST.getDisplayName(),
2362 DataModelUtil.createEntrySchema(propertyType.toLowerCase(), null, null),
2363 substitutionServiceTemplate);
2365 } else if (propertyType.equals(PropertyTypeExt.JSON.getDisplayName()) ||
2366 (Objects.nonNull(entrySchema) && isPropertySimpleType(entrySchema.getType()))) {
2367 addInputParameter(parameterId, PropertyType.LIST.getDisplayName(),
2368 DataModelUtil.createEntrySchema(PropertyTypeExt.JSON.getDisplayName(), null, null),
2369 substitutionServiceTemplate);
2371 addInputParameter(parameterId, analyzeParameterType(propertyType), DataModelUtil
2372 .createEntrySchema(analyzeEntrySchemaType(propertyType, entrySchema), null, null),
2373 substitutionServiceTemplate);
2377 private boolean isParameterBelongsToEnrichedPortProperties(String parameterId) {
2378 List enrichPortResourceProperties = TranslationContext.getEnrichPortResourceProperties();
2380 for (int i = 0; i < enrichPortResourceProperties.size(); i++) {
2381 if (parameterId.contains((CharSequence) enrichPortResourceProperties.get(i))) {
2389 private boolean isPropertySimpleType(String propertyType) {
2390 return !Objects.isNull(propertyType)
2391 && (PropertyType.getSimplePropertyTypes().contains(propertyType.toLowerCase()));
2394 private String analyzeParameterType(String propertyType) {
2395 return propertyType.equalsIgnoreCase(PropertyType.LIST.getDisplayName()) ? PropertyType.LIST
2396 .getDisplayName() : propertyType;
2399 private String analyzeEntrySchemaType(String propertyType, EntrySchema entrySchema) {
2400 return propertyType.equalsIgnoreCase(PropertyType.LIST.getDisplayName()) && entrySchema != null ?
2401 entrySchema.getType() : null;
2404 private void handleConsolidationEntitiesRequirementConnectivity(NodeTemplate nodeTemplate,
2405 ServiceTemplate serviceTemplate,
2406 TranslationContext context) {
2407 List<Map<String, RequirementAssignment>> nodeTemplateRequirements = DataModelUtil
2408 .getNodeTemplateRequirementList(nodeTemplate);
2409 if (CollectionUtils.isEmpty(nodeTemplateRequirements)) {
2413 for (Map<String, RequirementAssignment> requirement : nodeTemplateRequirements) {
2414 for (Map.Entry<String, RequirementAssignment> entry : requirement.entrySet()) {
2415 RequirementAssignment requirementAssignment = entry.getValue();
2416 String requirementNode = requirementAssignment.getNode();
2417 String unifiedNodeTemplateId =
2418 context.getUnifiedSubstitutionNodeTemplateId(serviceTemplate,
2420 if (unifiedNodeTemplateId != null) {
2421 //Update the node id in the requirement
2422 requirementAssignment.setNode(unifiedNodeTemplateId);
2426 nodeTemplate.setRequirements(nodeTemplateRequirements);
2430 * Update the node references in the volume relationship templates.
2432 * @param serviceTemplate the service template
2433 * @param context the context
2435 private void updateVolumeRelationshipTemplate(ServiceTemplate serviceTemplate,
2436 String relationshipId,
2437 TranslationContext context) {
2438 Map<String, RelationshipTemplate> relationshipTemplates = DataModelUtil
2439 .getRelationshipTemplates(serviceTemplate);
2440 if (relationshipTemplates != null) {
2441 RelationshipTemplate relationshipTemplate = relationshipTemplates.get(relationshipId);
2442 if (relationshipTemplate != null) {
2443 String relationshipTemplateType = relationshipTemplate.getType();
2444 if (relationshipTemplateType.equals(ToscaRelationshipType.CINDER_VOLUME_ATTACHES_TO)) {
2445 handleCinderVolumeAttachmentRelationshipTemplate(serviceTemplate,
2446 relationshipTemplate, context);
2453 private void handleCinderVolumeAttachmentRelationshipTemplate(ServiceTemplate
2454 substitutionServiceTemplate,
2455 RelationshipTemplate
2456 relationshipTemplate,
2457 TranslationContext context) {
2458 Map<String, Object> properties = relationshipTemplate.getProperties();
2459 properties.computeIfPresent(HeatConstants.INSTANCE_UUID_PROPERTY_NAME, (key, value) ->
2460 context.getUnifiedAbstractNodeTemplateId(substitutionServiceTemplate,
2464 private String updateIdenticalProperty(String nodeTemplateId, String propertyId,
2465 NodeTemplate nodeTemplate,
2466 UnifiedCompositionEntity unifiedCompositionEntity,
2467 List<UnifiedCompositionData> unifiedCompositionDataList) {
2469 String inputParamId = null;
2470 Map<String, Object> propertyVal = new HashMap<>();
2472 switch (unifiedCompositionEntity) {
2474 inputParamId = COMPUTE_IDENTICAL_VALUE_PROPERTY_PREFIX + propertyId
2475 + COMPUTE_IDENTICAL_VALUE_PROPERTY_SUFFIX;
2476 propertyVal.put(ToscaFunctions.GET_INPUT.getDisplayName(), inputParamId);
2477 nodeTemplate.getProperties().put(propertyId, propertyVal);
2480 String portType = ConsolidationDataUtil.getPortType(nodeTemplateId);
2481 ComputeTemplateConsolidationData computeTemplateConsolidationData =
2482 getConnectedComputeConsolidationData(unifiedCompositionDataList, nodeTemplateId);
2483 inputParamId = getInputParamIdForPort(nodeTemplateId, propertyId, portType, computeTemplateConsolidationData);
2484 propertyVal.put(ToscaFunctions.GET_INPUT.getDisplayName(), inputParamId);
2485 nodeTemplate.getProperties().put(propertyId, propertyVal);
2490 return inputParamId;
2493 private String getInputParamIdForPort(String nodeTemplateId, String propertyId, String portType,
2494 ComputeTemplateConsolidationData computeTemplateConsolidationData) {
2495 String inputParamId;
2496 if (Objects.isNull(computeTemplateConsolidationData)
2497 || computeTemplateConsolidationData.getPorts().get(portType).size() > 1) {
2499 UnifiedCompositionEntity.PORT.getDisplayName().toLowerCase() + "_" + nodeTemplateId + "_" +
2504 UnifiedCompositionEntity.PORT.getDisplayName().toLowerCase() + "_" + portType + "_"
2507 return inputParamId;
2510 private void addInputParameter(String parameterId,
2511 String parameterType,
2512 EntrySchema entrySchema,
2513 ServiceTemplate serviceTemplate) {
2515 ParameterDefinition parameterDefinition = DataModelUtil.createParameterDefinition(parameterType, null, true,
2516 null, entrySchema, null);
2520 .addInputParameterToTopologyTemplate(serviceTemplate, parameterId, parameterDefinition);
2523 // Return the input parameter Id which is used in the new property value if there is one
2524 private Optional<String> updateProperty(
2525 ServiceTemplate serviceTemplate,
2526 String nodeTemplateId, NodeTemplate nodeTemplate,
2527 Map.Entry<String, Object> propertyEntry,
2528 UnifiedCompositionEntity compositionEntity,
2529 ComputeTemplateConsolidationData computeTemplateConsolidationData,
2530 PortTemplateConsolidationData portTemplateConsolidationData,
2531 List<UnifiedCompositionData> unifiedCompositionDataList,
2532 TranslationContext context) {
2534 if (handleGetAttrFromConsolidationNodes(serviceTemplate, nodeTemplateId, nodeTemplate,
2535 propertyEntry, unifiedCompositionDataList, context)) {
2536 return Optional.empty();
2540 String inputParamId =
2541 getParameterId(nodeTemplateId, nodeTemplate, propertyEntry.getKey(), compositionEntity,
2542 computeTemplateConsolidationData, portTemplateConsolidationData);
2543 Map<String, List<String>> propertyVal = getPropertyValueInputParam(inputParamId);
2544 nodeTemplate.getProperties().put(propertyEntry.getKey(), propertyVal);
2545 return Optional.of(inputParamId);
2548 private Map<String, List<String>> getPropertyValueInputParam(String inputParamId) {
2549 Map<String, List<String>> propertyVal = new HashMap<>();
2550 List<String> getInputFuncParams = new ArrayList<>();
2551 getInputFuncParams.add(inputParamId);
2552 getInputFuncParams.add(ToscaConstants.INDEX_VALUE_PROPERTY_NAME);
2553 propertyVal.put(ToscaFunctions.GET_INPUT.getDisplayName(), getInputFuncParams);
2557 private boolean handleGetAttrFromConsolidationNodes(
2558 ServiceTemplate serviceTemplate,
2559 String nodeTemplateId, NodeTemplate nodeTemplate,
2560 Map.Entry<String, Object> propertyEntry,
2561 List<UnifiedCompositionData> unifiedCompositionDataList,
2562 TranslationContext context) {
2563 Map<String, UnifiedCompositionEntity> consolidationNodeTemplateIdAndType =
2564 getAllConsolidationNodeTemplateIdAndType(unifiedCompositionDataList);
2566 Set<String> consolidationNodeTemplateIds = consolidationNodeTemplateIdAndType.keySet();
2567 Map<String, String> entityIdToType = ConsolidationService.getConsolidationEntityIdToType(
2568 serviceTemplate, context.getConsolidationData());
2569 boolean includeGetAttrFromConsolidationNodes = false;
2570 boolean includeGetAttrFromOutsideNodes = false;
2571 boolean isGetAttrFromConsolidationIsFromSameType = false;
2572 List<List<Object>> getAttrFunctionList = extractGetAttrFunction(propertyEntry.getValue());
2573 for (List<Object> getAttrFunc : getAttrFunctionList) {
2574 String getAttrNodeId = (String) getAttrFunc.get(0);
2575 if (consolidationNodeTemplateIds.contains(getAttrNodeId)) {
2576 includeGetAttrFromConsolidationNodes = true;
2577 if (isGetAttrNodeTemplateFromSameType(nodeTemplateId, getAttrNodeId, entityIdToType)) {
2578 isGetAttrFromConsolidationIsFromSameType = true;
2581 includeGetAttrFromOutsideNodes = true;
2584 if ((includeGetAttrFromConsolidationNodes && includeGetAttrFromOutsideNodes)
2586 (includeGetAttrFromConsolidationNodes && isIncludeToscaFunc(propertyEntry.getValue(),
2587 ToscaFunctions.GET_INPUT))) {
2588 //This case is currently not supported - this property will be ignored
2590 } else if (includeGetAttrFromConsolidationNodes && !isGetAttrFromConsolidationIsFromSameType) {
2591 Object clonedPropertyValue = getClonedPropertyValue(propertyEntry);
2592 List<List<Object>> clonedGetAttrFuncList = extractGetAttrFunction(clonedPropertyValue);
2593 for (List<Object> getAttrFunc : clonedGetAttrFuncList) {
2594 String targetNodeTemplateId = (String) getAttrFunc.get(0);
2595 if (consolidationNodeTemplateIds.contains(targetNodeTemplateId)) {
2596 updatePropertyGetAttrFunc(serviceTemplate, unifiedCompositionDataList,
2597 consolidationNodeTemplateIdAndType, targetNodeTemplateId, getAttrFunc, context);
2600 nodeTemplate.getProperties().put(propertyEntry.getKey(), clonedPropertyValue);
2606 private boolean isGetAttrNodeTemplateFromSameType(String sourceNodeTemplateId,
2607 String targetNodeTemplateId,
2608 Map<String, String> nodeTemplateIdToType) {
2610 if (Objects.isNull(nodeTemplateIdToType.get(sourceNodeTemplateId))
2611 || Objects.isNull(nodeTemplateIdToType.get(targetNodeTemplateId))) {
2615 return nodeTemplateIdToType.get(sourceNodeTemplateId).equals(nodeTemplateIdToType
2616 .get(targetNodeTemplateId));
2619 private void updatePropertyGetAttrFunc(
2620 ServiceTemplate serviceTemplate,
2621 List<UnifiedCompositionData> unifiedCompositionDataList,
2622 Map<String, UnifiedCompositionEntity> consolidationNodeTemplateIdAndType,
2623 String targetNodeTemplateId,
2624 List<Object> getAttrFunc, TranslationContext context) {
2625 UnifiedCompositionEntity targetCompositionEntity =
2626 consolidationNodeTemplateIdAndType.get(targetNodeTemplateId);
2627 String targetNewNodeTemplateId =
2628 getNewNodeTemplateId(serviceTemplate, unifiedCompositionDataList, targetNodeTemplateId,
2629 targetCompositionEntity, context);
2630 getAttrFunc.set(0, targetNewNodeTemplateId);
2633 private String getNewNodeTemplateId(ServiceTemplate serviceTemplate,
2634 List<UnifiedCompositionData> unifiedCompositionDataList,
2635 String nodeTemplateId,
2636 UnifiedCompositionEntity compositionEntity,
2637 TranslationContext context) {
2638 String newNodeTemplateId = nodeTemplateId;
2639 String nodeTemplateIdGeneratorImpl = unifiedSubstitutionNodeTemplateIdGeneratorImplMap.get(compositionEntity);
2640 UnifiedSubstitutionNodeTemplateIdGenerator nodeTemplateIdGenerator =
2641 CommonMethods.newInstance(nodeTemplateIdGeneratorImpl, UnifiedSubstitutionNodeTemplateIdGenerator.class);
2642 UnifiedCompositionTo unifiedCompositionTo = new UnifiedCompositionTo(serviceTemplate, null,
2643 unifiedCompositionDataList, context, null);
2644 Optional<String> generatedNodeTemplateId = nodeTemplateIdGenerator.generate(unifiedCompositionTo, nodeTemplateId);
2645 if (generatedNodeTemplateId.isPresent()) {
2646 newNodeTemplateId = generatedNodeTemplateId.get();
2648 return newNodeTemplateId;
2651 private String getNewNodeTemplateId(String origNodeTemplateId,
2652 String serviceTemplateFileName,
2653 ServiceTemplate serviceTemplate,
2654 TranslationContext context) {
2655 ConsolidationData consolidationData = context.getConsolidationData();
2657 if (isIdIsOfExpectedType(origNodeTemplateId, UnifiedCompositionEntity.PORT,
2658 serviceTemplateFileName,
2660 return handleIdOfPort(origNodeTemplateId, serviceTemplateFileName, consolidationData);
2661 } else if (isIdIsOfExpectedType(origNodeTemplateId, COMPUTE,
2662 serviceTemplateFileName, context)) {
2663 NodeTemplate nodeTemplate =
2664 getComputeNodeTemplate(origNodeTemplateId, serviceTemplate, context);
2665 return getComputeTypeSuffix(nodeTemplate.getType());
2671 private Object getClonedPropertyValue(Map.Entry<String, Object> propertyEntry) {
2672 if (propertyEntry.getValue() instanceof Map) {
2673 return getClonedObject(propertyEntry.getValue(), Map.class);
2674 } else if (propertyEntry.getValue() instanceof List) {
2675 return getClonedObject(propertyEntry.getValue(), List.class);
2677 return propertyEntry.getValue();
2681 private String getParameterId(String nodeTemplateId, NodeTemplate nodeTemplate, String propertyId,
2682 UnifiedCompositionEntity unifiedCompositionEntity,
2683 ComputeTemplateConsolidationData
2684 computeTemplateConsolidationData,
2685 PortTemplateConsolidationData portTemplateConsolidationData) {
2686 String paramterId = propertyId;
2687 switch (unifiedCompositionEntity) {
2689 paramterId = COMPUTE.getDisplayName().toLowerCase() + "_"
2690 + getComputeTypeSuffix(nodeTemplate.getType()) + "_" + propertyId;
2693 String portType = ConsolidationDataUtil.getPortType(nodeTemplateId);
2694 if (Objects.isNull(computeTemplateConsolidationData)
2695 || computeTemplateConsolidationData.getPorts().get(portType).size() > 1) {
2696 paramterId = UnifiedCompositionEntity.PORT.getDisplayName().toLowerCase() + "_"
2697 + nodeTemplateId + "_" + propertyId;
2699 paramterId = UnifiedCompositionEntity.PORT.getDisplayName().toLowerCase() + "_" + portType + "_"
2704 paramterId = getSubInterfaceInputParameterId(nodeTemplate.getType(), nodeTemplateId, propertyId,
2705 portTemplateConsolidationData);
2713 private String getSubInterfaceInputParameterId(String type,
2714 String nodeTemplateId,
2716 PortTemplateConsolidationData portTemplateConsolidationData) {
2717 String subInterfaceType = getSubInterfaceTypeSuffix(type);
2718 if (Objects.isNull(portTemplateConsolidationData)
2719 || portTemplateConsolidationData.isSubInterfaceNodeTemplateIdParameter(type)) {
2720 return UnifiedCompositionEntity.SUB_INTERFACE.getDisplayName().toLowerCase() + "_"
2721 + nodeTemplateId + "_" + propertyId;
2723 return UnifiedCompositionEntity.SUB_INTERFACE.getDisplayName().toLowerCase() + "_"
2724 + subInterfaceType + "_" + propertyId;
2727 private void removeConnectivityOut(EntityConsolidationData entityConsolidationData,
2728 NodeTemplate nodeTemplate) {
2730 Multimap<String, RequirementAssignmentData> nodesConnectedOut = entityConsolidationData.getNodesConnectedOut();
2732 if (CommonUtil.isMultimapEmpty(nodesConnectedOut)) {
2736 nodesConnectedOut.values().forEach(requirementAssignmentData ->
2737 DataModelUtil.removeRequirementsAssignment(nodeTemplate.getRequirements(),
2738 requirementAssignmentData.getRequirementId())
2741 if (nodeTemplate.getRequirements().isEmpty()) {
2742 nodeTemplate.setRequirements(null);
2746 private void removeVolumeConnectivity(ComputeTemplateConsolidationData computeTemplateConsolidationData,
2747 NodeTemplate computeNodeTemplate) {
2748 if (CommonUtil.isMultimapEmpty(computeTemplateConsolidationData.getVolumes())) {
2752 computeTemplateConsolidationData.getVolumes().values().forEach(requirementAssignmentData ->
2753 DataModelUtil.removeRequirementsAssignment(computeNodeTemplate.getRequirements(),
2754 requirementAssignmentData.getRequirementId())
2757 if (computeNodeTemplate.getRequirements().isEmpty()) {
2758 computeNodeTemplate.setRequirements(null);
2762 private void createIndexInputParameter(ServiceTemplate substitutionServiceTemplate) {
2763 ParameterDefinition indexParameterDefinition =
2764 DataModelUtil.createParameterDefinition(PropertyType.INTEGER.getDisplayName(),
2765 "Index value of this substitution service template runtime instance",
2766 false, createIndexValueConstraint(), null, 0);
2767 DataModelUtil.addInputParameterToTopologyTemplate(substitutionServiceTemplate,
2768 ToscaConstants.INDEX_VALUE_PROPERTY_NAME, indexParameterDefinition);
2772 private List<Constraint> createIndexValueConstraint() {
2773 List<Constraint> constraints;
2774 constraints = new ArrayList<>();
2775 Constraint constraint = new Constraint();
2776 constraint.setGreater_or_equal(0);
2777 constraints.add(constraint);
2781 private Optional<UnifiedComposition> getUnifiedCompositionInstance(UnifiedCompositionMode mode) {
2782 String unifiedCompositionImplClassName =
2783 unifiedCompositionImplMap.get(mode.name()).getImplementationClass();
2784 if (StringUtils.isEmpty(unifiedCompositionImplClassName)) {
2785 return Optional.empty();
2788 .of(CommonMethods.newInstance(unifiedCompositionImplClassName, UnifiedComposition.class));
2791 private Optional<Map<String, Object>> createAbstractSubstitutionProperties(
2792 ServiceTemplate serviceTemplate,
2793 Map<String, ParameterDefinition> substitutionTemplateInputs,
2794 List<UnifiedCompositionData> unifiedCompositionDataList,
2795 TranslationContext context) {
2796 Map<String, Object> abstractSubstituteProperties = new LinkedHashMap<>();
2797 //Since all the computes have the same type fetching the type from the first entry
2798 NodeTemplate firstComputeNodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate,
2799 unifiedCompositionDataList.get(0)
2800 .getComputeTemplateConsolidationData().getNodeTemplateId());
2801 String computeType = getComputeTypeSuffix(firstComputeNodeTemplate.getType());
2802 for (Map.Entry<String, ParameterDefinition> input : substitutionTemplateInputs.entrySet()) {
2803 String substitutionTemplateInputName = input.getKey();
2804 ParameterDefinition inputParameterDefinition = input.getValue();
2805 String inputType = inputParameterDefinition.getType();
2806 UnifiedCompositionEntity inputUnifiedCompositionEntity =
2807 getInputCompositionEntity(substitutionTemplateInputName);
2809 if (isIdenticalValueProperty(substitutionTemplateInputName, inputUnifiedCompositionEntity)
2810 || !inputType.equalsIgnoreCase(PropertyType.LIST.getDisplayName())) {
2811 //Handle identical value properties
2812 Optional<String> identicalValuePropertyName =
2813 getIdenticalValuePropertyName(substitutionTemplateInputName,
2814 inputUnifiedCompositionEntity);
2816 identicalValuePropertyName.ifPresent(propertyName -> updateIdenticalPropertyValue(propertyName,
2817 substitutionTemplateInputName, inputUnifiedCompositionEntity,
2818 unifiedCompositionDataList.get(0), serviceTemplate, abstractSubstituteProperties,
2823 //Check if the input is of type compute, port or sub interface
2824 List<Object> abstractPropertyValue = new ArrayList<>();
2825 switch (inputUnifiedCompositionEntity) {
2827 createAbstractComputeProperties(unifiedCompositionDataList,
2828 substitutionTemplateInputName, serviceTemplate, abstractPropertyValue);
2831 createAbstractPortProperties(unifiedCompositionDataList, substitutionTemplateInputName,
2832 computeType, serviceTemplate, abstractPropertyValue);
2835 createAbstractSubInterfaceProperties(unifiedCompositionDataList,
2836 substitutionTemplateInputName, serviceTemplate, abstractPropertyValue);
2841 //Add the property only if it has at least one non-null value
2842 if (abstractPropertyValue.stream().anyMatch(Objects::nonNull)) {
2843 updateAbstractPropertyValue(substitutionTemplateInputName, inputParameterDefinition,
2844 abstractPropertyValue, abstractSubstituteProperties);
2847 return Optional.ofNullable(abstractSubstituteProperties);
2850 private void createAbstractComputeProperties(List<UnifiedCompositionData>
2851 unifiedCompositionDataList,
2852 String substitutionTemplateInputName,
2853 ServiceTemplate serviceTemplate,
2854 List<Object> abstractPropertyValue) {
2855 for (UnifiedCompositionData compositionData : unifiedCompositionDataList) {
2856 ComputeTemplateConsolidationData computeTemplateConsolidationData =
2857 compositionData.getComputeTemplateConsolidationData();
2858 Object propertyValue = getComputePropertyValue(substitutionTemplateInputName,
2859 serviceTemplate, computeTemplateConsolidationData);
2860 if (!(propertyValue instanceof Optional)) {
2861 abstractPropertyValue.add(propertyValue);
2866 private void createAbstractPortProperties(List<UnifiedCompositionData>
2867 unifiedCompositionDataList,
2868 String substitutionTemplateInputName,
2870 ServiceTemplate serviceTemplate,
2871 List<Object> abstractPropertyValue) {
2872 for (UnifiedCompositionData compositionData : unifiedCompositionDataList) {
2873 List<PortTemplateConsolidationData> portTemplateConsolidationDataList =
2874 getPortTemplateConsolidationDataList(compositionData);
2875 //Get the input type for this input whether it is of type
2876 // port_<port_node_template_id>_<property_name> or port_<port_type>_<property_name>
2877 PropertyInputType portInputType = getPortInputType(substitutionTemplateInputName,
2879 for (PortTemplateConsolidationData portTemplateConsolidationData :
2880 portTemplateConsolidationDataList) {
2881 //Get the port property value
2882 String portNodeTemplateId = portTemplateConsolidationData.getNodeTemplateId();
2883 Object propertyValue = getPortPropertyValue(substitutionTemplateInputName,
2884 computeType, portInputType, serviceTemplate,
2885 portNodeTemplateId);
2886 //If the value object is Optional.empty it implies that the property name was not
2887 // found in the input name
2888 if (!(propertyValue instanceof Optional)) {
2889 abstractPropertyValue.add(propertyValue);
2895 private void createAbstractSubInterfaceProperties(List<UnifiedCompositionData>
2896 unifiedCompositionDataList,
2897 String substitutionTemplateInputName,
2898 ServiceTemplate serviceTemplate,
2899 List<Object> abstractPropertyValue) {
2900 for (UnifiedCompositionData compositionData : unifiedCompositionDataList) {
2901 List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList =
2902 getSubInterfaceTemplateConsolidationDataList(compositionData);
2903 //Get the input type for this input whether it is of type
2904 // subInterface_<subinterface_node_template_id>_<property_name> or
2905 // subInterface_<subinterface_type>_<property_name>
2906 PropertyInputType subInterfaceInputType =
2907 getSubInterfaceInputType(substitutionTemplateInputName, compositionData);
2908 for (SubInterfaceTemplateConsolidationData subInterfaceTemplateConsolidationData :
2909 subInterfaceTemplateConsolidationDataList) {
2910 //Get the subInterface property value
2911 String subInterfaceNodeTemplateId = subInterfaceTemplateConsolidationData
2912 .getNodeTemplateId();
2913 NodeTemplate subInterfaceNodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate,
2914 subInterfaceNodeTemplateId);
2915 String subInterfaceType = getSubInterfaceTypeSuffix(subInterfaceNodeTemplate
2917 Object propertyValue = getSubInterfacePropertyValue(substitutionTemplateInputName,
2918 subInterfaceType, subInterfaceInputType, serviceTemplate,
2919 subInterfaceNodeTemplateId);
2920 //If the value object is Optional.empty it implies that the property name was not
2921 // found in the input name
2922 if (!(propertyValue instanceof Optional)) {
2923 abstractPropertyValue.add(propertyValue);
2929 private void updateAbstractPropertyValue(String substitutionTemplateInputName,
2930 ParameterDefinition parameterDefinition,
2931 List<Object> abstractPropertyValue,
2932 Map<String, Object> abstractSubstituteProperties) {
2933 if (abstractPropertyValue.size() > 1) {
2934 abstractSubstituteProperties.put(substitutionTemplateInputName, abstractPropertyValue);
2936 Object propertyValue = abstractPropertyValue.get(0);
2937 String entrySchemaType = parameterDefinition.getEntry_schema().getType();
2938 if (PropertyType.getSimplePropertyTypes().contains(entrySchemaType.toLowerCase())
2939 || entrySchemaType.equals(PropertyTypeExt.JSON.getDisplayName())) {
2940 abstractSubstituteProperties.put(substitutionTemplateInputName, abstractPropertyValue);
2942 abstractSubstituteProperties.put(substitutionTemplateInputName, propertyValue);
2947 private void updateIdenticalPropertyValue(String identicalValuePropertyName,
2948 String substitutionTemplateInputName,
2949 UnifiedCompositionEntity entity,
2950 UnifiedCompositionData unifiedCompositionData,
2951 ServiceTemplate serviceTemplate,
2952 Map<String, Object> abstractSubstituteProperties,
2953 TranslationContext context) {
2954 Optional<Object> identicalPropertyValueByType =
2955 getIdenticalPropertyValueByType(identicalValuePropertyName, substitutionTemplateInputName,
2956 entity, unifiedCompositionData, serviceTemplate, context);
2958 if (identicalPropertyValueByType.isPresent()) {
2959 abstractSubstituteProperties
2960 .put(substitutionTemplateInputName, identicalPropertyValueByType.get());
2967 private Optional<Object> getIdenticalPropertyValueByType(String identicalValuePropertyName,
2968 String substitutionTemplateInputName,
2969 UnifiedCompositionEntity entity,
2970 UnifiedCompositionData
2971 unifiedCompositionData,
2972 ServiceTemplate serviceTemplate,
2973 TranslationContext context) {
2975 ComputeTemplateConsolidationData computeTemplateConsolidationData =
2976 unifiedCompositionData.getComputeTemplateConsolidationData();
2978 Optional<Object> identicalPropertyValue = Optional.empty();
2981 identicalPropertyValue =
2982 getIdenticalPropertyValue(identicalValuePropertyName, serviceTemplate,
2983 computeTemplateConsolidationData, context);
2986 identicalPropertyValue =
2987 getIdenticalPropertyValue(identicalValuePropertyName, serviceTemplate,
2988 computeTemplateConsolidationData, context);
2991 PropertyInputType portInputType = getPortInputType(substitutionTemplateInputName,
2992 unifiedCompositionData);
2993 Optional <PortTemplateConsolidationData> portTemplateConsolidationData =
2994 unifiedCompositionData.getPortTemplateConsolidationDataList()
2996 .filter(s -> substitutionTemplateInputName.
2997 contains(getPropertyInputPrefix(s.getNodeTemplateId(),
2998 ConsolidationDataUtil.getPortType(s.getNodeTemplateId()),
2999 portInputType, UnifiedCompositionEntity.PORT)))
3002 if(portTemplateConsolidationData.isPresent()) {
3003 return getIdenticalPropertyValue(identicalValuePropertyName, serviceTemplate,
3004 portTemplateConsolidationData.get(), context);
3010 return identicalPropertyValue;
3014 private PropertyInputType getPortInputType(String inputName,
3015 UnifiedCompositionData unifiedCompositionData) {
3016 String portInputPrefix = UnifiedCompositionEntity.PORT.getDisplayName().toLowerCase() + "_";
3017 ComputeTemplateConsolidationData computeTemplateConsolidationData = unifiedCompositionData
3018 .getComputeTemplateConsolidationData();
3019 List<PortTemplateConsolidationData> portTemplateConsolidationDataList =
3020 getPortTemplateConsolidationDataList(unifiedCompositionData);
3021 //Scan the available port node template ids to check if the input is of the form
3022 // "port_<port_node_template_id>_<property_name>"
3023 if (portTemplateConsolidationDataList.stream().map(EntityConsolidationData::getNodeTemplateId)
3024 .map(portNodeTemplateId -> portInputPrefix + portNodeTemplateId).anyMatch(inputName::startsWith)) {
3025 return PropertyInputType.NODE_TEMPLATE_ID;
3027 //Check whether the input is of the form "port_<port_type>_<property_name>"
3028 Set<String> portTypes = computeTemplateConsolidationData.getPorts().keySet();
3029 if (portTypes.stream().map(portType -> portInputPrefix + portType + "_").anyMatch(inputName::startsWith)) {
3030 return PropertyInputType.TYPE;
3032 return PropertyInputType.OTHER;
3035 private PropertyInputType getSubInterfaceInputType(String inputName,
3036 UnifiedCompositionData unifiedCompositionData) {
3037 String subInterfaceInputPrefix = UnifiedCompositionEntity.SUB_INTERFACE.getDisplayName().toLowerCase()
3039 List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList =
3040 getSubInterfaceTemplateConsolidationDataList(unifiedCompositionData);
3041 //Scan the available port node template ids to check if the input is of the form
3042 // "subinterface_<subinterface_node_template_id>_<property_name>"
3043 if (subInterfaceTemplateConsolidationDataList.stream().map(EntityConsolidationData::getNodeTemplateId)
3044 .map(subInterfaceNodeTemplateId -> subInterfaceInputPrefix
3045 + subInterfaceNodeTemplateId)
3046 .anyMatch(inputName::startsWith)) {
3047 return PropertyInputType.NODE_TEMPLATE_ID;
3049 //Check whether the input is of the form "subinterface_<subinterface_type>_<property_name>"
3050 Set<String> subInterfaceTypes = new HashSet<>();
3051 List<PortTemplateConsolidationData> portTemplateConsolidationDataList =
3052 getPortTemplateConsolidationDataList(unifiedCompositionData);
3053 for (PortTemplateConsolidationData portTemplateConsolidationData :
3054 portTemplateConsolidationDataList) {
3055 ListMultimap<String, SubInterfaceTemplateConsolidationData> subInterfaceTypeToEntity = ArrayListMultimap.create();
3056 portTemplateConsolidationData.copyMappedInto(subInterfaceTypeToEntity);
3057 subInterfaceTypes.addAll(subInterfaceTypeToEntity.keySet());
3060 if (subInterfaceTypes.stream().map(UnifiedCompositionUtil::getSubInterfaceTypeSuffix)
3061 .map(subInterfaceTypeSuffix -> subInterfaceInputPrefix + subInterfaceTypeSuffix + "_")
3062 .anyMatch(inputName::startsWith)) {
3063 return PropertyInputType.TYPE;
3065 return PropertyInputType.OTHER;
3068 private void cleanServiceTemplate(ServiceTemplate serviceTemplate,
3069 EntityConsolidationData entity,
3070 TranslationContext context) {
3071 removeNodeTemplateFromServiceTemplate(serviceTemplate, entity, context);
3072 updateHeatStackGroup(serviceTemplate, entity, context);
3073 updateSubstitutionMapping(serviceTemplate, context);
3076 private void removeNodeTemplateFromServiceTemplate(ServiceTemplate serviceTemplate,
3077 EntityConsolidationData entity,
3078 TranslationContext context) {
3079 String nodeTemplateIdToRemove = entity.getNodeTemplateId();
3080 Map<String, NodeTemplate> nodeTemplates =
3081 serviceTemplate.getTopology_template().getNode_templates();
3082 NodeTemplate nodeTemplateToRemove =
3083 nodeTemplates.get(nodeTemplateIdToRemove);
3084 nodeTemplates.remove(nodeTemplateIdToRemove);
3086 context.addCleanedNodeTemplate(ToscaUtil.getServiceTemplateFileName(serviceTemplate),
3087 nodeTemplateIdToRemove,
3088 entity.getClass() == ComputeTemplateConsolidationData.class
3090 : UnifiedCompositionEntity.PORT,
3091 nodeTemplateToRemove);
3095 private void removeCleanedNodeType(String cleanedNodeTemplateId,
3096 ServiceTemplate serviceTemplate,
3097 TranslationContext context) {
3098 NodeTemplate cleanedNodeTemplate =
3100 .getCleanedNodeTemplate(ToscaUtil.getServiceTemplateFileName(serviceTemplate),
3101 cleanedNodeTemplateId);
3102 String typeToRemove = cleanedNodeTemplate.getType();
3104 if (Objects.nonNull(typeToRemove)
3105 && serviceTemplate.getNode_types().containsKey(typeToRemove)) {
3106 serviceTemplate.getNode_types().remove(typeToRemove);
3110 private void updateHeatStackGroup(ServiceTemplate serviceTemplate,
3111 EntityConsolidationData entity,
3112 TranslationContext context) {
3113 Map<String, GroupDefinition> groups = serviceTemplate.getTopology_template()
3114 .getGroups() == null ? new HashMap<>()
3115 : serviceTemplate.getTopology_template().getGroups();
3116 String nodeRelatedAbstractNodeId =
3117 context.getUnifiedAbstractNodeTemplateId(serviceTemplate, entity.getNodeTemplateId());
3119 for (Map.Entry<String, GroupDefinition> groupEntry : groups.entrySet()) {
3120 GroupDefinition groupDefinition = groupEntry.getValue();
3121 if (isHeatStackGroup(groupDefinition.getType())) {
3122 updateGroupMembersWithNewUnifiedNodeTemplateId(entity, nodeRelatedAbstractNodeId,
3128 private void updateGroupMembersWithNewUnifiedNodeTemplateId(
3129 EntityConsolidationData entity,
3130 String newNodetemplateId,
3131 Map.Entry<String, GroupDefinition> groupEntry) {
3132 List<String> members = groupEntry.getValue().getMembers();
3133 if (members.contains(entity.getNodeTemplateId())) {
3134 members.remove(entity.getNodeTemplateId());
3135 if (!members.contains(newNodetemplateId)) {
3136 members.add(newNodetemplateId);
3139 groupEntry.getValue().setMembers(members);
3142 private void updateSubstitutionMapping(ServiceTemplate serviceTemplate,
3143 TranslationContext context) {
3144 SubstitutionMapping substitutionMappings =
3145 DataModelUtil.getSubstitutionMappings(serviceTemplate);
3146 if (Objects.nonNull(substitutionMappings)) {
3148 if (Objects.nonNull(substitutionMappings.getRequirements())) {
3149 updateSubstitutionMappingRequirements(substitutionMappings.getRequirements(),
3150 serviceTemplate, context);
3153 if (Objects.nonNull(substitutionMappings.getCapabilities())) {
3154 updateSubstitutionMappingCapabilities(substitutionMappings.getCapabilities(),
3155 serviceTemplate, context);
3160 private void updateSubstitutionMappingRequirements(Map<String, List<String>>
3161 substitutionMappingRequirements,
3162 ServiceTemplate serviceTemplate,
3163 TranslationContext context) {
3164 for (Map.Entry<String, List<String>> entry : substitutionMappingRequirements.entrySet()) {
3165 List<String> requirement = entry.getValue();
3166 String oldNodeTemplateId = requirement.get(0);
3167 String newAbstractNodeTemplateId = context.getUnifiedAbstractNodeTemplateId(serviceTemplate,
3168 requirement.get(0));
3169 String newSubstitutionNodeTemplateId = context.getUnifiedSubstitutionNodeTemplateId(
3170 serviceTemplate, oldNodeTemplateId);
3171 if (Objects.nonNull(newAbstractNodeTemplateId)
3172 && Objects.nonNull(newSubstitutionNodeTemplateId)) {
3173 requirement.set(0, newAbstractNodeTemplateId);
3174 String newRequirementValue = requirement.get(1) + "_" + newSubstitutionNodeTemplateId;
3175 requirement.set(1, newRequirementValue);
3180 private void updateSubstitutionMappingCapabilities(Map<String, List<String>>
3181 substitutionMappingCapabilities,
3182 ServiceTemplate serviceTemplate,
3183 TranslationContext context) {
3184 for (Map.Entry<String, List<String>> entry : substitutionMappingCapabilities.entrySet()) {
3185 List<String> capability = entry.getValue();
3186 String oldNodeTemplateId = capability.get(0);
3187 String newAbstractNodeTemplateId = context.getUnifiedAbstractNodeTemplateId(serviceTemplate,
3189 String newSubstitutionNodeTemplateId = context.getUnifiedSubstitutionNodeTemplateId(
3190 serviceTemplate, oldNodeTemplateId);
3191 if (Objects.nonNull(newAbstractNodeTemplateId)
3192 && Objects.nonNull(newSubstitutionNodeTemplateId)) {
3193 capability.set(0, newAbstractNodeTemplateId);
3194 String newRequirementValue = capability.get(1) + "_" + newSubstitutionNodeTemplateId;
3195 capability.set(1, newRequirementValue);
3200 private void updateHeatStackGroupNestedComposition(ServiceTemplate serviceTemplate,
3201 EntityConsolidationData entity,
3202 TranslationContext context) {
3203 Map<String, GroupDefinition> groups = serviceTemplate.getTopology_template()
3204 .getGroups() == null ? new HashMap<>() : serviceTemplate.getTopology_template().getGroups();
3205 String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate);
3206 Optional<String> nestedNodeTemplateId =
3207 context.getUnifiedNestedNodeTemplateId(serviceTemplateFileName, entity.getNodeTemplateId());
3208 if (nestedNodeTemplateId.isPresent()) {
3209 for (Map.Entry<String, GroupDefinition> groupEntry : groups.entrySet()) {
3210 GroupDefinition groupDefinition = groupEntry.getValue();
3211 if (isHeatStackGroup(groupDefinition.getType())) {
3212 updateGroupMembersWithNewUnifiedNodeTemplateId(entity, nestedNodeTemplateId.get(),
3219 private void handleNestedNodeTemplateInMainServiceTemplate(String nestedNodeTemplateId,
3220 ServiceTemplate mainServiceTemplate,
3221 ServiceTemplate nestedServiceTemplate,
3222 TranslationContext context) {
3223 NodeTemplate nestedNodeTemplate = DataModelUtil.getNodeTemplate(mainServiceTemplate,
3224 nestedNodeTemplateId);
3225 if (Objects.isNull(nestedNodeTemplate)) {
3229 updateNestedNodeTemplateProperties(nestedServiceTemplate, nestedNodeTemplate, context);
3231 Optional<String> unifiedNestedNodeTypeId = context
3232 .getUnifiedNestedNodeTypeId(
3233 ToscaUtil.getServiceTemplateFileName(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME),
3234 nestedNodeTemplate.getType());
3235 unifiedNestedNodeTypeId
3236 .ifPresent(unifiedNestedNodeTypeIdVal -> updateNestedNodeTemplate(
3237 unifiedNestedNodeTypeIdVal, nestedNodeTemplateId, nestedNodeTemplate,
3238 mainServiceTemplate, context));
3241 private void updateNestedNodeTemplateProperties(ServiceTemplate nestedServiceTemplate,
3242 NodeTemplate nestedNodeTemplate,
3243 TranslationContext context) {
3245 Map<String, Object> newPropertyInputParamIds =
3246 context.getAllNewPropertyInputParamIdsPerNodeTenplateId(ToscaUtil
3247 .getServiceTemplateFileName(nestedServiceTemplate));
3249 for (Map.Entry<String, Object> entry : newPropertyInputParamIds.entrySet()) {
3250 if (Objects.nonNull(entry.getValue())) {
3251 Object value = getClonedObject(entry.getValue());
3252 nestedNodeTemplate.getProperties().put(entry.getKey(), value);
3256 String subNodeType =
3257 nestedServiceTemplate.getTopology_template().getSubstitution_mappings().getNode_type();
3258 nestedNodeTemplate.setType(subNodeType);
3262 private void handleSubstitutionMappingInNestedServiceTemplate(
3263 String newNestedNodeType,
3264 ServiceTemplate nestedServiceTemplate,
3265 TranslationContext context) {
3266 if (Objects.isNull(newNestedNodeType)) {
3270 Set<String> relatedNestedNodeTypeIds =
3271 context.getAllRelatedNestedNodeTypeIds();
3273 SubstitutionMapping substitutionMappings =
3274 nestedServiceTemplate.getTopology_template().getSubstitution_mappings();
3275 if (!relatedNestedNodeTypeIds.contains(substitutionMappings.getNode_type())) {
3276 substitutionMappings.setNode_type(newNestedNodeType);
3280 private void updateNestedNodeTemplate(String newNestedNodeTypeId,
3281 String nestedNodeTemplateId,
3282 NodeTemplate nestedNodeTemplate,
3283 ServiceTemplate mainServiceTemplate,
3284 TranslationContext context) {
3285 String mainSTName = ToscaUtil.getServiceTemplateFileName(mainServiceTemplate);
3286 String globalSTName =
3287 ToscaUtil.getServiceTemplateFileName(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME);
3289 context.getHandledNestedComputeNodeTemplateIndex(globalSTName, newNestedNodeTypeId);
3290 String newNodeTemplateId =
3291 Constants.ABSTRACT_NODE_TEMPLATE_ID_PREFIX + getComputeTypeSuffix(newNestedNodeTypeId)
3294 nestedNodeTemplate.setType(newNestedNodeTypeId);
3295 mainServiceTemplate.getTopology_template().getNode_templates().remove(nestedNodeTemplateId);
3296 mainServiceTemplate.getTopology_template().getNode_templates()
3297 .put(newNodeTemplateId, nestedNodeTemplate);
3299 context.addUnifiedNestedNodeTemplateId(mainSTName, nestedNodeTemplateId, newNodeTemplateId);
3302 private void handleNestedNodeTypesInGlobalSubstituteServiceTemplate(
3303 String origNestedNodeTypeId,
3304 String newNestedNodeTypeId,
3305 ServiceTemplate globalSubstitutionServiceTemplate,
3306 TranslationContext context) {
3307 Set<String> relatedNestedNodeTypeIds =
3308 context.getAllRelatedNestedNodeTypeIds();
3310 Map<String, NodeType> nodeTypes = globalSubstitutionServiceTemplate.getNode_types();
3311 if (!relatedNestedNodeTypeIds.contains(origNestedNodeTypeId)) {
3312 NodeType nested = DataModelUtil.getNodeType(globalSubstitutionServiceTemplate,
3313 origNestedNodeTypeId);
3314 setNewValuesForNestedNodeType(origNestedNodeTypeId, newNestedNodeTypeId, nested, nodeTypes);
3317 (NodeType) DataModelUtil.getClonedObject(
3318 DataModelUtil.getNodeType(globalSubstitutionServiceTemplate, origNestedNodeTypeId));
3319 nested.setDerived_from(ToscaNodeType.VFC_ABSTRACT_SUBSTITUTE);
3320 nodeTypes.put(newNestedNodeTypeId, nested);
3322 context.addUnifiedNestedNodeTypeId(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME,
3323 origNestedNodeTypeId, newNestedNodeTypeId);
3326 private void setNewValuesForNestedNodeType(String origNestedNodeType,
3327 String newNestedNodeTypeId,
3329 Map<String, NodeType> nodeTypes) {
3330 if (Objects.nonNull(nested)) {
3331 nested.setDerived_from(ToscaNodeType.VFC_ABSTRACT_SUBSTITUTE);
3332 nodeTypes.remove(origNestedNodeType);
3333 nodeTypes.put(newNestedNodeTypeId, nested);
3337 private Optional<String> getNewNestedNodeTypeId(ServiceTemplate nestedServiceTemplate,
3338 TranslationContext context) {
3339 FileComputeConsolidationData fileComputeConsolidationData =
3340 context.getConsolidationData().getComputeConsolidationData()
3341 .getFileComputeConsolidationData(
3342 ToscaUtil.getServiceTemplateFileName(nestedServiceTemplate));
3344 if (Objects.nonNull(fileComputeConsolidationData)) {
3345 String nestedNodeTypePrefix = ToscaNodeType.ABSTRACT_NODE_TYPE_PREFIX + "heat.";
3347 .of(nestedNodeTypePrefix + getComputeTypeInNestedFile(fileComputeConsolidationData));
3349 return Optional.empty();
3352 private String getComputeTypeInNestedFile(
3353 FileComputeConsolidationData fileComputeConsolidationData) {
3354 List<TypeComputeConsolidationData> typeComputeConsolidationDatas =
3355 new ArrayList<>(fileComputeConsolidationData.getAllTypeComputeConsolidationData());
3356 if (typeComputeConsolidationDatas.isEmpty()) {
3359 String computeNodeType = fileComputeConsolidationData.getAllComputeTypes().iterator().next();
3360 return getComputeTypeSuffix(computeNodeType);
3364 private void handleGetAttrInAbstractNodeTemplate(ServiceTemplate serviceTemplate,
3365 TranslationContext context,
3366 String serviceTemplateFileName,
3367 NodeTemplate abstractNodeTemplate) {
3368 Map<String, Object> properties =
3369 abstractNodeTemplate == null || abstractNodeTemplate.getProperties() == null
3371 : abstractNodeTemplate.getProperties();
3372 for (Object propertyValue : properties.values()) {
3373 List<List<Object>> getAttrList = extractGetAttrFunction(propertyValue);
3374 for (List<Object> getAttrFuncValue : getAttrList) {
3375 String origNodeTemplateId = (String) getAttrFuncValue.get(0);
3376 Optional<String> nestedNodeTemplateId = context.getUnifiedNestedNodeTemplateId(ToscaUtil
3377 .getServiceTemplateFileName(serviceTemplate), origNodeTemplateId);
3378 if (nestedNodeTemplateId.isPresent()) {
3379 getAttrFuncValue.set(0, nestedNodeTemplateId.get());
3381 replaceGetAttrNodeIdAndAttrName(serviceTemplate, context, serviceTemplateFileName,
3388 private void replaceGetAttrNodeIdAndAttrName(ServiceTemplate serviceTemplate,
3389 TranslationContext context,
3390 String serviceTemplateFileName,
3391 List<Object> getAttrFuncValue) {
3392 String origNodeTemplateId = (String) getAttrFuncValue.get(0);
3393 String attributeName = (String) getAttrFuncValue.get(1);
3395 String unifiedAbstractNodeTemplateId =
3396 context.getUnifiedAbstractNodeTemplateId(serviceTemplate, origNodeTemplateId);
3398 if (Objects.isNull(unifiedAbstractNodeTemplateId)) {
3402 String newNodeTemplateId =
3403 getNewNodeTemplateId(origNodeTemplateId, serviceTemplateFileName, serviceTemplate, context);
3405 String newSubstitutionOutputParameterId =
3406 getNewSubstitutionOutputParameterId(newNodeTemplateId, attributeName);
3408 getAttrFuncValue.set(0, unifiedAbstractNodeTemplateId);
3409 getAttrFuncValue.set(1, newSubstitutionOutputParameterId);
3412 private NodeTemplate getComputeNodeTemplate(String origNodeTemplateId,
3413 ServiceTemplate serviceTemplate,
3414 TranslationContext context) {
3415 NodeTemplate computeNodeTemplate =
3416 DataModelUtil.getNodeTemplate(serviceTemplate, origNodeTemplateId);
3417 if (computeNodeTemplate == null) {
3418 computeNodeTemplate =
3419 context.getCleanedNodeTemplate(ToscaUtil.getServiceTemplateFileName(serviceTemplate),
3420 origNodeTemplateId);
3422 return computeNodeTemplate;
3425 private String handleIdOfPort(String origNodeTemplateId, String serviceTemplateFileName,
3426 ConsolidationData consolidationData) {
3427 Optional<Pair<String, ComputeTemplateConsolidationData>>
3428 computeTypeAndComputeTemplateByPortId =
3429 getComputeTypeAndComputeTemplateByPortId(origNodeTemplateId, serviceTemplateFileName,
3431 if (computeTypeAndComputeTemplateByPortId.isPresent()) {
3432 Pair<String, ComputeTemplateConsolidationData> computeIdToComputeData =
3433 computeTypeAndComputeTemplateByPortId.get();
3434 return getNewPortNodeTemplateId(origNodeTemplateId, computeIdToComputeData.getKey(),
3435 computeIdToComputeData.getValue());
3441 private Optional<Pair<String, ComputeTemplateConsolidationData>>
3442 getComputeTypeAndComputeTemplateByPortId(String portId, String serviceTemplateFileName,
3443 ConsolidationData consolidationData) {
3444 FileComputeConsolidationData fileComputeConsolidationData =
3445 consolidationData.getComputeConsolidationData()
3446 .getFileComputeConsolidationData(serviceTemplateFileName);
3447 Set<String> computeTypes =
3448 fileComputeConsolidationData.getAllComputeTypes();
3450 for (String computeType : computeTypes) {
3451 Collection<ComputeTemplateConsolidationData> computeTemplateConsolidationDatas =
3452 fileComputeConsolidationData.getTypeComputeConsolidationData(computeType)
3453 .getAllComputeTemplateConsolidationData();
3455 for (ComputeTemplateConsolidationData compute : computeTemplateConsolidationDatas) {
3456 if (ConsolidationDataUtil.isComputeReferenceToPortId(compute, portId)) {
3457 return Optional.of(new ImmutablePair<>(computeType, compute));
3462 return Optional.empty();
3465 private boolean isIdIsOfExpectedType(String id,
3466 UnifiedCompositionEntity expectedUnifiedCompositionEntity,
3467 String serviceTemplateFileName,
3468 TranslationContext context) {
3469 UnifiedSubstitutionData unifiedSubstitutionData =
3470 context.getUnifiedSubstitutionData().get(serviceTemplateFileName);
3471 if (Objects.isNull(unifiedSubstitutionData)) {
3475 UnifiedCompositionEntity actualUnifiedCompositionEntity =
3476 unifiedSubstitutionData.getCleanedNodeTemplateCompositionEntity(id);
3478 return actualUnifiedCompositionEntity == null ? false
3479 : actualUnifiedCompositionEntity.equals(expectedUnifiedCompositionEntity);
3482 private boolean isHeatStackGroup(String groupType) {
3483 return groupType.equals(ToscaGroupType.HEAT_STACK);
3486 private Object getPortPropertyValue(String inputName,
3488 PropertyInputType portInputType,
3489 ServiceTemplate serviceTemplate,
3490 String portNodeTemplateId) {
3491 //Get the input prefix to extract the property name from the input name
3492 String portType = ConsolidationDataUtil.getPortType(portNodeTemplateId);
3493 String portInputPrefix = getPropertyInputPrefix(
3494 portNodeTemplateId, portType, portInputType, UnifiedCompositionEntity.PORT);
3495 //Get the property name from the input
3496 Optional<String> propertyName = getPropertyNameFromInput(inputName,
3497 UnifiedCompositionEntity.PORT, computeType, portInputPrefix);
3498 //Get the property value from the node template
3499 if (propertyName.isPresent()) {
3500 NodeTemplate portNodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate,
3501 portNodeTemplateId);
3502 if (Objects.nonNull(portNodeTemplate)) {
3503 return getPropertyValueFromNodeTemplate(propertyName.get(), portNodeTemplate);
3506 return Optional.empty();
3509 private Object getComputePropertyValue(
3511 ServiceTemplate serviceTemplate,
3512 ComputeTemplateConsolidationData computeTemplateConsolidationData) {
3513 NodeTemplate nodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate,
3514 computeTemplateConsolidationData.getNodeTemplateId());
3515 String nodeType = getComputeTypeSuffix(nodeTemplate.getType());
3516 Optional<String> propertyName =
3517 getPropertyNameFromInput(inputName, COMPUTE, nodeType, null);
3518 if (propertyName.isPresent()) {
3519 return getPropertyValueFromNodeTemplate(propertyName.get(), nodeTemplate);
3521 return Optional.empty();
3524 private Object getSubInterfacePropertyValue(String inputName,
3525 String subInterfaceTypeSuffix,
3526 PropertyInputType propertyInputType,
3527 ServiceTemplate serviceTemplate,
3528 String subInterfaceNodeTemplateId) {
3529 //Get the input prefix to extract the property name from the input name
3530 String propertyInputPrefix = getPropertyInputPrefix(subInterfaceNodeTemplateId,
3531 subInterfaceTypeSuffix, propertyInputType, UnifiedCompositionEntity.SUB_INTERFACE);
3532 //Get the property name from the input
3533 Optional<String> propertyName = getPropertyNameFromInput(inputName,
3534 UnifiedCompositionEntity.SUB_INTERFACE, null, propertyInputPrefix);
3535 //Get the property value from the node template
3536 if (propertyName.isPresent()) {
3537 NodeTemplate subInterfaceNodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate,
3538 subInterfaceNodeTemplateId);
3539 if (Objects.nonNull(subInterfaceNodeTemplate)) {
3540 return getPropertyValueFromNodeTemplate(propertyName.get(), subInterfaceNodeTemplate);
3543 return Optional.empty();
3546 private Optional<Object> getIdenticalPropertyValue(String identicalValuePropertyName,
3547 ServiceTemplate serviceTemplate,
3548 EntityConsolidationData entity,
3549 TranslationContext context) {
3550 NodeTemplate nodeTemplate =
3551 getNodeTemplate(entity.getNodeTemplateId(), serviceTemplate, context);
3553 Object propertyValueFromNodeTemplate =
3554 getPropertyValueFromNodeTemplate(identicalValuePropertyName, nodeTemplate);
3556 return Objects.isNull(propertyValueFromNodeTemplate) ? Optional.empty()
3557 : Optional.of(propertyValueFromNodeTemplate);
3560 private UnifiedCompositionEntity getInputCompositionEntity(String inputName) {
3561 UnifiedCompositionEntity inputCompositionEntity = UnifiedCompositionEntity.OTHER;
3562 if (inputName.indexOf('_') != -1) {
3563 String inputType = inputName.substring(0, inputName.indexOf('_'));
3564 if (inputType.equalsIgnoreCase(COMPUTE.getDisplayName())) {
3565 inputCompositionEntity = COMPUTE;
3566 } else if (inputType.equalsIgnoreCase(UnifiedCompositionEntity.PORT.getDisplayName())) {
3567 inputCompositionEntity = UnifiedCompositionEntity.PORT;
3568 } else if (inputType.equalsIgnoreCase(UnifiedCompositionEntity.SUB_INTERFACE
3569 .getDisplayName())) {
3570 inputCompositionEntity = UnifiedCompositionEntity.SUB_INTERFACE;
3573 return inputCompositionEntity;
3576 private Optional<String> getPropertyNameFromInput(
3578 UnifiedCompositionEntity compositionEntity,
3579 String entityType, String propertyInputPrefix) {
3580 String propertyName = null;
3581 switch (compositionEntity) {
3583 propertyName = inputName.substring(inputName.lastIndexOf(entityType)
3584 + entityType.length() + 1);
3588 if (inputName.startsWith(propertyInputPrefix)) {
3589 propertyName = inputName.split(propertyInputPrefix)[1];
3595 return Optional.ofNullable(propertyName);
3598 private String getPropertyInputPrefix(String nodeTemplateId,
3599 String propertyEntityType,
3600 PropertyInputType propertyInputType,
3601 UnifiedCompositionEntity unifiedCompositionEntity) {
3602 String propertyInputPrefix = unifiedCompositionEntity.getDisplayName().toLowerCase() + "_";
3603 if (propertyInputType == PropertyInputType.NODE_TEMPLATE_ID) {
3604 propertyInputPrefix += nodeTemplateId + "_";
3605 } else if (propertyInputType == PropertyInputType.TYPE) {
3606 propertyInputPrefix += propertyEntityType + "_";
3608 return propertyInputPrefix;
3611 private boolean isIdenticalValueProperty(String inputName,
3612 UnifiedCompositionEntity unifiedCompositionEntity) {
3614 List<String> identicalValuePropertyList =
3615 consolidationService.getPropertiesWithIdenticalVal(unifiedCompositionEntity);
3617 StringBuilder builder = getPropertyValueStringBuilder(unifiedCompositionEntity);
3618 if (Objects.isNull(builder)) {
3622 boolean isMatchingProperty = Pattern.matches(builder.toString(), inputName);
3623 return isMatchingProperty
3624 && isPropertyFromIdenticalValuesList(inputName, unifiedCompositionEntity,
3625 identicalValuePropertyList);
3628 private boolean isPropertyFromIdenticalValuesList(String inputName,
3629 UnifiedCompositionEntity unifiedCompositionEntity,
3630 List<String> identicalValuePropertyList) {
3631 switch (unifiedCompositionEntity) {
3633 return identicalValuePropertyList.contains(getIdenticalValuePropertyName(inputName,
3634 unifiedCompositionEntity).get());
3637 return identicalValuePropertyList.contains(getIdenticalValuePropertyName(inputName,
3638 unifiedCompositionEntity).get());
3641 return getPortPropertyNameFromInput(inputName, identicalValuePropertyList).isPresent();
3648 private Optional<String> getPortPropertyNameFromInput(String inputName,
3649 List<String> identicalValuePropertyList) {
3650 for (String identicalProperty : identicalValuePropertyList) {
3651 if (inputName.endsWith(identicalProperty)) {
3652 return Optional.of(identicalProperty);
3655 return Optional.empty();
3658 private StringBuilder getPropertyValueStringBuilder(
3659 UnifiedCompositionEntity unifiedCompositionEntity) {
3661 switch (unifiedCompositionEntity) {
3663 return getComputePropertyValueStringBuilder();
3666 return getComputePropertyValueStringBuilder();
3669 return getPortPropertyValueStringBuilder();
3672 return getSubInterfacePropertyValueStringBuilder();
3679 private StringBuilder getPortPropertyValueStringBuilder() {
3680 StringBuilder builder;
3681 builder = new StringBuilder(PORT_IDENTICAL_VALUE_PROPERTY_PREFIX);
3682 builder.append(".+");
3686 private StringBuilder getComputePropertyValueStringBuilder() {
3687 StringBuilder builder;
3688 builder = new StringBuilder(COMPUTE_IDENTICAL_VALUE_PROPERTY_PREFIX);
3689 builder.append("[a-z]+");
3690 builder.append(COMPUTE_IDENTICAL_VALUE_PROPERTY_SUFFIX);
3694 private StringBuilder getSubInterfacePropertyValueStringBuilder() {
3695 StringBuilder builder;
3696 builder = new StringBuilder(SUB_INTERFACE_PROPERTY_VALUE_PREFIX);
3697 builder.append(".+");
3701 private Optional<String> getIdenticalValuePropertyName(String input,
3702 UnifiedCompositionEntity
3703 unifiedCompositionEntity) {
3704 switch (unifiedCompositionEntity) {
3706 return Optional.of(input.split("_")[1]);
3709 return Optional.of(input.split("_")[1]);
3712 return getPortPropertyNameFromInput(input, consolidationService
3713 .getPropertiesWithIdenticalVal(unifiedCompositionEntity));
3716 return Optional.empty();
3720 private Object getPropertyValueFromNodeTemplate(String propertyName, NodeTemplate nodeTemplate) {
3721 Map<String, Object> nodeTemplateProperties = nodeTemplate.getProperties();
3722 if (nodeTemplateProperties != null) {
3723 Object propertyValue;
3724 if (propertyName.startsWith(ToscaConstants.SERVICE_TEMPLATE_FILTER_PROPERTY_NAME)) {
3725 propertyValue = getServiceTemplateFilterPropertyValue(propertyName, nodeTemplateProperties);
3727 propertyValue = nodeTemplateProperties.get(propertyName);
3728 propertyValue = getClonedObject(propertyValue);
3730 return propertyValue;
3735 private Object getServiceTemplateFilterPropertyValue(String propertyName,
3736 Map<String, Object> nodeTemplateProperties) {
3737 Object propertyValue = null;
3738 Object serviceTemplateFilterProperties =
3739 nodeTemplateProperties.get(ToscaConstants.SERVICE_TEMPLATE_FILTER_PROPERTY_NAME);
3740 String serviceTemplateFilterPropertyName =
3741 propertyName.replace(ToscaConstants.SERVICE_TEMPLATE_FILTER_PROPERTY_NAME + "_", "");
3743 if (Objects.nonNull(serviceTemplateFilterProperties)
3744 && serviceTemplateFilterProperties instanceof Map) {
3745 propertyValue = ((Map<String, Object>) serviceTemplateFilterProperties).get(serviceTemplateFilterPropertyName);
3747 return propertyValue;
3750 private Map<String, UnifiedCompositionEntity> getAllConsolidationNodeTemplateIdAndType(
3751 List<UnifiedCompositionData> unifiedCompositionDataList) {
3753 Map<String, UnifiedCompositionEntity> consolidationNodeTemplateIdAndType = new HashMap<>();
3754 for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) {
3755 ComputeTemplateConsolidationData computeTemplateConsolidationData =
3756 unifiedCompositionData.getComputeTemplateConsolidationData();
3757 if (Objects.nonNull(computeTemplateConsolidationData)) {
3758 consolidationNodeTemplateIdAndType.put(computeTemplateConsolidationData.getNodeTemplateId(), COMPUTE);
3760 List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList =
3761 getSubInterfaceTemplateConsolidationDataList(unifiedCompositionData);
3762 for (SubInterfaceTemplateConsolidationData subInterfaceTemplateConsolidationData :
3763 subInterfaceTemplateConsolidationDataList) {
3764 consolidationNodeTemplateIdAndType.put(subInterfaceTemplateConsolidationData.getNodeTemplateId(),
3765 UnifiedCompositionEntity.SUB_INTERFACE);
3767 List<PortTemplateConsolidationData> portTemplateConsolidationDataList =
3768 getPortTemplateConsolidationDataList(unifiedCompositionData);
3769 for (PortTemplateConsolidationData portTemplateConsolidationData :
3770 portTemplateConsolidationDataList) {
3771 consolidationNodeTemplateIdAndType.put(portTemplateConsolidationData.getNodeTemplateId(),
3772 UnifiedCompositionEntity.PORT);
3774 NestedTemplateConsolidationData nestedTemplateConsolidationData =
3775 unifiedCompositionData.getNestedTemplateConsolidationData();
3776 if (Objects.nonNull(nestedTemplateConsolidationData)) {
3777 consolidationNodeTemplateIdAndType
3778 .put(nestedTemplateConsolidationData.getNodeTemplateId(),
3779 UnifiedCompositionEntity.NESTED);
3782 return consolidationNodeTemplateIdAndType;
3785 private List<PortTemplateConsolidationData> getPortTemplateConsolidationDataList(
3786 UnifiedCompositionData unifiedCompositionData) {
3787 return unifiedCompositionData.getPortTemplateConsolidationDataList() == null ? new
3788 ArrayList<>() : unifiedCompositionData.getPortTemplateConsolidationDataList();
3791 private enum PropertyInputType {