2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
21 package org.openecomp.sdc.translator.services.heattotosca;
23 import static org.openecomp.sdc.tosca.services.DataModelUtil.getClonedObject;
24 import static org.openecomp.sdc.translator.services.heattotosca.Constants.ABSTRACT_NODE_TEMPLATE_ID_PREFIX;
25 import static org.openecomp.sdc.translator.services.heattotosca.Constants.COMPUTE_IDENTICAL_VALUE_PROPERTY_PREFIX;
26 import static org.openecomp.sdc.translator.services.heattotosca.Constants.COMPUTE_IDENTICAL_VALUE_PROPERTY_SUFFIX;
27 import static org.openecomp.sdc.translator.services.heattotosca.Constants.PORT_IDENTICAL_VALUE_PROPERTY_PREFIX;
29 import org.apache.commons.collections.map.HashedMap;
30 import org.apache.commons.collections4.CollectionUtils;
31 import org.apache.commons.collections4.MapUtils;
32 import org.apache.commons.lang3.StringUtils;
33 import org.apache.commons.lang3.tuple.ImmutablePair;
34 import org.apache.commons.lang3.tuple.Pair;
35 import org.openecomp.config.api.Configuration;
36 import org.openecomp.config.api.ConfigurationManager;
37 import org.openecomp.core.utilities.CommonMethods;
38 import org.openecomp.core.utilities.json.JsonUtil;
39 import org.openecomp.sdc.datatypes.configuration.ImplementationConfiguration;
40 import org.openecomp.sdc.heat.services.HeatConstants;
41 import org.openecomp.sdc.logging.api.Logger;
42 import org.openecomp.sdc.logging.api.LoggerFactory;
43 import org.openecomp.sdc.logging.context.impl.MdcDataDebugMessage;
44 import org.openecomp.sdc.tosca.datatypes.ToscaFunctions;
45 import org.openecomp.sdc.tosca.datatypes.ToscaGroupType;
46 import org.openecomp.sdc.tosca.datatypes.ToscaNodeType;
47 import org.openecomp.sdc.tosca.datatypes.ToscaRelationshipType;
48 import org.openecomp.sdc.tosca.datatypes.model.AttributeDefinition;
49 import org.openecomp.sdc.tosca.datatypes.model.CapabilityDefinition;
50 import org.openecomp.sdc.tosca.datatypes.model.Constraint;
51 import org.openecomp.sdc.tosca.datatypes.model.EntrySchema;
52 import org.openecomp.sdc.tosca.datatypes.model.GroupDefinition;
53 import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate;
54 import org.openecomp.sdc.tosca.datatypes.model.NodeType;
55 import org.openecomp.sdc.tosca.datatypes.model.ParameterDefinition;
56 import org.openecomp.sdc.tosca.datatypes.model.PropertyDefinition;
57 import org.openecomp.sdc.tosca.datatypes.model.PropertyType;
58 import org.openecomp.sdc.tosca.datatypes.model.RelationshipTemplate;
59 import org.openecomp.sdc.tosca.datatypes.model.RequirementAssignment;
60 import org.openecomp.sdc.tosca.datatypes.model.RequirementDefinition;
61 import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate;
62 import org.openecomp.sdc.tosca.datatypes.model.SubstitutionMapping;
63 import org.openecomp.sdc.tosca.datatypes.model.heatextend.PropertyTypeExt;
64 import org.openecomp.sdc.tosca.services.DataModelUtil;
65 import org.openecomp.sdc.tosca.services.ToscaAnalyzerService;
66 import org.openecomp.sdc.tosca.services.ToscaConstants;
67 import org.openecomp.sdc.tosca.services.ToscaUtil;
68 import org.openecomp.sdc.tosca.services.impl.ToscaAnalyzerServiceImpl;
69 import org.openecomp.sdc.translator.datatypes.heattotosca.TranslationContext;
70 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.UnifiedCompositionData;
71 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.UnifiedCompositionEntity;
72 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.UnifiedCompositionMode;
73 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.UnifiedSubstitutionData;
74 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.ComputeTemplateConsolidationData;
75 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.ConsolidationData;
76 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.EntityConsolidationData;
77 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.FileComputeConsolidationData;
78 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.FilePortConsolidationData;
79 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.GetAttrFuncData;
80 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.NestedTemplateConsolidationData;
81 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.PortTemplateConsolidationData;
82 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.RequirementAssignmentData;
83 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.TypeComputeConsolidationData;
85 import java.util.ArrayList;
86 import java.util.Collection;
87 import java.util.HashMap;
88 import java.util.HashSet;
89 import java.util.LinkedHashMap;
90 import java.util.List;
92 import java.util.Objects;
93 import java.util.Optional;
95 import java.util.regex.Pattern;
97 public class UnifiedCompositionService {
99 protected static Logger logger =
100 (Logger) LoggerFactory.getLogger(UnifiedCompositionService.class);
101 protected static MdcDataDebugMessage mdcDataDebugMessage = new MdcDataDebugMessage();
102 private static Map<String, ImplementationConfiguration> unifiedCompositionImplMap;
105 Configuration config = ConfigurationManager.lookup();
106 unifiedCompositionImplMap =
107 config.populateMap(ConfigConstants.MANDATORY_UNIFIED_MODEL_NAMESPACE,
108 ConfigConstants.UNIFIED_COMPOSITION_IMPL_KEY, ImplementationConfiguration.class);
112 private ConsolidationService consolidationService = new ConsolidationService();
114 private static List<EntityConsolidationData> getPortConsolidationDataList(
116 List<UnifiedCompositionData> unifiedCompositionDataList) {
117 List<EntityConsolidationData> portConsolidationDataList = new ArrayList<>();
118 for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) {
119 for (PortTemplateConsolidationData portTemplateConsolidationData : unifiedCompositionData
120 .getPortTemplateConsolidationDataList()) {
121 if (portIds.contains(portTemplateConsolidationData.getNodeTemplateId())) {
122 portConsolidationDataList.add(portTemplateConsolidationData);
126 return portConsolidationDataList;
130 * Create unified composition.
132 * @param serviceTemplate the service template
133 * @param nestedServiceTemplate the nested service template
134 * @param unifiedCompositionDataList the unified composition data list. In case no consolidation,
135 * one entry will be in this list, in case of having
136 * consolidation, all entries in the list are the once which
137 * need to be consolidated.
138 * @param mode the mode
139 * @param context the context
141 public void createUnifiedComposition(ServiceTemplate serviceTemplate,
142 ServiceTemplate nestedServiceTemplate,
143 List<UnifiedCompositionData> unifiedCompositionDataList,
144 UnifiedCompositionMode mode, TranslationContext context) {
145 mdcDataDebugMessage.debugEntryMessage(null, null);
146 Optional<UnifiedComposition> unifiedCompositionInstance = getUnifiedCompositionInstance(mode);
147 if (!unifiedCompositionInstance.isPresent()) {
150 unifiedCompositionInstance.get()
151 .createUnifiedComposition(serviceTemplate, nestedServiceTemplate,
152 unifiedCompositionDataList, context);
153 mdcDataDebugMessage.debugExitMessage(null, null);
157 * Create unified substitution service template according to the input service template, based on
158 * the unified composition data.
160 * @param serviceTemplate the service template
161 * @param unifiedCompositionDataList the unified composition data list. In case no consolidation,
162 * one entry will be in this list, in case of having
163 * consolidation, all entries in the list are the once which
164 * need to be consolidated.
165 * @param context the translation context
166 * @return the substitution service template
168 public Optional<ServiceTemplate> createUnifiedSubstitutionServiceTemplate(
169 ServiceTemplate serviceTemplate,
170 List<UnifiedCompositionData> unifiedCompositionDataList,
171 TranslationContext context,
172 String substitutionNodeTypeId,
174 if (CollectionUtils.isEmpty(unifiedCompositionDataList)) {
175 return Optional.empty();
177 UnifiedCompositionData unifiedCompositionData = unifiedCompositionDataList.get(0);
178 String templateName =
179 getTemplateName(serviceTemplate, unifiedCompositionData, substitutionNodeTypeId, index);
180 ServiceTemplate substitutionServiceTemplate =
181 HeatToToscaUtil.createInitSubstitutionServiceTemplate(templateName);
183 createIndexInputParameter(substitutionServiceTemplate);
185 String computeNodeType =
186 handleCompute(serviceTemplate, substitutionServiceTemplate, unifiedCompositionDataList,
188 handlePorts(serviceTemplate, substitutionServiceTemplate, unifiedCompositionDataList,
189 computeNodeType, context);
190 createOutputParameters(serviceTemplate, substitutionServiceTemplate, unifiedCompositionDataList,
191 computeNodeType, context);
192 NodeType substitutionGlobalNodeType =
193 handleSubstitutionGlobalNodeType(serviceTemplate, substitutionServiceTemplate,
194 context, unifiedCompositionData, substitutionNodeTypeId, index);
196 ServiceTemplate globalSubstitutionServiceTemplate =
197 HeatToToscaUtil.fetchGlobalSubstitutionServiceTemplate(serviceTemplate, context);
198 addComputeNodeTypeToGlobalST(computeNodeType, serviceTemplate,
199 globalSubstitutionServiceTemplate, substitutionGlobalNodeType);
201 HeatToToscaUtil.handleSubstitutionMapping(context,
202 substitutionNodeTypeId,
203 substitutionServiceTemplate, substitutionGlobalNodeType);
205 context.getTranslatedServiceTemplates().put(templateName, substitutionServiceTemplate);
206 return Optional.of(substitutionServiceTemplate);
209 private void addComputeNodeTypeToGlobalST(String computeNodeType,
210 ServiceTemplate serviceTemplate,
211 ServiceTemplate globalSubstitutionServiceTemplate,
212 NodeType substitutionGlobalNodeType) {
213 NodeType nodeType = DataModelUtil.getNodeType(serviceTemplate, computeNodeType);
215 (NodeType) DataModelUtil.getClonedObject(substitutionGlobalNodeType, NodeType.class);
216 clonedNT.setDerived_from(nodeType.getDerived_from());
218 .addNodeType(globalSubstitutionServiceTemplate, computeNodeType,
223 * Create abstract substitute node template that can be substituted by the input
224 * substitutionServiceTemplate.
226 * @param serviceTemplate the service template
227 * @param substitutionServiceTemplate the subtitution service template
228 * @param unifiedCompositionDataList the unified composition data list. In case no consolidation,
229 * one entry will be in this list, in case of having
230 * consolidation, all entries in the list are the once which
231 * need to be consolidated.
232 * @param context the translation context
233 * @return the abstract substitute node template id
235 public String createAbstractSubstituteNodeTemplate(
236 ServiceTemplate serviceTemplate,
237 ServiceTemplate substitutionServiceTemplate,
238 List<UnifiedCompositionData> unifiedCompositionDataList,
239 String substituteNodeTypeId,
240 TranslationContext context,
243 NodeTemplate substitutionNodeTemplate = new NodeTemplate();
244 List<String> directiveList = new ArrayList<>();
245 directiveList.add(ToscaConstants.NODE_TEMPLATE_DIRECTIVE_SUBSTITUTABLE);
246 substitutionNodeTemplate.setDirectives(directiveList);
247 substitutionNodeTemplate.setType(substituteNodeTypeId);
248 Optional<Map<String, Object>> abstractSubstitutionProperties =
249 createAbstractSubstitutionProperties(serviceTemplate,
250 substitutionServiceTemplate, unifiedCompositionDataList, context);
251 abstractSubstitutionProperties.ifPresent(substitutionNodeTemplate::setProperties);
253 //Add substitution filtering property
254 String substitutionServiceTemplateName = ToscaUtil.getServiceTemplateFileName(
255 substitutionServiceTemplate);
256 int count = unifiedCompositionDataList.size();
257 DataModelUtil.addSubstitutionFilteringProperty(substitutionServiceTemplateName,
258 substitutionNodeTemplate, count);
259 //Add index_value property
260 addIndexValueProperty(substitutionNodeTemplate);
261 String substituteNodeTemplateId =
262 getSubstituteNodeTemplateId(serviceTemplate, unifiedCompositionDataList.get(0),
263 substituteNodeTypeId, index);
264 //Add node template id and related abstract node template id in context
265 addUnifiedSubstitionData(context, serviceTemplate, unifiedCompositionDataList,
266 substituteNodeTemplateId);
268 .addNodeTemplate(serviceTemplate, substituteNodeTemplateId, substitutionNodeTemplate);
269 return substituteNodeTemplateId;
274 * Update the connectivity from/to the "moved" nodes from the original service template to the new
275 * substitution service template.
277 * @param serviceTemplate the service template
278 * @param unifiedCompositionDataList the unified composition data list. In case no consolidation,
279 * one entry will be in this list, in case of having
280 * consolidation, all entries in the list are the once which
281 * need to be consolidated.
282 * @param context the translation context
284 public void updateCompositionConnectivity(ServiceTemplate serviceTemplate,
285 List<UnifiedCompositionData> unifiedCompositionDataList,
286 TranslationContext context) {
287 updOutputParamGetAttrInConnectivity(serviceTemplate, unifiedCompositionDataList, context);
288 updNodesGetAttrInConnectivity(serviceTemplate, unifiedCompositionDataList, context);
289 updNodesConnectedOutConnectivity(serviceTemplate, unifiedCompositionDataList, context);
290 updNodesConnectedInConnectivity(serviceTemplate, unifiedCompositionDataList, context);
291 updVolumeConnectivity(serviceTemplate, unifiedCompositionDataList, context);
292 updGroupsConnectivity(serviceTemplate, unifiedCompositionDataList, context);
296 * Delete the "moved" nodes from the original service template to the new substitution service
299 * @param serviceTemplate the service template
300 * @param unifiedCompositionDataList the unified composition data list. In case no consolidation,
301 * one entry will be in this list, in case of having
302 * consolidation, all entries in the list are the once which
303 * need to be consolidated.
304 * @param context the translation context
306 public void cleanUnifiedCompositionEntities(
307 ServiceTemplate serviceTemplate,
308 List<UnifiedCompositionData> unifiedCompositionDataList,
309 TranslationContext context) {
310 for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) {
311 ComputeTemplateConsolidationData computeTemplateConsolidationData =
312 unifiedCompositionData.getComputeTemplateConsolidationData();
313 cleanServiceTemplate(serviceTemplate, computeTemplateConsolidationData, context);
315 List<PortTemplateConsolidationData> portTemplateConsolidationDataList =
316 getPortTemplateConsolidationDataList(unifiedCompositionData);
317 for (PortTemplateConsolidationData portTemplateConsolidationData :
318 portTemplateConsolidationDataList) {
319 cleanServiceTemplate(serviceTemplate, portTemplateConsolidationData, context);
328 * @param serviceTemplate the service template
329 * @param unifiedCompositionDataList the unified composition data list
330 * @param context the context
332 public void cleanNodeTypes(ServiceTemplate serviceTemplate,
333 List<UnifiedCompositionData> unifiedCompositionDataList,
334 TranslationContext context) {
335 for (UnifiedCompositionData unifiedData : unifiedCompositionDataList) {
336 removeCleanedNodeType(
337 unifiedData.getComputeTemplateConsolidationData().getNodeTemplateId(), serviceTemplate,
340 if (MapUtils.isEmpty(serviceTemplate.getNode_types())) {
341 serviceTemplate.setNode_types(null);
346 * Update unified abstract nodes connectivity.
348 * @param serviceTemplate the service template
349 * @param context the context
351 public void updateUnifiedAbstractNodesConnectivity(ServiceTemplate serviceTemplate,
352 TranslationContext context) {
355 String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate);
356 UnifiedSubstitutionData unifiedSubstitutionData = context.getUnifiedSubstitutionData()
357 .get(serviceTemplateFileName);
359 if (Objects.nonNull(unifiedSubstitutionData)) {
360 //Handle get attribute in connectivity for abstarct node to abstract node templates
361 Set<String> abstractNodeIds =
362 new HashSet<>(unifiedSubstitutionData.getAllRelatedAbstractNodeIds());
363 handleGetAttrInConnectivity(serviceTemplate, abstractNodeIds, context);
364 //Handle get attribute in connectivity for abstract node templates to nested node template
365 Set<String> nestedNodeIds =
366 new HashSet<>(unifiedSubstitutionData.getAllUnifiedNestedNodeTemplateIds());
367 handleGetAttrInConnectivity(serviceTemplate, nestedNodeIds, context);
372 * Handle unified nested definition.
374 * @param mainServiceTemplate the main service template
375 * @param nestedServiceTemplate the nested service template
376 * @param unifiedCompositionData the unified composition data
377 * @param context the context
379 public void handleUnifiedNestedDefinition(ServiceTemplate mainServiceTemplate,
380 ServiceTemplate nestedServiceTemplate,
381 UnifiedCompositionData unifiedCompositionData,
382 TranslationContext context) {
383 handleUnifiedNestedNodeType(mainServiceTemplate, nestedServiceTemplate, context);
384 updateUnifiedNestedTemplates(mainServiceTemplate, nestedServiceTemplate,
385 unifiedCompositionData, context);
388 private void handleGetAttrInConnectivity(ServiceTemplate serviceTemplate,
389 Set<String> unifiedNodeIds,
390 TranslationContext context) {
391 Map<String, NodeTemplate> nodeTemplates =
392 serviceTemplate.getTopology_template().getNode_templates();
393 String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate);
394 for (String unifiedNodeId : unifiedNodeIds) {
395 NodeTemplate nodeTemplate = nodeTemplates.get(unifiedNodeId);
396 handleGetAttrInAbstractNodeTemplate(serviceTemplate, context, serviceTemplateFileName,
401 private void handleUnifiedNestedNodeType(ServiceTemplate mainServiceTemplate,
402 ServiceTemplate nestedServiceTemplate,
403 TranslationContext context) {
406 SubstitutionMapping substitutionMappings =
407 nestedServiceTemplate.getTopology_template().getSubstitution_mappings();
408 String nodeTypeId = substitutionMappings.getNode_type();
410 Optional<String> newNestedNodeTypeId =
411 getNewNestedNodeTypeId(mainServiceTemplate, nestedServiceTemplate, context);
413 ServiceTemplate globalSubstitutionServiceTemplate =
414 context.getGlobalSubstitutionServiceTemplate();
416 if (isNestedServiceTemplateWasHandled(globalSubstitutionServiceTemplate, nestedServiceTemplate,
418 newNestedNodeTypeId)) {
420 .updateHandledComputeType(ToscaUtil.getServiceTemplateFileName(mainServiceTemplate),
421 newNestedNodeTypeId.get(),
422 ToscaUtil.getServiceTemplateFileName(nestedServiceTemplate));
427 newNestedNodeTypeId.ifPresent(
428 newNestedNodeTypeIdVal -> handleNestedNodeType(nodeTypeId, newNestedNodeTypeIdVal,
429 nestedServiceTemplate, mainServiceTemplate, globalSubstitutionServiceTemplate,
434 private boolean isNestedServiceTemplateWasHandled(ServiceTemplate mainServiceTemplate,
435 ServiceTemplate nestedServiceTemplate,
436 TranslationContext context,
437 Optional<String> newNestedNodeTypeId) {
438 return newNestedNodeTypeId.isPresent()
439 && context.isNestedServiceTemplateWasHandled(
440 ToscaUtil.getServiceTemplateFileName(mainServiceTemplate),
441 ToscaUtil.getServiceTemplateFileName(nestedServiceTemplate));
444 private void handleNestedNodeType(String nodeTypeId, String newNestedNodeTypeId,
445 ServiceTemplate nestedServiceTemplate,
446 ServiceTemplate mainServiceTemplate,
447 ServiceTemplate globalSubstitutionServiceTemplate,
448 TranslationContext context) {
449 updateNestedServiceTemplate(nestedServiceTemplate, context);
450 updateNestedNodeType(nodeTypeId, newNestedNodeTypeId, nestedServiceTemplate,
452 globalSubstitutionServiceTemplate, context);
457 private void updateNestedServiceTemplate(ServiceTemplate nestedServiceTemplate,
458 TranslationContext context) {
459 enrichPortProperties(nestedServiceTemplate, context);
462 private void enrichPortProperties(ServiceTemplate nestedServiceTemplate,
463 TranslationContext context) {
464 String nestedServiceTemplateFileName =
465 ToscaUtil.getServiceTemplateFileName(nestedServiceTemplate);
466 FilePortConsolidationData filePortConsolidationData =
467 context.getConsolidationData().getPortConsolidationData().getFilePortConsolidationData
468 (nestedServiceTemplateFileName);
470 if (Objects.nonNull(filePortConsolidationData)) {
471 Set<String> portNodeTemplateIds = filePortConsolidationData.getAllPortNodeTemplateIds();
472 if (Objects.nonNull(portNodeTemplateIds)) {
473 for (String portNodeTemplateId : portNodeTemplateIds) {
474 NodeTemplate portNodeTemplate = DataModelUtil.getNodeTemplate(nestedServiceTemplate,
476 List<EntityConsolidationData> portEntityConsolidationDataList = new ArrayList<>();
477 portEntityConsolidationDataList.add(filePortConsolidationData
478 .getPortTemplateConsolidationData(portNodeTemplateId));
480 handleNodeTypeProperties(nestedServiceTemplate,
481 portEntityConsolidationDataList, portNodeTemplate, UnifiedCompositionEntity.Port,
488 private void updateNestedNodeType(String nodeTypeId, String newNestedNodeTypeId,
489 ServiceTemplate nestedServiceTemplate,
490 ServiceTemplate mainServiceTemplate,
491 ServiceTemplate globalSubstitutionServiceTemplate,
492 TranslationContext context) {
493 String indexedNewNestedNodeTypeId =
494 updateNodeTypeId(nodeTypeId, newNestedNodeTypeId, nestedServiceTemplate,
496 globalSubstitutionServiceTemplate, context);
498 updateNodeTypeProperties(nestedServiceTemplate, globalSubstitutionServiceTemplate,
499 indexedNewNestedNodeTypeId);
500 //addComputeNodeTypeToGlobalST();
504 private void updateNodeTypeProperties(ServiceTemplate nestedServiceTemplate,
505 ServiceTemplate globalSubstitutionServiceTemplate,
507 ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl();
508 Map<String, PropertyDefinition> nodeTypePropertiesDefinition =
509 toscaAnalyzerService.manageSubstitutionNodeTypeProperties(nestedServiceTemplate);
510 NodeType nestedNodeType =
511 DataModelUtil.getNodeType(globalSubstitutionServiceTemplate, nodeTypeId);
512 nestedNodeType.setProperties(nodeTypePropertiesDefinition);
513 addComputeNodeTypeToGlobalST(nestedServiceTemplate.getNode_types().keySet().iterator().next()
514 , nestedServiceTemplate, globalSubstitutionServiceTemplate, nestedNodeType);
517 private String updateNodeTypeId(String nodeTypeId, String newNestedNodeTypeId,
518 ServiceTemplate nestedServiceTemplate,
519 ServiceTemplate mainServiceTemplate,
520 ServiceTemplate globalSubstitutionServiceTemplate,
521 TranslationContext context) {
522 String indexedNewNestedNodeTypeId =
523 handleNestedNodeTypeInGlobalSubstitutionTemplate(nodeTypeId, newNestedNodeTypeId,
524 globalSubstitutionServiceTemplate, context);
526 handleSubstitutionMappingInNestedServiceTemplate(indexedNewNestedNodeTypeId,
527 nestedServiceTemplate, context);
530 .updateHandledComputeType(
531 ToscaUtil.getServiceTemplateFileName(mainServiceTemplate),
532 ToscaUtil.getServiceTemplateFileName(nestedServiceTemplate),
533 newNestedNodeTypeId);
534 return indexedNewNestedNodeTypeId;
537 private String handleNestedNodeTypeInGlobalSubstitutionTemplate(String nodeTypeId,
538 String newNestedNodeTypeId,
539 ServiceTemplate globalSubstitutionServiceTemplate,
540 TranslationContext context) {
541 String indexedNodeType =
542 getIndexedGlobalNodeTypeId(newNestedNodeTypeId, context);
543 context.updateUsedTimesForNestedComputeNodeType(
544 ToscaUtil.getServiceTemplateFileName(globalSubstitutionServiceTemplate),
545 newNestedNodeTypeId);
546 handleNestedNodeTypesInGlobalSubstituteServiceTemplate(nodeTypeId, indexedNodeType,
547 globalSubstitutionServiceTemplate, context);
548 return indexedNodeType;
551 private String getIndexedGlobalNodeTypeId(String newNestedNodeTypeId,
552 TranslationContext context) {
553 int globalNodeTypeIndex =
554 context.getGlobalNodeTypeIndex(
555 ToscaUtil.getServiceTemplateFileName(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME),
556 newNestedNodeTypeId);
557 return globalNodeTypeIndex > 0 ? newNestedNodeTypeId + "_"
558 + String.valueOf(globalNodeTypeIndex) : newNestedNodeTypeId;
561 private void updateUnifiedNestedTemplates(ServiceTemplate mainServiceTemplate,
562 ServiceTemplate nestedServiceTemplate,
563 UnifiedCompositionData unifiedCompositionData,
564 TranslationContext context) {
566 NestedTemplateConsolidationData nestedTemplateConsolidationData =
567 unifiedCompositionData.getNestedTemplateConsolidationData();
568 if (Objects.isNull(nestedTemplateConsolidationData)) {
571 handleNestedNodeTemplateInMainServiceTemplate(
572 nestedTemplateConsolidationData.getNodeTemplateId(), mainServiceTemplate,
573 nestedServiceTemplate, context);
578 * Update connectivity for unified nested patterns.
580 * @param serviceTemplate the service template
581 * @param nestedServiceTemplate the nested service template
582 * @param unifiedCompositionData the unified composition data
583 * @param context the context
585 public void updateUnifiedNestedConnectivity(ServiceTemplate serviceTemplate,
586 ServiceTemplate nestedServiceTemplate,
587 UnifiedCompositionData unifiedCompositionData,
588 TranslationContext context) {
590 updNestedCompositionNodesConnectedInConnectivity(serviceTemplate, unifiedCompositionData,
592 updNestedCompositionNodesGetAttrInConnectivity(serviceTemplate, unifiedCompositionData,
594 updNestedCompositionOutputParamGetAttrInConnectivity(serviceTemplate,
595 unifiedCompositionData, context);
600 * Clean unified nested entities. Update the heat stack group with the new node template ids.
602 * @param serviceTemplate the service template
603 * @param unifiedCompositionData the unified composition data
604 * @param context the context
606 public void cleanUnifiedNestedEntities(ServiceTemplate serviceTemplate,
607 UnifiedCompositionData unifiedCompositionData,
608 TranslationContext context) {
609 EntityConsolidationData entityConsolidationData =
610 unifiedCompositionData.getNestedTemplateConsolidationData();
611 updateHeatStackGroupNestedComposition(serviceTemplate, entityConsolidationData, context);
615 public void handleComplexVfcType(ServiceTemplate serviceTemplate, TranslationContext context) {
616 SubstitutionMapping substitution_mappings =
617 serviceTemplate.getTopology_template().getSubstitution_mappings();
619 if (Objects.isNull(substitution_mappings)) {
623 ServiceTemplate globalSubstitutionServiceTemplate =
624 context.getGlobalSubstitutionServiceTemplate();
626 String substitutionNT = substitution_mappings.getNode_type();
627 if (globalSubstitutionServiceTemplate.getNode_types().containsKey(substitutionNT)) {
628 //todo - remove comment after integration with AT&T
629 // globalSubstitutionServiceTemplate.getNode_types().get(substitutionNT).setDerived_from
630 // (ToscaNodeType.COMPLEX_VFC_NODE_TYPE);
635 protected void updNodesConnectedOutConnectivity(ServiceTemplate serviceTemplate,
636 List<UnifiedCompositionData>
637 unifiedCompositionDataList,
638 TranslationContext context) {
639 for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) {
640 ComputeTemplateConsolidationData computeTemplateConsolidationData = unifiedCompositionData
641 .getComputeTemplateConsolidationData();
642 //Add requirements in the abstract node template for nodes connected out for computes
643 String newComputeNodeTemplateId = getNewComputeNodeTemplateId(serviceTemplate,
644 computeTemplateConsolidationData.getNodeTemplateId());
645 Map<String, List<RequirementAssignmentData>> computeNodesConnectedOut =
646 computeTemplateConsolidationData.getNodesConnectedOut();
647 if (computeNodesConnectedOut != null) {
648 updateRequirementInAbstractNodeTemplate(serviceTemplate, computeTemplateConsolidationData,
649 newComputeNodeTemplateId, computeNodesConnectedOut, context);
651 String computeType = getComputeTypeSuffix(serviceTemplate, computeTemplateConsolidationData
652 .getNodeTemplateId());
653 //Add requirements in the abstract node template for nodes connected out for ports
654 List<PortTemplateConsolidationData> portTemplateConsolidationDataList =
655 getPortTemplateConsolidationDataList(unifiedCompositionData);
656 for (PortTemplateConsolidationData portTemplateConsolidationData :
657 portTemplateConsolidationDataList) {
658 String newPortNodeTemplateId = getNewPortNodeTemplateId(portTemplateConsolidationData
659 .getNodeTemplateId(), computeType, computeTemplateConsolidationData);
660 Map<String, List<RequirementAssignmentData>> portNodesConnectedOut =
661 portTemplateConsolidationData.getNodesConnectedOut();
662 if (portNodesConnectedOut != null) {
663 updateRequirementInAbstractNodeTemplate(serviceTemplate, portTemplateConsolidationData,
664 newPortNodeTemplateId, portNodesConnectedOut, context);
670 protected void updNodesConnectedInConnectivity(ServiceTemplate serviceTemplate,
671 List<UnifiedCompositionData>
672 unifiedCompositionDataList,
673 TranslationContext context) {
674 for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) {
675 ComputeTemplateConsolidationData computeTemplateConsolidationData = unifiedCompositionData
676 .getComputeTemplateConsolidationData();
677 //Update requirements in the node template which pointing to the computes
678 String newComputeNodeTemplateId = getNewComputeNodeTemplateId(serviceTemplate,
679 computeTemplateConsolidationData.getNodeTemplateId());
680 updNodesConnectedInConnectivity(serviceTemplate, computeTemplateConsolidationData,
681 newComputeNodeTemplateId, context, false);
683 String computeType = getComputeTypeSuffix(serviceTemplate, computeTemplateConsolidationData
684 .getNodeTemplateId());
685 //Update requirements in the node template which pointing to the ports
686 List<PortTemplateConsolidationData> portTemplateConsolidationDataList =
687 getPortTemplateConsolidationDataList(unifiedCompositionData);
688 for (PortTemplateConsolidationData portTemplateConsolidationData :
689 portTemplateConsolidationDataList) {
690 String newPortNodeTemplateId = getNewPortNodeTemplateId(portTemplateConsolidationData
691 .getNodeTemplateId(), computeType, computeTemplateConsolidationData);
692 updNodesConnectedInConnectivity(serviceTemplate, portTemplateConsolidationData,
693 newPortNodeTemplateId, context, false);
698 private void updNodesConnectedInConnectivity(ServiceTemplate serviceTemplate,
699 EntityConsolidationData entityConsolidationData,
700 String newNodeTemplateId,
701 TranslationContext context,
703 Map<String, List<RequirementAssignmentData>> nodesConnectedIn =
704 entityConsolidationData.getNodesConnectedIn();
705 if (nodesConnectedIn == null) {
706 //No nodes connected in info
709 for (Map.Entry<String, List<RequirementAssignmentData>> entry : nodesConnectedIn
711 List<RequirementAssignmentData> requirementAssignmentDataList = entry.getValue();
712 for (RequirementAssignmentData requirementAssignmentData : requirementAssignmentDataList) {
713 RequirementAssignment requirementAssignment = requirementAssignmentData
714 .getRequirementAssignment();
715 if (!requirementAssignment.getNode().equals(entityConsolidationData
716 .getNodeTemplateId())) {
717 //The requirement assignment target node should be the one which we are handling in the
718 //consolidation object
721 //Update the requirement assignment object in the original node template
723 updateRequirementForNestedCompositionNodesConnectedIn(serviceTemplate,
724 requirementAssignmentData, entityConsolidationData, newNodeTemplateId, context);
726 updateRequirementForNodesConnectedIn(serviceTemplate, requirementAssignmentData,
727 entityConsolidationData, entry.getKey(), newNodeTemplateId, context);
734 protected void updNestedCompositionNodesConnectedInConnectivity(
735 ServiceTemplate serviceTemplate,
736 UnifiedCompositionData unifiedCompositionData,
737 TranslationContext context) {
738 NestedTemplateConsolidationData nestedTemplateConsolidationData = unifiedCompositionData
739 .getNestedTemplateConsolidationData();
740 //Update requirements in the node template which pointing to the nested nodes
741 String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate);
742 Optional<String> newNestedNodeTemplateId = context.getUnifiedNestedNodeTemplateId(
743 serviceTemplateFileName, nestedTemplateConsolidationData.getNodeTemplateId());
744 newNestedNodeTemplateId.ifPresent(
745 newNestedNodeTemplateIdVal -> updNodesConnectedInConnectivity(serviceTemplate,
746 nestedTemplateConsolidationData,
747 newNestedNodeTemplateIdVal, context, true));
751 protected void updVolumeConnectivity(ServiceTemplate serviceTemplate,
752 List<UnifiedCompositionData>
753 unifiedCompositionDataList,
754 TranslationContext context) {
755 for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) {
756 ComputeTemplateConsolidationData computeTemplateConsolidationData = unifiedCompositionData
757 .getComputeTemplateConsolidationData();
758 //Add requirements in the abstract node template for compute volumes
759 String newComputeNodeTemplateId = getNewComputeNodeTemplateId(serviceTemplate,
760 computeTemplateConsolidationData.getNodeTemplateId());
761 Map<String, List<RequirementAssignmentData>> computeVolumes =
762 computeTemplateConsolidationData.getVolumes();
763 if (computeVolumes != null) {
764 updateRequirementInAbstractNodeTemplate(serviceTemplate, computeTemplateConsolidationData,
765 newComputeNodeTemplateId, computeVolumes, context);
770 protected void updGroupsConnectivity(ServiceTemplate serviceTemplate,
771 List<UnifiedCompositionData>
772 unifiedCompositionDataList,
773 TranslationContext context) {
774 for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) {
775 ComputeTemplateConsolidationData computeTemplateConsolidationData = unifiedCompositionData
776 .getComputeTemplateConsolidationData();
777 //Add requirements in the abstract node template for nodes connected in for computes
778 String newComputeNodeTemplateId = getNewComputeNodeTemplateId(serviceTemplate,
779 computeTemplateConsolidationData.getNodeTemplateId());
780 updGroupsConnectivity(serviceTemplate, computeTemplateConsolidationData, context);
782 String computeType = getComputeTypeSuffix(serviceTemplate, computeTemplateConsolidationData
783 .getNodeTemplateId());
784 //Add requirements in the abstract node template for nodes connected in for ports
785 List<PortTemplateConsolidationData> portTemplateConsolidationDataList =
786 getPortTemplateConsolidationDataList(unifiedCompositionData);
787 for (PortTemplateConsolidationData portTemplateConsolidationData :
788 portTemplateConsolidationDataList) {
789 String newPortNodeTemplateId = getNewPortNodeTemplateId(portTemplateConsolidationData
790 .getNodeTemplateId(), computeType, computeTemplateConsolidationData);
791 updGroupsConnectivity(serviceTemplate, portTemplateConsolidationData, context);
796 private void updGroupsConnectivity(ServiceTemplate serviceTemplate, EntityConsolidationData
797 entityConsolidationData, TranslationContext context) {
798 List<String> groupIds = entityConsolidationData.getGroupIds();
799 if (groupIds == null) {
802 String oldNodeTemplateId = entityConsolidationData.getNodeTemplateId();
803 String abstractNodeTemplateId = context.getUnifiedAbstractNodeTemplateId(
804 serviceTemplate, entityConsolidationData.getNodeTemplateId());
805 Map<String, GroupDefinition> groups = serviceTemplate.getTopology_template().getGroups();
806 if (groups != null) {
807 for (String groupId : groupIds) {
808 GroupDefinition groupDefinition = groups.get(groupId);
809 if (groupDefinition != null) {
810 List<String> groupMembers = groupDefinition.getMembers();
811 if (groupMembers.contains(oldNodeTemplateId)) {
812 //Replace the old node template id
813 groupMembers.remove(oldNodeTemplateId);
814 if (!groupMembers.contains(abstractNodeTemplateId)) {
815 //Add the abstract node template id if not already present
816 groupMembers.add(abstractNodeTemplateId);
824 protected void updOutputParamGetAttrInConnectivity(
825 ServiceTemplate serviceTemplate, List<UnifiedCompositionData> unifiedComposotionDataList,
826 TranslationContext context) {
827 for (UnifiedCompositionData unifiedCompositionData : unifiedComposotionDataList) {
828 ComputeTemplateConsolidationData computeTemplateConsolidationData =
829 unifiedCompositionData.getComputeTemplateConsolidationData();
830 String newComputeNodeTemplateId = getNewComputeNodeTemplateId(serviceTemplate,
831 computeTemplateConsolidationData.getNodeTemplateId());
833 updOutputParamGetAttrInConnectivity(serviceTemplate, computeTemplateConsolidationData,
834 computeTemplateConsolidationData.getNodeTemplateId(), newComputeNodeTemplateId,
838 getComputeTypeSuffix(serviceTemplate,
839 computeTemplateConsolidationData.getNodeTemplateId());
840 List<PortTemplateConsolidationData> portTemplateConsolidationDataList =
841 getPortTemplateConsolidationDataList(unifiedCompositionData);
842 for (PortTemplateConsolidationData portTemplateConsolidationData :
843 portTemplateConsolidationDataList) {
844 String newPortNodeTemplateId =
845 getNewPortNodeTemplateId(portTemplateConsolidationData.getNodeTemplateId(), computeType,
846 computeTemplateConsolidationData);
848 updOutputParamGetAttrInConnectivity(serviceTemplate, portTemplateConsolidationData,
849 portTemplateConsolidationData.getNodeTemplateId(), newPortNodeTemplateId, context,
855 protected void updNodesGetAttrInConnectivity(
856 ServiceTemplate serviceTemplate,
857 List<UnifiedCompositionData> unifiedComposotionDataList,
858 TranslationContext context) {
859 Map<String, UnifiedCompositionEntity> consolidationNodeTemplateIdAndType =
860 getAllConsolidationNodeTemplateIdAndType(unifiedComposotionDataList);
861 for (UnifiedCompositionData unifiedCompositionData : unifiedComposotionDataList) {
862 ComputeTemplateConsolidationData computeTemplateConsolidationData =
863 unifiedCompositionData.getComputeTemplateConsolidationData();
864 String newComputeNodeTemplateId = getNewComputeNodeTemplateId(serviceTemplate,
865 computeTemplateConsolidationData.getNodeTemplateId());
867 updNodeGetAttrInConnectivity(serviceTemplate, computeTemplateConsolidationData,
868 computeTemplateConsolidationData.getNodeTemplateId(),
869 newComputeNodeTemplateId, context, consolidationNodeTemplateIdAndType, false);
872 getComputeTypeSuffix(serviceTemplate,
873 computeTemplateConsolidationData.getNodeTemplateId());
875 List<PortTemplateConsolidationData> portTemplateConsolidationDataList =
876 getPortTemplateConsolidationDataList(unifiedCompositionData);
877 for (PortTemplateConsolidationData portTemplateConsolidationData :
878 portTemplateConsolidationDataList) {
879 String newPotNodeTemplateId =
880 getNewPortNodeTemplateId(portTemplateConsolidationData.getNodeTemplateId(), computeType,
881 computeTemplateConsolidationData);
883 updNodeGetAttrInConnectivity(serviceTemplate, portTemplateConsolidationData,
884 portTemplateConsolidationData.getNodeTemplateId(),
885 newPotNodeTemplateId, context, consolidationNodeTemplateIdAndType, false);
890 protected void updNestedCompositionOutputParamGetAttrInConnectivity(
891 ServiceTemplate serviceTemplate, UnifiedCompositionData unifiedCompositionData,
892 TranslationContext context) {
893 NestedTemplateConsolidationData nestedTemplateConsolidationData =
894 unifiedCompositionData.getNestedTemplateConsolidationData();
895 if (Objects.isNull(nestedTemplateConsolidationData)) {
898 String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate);
899 Optional<String> newNestedNodeTemplateId = context.getUnifiedNestedNodeTemplateId(
900 serviceTemplateFileName, nestedTemplateConsolidationData.getNodeTemplateId());
902 newNestedNodeTemplateId.ifPresent(
903 newNestedNodeTemplateIdVal -> updOutputParamGetAttrInConnectivity(serviceTemplate,
904 nestedTemplateConsolidationData, nestedTemplateConsolidationData.getNodeTemplateId(),
905 newNestedNodeTemplateIdVal, context, true));
908 protected void updNestedCompositionNodesGetAttrInConnectivity(
909 ServiceTemplate serviceTemplate,
910 UnifiedCompositionData unifiedCompositionData,
911 TranslationContext context) {
912 NestedTemplateConsolidationData nestedTemplateConsolidationData =
913 unifiedCompositionData.getNestedTemplateConsolidationData();
914 if (Objects.isNull(nestedTemplateConsolidationData)) {
917 String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate);
918 Optional<String> newNestedNodeTemplateId = context.getUnifiedNestedNodeTemplateId(
919 serviceTemplateFileName, nestedTemplateConsolidationData.getNodeTemplateId());
921 newNestedNodeTemplateId.ifPresent(
922 newNestedNodeTemplateIdVal -> updNodeGetAttrInConnectivity(serviceTemplate,
923 nestedTemplateConsolidationData, nestedTemplateConsolidationData.getNodeTemplateId(),
924 newNestedNodeTemplateIdVal, context, null, true));
927 private void updateRequirementForNodesConnectedIn(
928 ServiceTemplate serviceTemplate,
929 RequirementAssignmentData requirementAssignmentData,
930 EntityConsolidationData entityConsolidationData,
931 String originalNodeTemplateId,
932 String newNodeTemplateId,
933 TranslationContext context) {
934 ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl();
935 RequirementAssignment requirementAssignment = requirementAssignmentData
936 .getRequirementAssignment();
937 String newAbstractUnifiedNodeTemplateId = context.getUnifiedAbstractNodeTemplateId(
938 serviceTemplate, entityConsolidationData.getNodeTemplateId());
939 NodeTemplate abstractUnifiedNodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate,
940 newAbstractUnifiedNodeTemplateId);
941 Optional<String> newCapabilityId = getNewCapabilityForNodesConnectedIn(serviceTemplate,
942 abstractUnifiedNodeTemplate, requirementAssignment, newNodeTemplateId, context);
943 if (newCapabilityId.isPresent()) {
944 //Creating a copy of the requirement object and checking if it already exists in the
945 // original node template
946 RequirementAssignment requirementAssignmentCopy = (RequirementAssignment) getClonedObject(
947 requirementAssignmentData.getRequirementAssignment(), RequirementAssignment.class);
948 NodeTemplate originalNodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate,
949 originalNodeTemplateId);
950 requirementAssignmentCopy.setCapability(newCapabilityId.get());
951 requirementAssignmentCopy.setNode(newAbstractUnifiedNodeTemplateId);
952 if (!toscaAnalyzerService.isRequirementExistInNodeTemplate(originalNodeTemplate,
953 requirementAssignmentData.getRequirementId(), requirementAssignmentCopy)) {
954 //Update the existing requirement
955 requirementAssignmentData.getRequirementAssignment().setCapability(newCapabilityId
957 requirementAssignmentData.getRequirementAssignment()
958 .setNode(newAbstractUnifiedNodeTemplateId);
960 //The updated requirement already exists in the node template so simply remove the
962 DataModelUtil.removeRequirementAssignment(originalNodeTemplate, requirementAssignmentData
963 .getRequirementId(), requirementAssignmentData.getRequirementAssignment());
968 private void updateRequirementForNestedCompositionNodesConnectedIn(
969 ServiceTemplate serviceTemplate,
970 RequirementAssignmentData requirementAssignmentData,
971 EntityConsolidationData entityConsolidationData,
972 String newNodeTemplateId,
973 TranslationContext context) {
974 ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl();
975 String newAbstractUnifiedNodeTemplateId = newNodeTemplateId;
976 RequirementAssignment requirementAssignment = requirementAssignmentData
977 .getRequirementAssignment();
978 //Creating a copy of the requirement object and checking if it already exists in the
979 // original node template
980 RequirementAssignment requirementAssignmentCopy = (RequirementAssignment) getClonedObject(
981 requirementAssignmentData.getRequirementAssignment(), RequirementAssignment.class);
982 NodeTemplate unifiedAbstractNestedNodeTemplate = DataModelUtil
983 .getNodeTemplate(serviceTemplate, newAbstractUnifiedNodeTemplateId);
984 requirementAssignmentCopy.setCapability(requirementAssignment.getCapability());
985 requirementAssignmentCopy.setNode(newAbstractUnifiedNodeTemplateId);
986 if (!toscaAnalyzerService.isRequirementExistInNodeTemplate(unifiedAbstractNestedNodeTemplate,
987 requirementAssignmentData.getRequirementId(), requirementAssignmentCopy)) {
988 //Update the existing requirement
989 requirementAssignmentData.getRequirementAssignment()
990 .setNode(newAbstractUnifiedNodeTemplateId);
992 //The updated requirement already exists in the node template so simply remove the
994 DataModelUtil.removeRequirementAssignment(unifiedAbstractNestedNodeTemplate,
995 requirementAssignmentData.getRequirementId(), requirementAssignmentData
996 .getRequirementAssignment());
1000 private Optional<String> getNewCapabilityForNodesConnectedIn(ServiceTemplate serviceTemplate,
1001 NodeTemplate unifiedNodeTemplate,
1002 RequirementAssignment
1003 requirementAssignment,
1004 String newNodeTemplateId,
1005 TranslationContext context) {
1006 ServiceTemplate globalSubstitutionServiceTemplate =
1007 HeatToToscaUtil.fetchGlobalSubstitutionServiceTemplate(serviceTemplate, context);
1008 Map<String, NodeType> nodeTypes = globalSubstitutionServiceTemplate.getNode_types();
1009 String unifiedNodeTemplateType = unifiedNodeTemplate.getType();
1010 NodeType unifiedNodeType = nodeTypes.get(unifiedNodeTemplateType);
1011 Map<String, CapabilityDefinition> abstractNodeTypeCapabilities = unifiedNodeType
1013 for (Map.Entry<String, CapabilityDefinition> entry : abstractNodeTypeCapabilities.entrySet()) {
1014 String capabilityId = entry.getKey();
1015 CapabilityDefinition capabilityDefinition = entry.getValue();
1016 String capabilityType = capabilityDefinition.getType();
1017 if (capabilityType.equals(requirementAssignment.getCapability())) {
1018 //Matching capability type found..Check if the id ends with new node template id
1019 if (capabilityId.endsWith(newNodeTemplateId)) {
1020 return Optional.ofNullable(capabilityId);
1024 return Optional.empty();
1028 private void updateRequirementInAbstractNodeTemplate(ServiceTemplate serviceTemplate,
1029 EntityConsolidationData
1030 entityConsolidationData,
1031 String newNodeTemplateId,
1032 Map<String, List<RequirementAssignmentData>>
1033 requirementAssignmentDataMap,
1034 TranslationContext context) {
1035 ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl();
1036 for (Map.Entry<String, List<RequirementAssignmentData>> entry : requirementAssignmentDataMap
1038 String abstractNodeTemplateId = context.getUnifiedAbstractNodeTemplateId(
1039 serviceTemplate, entityConsolidationData.getNodeTemplateId());
1040 NodeTemplate abstractNodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate,
1041 abstractNodeTemplateId);
1042 if (abstractNodeTemplate == null) {
1043 //The abstract node template is not found from id in the context
1046 List<RequirementAssignmentData> requirementAssignmentDataList = entry.getValue();
1047 for (RequirementAssignmentData requirementAssignmentData : requirementAssignmentDataList) {
1048 String oldRequirementId = requirementAssignmentData.getRequirementId();
1049 RequirementAssignment abstractRequirementAssignment = (RequirementAssignment)
1050 getClonedObject(requirementAssignmentData.getRequirementAssignment(),
1051 RequirementAssignment.class);
1052 String newRequirementId = oldRequirementId + "_" + newNodeTemplateId;
1053 //Check if the requirement is not already present in the list of requirements of the
1054 // abstract node template
1055 if (!toscaAnalyzerService.isRequirementExistInNodeTemplate(abstractNodeTemplate,
1056 newRequirementId, abstractRequirementAssignment)) {
1057 DataModelUtil.addRequirementAssignment(abstractNodeTemplate, newRequirementId,
1058 abstractRequirementAssignment);
1059 //Update the volume relationship template if required
1060 updateVolumeRelationshipTemplate(serviceTemplate, abstractRequirementAssignment
1061 .getRelationship(), context);
1067 private NodeTemplate getAbstractNodeTemplate(
1068 ServiceTemplate serviceTemplate,
1069 UnifiedCompositionEntity unifiedCompositionEntity,
1070 ComputeTemplateConsolidationData computeTemplateConsolidationData,
1071 PortTemplateConsolidationData portTemplateConsolidationData,
1072 TranslationContext context) {
1073 String abstractNodeTemplateId =
1074 getAbstractNodeTemplateId(serviceTemplate, unifiedCompositionEntity,
1075 computeTemplateConsolidationData, portTemplateConsolidationData, context);
1077 return DataModelUtil.getNodeTemplate(serviceTemplate,
1078 abstractNodeTemplateId);
1081 private String getAbstractNodeTemplateId(
1082 ServiceTemplate serviceTemplate,
1083 UnifiedCompositionEntity unifiedCompositionEntity,
1084 ComputeTemplateConsolidationData computeTemplateConsolidationData,
1085 PortTemplateConsolidationData portTemplateConsolidationData,
1086 TranslationContext context) {
1087 switch (unifiedCompositionEntity) {
1089 return context.getUnifiedAbstractNodeTemplateId(serviceTemplate,
1090 computeTemplateConsolidationData.getNodeTemplateId());
1092 return context.getUnifiedAbstractNodeTemplateId(serviceTemplate,
1093 portTemplateConsolidationData.getNodeTemplateId());
1099 private void updNodeGetAttrInConnectivity(
1100 ServiceTemplate serviceTemplate,
1101 EntityConsolidationData entityConsolidationData,
1102 String oldNodeTemplateId, String newNodeTemplateId,
1103 TranslationContext context,
1104 Map<String, UnifiedCompositionEntity> consolidationNodeTemplateIdAndType,
1106 Map<String, List<GetAttrFuncData>> nodesGetAttrIn = entityConsolidationData.getNodesGetAttrIn();
1107 if (MapUtils.isEmpty(nodesGetAttrIn)) {
1111 for (String sourceNodeTemplateId : nodesGetAttrIn.keySet()) {
1112 NodeTemplate sourceNodeTemplate =
1113 DataModelUtil.getNodeTemplate(serviceTemplate, sourceNodeTemplateId);
1114 if (!isNested && consolidationNodeTemplateIdAndType.keySet().contains(sourceNodeTemplateId)) {
1117 List<GetAttrFuncData> getAttrFuncDataList = nodesGetAttrIn.get(sourceNodeTemplateId);
1118 for (GetAttrFuncData getAttrFuncData : getAttrFuncDataList) {
1119 Object propertyValue =
1120 DataModelUtil.getPropertyValue(sourceNodeTemplate, getAttrFuncData.getFieldName());
1121 String newAttrName = null;
1122 String newGetAttrAbstractNodeTemplateId = newNodeTemplateId;
1124 newGetAttrAbstractNodeTemplateId =
1125 context.getUnifiedAbstractNodeTemplateId(serviceTemplate, oldNodeTemplateId);
1126 newAttrName = getNewSubstitutionOutputParameterId(newNodeTemplateId, getAttrFuncData
1127 .getAttributeName());
1129 List<List<Object>> getAttrFuncValueList = extractGetAttrFunction(propertyValue);
1130 updateGetAttrValue(oldNodeTemplateId, getAttrFuncData, newGetAttrAbstractNodeTemplateId,
1131 newAttrName, getAttrFuncValueList, isNested);
1136 private void updateGetAttrValue(String oldNodeTemplateId, GetAttrFuncData getAttrFuncData,
1137 String newNodeTemplateId, String newAttrName,
1138 List<List<Object>> getAttrFuncValueList, boolean isNested) {
1139 for (List<Object> getAttrFuncValue : getAttrFuncValueList) {
1140 if (oldNodeTemplateId.equals(getAttrFuncValue.get(0))
1141 && getAttrFuncData.getAttributeName().equals(getAttrFuncValue.get(1))) {
1142 getAttrFuncValue.set(0, newNodeTemplateId);
1144 getAttrFuncValue.set(1, newAttrName);
1150 private String getTemplateName(ServiceTemplate serviceTemplate,
1151 UnifiedCompositionData unifiedCompositionData,
1154 ComputeTemplateConsolidationData computeTemplateConsolidationData =
1155 unifiedCompositionData.getComputeTemplateConsolidationData();
1156 String computeType = getComputeTypeSuffix(nodeTypeId);
1157 String templateName = "Nested_" + computeType;
1158 if (Objects.nonNull(index)) {
1159 templateName = templateName + "_" + index.toString();
1161 return templateName;
1164 private String getComputeTypeSuffix(ServiceTemplate serviceTemplate,
1165 String computeNodeTemplateId) {
1166 NodeTemplate computeNodeTemplate =
1167 DataModelUtil.getNodeTemplate(serviceTemplate, computeNodeTemplateId);
1168 return getComputeTypeSuffix(computeNodeTemplate.getType());
1172 * Gets compute type.
1174 * @param computeType the compute node type abc.def.vFSB
1175 * @return the compute type e.g.:vFSB
1177 private String getComputeTypeSuffix(String computeType) {
1178 return DataModelUtil.getNamespaceSuffix(computeType);
1181 private void updOutputParamGetAttrInConnectivity(ServiceTemplate serviceTemplate,
1182 EntityConsolidationData entityConsolidationData,
1183 String oldNodeTemplateId,
1184 String newNodeTemplateId,
1185 TranslationContext context,
1187 List<GetAttrFuncData> outputParametersGetAttrIn =
1188 entityConsolidationData.getOutputParametersGetAttrIn();
1189 if (CollectionUtils.isEmpty(outputParametersGetAttrIn)) {
1192 for (GetAttrFuncData getAttrFuncData : outputParametersGetAttrIn) {
1193 Object outputParamValue =
1194 DataModelUtil.getOuputParameter(serviceTemplate, getAttrFuncData.getFieldName())
1196 String newAttrName = null;
1197 String newGetAttrAbstractNodeTemplateId = newNodeTemplateId;
1199 newGetAttrAbstractNodeTemplateId =
1200 context.getUnifiedAbstractNodeTemplateId(serviceTemplate, oldNodeTemplateId);
1201 newAttrName = getNewSubstitutionOutputParameterId(newNodeTemplateId, getAttrFuncData
1202 .getAttributeName());
1204 List<List<Object>> getAttrFuncValueList = extractGetAttrFunction(outputParamValue);
1205 updateGetAttrValue(oldNodeTemplateId, getAttrFuncData, newGetAttrAbstractNodeTemplateId,
1207 getAttrFuncValueList, isNested);
1212 private List<List<Object>> extractGetAttrFunction(Object valueObject) {
1214 List<List<Object>> getAttrValueList = new ArrayList<>();
1216 if (valueObject instanceof Map) {
1217 if (((Map) valueObject).containsKey(ToscaFunctions.GET_ATTRIBUTE.getDisplayName())) {
1218 getAttrValueList.add(
1219 (List<Object>) ((Map) valueObject).get(ToscaFunctions.GET_ATTRIBUTE.getDisplayName()));
1222 for (Object key : ((Map) valueObject).keySet()) {
1223 getAttrValueList.addAll(extractGetAttrFunction(((Map) valueObject).get(key)));
1227 } else if (valueObject instanceof List) {
1228 for (Object valueEntity : (List) valueObject) {
1229 getAttrValueList.addAll(extractGetAttrFunction(valueEntity));
1232 return getAttrValueList;
1235 private boolean isIncludeToscaFunc(Object valueObject, ToscaFunctions toscaFunction) {
1236 if (valueObject instanceof Map) {
1237 if (((Map) valueObject).containsKey(toscaFunction.getDisplayName())) {
1241 Set<Map.Entry<String, Object>> entries = ((Map<String, Object>) valueObject).entrySet();
1242 for(Map.Entry<String, Object> valueObjectEntry : entries){
1243 if(isIncludeToscaFunc(valueObjectEntry.getValue(), toscaFunction)){
1247 // Map.Entry<String, Object> functionMapEntry =
1248 // (Map.Entry<String, Object>) ((Map) valueObject).entrySet().iterator().next();
1249 // return isIncludeToscaFunc(functionMapEntry.getValue(), toscaFunction);
1251 } else if (valueObject instanceof List) {
1252 for (Object valueEntity : (List) valueObject) {
1253 if (isIncludeToscaFunc(valueEntity, toscaFunction) == true) {
1261 private void createOutputParameters(ServiceTemplate serviceTemplate,
1262 ServiceTemplate substitutionServiceTemplate,
1263 List<UnifiedCompositionData> unifiedCompositionDataList,
1264 String computeNodeType, TranslationContext context) {
1266 createOutputParametersForCompute(serviceTemplate, substitutionServiceTemplate,
1267 unifiedCompositionDataList, context);
1268 createOutputParameterForPorts(serviceTemplate, substitutionServiceTemplate,
1269 unifiedCompositionDataList, computeNodeType, context);
1272 private void createOutputParameterForPorts(
1273 ServiceTemplate serviceTemplate,
1274 ServiceTemplate substitutionServiceTemplate,
1275 List<UnifiedCompositionData> unifiedCompositionDataList,
1276 String connectedComputeNodeType,
1277 TranslationContext context) {
1278 for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) {
1279 List<PortTemplateConsolidationData> portTemplateConsolidationDataList =
1280 getPortTemplateConsolidationDataList(unifiedCompositionData);
1281 if (CollectionUtils.isEmpty(portTemplateConsolidationDataList)) {
1285 for (PortTemplateConsolidationData portTemplateConsolidationData :
1286 portTemplateConsolidationDataList) {
1287 String newPortNodeTemplateId =
1288 getNewPortNodeTemplateId(portTemplateConsolidationData.getNodeTemplateId(),
1289 connectedComputeNodeType,
1290 unifiedCompositionData.getComputeTemplateConsolidationData());
1291 addOutputParameters(portTemplateConsolidationData, newPortNodeTemplateId,
1292 serviceTemplate, substitutionServiceTemplate, unifiedCompositionDataList, context);
1297 //The ID should be <vm_type>_<port_type> or <vm_type>_<portNodeTemplateId>
1298 private String getNewPortNodeTemplateId(
1299 String portNodeTemplateId,
1300 String connectedComputeNodeType,
1301 ComputeTemplateConsolidationData computeTemplateConsolidationData) {
1303 StringBuilder newPortNodeTemplateId = new StringBuilder();
1304 String portType = ConsolidationDataUtil.getPortType(portNodeTemplateId);
1305 newPortNodeTemplateId.append(DataModelUtil.getNamespaceSuffix(connectedComputeNodeType));
1306 if (computeTemplateConsolidationData.getPorts().get(portType).size() > 1) {
1308 newPortNodeTemplateId.append("_").append(portNodeTemplateId);
1310 //consolidation port
1311 newPortNodeTemplateId.append("_").append(portType);
1313 return newPortNodeTemplateId.toString();
1316 private void createOutputParametersForCompute(
1317 ServiceTemplate serviceTemplate,
1318 ServiceTemplate substitutionServiceTemplate,
1319 List<UnifiedCompositionData>
1320 unifiedCompositionDataList,
1321 TranslationContext context) {
1322 List<EntityConsolidationData> computeConsolidationDataList =
1323 getComputeConsolidationDataList(unifiedCompositionDataList);
1325 for (EntityConsolidationData computeTemplateConsolidationData : computeConsolidationDataList) {
1326 String newComputeNodeTemplateId =
1327 getNewComputeNodeTemplateId(serviceTemplate,
1328 computeTemplateConsolidationData.getNodeTemplateId());
1329 addOutputParameters(computeTemplateConsolidationData, newComputeNodeTemplateId,
1330 serviceTemplate, substitutionServiceTemplate, unifiedCompositionDataList, context);
1334 private void addOutputParameters(EntityConsolidationData entityConsolidationData,
1335 String newNodeTemplateId,
1336 ServiceTemplate serviceTemplate,
1337 ServiceTemplate substitutionServiceTemplate,
1338 List<UnifiedCompositionData> unifiedCompositionDataList,
1339 TranslationContext context) {
1340 handleNodesGetAttrIn(entityConsolidationData, newNodeTemplateId, serviceTemplate,
1341 substitutionServiceTemplate, unifiedCompositionDataList, context);
1343 handleOutputParamGetAttrIn(entityConsolidationData, newNodeTemplateId, serviceTemplate,
1344 substitutionServiceTemplate, context);
1347 private void handleOutputParamGetAttrIn(EntityConsolidationData entityConsolidationData,
1348 String newNodeTemplateId,
1349 ServiceTemplate serviceTemplate,
1350 ServiceTemplate substitutionServiceTemplate,
1351 TranslationContext context) {
1352 List<GetAttrFuncData> outputParametersGetAttrIn =
1353 entityConsolidationData.getOutputParametersGetAttrIn();
1354 if (!CollectionUtils.isEmpty(outputParametersGetAttrIn)) {
1355 for (GetAttrFuncData getAttrFuncData : outputParametersGetAttrIn) {
1356 createAndAddOutputParameter(entityConsolidationData, newNodeTemplateId,
1357 substitutionServiceTemplate, getAttrFuncData, context);
1362 private void handleNodesGetAttrIn(EntityConsolidationData entityConsolidationData,
1363 String newNodeTemplateId,
1364 ServiceTemplate serviceTemplate,
1365 ServiceTemplate substitutionServiceTemplate,
1366 List<UnifiedCompositionData> unifiedCompositionDataList,
1367 TranslationContext context) {
1368 Map<String, List<GetAttrFuncData>> getAttrIn = entityConsolidationData.getNodesGetAttrIn();
1370 if (!MapUtils.isEmpty(getAttrIn)) {
1371 Map<String, UnifiedCompositionEntity> consolidationNodeTemplateIdAndType =
1372 getAllConsolidationNodeTemplateIdAndType(unifiedCompositionDataList);
1373 for (String sourceNodeTemplateId : getAttrIn.keySet()) {
1374 if (!consolidationNodeTemplateIdAndType.keySet().contains(sourceNodeTemplateId)) {
1375 List<GetAttrFuncData> getAttrFuncDataList = getAttrIn.get(sourceNodeTemplateId);
1376 for (GetAttrFuncData getAttrFuncData : getAttrFuncDataList) {
1377 createAndAddOutputParameter(entityConsolidationData, newNodeTemplateId,
1378 substitutionServiceTemplate, getAttrFuncData, context);
1385 private void createAndAddOutputParameter(EntityConsolidationData entityConsolidationData,
1386 String newNodeTemplateId,
1387 ServiceTemplate substitutionServiceTemplate,
1388 GetAttrFuncData getAttrFuncData,
1389 TranslationContext context) {
1390 Map<String, List<Object>> parameterValue = new HashMap<>();
1391 List<Object> valueList = new ArrayList<>();
1392 valueList.add(newNodeTemplateId);
1393 valueList.add(getAttrFuncData.getAttributeName());
1394 parameterValue.put(ToscaFunctions.GET_ATTRIBUTE.getDisplayName(), valueList);
1395 ParameterDefinition outputParameter = new ParameterDefinition();
1396 outputParameter.setValue(parameterValue);
1397 setOutputParameterType(substitutionServiceTemplate, newNodeTemplateId, getAttrFuncData
1398 .getAttributeName(), outputParameter, context);
1399 DataModelUtil.addOutputParameterToTopologyTemplate(substitutionServiceTemplate,
1400 getNewSubstitutionOutputParameterId(newNodeTemplateId, getAttrFuncData.getAttributeName()),
1404 private void setOutputParameterType(ServiceTemplate substitutionServiceTemplate,
1405 String newNodeTemplateId,
1406 String outputParameterName,
1407 ParameterDefinition outputParameter,
1408 TranslationContext context) {
1409 NodeTemplate nodeTemplate = DataModelUtil.getNodeTemplate(substitutionServiceTemplate,
1411 //Get the type and entry schema of the output parameter from the node type flat hierarchy
1412 String outputParameterType = null;
1413 EntrySchema outputParameterEntrySchema = null;
1414 NodeType nodeTypeWithFlatHierarchy =
1415 HeatToToscaUtil.getNodeTypeWithFlatHierarchy(nodeTemplate.getType(),
1416 substitutionServiceTemplate, context);
1417 //Check if the parameter is present in the attributes
1418 AttributeDefinition outputParameterDefinitionFromAttributes =
1419 getOutputParameterDefinitionFromAttributes(nodeTypeWithFlatHierarchy, outputParameterName);
1420 if (Objects.nonNull(outputParameterDefinitionFromAttributes)) {
1421 outputParameterType = outputParameterDefinitionFromAttributes.getType();
1422 outputParameterEntrySchema = outputParameterDefinitionFromAttributes.getEntry_schema();
1424 //If the below fails due to null pointer then we need to check if the heatToToscaMapping
1425 // properties and global types are in sync. Ideally the parameter should be found in either
1426 // properties or attributes collected from global types
1427 PropertyDefinition outputParameterDefinitionFromProperties =
1428 nodeTypeWithFlatHierarchy.getProperties().get(outputParameterName);
1429 outputParameterType = outputParameterDefinitionFromProperties.getType();
1430 outputParameterEntrySchema = outputParameterDefinitionFromProperties.getEntry_schema();
1432 //Set the type and entry schema for the output param obtained from the node type hierarchy
1433 outputParameter.setType(outputParameterType);
1434 outputParameter.setEntry_schema(outputParameterEntrySchema);
1437 private String getNewInputParameterType(NodeTemplate nodeTemplate,
1438 ServiceTemplate serviceTemplate,
1439 String inputParameterName,
1440 TranslationContext context) {
1441 NodeType nodeTypeWithFlatHierarchy =
1442 HeatToToscaUtil.getNodeTypeWithFlatHierarchy(nodeTemplate.getType(),
1443 serviceTemplate, context);
1444 String parameterType = nodeTypeWithFlatHierarchy.getProperties()
1445 .get(inputParameterName).getType();
1446 return getUnifiedInputParameterType(parameterType);
1449 private AttributeDefinition getOutputParameterDefinitionFromAttributes(NodeType
1450 nodeTypeWithFlatHierarchy,
1451 String outputParameterName) {
1452 AttributeDefinition outputParameterDefinition = null;
1453 if ((Objects.nonNull(nodeTypeWithFlatHierarchy.getAttributes()))
1454 && (nodeTypeWithFlatHierarchy.getAttributes().containsKey(outputParameterName))) {
1455 outputParameterDefinition =
1456 nodeTypeWithFlatHierarchy.getAttributes().get(outputParameterName);
1458 return outputParameterDefinition;
1461 private String getUnifiedInputParameterType(String parameterType) {
1462 String unifiedInputParameterType = null;
1463 if (Objects.nonNull(parameterType)) {
1464 if (parameterType.equalsIgnoreCase(PropertyType.STRING.getDisplayName())
1465 || parameterType.equalsIgnoreCase(PropertyType.INTEGER.getDisplayName())
1466 || parameterType.equalsIgnoreCase(PropertyType.FLOAT.getDisplayName())
1467 || parameterType.equalsIgnoreCase(PropertyType.BOOLEAN.getDisplayName())
1468 || parameterType.equalsIgnoreCase(PropertyType.TIMESTAMP.getDisplayName())
1469 || parameterType.equalsIgnoreCase(PropertyType.NULL.getDisplayName())
1470 || parameterType.equalsIgnoreCase(PropertyType.SCALAR_UNIT_SIZE.getDisplayName())
1471 || parameterType.equalsIgnoreCase(PropertyType.SCALAR_UNIT_FREQUENCY.getDisplayName())) {
1472 unifiedInputParameterType = parameterType.toLowerCase();
1473 } else if (parameterType.equalsIgnoreCase(PropertyType.MAP.getDisplayName())
1474 || parameterType.equalsIgnoreCase(PropertyType.LIST.getDisplayName())
1475 || parameterType.equalsIgnoreCase(PropertyTypeExt.JSON.getDisplayName())) {
1476 unifiedInputParameterType = PropertyTypeExt.JSON.getDisplayName();
1478 unifiedInputParameterType = parameterType;
1481 return unifiedInputParameterType;
1484 private String getNewSubstitutionOutputParameterId(String newNodeTemplateId,
1485 String attributeName) {
1486 return newNodeTemplateId + "_" + attributeName;
1489 private void addUnifiedSubstitionData(TranslationContext context, ServiceTemplate
1490 serviceTemplate, List<UnifiedCompositionData> unifiedCompositionDataList, String
1491 substituteNodeTemplateId) {
1492 String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate);
1493 for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) {
1494 //Add compute node template mapping information
1495 ComputeTemplateConsolidationData computeTemplateConsolidationData =
1496 unifiedCompositionData.getComputeTemplateConsolidationData();
1497 String computeNodeTemplateId = computeTemplateConsolidationData.getNodeTemplateId();
1498 context.addUnifiedSubstitutionData(serviceTemplateFileName, computeNodeTemplateId,
1499 substituteNodeTemplateId);
1500 //Add Port template mapping information
1501 List<PortTemplateConsolidationData> portTemplateConsolidationDataList =
1502 getPortTemplateConsolidationDataList(unifiedCompositionData);
1504 if (CollectionUtils.isNotEmpty(portTemplateConsolidationDataList)) {
1505 for (PortTemplateConsolidationData portTemplateConsolidationData :
1506 portTemplateConsolidationDataList) {
1507 String oldPortNodeTemplateId = portTemplateConsolidationData.getNodeTemplateId();
1508 context.addUnifiedSubstitutionData(serviceTemplateFileName, oldPortNodeTemplateId,
1509 substituteNodeTemplateId);
1515 private void addIndexValueProperty(NodeTemplate nodeTemplate) {
1516 List<String> indexValueGetPropertyValue = new ArrayList<>();
1517 indexValueGetPropertyValue.add(ToscaConstants.MODELABLE_ENTITY_NAME_SELF);
1518 indexValueGetPropertyValue.add(ToscaConstants.SERVICE_TEMPLATE_FILTER_PROPERTY_NAME);
1519 indexValueGetPropertyValue.add(ToscaConstants.INDEX_VALUE_PROPERTY_NAME);
1521 Map<String, Object> indexPropertyValue = new HashMap<>();
1522 Map<String, Object> properties = nodeTemplate.getProperties();
1523 indexPropertyValue.put(ToscaFunctions.GET_PROPERTY.getDisplayName(),
1524 indexValueGetPropertyValue);
1525 properties.put(ToscaConstants.INDEX_VALUE_PROPERTY_NAME,
1526 indexPropertyValue);
1527 nodeTemplate.setProperties(properties);
1530 private String getSubstituteNodeTemplateId(ServiceTemplate serviceTemplate,
1531 UnifiedCompositionData unifiedCompositionData,
1534 String computeNodeTemplateId =
1535 unifiedCompositionData.getComputeTemplateConsolidationData().getNodeTemplateId();
1536 NodeTemplate computeNodeTemplate =
1537 DataModelUtil.getNodeTemplate(serviceTemplate, computeNodeTemplateId);
1538 String nodeTemplateId = ABSTRACT_NODE_TEMPLATE_ID_PREFIX + DataModelUtil
1539 .getNamespaceSuffix(nodeTypeId);
1540 if (Objects.nonNull(index)) {
1541 nodeTemplateId = nodeTemplateId + "_" + index.toString();
1543 return nodeTemplateId;
1547 * Gets substitution node type id.
1549 * @param serviceTemplate the service template
1550 * @param unifiedCompositionData the unified composition data
1551 * @param index the index
1552 * @return the substitution node type id
1554 public String getSubstitutionNodeTypeId(ServiceTemplate serviceTemplate,
1555 UnifiedCompositionData unifiedCompositionData,
1557 TranslationContext context) {
1558 String computeNodeTemplateId =
1559 unifiedCompositionData.getComputeTemplateConsolidationData().getNodeTemplateId();
1560 NodeTemplate computeNodeTemplate =
1561 DataModelUtil.getNodeTemplate(serviceTemplate, computeNodeTemplateId);
1562 String computeType = computeNodeTemplate.getType();
1563 String globalSTName = ToscaUtil.getServiceTemplateFileName(Constants
1564 .GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME);
1566 String nodeTypeId = ToscaNodeType.ABSTRACT_NODE_TYPE_PREFIX
1567 + DataModelUtil.getNamespaceSuffix(getIndexedGlobalNodeTypeId(computeType, context));
1569 context.updateUsedTimesForNestedComputeNodeType(globalSTName, computeType);
1571 if (Objects.nonNull(index)) {
1572 nodeTypeId = nodeTypeId + "_" + index.toString();
1577 private String getNewComputeNodeTemplateId(
1578 ServiceTemplate serviceTemplate,
1579 String computeNodeTemplateId) {
1580 return getComputeTypeSuffix(serviceTemplate, computeNodeTemplateId);
1583 private NodeType handleSubstitutionGlobalNodeType(ServiceTemplate serviceTemplate,
1584 ServiceTemplate substitutionServiceTemplate,
1585 TranslationContext context,
1586 UnifiedCompositionData unifiedCompositionData,
1587 String substitutionNodeTypeId,
1589 NodeType substitutionNodeType = new ToscaAnalyzerServiceImpl()
1590 .createInitSubstitutionNodeType(substitutionServiceTemplate,
1591 ToscaNodeType.VFC_ABSTRACT_SUBSTITUTE);
1592 ServiceTemplate globalSubstitutionServiceTemplate =
1593 HeatToToscaUtil.fetchGlobalSubstitutionServiceTemplate(serviceTemplate, context);
1594 DataModelUtil.addNodeType(globalSubstitutionServiceTemplate, substitutionNodeTypeId,
1595 substitutionNodeType);
1597 return substitutionNodeType;
1600 private void handlePorts(ServiceTemplate serviceTemplate,
1601 ServiceTemplate substitutionServiceTemplate,
1602 List<UnifiedCompositionData> unifiedCompositionDataList,
1603 String connectedComputeNodeType,
1604 TranslationContext context) {
1606 if (unifiedCompositionDataList.size() > 1) {
1607 handleConsolidationPorts(serviceTemplate, substitutionServiceTemplate,
1608 unifiedCompositionDataList, connectedComputeNodeType, context);
1610 handleSinglePorts(serviceTemplate, substitutionServiceTemplate, connectedComputeNodeType,
1611 unifiedCompositionDataList, context);
1615 private void handleSinglePorts(ServiceTemplate serviceTemplate,
1616 ServiceTemplate substitutionServiceTemplate,
1617 String connectedComputeNodeType,
1618 List<UnifiedCompositionData> unifiedCompositionDataList,
1619 TranslationContext context) {
1620 UnifiedCompositionData unifiedCompositionData = unifiedCompositionDataList.get(0);
1621 List<PortTemplateConsolidationData> portTemplateConsolidationDataList =
1622 getPortTemplateConsolidationDataList(unifiedCompositionData);
1623 if (CollectionUtils.isEmpty(portTemplateConsolidationDataList)) {
1626 for (PortTemplateConsolidationData portTemplateConsolidationData :
1627 portTemplateConsolidationDataList) {
1628 List<EntityConsolidationData> portConsolidationDataList = new ArrayList<>();
1629 portConsolidationDataList.add(portTemplateConsolidationData);
1630 handlePortNodeTemplate(serviceTemplate, substitutionServiceTemplate,
1631 portConsolidationDataList, connectedComputeNodeType,
1632 unifiedCompositionData.getComputeTemplateConsolidationData(),
1633 unifiedCompositionDataList, context);
1637 private void handleConsolidationPorts(ServiceTemplate serviceTemplate,
1638 ServiceTemplate substitutionServiceTemplate,
1639 List<UnifiedCompositionData> unifiedCompositionDataList,
1640 String connectedComputeNodeType,
1641 TranslationContext context) {
1642 Collection<ComputeTemplateConsolidationData> computeConsolidationDataList =
1643 (Collection) getComputeConsolidationDataList(unifiedCompositionDataList);
1645 Map<String, Set<String>> portIdsPerPortType = UnifiedCompositionUtil
1646 .collectAllPortsFromEachTypesFromComputes(computeConsolidationDataList);
1648 for (String portType : portIdsPerPortType.keySet()) {
1649 List<EntityConsolidationData> portTemplateConsolidationDataList =
1650 getPortConsolidationDataList(portIdsPerPortType.get(portType),
1651 unifiedCompositionDataList);
1652 if (CollectionUtils.isEmpty(portTemplateConsolidationDataList)) {
1656 handlePortNodeTemplate(serviceTemplate, substitutionServiceTemplate,
1657 portTemplateConsolidationDataList, connectedComputeNodeType,
1658 unifiedCompositionDataList.get(0).getComputeTemplateConsolidationData(),
1659 unifiedCompositionDataList, context);
1663 private void handlePortNodeTemplate(
1664 ServiceTemplate serviceTemplate,
1665 ServiceTemplate substitutionServiceTemplate,
1666 List<EntityConsolidationData> portTemplateConsolidationDataList,
1667 String connectedComputeNodeType,
1668 ComputeTemplateConsolidationData computeTemplateConsolidationData,
1669 List<UnifiedCompositionData> unifiedCompositionDataList,
1670 TranslationContext context) {
1671 EntityConsolidationData portTemplateConsolidationData =
1672 portTemplateConsolidationDataList.get(0);
1673 NodeTemplate newPortNodeTemplate = getNodeTemplate(
1674 portTemplateConsolidationData.getNodeTemplateId(), serviceTemplate, context).clone();
1676 removeConnectivityOut(portTemplateConsolidationData, newPortNodeTemplate);
1677 handleProperties(serviceTemplate, newPortNodeTemplate,
1678 substitutionServiceTemplate, UnifiedCompositionEntity.Port,
1679 portTemplateConsolidationDataList, computeTemplateConsolidationData,
1680 unifiedCompositionDataList, context);
1682 String newPortNodeTemplateId =
1683 getNewPortNodeTemplateId(portTemplateConsolidationData
1684 .getNodeTemplateId(), connectedComputeNodeType,
1685 computeTemplateConsolidationData);
1686 //Update requirements for relationships between the consolidation entities
1687 handleConsolidationEntitiesRequirementConnectivity(newPortNodeTemplateId, newPortNodeTemplate,
1688 serviceTemplate, context);
1689 DataModelUtil.addNodeTemplate(substitutionServiceTemplate, newPortNodeTemplateId,
1690 newPortNodeTemplate);
1692 //Add the node template mapping in the context for handling requirement updation
1693 for (EntityConsolidationData data : portTemplateConsolidationDataList) {
1694 String newPortTemplateId = getNewPortNodeTemplateId(data.getNodeTemplateId(),
1695 connectedComputeNodeType, computeTemplateConsolidationData);
1696 context.addSubstitutionServiceTemplateUnifiedSubstitutionData(ToscaUtil
1697 .getServiceTemplateFileName(serviceTemplate), data.getNodeTemplateId(),
1703 private NodeTemplate getNodeTemplate(String nodeTemplateId, ServiceTemplate serviceTemplate,
1704 TranslationContext context) {
1706 NodeTemplate nodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate, nodeTemplateId);
1708 if (Objects.isNull(nodeTemplate)) {
1709 nodeTemplate = context
1710 .getCleanedNodeTemplate(ToscaUtil.getServiceTemplateFileName(serviceTemplate),
1714 return nodeTemplate;
1718 private String handleCompute(ServiceTemplate serviceTemplate,
1719 ServiceTemplate substitutionServiceTemplate,
1720 List<UnifiedCompositionData> unifiedCompositionDataList,
1721 TranslationContext context) {
1722 ComputeTemplateConsolidationData computeTemplateConsolidationData =
1723 unifiedCompositionDataList.get(0).getComputeTemplateConsolidationData();
1724 handleComputeNodeTemplate(serviceTemplate, substitutionServiceTemplate,
1725 unifiedCompositionDataList, context);
1726 ServiceTemplate globalSubstitutionServiceTemplate =
1727 HeatToToscaUtil.fetchGlobalSubstitutionServiceTemplate(serviceTemplate, context);
1728 return handleComputeNodeType(serviceTemplate, substitutionServiceTemplate, globalSubstitutionServiceTemplate,
1729 computeTemplateConsolidationData);
1732 private String handleComputeNodeType(
1733 ServiceTemplate serviceTemplate,
1734 ServiceTemplate substitutionServiceTemplate,
1735 ServiceTemplate globalSubstitutionServiceTemplate,
1736 ComputeTemplateConsolidationData computeTemplateConsolidationData) {
1737 NodeTemplate computeNodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate,
1738 computeTemplateConsolidationData.getNodeTemplateId());
1739 String computeNodeTypeId = computeNodeTemplate.getType();
1740 NodeType computeNodeType =
1741 DataModelUtil.getNodeType(serviceTemplate, computeNodeTypeId);
1743 .addNodeType(substitutionServiceTemplate, computeNodeTypeId, computeNodeType);
1744 // NodeType globalNodeType = new ToscaAnalyzerServiceImpl()
1745 // .createInitSubstitutionNodeType(substitutionServiceTemplate,
1746 // computeNodeType.getDerived_from());
1748 // .addNodeType(globalSubstitutionServiceTemplate, computeNodeTypeId, globalNodeType);
1750 return computeNodeTypeId;
1753 private void handleComputeNodeTemplate(ServiceTemplate serviceTemplate,
1754 ServiceTemplate substitutionServiceTemplate,
1755 List<UnifiedCompositionData> unifiedCompositionDataList,
1756 TranslationContext context) {
1757 ComputeTemplateConsolidationData computeTemplateConsolidationData =
1758 unifiedCompositionDataList.get(0).getComputeTemplateConsolidationData();
1759 NodeTemplate newComputeNodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate,
1760 computeTemplateConsolidationData.getNodeTemplateId()).clone();
1762 removeConnectivityOut(computeTemplateConsolidationData, newComputeNodeTemplate);
1763 removeVolumeConnectivity(computeTemplateConsolidationData, newComputeNodeTemplate);
1765 List<EntityConsolidationData> computeConsoliadtionDataList =
1766 getComputeConsolidationDataList(unifiedCompositionDataList);
1768 handleProperties(serviceTemplate, newComputeNodeTemplate,
1769 substitutionServiceTemplate, UnifiedCompositionEntity.Compute,
1770 computeConsoliadtionDataList, computeTemplateConsolidationData, unifiedCompositionDataList,
1773 String newComputeNodeTemplateId = getNewComputeNodeTemplateId(serviceTemplate,
1774 computeTemplateConsolidationData.getNodeTemplateId());
1775 //Update requirements for relationships between the consolidation entities
1776 handleConsolidationEntitiesRequirementConnectivity(newComputeNodeTemplateId,
1777 newComputeNodeTemplate,
1778 serviceTemplate, context);
1780 .addNodeTemplate(substitutionServiceTemplate,
1781 newComputeNodeTemplateId, newComputeNodeTemplate);
1782 //Add the node template mapping in the context for handling requirement updation
1783 for (EntityConsolidationData data : computeConsoliadtionDataList) {
1784 String newComputeTemplateId = getNewComputeNodeTemplateId(serviceTemplate,
1785 computeTemplateConsolidationData.getNodeTemplateId());
1786 context.addSubstitutionServiceTemplateUnifiedSubstitutionData(ToscaUtil
1787 .getServiceTemplateFileName(serviceTemplate), data.getNodeTemplateId(),
1788 newComputeTemplateId);
1792 private List<EntityConsolidationData> getComputeConsolidationDataList(
1793 List<UnifiedCompositionData> unifiedCompositionDataList) {
1794 List<EntityConsolidationData> computeConsolidationDataList = new ArrayList<>();
1795 for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) {
1796 computeConsolidationDataList
1797 .add(unifiedCompositionData.getComputeTemplateConsolidationData());
1799 return computeConsolidationDataList;
1803 private void handleProperties(ServiceTemplate serviceTemplate,
1804 NodeTemplate nodeTemplate,
1805 ServiceTemplate substitutionServiceTemplate,
1806 UnifiedCompositionEntity unifiedCompositionEntity,
1807 List<EntityConsolidationData> entityConsolidationDataList,
1808 ComputeTemplateConsolidationData computeTemplateConsolidationData,
1809 List<UnifiedCompositionData> unifiedCompositionDataList,
1810 TranslationContext context) {
1811 List<String> propertiesWithIdenticalVal =
1812 consolidationService.getPropertiesWithIdenticalVal(unifiedCompositionEntity, context);
1813 nodeTemplate.setProperties(new HashedMap());
1814 handleNodeTemplateProperties(serviceTemplate, nodeTemplate, substitutionServiceTemplate,
1815 unifiedCompositionEntity, entityConsolidationDataList, computeTemplateConsolidationData,
1816 unifiedCompositionDataList, context);
1817 //Add enrich properties from openecomp node type as input to global and substitution ST
1818 handleNodeTypeProperties(substitutionServiceTemplate,
1819 entityConsolidationDataList, nodeTemplate, unifiedCompositionEntity,
1820 computeTemplateConsolidationData, context);
1824 private void handleNodeTemplateProperties(ServiceTemplate serviceTemplate,
1825 NodeTemplate nodeTemplate,
1826 ServiceTemplate substitutionServiceTemplate,
1827 UnifiedCompositionEntity unifiedCompositionEntity,
1828 List<EntityConsolidationData>
1829 entityConsolidationDataList,
1830 ComputeTemplateConsolidationData
1831 computeTemplateConsolidationData,
1832 List<UnifiedCompositionData> unifiedCompositionDataList,
1833 TranslationContext context) {
1834 List<String> propertiesWithIdenticalVal =
1835 consolidationService.getPropertiesWithIdenticalVal(unifiedCompositionEntity, context);
1837 for (EntityConsolidationData entityConsolidationData : entityConsolidationDataList) {
1838 String nodeTemplateId = entityConsolidationData.getNodeTemplateId();
1839 Map<String, Object> properties =
1840 DataModelUtil.getNodeTemplateProperties(serviceTemplate, nodeTemplateId);
1841 if (MapUtils.isEmpty(properties)) {
1845 for (Map.Entry<String, Object> propertyEntry : properties.entrySet()) {
1846 NodeType nodeTypeWithFlatHierarchy =
1847 HeatToToscaUtil.getNodeTypeWithFlatHierarchy(nodeTemplate.getType(), serviceTemplate,
1849 PropertyDefinition propertyDefinition =
1850 nodeTypeWithFlatHierarchy.getProperties().get(propertyEntry.getKey());
1851 String propertyType = propertyDefinition.getType();
1853 if (propertiesWithIdenticalVal.contains(propertyEntry.getKey())) {
1854 String parameterId =
1855 updateIdenticalProperty(nodeTemplateId, propertyEntry.getKey(), nodeTemplate,
1856 unifiedCompositionEntity, unifiedCompositionDataList);
1859 parameterId, propertyType,
1860 propertyType.equals(PropertyType.LIST.getDisplayName()) ? propertyDefinition
1861 .getEntry_schema() : null,
1862 substitutionServiceTemplate);
1864 Optional<String> parameterId =
1865 updateProperty(serviceTemplate, nodeTemplateId, nodeTemplate, propertyEntry,
1866 unifiedCompositionEntity, computeTemplateConsolidationData,
1867 unifiedCompositionDataList,
1869 //todo - define list of type which will match the node property type (instead of string)
1870 addPropertyInputParameter(propertyType, substitutionServiceTemplate, propertyDefinition
1872 parameterId, unifiedCompositionEntity, context);
1878 private void handleNodeTypeProperties(ServiceTemplate substitutionServiceTemplate,
1879 List<EntityConsolidationData> entityConsolidationDataList,
1880 NodeTemplate nodeTemplate,
1881 UnifiedCompositionEntity compositionEntity,
1882 ComputeTemplateConsolidationData
1883 computeTemplateConsolidationData,
1884 TranslationContext context) {
1885 ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl();
1886 Optional<NodeType> enrichNodeType;
1887 List<String> enrichProperties;
1889 if (compositionEntity.equals(UnifiedCompositionEntity.Port)) {
1891 toscaAnalyzerService.fetchNodeType(ToscaNodeType.NETWORK_PORT,
1892 context.getGlobalServiceTemplates().values());
1893 enrichProperties = context.getEnrichPortResourceProperties();
1894 if (!enrichNodeType.isPresent() || Objects.isNull(enrichProperties)) {
1901 Map<String, Object> nodeTemplateProperties = nodeTemplate.getProperties();
1902 Map<String, PropertyDefinition> enrichNodeTypeProperties = enrichNodeType.get().getProperties();
1903 if (Objects.nonNull(enrichNodeTypeProperties)) {
1904 for (String enrichPropertyName : enrichProperties) {
1905 handleEntityConsolidationDataNodeTypeProperties(
1906 enrichPropertyName, substitutionServiceTemplate,
1907 enrichNodeType.get(), nodeTemplate, compositionEntity, computeTemplateConsolidationData,
1908 entityConsolidationDataList, nodeTemplateProperties, context);
1913 private void handleEntityConsolidationDataNodeTypeProperties(String enrichPropertyName,
1914 ServiceTemplate substitutionServiceTemplate,
1915 NodeType enrichNodeType,
1916 NodeTemplate nodeTemplate,
1917 UnifiedCompositionEntity compositionEntity,
1918 ComputeTemplateConsolidationData computeTemplateConsolidationData,
1919 List<EntityConsolidationData> entityConsolidationDataList,
1920 Map<String, Object> nodeTemplateProperties,
1921 TranslationContext context) {
1923 String propertyType;
1925 for (EntityConsolidationData entityConsolidationData : entityConsolidationDataList) {
1926 String nodeTemplateId = entityConsolidationData.getNodeTemplateId();
1928 String inputParamId =
1929 getParameterId(nodeTemplateId, nodeTemplate, enrichPropertyName,
1930 compositionEntity, computeTemplateConsolidationData);
1931 Map<String, String> propertyValMap = new HashMap<>();
1934 .addNewPropertyIdToNodeTemplate(
1935 ToscaUtil.getServiceTemplateFileName(substitutionServiceTemplate),
1936 inputParamId, nodeTemplateProperties.get(enrichPropertyName));
1938 if (nodeTemplateProperties.containsKey(enrichPropertyName)) {
1939 handleExistingEnrichedProperty(enrichPropertyName, nodeTemplateProperties, inputParamId);
1941 propertyValMap.put(ToscaFunctions.GET_INPUT.getDisplayName(), inputParamId);
1942 nodeTemplate.getProperties().put(enrichPropertyName, propertyValMap);
1945 enrichNodeType.getProperties().get(enrichPropertyName).getType();
1947 addPropertyInputParameter(propertyType, substitutionServiceTemplate, enrichNodeType
1948 .getProperties().get(enrichPropertyName).getEntry_schema(),
1949 Optional.of(inputParamId), compositionEntity, context);
1954 private void handleExistingEnrichedProperty(String enrichPropertyName,
1955 Map<String, Object> nodeTemplateProperties,
1956 String inputParamId) {
1957 Object enrichedProperty = nodeTemplateProperties.get(enrichPropertyName);
1958 if (!isPropertyContainsToscaFunction(enrichedProperty)) {
1959 Map<String, Object> propertyWithGetInput = new HashMap<>();
1960 propertyWithGetInput.put(ToscaFunctions.GET_INPUT.getDisplayName(), inputParamId);
1961 nodeTemplateProperties.put(enrichPropertyName, propertyWithGetInput);
1966 private boolean isPropertyContainsToscaFunction(Object propertyValue) {
1967 ToscaFunctions[] values = ToscaFunctions.values();
1968 for (ToscaFunctions toscaFunction : values) {
1969 if (isIncludeToscaFunc(propertyValue, toscaFunction)) {
1978 private void addPropertyInputParameter(String propertyType,
1979 ServiceTemplate substitutionServiceTemplate,
1980 EntrySchema entrySchema, Optional<String> parameterId,
1981 UnifiedCompositionEntity unifiedCompositionEntity,
1982 TranslationContext context) {
1983 if (parameterId.isPresent() &&
1984 isParameterBelongsToEnrichedPortProperties(parameterId.get(), context)) {
1985 addInputParameter(parameterId.get(),
1987 propertyType.equals(PropertyType.LIST.getDisplayName()) ? entrySchema : null,
1988 substitutionServiceTemplate);
1989 } else if (isPropertySimpleType(propertyType)) {
1991 .ifPresent(parameterIdValue -> addInputParameter(parameterIdValue,
1992 PropertyType.LIST.getDisplayName(),
1994 .createEntrySchema(propertyType.toLowerCase(), null, null),
1995 substitutionServiceTemplate));
1997 } else if (propertyType.equals(PropertyTypeExt.JSON.getDisplayName()) ||
1998 (Objects.nonNull(entrySchema) && isPropertySimpleType(entrySchema.getType()))) {
2000 .ifPresent(parameterIdValue -> addInputParameter(parameterIdValue,
2001 PropertyType.LIST.getDisplayName(),
2003 .createEntrySchema(PropertyTypeExt.JSON.getDisplayName(), null, null),
2004 substitutionServiceTemplate));
2007 .ifPresent(parameterIdValue -> addInputParameter(parameterIdValue,
2008 analyzeParameterType(propertyType),
2010 .createEntrySchema(analyzeEntrySchemaType(propertyType, entrySchema),
2012 substitutionServiceTemplate));
2016 private boolean isParameterBelongsToEnrichedPortProperties(String parameterId,
2017 TranslationContext context) {
2018 List enrichPortResourceProperties = context.getEnrichPortResourceProperties();
2020 for (int i = 0; i < enrichPortResourceProperties.size(); i++) {
2021 if (parameterId.contains((CharSequence) enrichPortResourceProperties.get(i))) {
2029 private boolean isPropertySimpleType(String propertyType) {
2030 return !Objects.isNull(propertyType) &&
2031 (propertyType.equalsIgnoreCase(PropertyType.STRING.getDisplayName())
2032 || propertyType.equalsIgnoreCase(PropertyType.INTEGER.getDisplayName())
2033 || propertyType.equalsIgnoreCase(PropertyType.FLOAT.getDisplayName())
2034 || propertyType.equalsIgnoreCase(PropertyType.BOOLEAN.getDisplayName()));
2037 private String analyzeParameterType(String propertyType) {
2038 return propertyType.equalsIgnoreCase(PropertyType.LIST.getDisplayName()) ? PropertyType.LIST
2039 .getDisplayName() : propertyType;
2042 private String analyzeEntrySchemaType(String propertyType, EntrySchema entrySchema) {
2043 return propertyType.equalsIgnoreCase(PropertyType.LIST.getDisplayName()) ?
2044 entrySchema.getType() : null;
2047 private void handleConsolidationEntitiesRequirementConnectivity(String nodeTemplateId,
2048 NodeTemplate nodeTemplate,
2049 ServiceTemplate serviceTemplate,
2050 TranslationContext context) {
2051 Map<String, RequirementAssignment> updatedNodeTemplateRequirements = new HashMap<>();
2052 List<Map<String, RequirementAssignment>> nodeTemplateRequirements = DataModelUtil
2053 .getNodeTemplateRequirementList(nodeTemplate);
2054 if (CollectionUtils.isEmpty(nodeTemplateRequirements)) {
2058 for (Map<String, RequirementAssignment> requirement : nodeTemplateRequirements) {
2059 for (Map.Entry<String, RequirementAssignment> entry : requirement.entrySet()) {
2060 RequirementAssignment requirementAssignment = entry.getValue();
2061 String requirementNode = requirementAssignment.getNode();
2062 String unifiedNodeTemplateId =
2063 context.getUnifiedSubstitutionNodeTemplateId(serviceTemplate,
2065 if (unifiedNodeTemplateId != null) {
2066 //Update the node id in the requirement
2067 requirementAssignment.setNode(unifiedNodeTemplateId);
2071 nodeTemplate.setRequirements(nodeTemplateRequirements);
2075 * Update the node references in the volume relationship templates.
2077 * @param serviceTemplate the service template
2078 * @param context the context
2080 private void updateVolumeRelationshipTemplate(ServiceTemplate serviceTemplate,
2081 String relationshipId,
2082 TranslationContext context) {
2083 Map<String, RelationshipTemplate> relationshipTemplates = DataModelUtil
2084 .getRelationshipTemplates(serviceTemplate);
2085 if (relationshipTemplates != null) {
2086 RelationshipTemplate relationshipTemplate = relationshipTemplates.get(relationshipId);
2087 if (relationshipTemplate != null) {
2088 String relationshipTemplateType = relationshipTemplate.getType();
2089 if (relationshipTemplateType.equals(ToscaRelationshipType.CINDER_VOLUME_ATTACHES_TO)) {
2090 handleCinderVolumeAttachmentRelationshipTemplate(serviceTemplate,
2091 relationshipTemplate, context);
2098 private void handleCinderVolumeAttachmentRelationshipTemplate(ServiceTemplate
2099 substitutionServiceTemplate,
2100 RelationshipTemplate
2101 relationshipTemplate,
2102 TranslationContext context) {
2103 Map<String, Object> properties = relationshipTemplate.getProperties();
2104 properties.computeIfPresent(HeatConstants.INSTANCE_UUID_PROPERTY_NAME, (key, value) ->
2105 context.getUnifiedAbstractNodeTemplateId(substitutionServiceTemplate,
2109 private String updateIdenticalProperty(String nodeTemplateId, String propertyId,
2110 NodeTemplate nodeTemplate,
2111 UnifiedCompositionEntity unifiedCompositionEntity,
2112 List<UnifiedCompositionData> unifiedCompositionDataList) {
2114 String inputParamId;
2115 Map<String, Object> propertyVal = new HashMap<>();
2117 switch (unifiedCompositionEntity) {
2119 inputParamId = COMPUTE_IDENTICAL_VALUE_PROPERTY_PREFIX + propertyId
2120 + COMPUTE_IDENTICAL_VALUE_PROPERTY_SUFFIX;
2122 propertyVal.put(ToscaFunctions.GET_INPUT.getDisplayName(), inputParamId);
2123 nodeTemplate.getProperties().put(propertyId, propertyVal);
2125 return inputParamId;
2128 String portType = ConsolidationDataUtil.getPortType(nodeTemplateId);
2129 ComputeTemplateConsolidationData computeTemplateConsolidationData =
2130 getConnectedComputeConsolidationData(unifiedCompositionDataList, nodeTemplateId);
2131 inputParamId = getInputParamIdForPort(nodeTemplateId, propertyId, portType,
2132 computeTemplateConsolidationData);
2134 propertyVal.put(ToscaFunctions.GET_INPUT.getDisplayName(), inputParamId);
2135 nodeTemplate.getProperties().put(propertyId, propertyVal);
2137 return inputParamId;
2144 private String getInputParamIdForPort(String nodeTemplateId, String propertyId, String portType,
2145 ComputeTemplateConsolidationData computeTemplateConsolidationData) {
2146 String inputParamId;
2147 if (Objects.isNull(computeTemplateConsolidationData)
2148 || computeTemplateConsolidationData.getPorts().get(portType).size() > 1) {
2150 UnifiedCompositionEntity.Port.name().toLowerCase() + "_" + nodeTemplateId + "_" +
2155 UnifiedCompositionEntity.Port.name().toLowerCase() + "_" + portType + "_"
2158 return inputParamId;
2161 private void addInputParameter(String parameterId,
2162 String parameterType,
2163 EntrySchema entrySchema,
2164 ServiceTemplate serviceTemplate) {
2166 ParameterDefinition parameterDefinition = DataModelUtil.createParameterDefinition
2167 (parameterType, null, null,
2173 .addInputParameterToTopologyTemplate(serviceTemplate, parameterId, parameterDefinition);
2176 // Return the input parameter Id which is used in the new property value if there is one
2177 private Optional<String> updateProperty(
2178 ServiceTemplate serviceTemplate,
2179 String nodeTemplateId, NodeTemplate nodeTemplate,
2180 Map.Entry<String, Object> propertyEntry,
2181 UnifiedCompositionEntity compositionEntity,
2182 ComputeTemplateConsolidationData computeTemplateConsolidationData,
2183 List<UnifiedCompositionData> unifiedCompositionDataList,
2184 TranslationContext context) {
2186 if (handleGetAttrFromConsolidationNodes(serviceTemplate, nodeTemplateId, nodeTemplate,
2187 propertyEntry, unifiedCompositionDataList, context)) {
2188 return Optional.empty();
2192 String inputParamId =
2193 getParameterId(nodeTemplateId, nodeTemplate, propertyEntry.getKey(), compositionEntity,
2194 computeTemplateConsolidationData);
2195 Map<String, List<String>> propertyVal = getPropertyValueInputParam(nodeTemplateId,
2196 nodeTemplate, inputParamId);
2197 nodeTemplate.getProperties().put(propertyEntry.getKey(), propertyVal);
2198 return Optional.of(inputParamId);
2201 private Map<String, List<String>> getPropertyValueInputParam(String nodeTemplateId,
2202 NodeTemplate nodeTemplate,
2203 String inputParamId) {
2204 Map<String, List<String>> propertyVal = new HashMap<>();
2205 List<String> getInputFuncParams = new ArrayList<>();
2206 getInputFuncParams.add(inputParamId);
2207 getInputFuncParams.add(ToscaConstants.INDEX_VALUE_PROPERTY_NAME);
2208 propertyVal.put(ToscaFunctions.GET_INPUT.getDisplayName(), getInputFuncParams);
2212 private boolean handleGetAttrFromConsolidationNodes(
2213 ServiceTemplate serviceTemplate,
2214 String nodeTemplateId, NodeTemplate nodeTemplate,
2215 Map.Entry<String, Object> propertyEntry,
2216 List<UnifiedCompositionData> unifiedCompositionDataList,
2217 TranslationContext context) {
2218 Map<String, UnifiedCompositionEntity> consolidationNodeTemplateIdAndType =
2219 getAllConsolidationNodeTemplateIdAndType(unifiedCompositionDataList);
2221 Set<String> consolidationNodeTemplateIds = consolidationNodeTemplateIdAndType.keySet();
2222 Map<String, String> entityIdToType = ConsolidationService.getConsolidationEntityIdToType(
2223 serviceTemplate, context.getConsolidationData());
2224 boolean includeGetAttrFromConsolidationNodes = false;
2225 boolean includeGetAttrFromOutsideNodes = false;
2226 boolean isGetAttrFromConsolidationIsFromSameType = false;
2227 List<List<Object>> getAttrFunctionList = extractGetAttrFunction(propertyEntry.getValue());
2228 for (List<Object> getAttrFunc : getAttrFunctionList) {
2229 String getAttrNodeId = (String) getAttrFunc.get(0);
2230 if (consolidationNodeTemplateIds.contains(getAttrNodeId)) {
2231 includeGetAttrFromConsolidationNodes = true;
2232 if (isGetAttrNodeTemplateFromSameType(nodeTemplateId, getAttrNodeId, entityIdToType)) {
2233 isGetAttrFromConsolidationIsFromSameType = true;
2236 includeGetAttrFromOutsideNodes = true;
2239 if ((includeGetAttrFromConsolidationNodes && includeGetAttrFromOutsideNodes)
2241 (includeGetAttrFromConsolidationNodes && isIncludeToscaFunc(propertyEntry.getValue(),
2242 ToscaFunctions.GET_INPUT))) {
2243 //This case is currently not supported - this property will be ignored
2245 } else if (includeGetAttrFromConsolidationNodes && !isGetAttrFromConsolidationIsFromSameType) {
2246 Object clonedPropertyValue = getClonedPropertyValue(propertyEntry);
2247 List<List<Object>> clonedGetAttrFuncList = extractGetAttrFunction(clonedPropertyValue);
2248 for (List<Object> getAttrFunc : clonedGetAttrFuncList) {
2249 String targetNodeTemplateId = (String) getAttrFunc.get(0);
2250 if (consolidationNodeTemplateIds.contains(targetNodeTemplateId)) {
2251 updatePropertyGetAttrFunc(serviceTemplate, unifiedCompositionDataList, context,
2252 consolidationNodeTemplateIdAndType, targetNodeTemplateId, getAttrFunc);
2255 nodeTemplate.getProperties().put(propertyEntry.getKey(), clonedPropertyValue);
2261 private boolean isGetAttrFromConsolidationNodesIsFromSameType(String sourceNodeTemplateId,
2262 Set<String> nodeTemplateIdsFromConsolidation,
2264 nodeTemplateIdToType) {
2265 for (String idFromConsolidation : nodeTemplateIdsFromConsolidation) {
2266 if (isGetAttrNodeTemplateFromSameType(sourceNodeTemplateId, idFromConsolidation,
2267 nodeTemplateIdToType)) {
2274 private boolean isGetAttrNodeTemplateFromSameType(String sourceNodeTemplateId,
2275 String targetNodeTemplateId,
2276 Map<String, String> nodeTemplateIdToType) {
2278 if (Objects.isNull(nodeTemplateIdToType.get(sourceNodeTemplateId))
2279 || Objects.isNull(nodeTemplateIdToType.get(targetNodeTemplateId))) {
2283 return nodeTemplateIdToType.get(sourceNodeTemplateId).equals(nodeTemplateIdToType
2284 .get(targetNodeTemplateId));
2287 private void updatePropertyGetAttrFunc(
2288 ServiceTemplate serviceTemplate,
2289 List<UnifiedCompositionData> unifiedCompositionDataList,
2290 TranslationContext context,
2291 Map<String, UnifiedCompositionEntity> consolidationNodeTemplateIdAndType,
2292 String targetNodeTemplateId,
2293 List<Object> getAttrFunc) {
2294 UnifiedCompositionEntity targetCompositionEntity =
2295 consolidationNodeTemplateIdAndType.get(targetNodeTemplateId);
2296 String targetNewNodeTemplateId =
2297 getNewNodeTemplateId(serviceTemplate, unifiedCompositionDataList, targetNodeTemplateId,
2298 targetCompositionEntity);
2299 getAttrFunc.set(0, targetNewNodeTemplateId);
2302 private String getNewNodeTemplateId(ServiceTemplate serviceTemplate,
2303 List<UnifiedCompositionData> unifiedCompositionDataList,
2304 String nodeTemplateId,
2305 UnifiedCompositionEntity compositionEntity) {
2306 switch (compositionEntity) {
2308 return getNewComputeNodeTemplateId(serviceTemplate, nodeTemplateId);
2310 ComputeTemplateConsolidationData connectedComputeConsolidationData =
2311 getConnectedComputeConsolidationData(
2312 unifiedCompositionDataList, nodeTemplateId);
2313 NodeTemplate connectedComputeNodeTemplate =
2314 DataModelUtil.getNodeTemplate(serviceTemplate,
2315 connectedComputeConsolidationData.getNodeTemplateId());
2316 return getNewPortNodeTemplateId(nodeTemplateId, connectedComputeNodeTemplate.getType(),
2317 connectedComputeConsolidationData);
2323 private String getNewNodeTemplateId(String origNodeTemplateId,
2324 String serviceTemplateFileName,
2325 ServiceTemplate serviceTemplate,
2326 TranslationContext context) {
2327 ConsolidationData consolidationData = context.getConsolidationData();
2329 if (isIdIsOfExpectedType(origNodeTemplateId, UnifiedCompositionEntity.Port,
2330 serviceTemplateFileName,
2332 return handleIdOfPort(origNodeTemplateId, serviceTemplateFileName, consolidationData);
2333 } else if (isIdIsOfExpectedType(origNodeTemplateId, UnifiedCompositionEntity.Compute,
2334 serviceTemplateFileName, context)) {
2335 NodeTemplate nodeTemplate =
2336 getComputeNodeTemplate(origNodeTemplateId, serviceTemplate, context);
2337 return getComputeTypeSuffix(nodeTemplate.getType());
2343 private ComputeTemplateConsolidationData getConnectedComputeConsolidationData(
2344 List<UnifiedCompositionData> unifiedCompositionDataList,
2345 String portNodeTemplateId) {
2346 for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) {
2347 Collection<List<String>> portsCollection =
2348 unifiedCompositionData.getComputeTemplateConsolidationData().getPorts().values();
2349 for (List<String> portIdList : portsCollection) {
2350 if (portIdList.contains(portNodeTemplateId)) {
2351 return unifiedCompositionData.getComputeTemplateConsolidationData();
2358 private Object getClonedPropertyValue(Map.Entry<String, Object> propertyEntry) {
2359 if (propertyEntry.getValue() instanceof Map) {
2360 return getClonedObject(propertyEntry.getValue(), Map.class);
2361 } else if (propertyEntry.getValue() instanceof List) {
2362 return getClonedObject(propertyEntry.getValue(), List.class);
2364 return propertyEntry.getValue();
2368 private String getParameterId(String nodeTemplateId, NodeTemplate nodeTemplate, String propertyId,
2369 UnifiedCompositionEntity unifiedCompositionEntity,
2370 ComputeTemplateConsolidationData computeTemplateConsolidationData) {
2371 switch (unifiedCompositionEntity) {
2373 return UnifiedCompositionEntity.Compute.name().toLowerCase() + "_"
2374 + getComputeTypeSuffix(nodeTemplate.getType()) + "_" + propertyId;
2376 String portType = ConsolidationDataUtil.getPortType(nodeTemplateId);
2377 if (Objects.isNull(computeTemplateConsolidationData)
2378 || computeTemplateConsolidationData.getPorts().get(portType).size() > 1) {
2379 return UnifiedCompositionEntity.Port.name().toLowerCase() + "_" + nodeTemplateId + "_"
2382 return UnifiedCompositionEntity.Port.name().toLowerCase() + "_" + portType + "_"
2389 private void removeConnectivityOut(EntityConsolidationData entityConsolidationData,
2390 NodeTemplate nodeTemplate) {
2391 if (MapUtils.isEmpty(entityConsolidationData.getNodesConnectedOut())) {
2395 for (List<RequirementAssignmentData> requirementAssignmentDataList : entityConsolidationData
2396 .getNodesConnectedOut().values()) {
2397 for (RequirementAssignmentData requirementAssignmentData : requirementAssignmentDataList) {
2398 DataModelUtil.removeRequirementsAssignment(nodeTemplate.getRequirements(),
2399 requirementAssignmentData.getRequirementId());
2401 if (nodeTemplate.getRequirements().isEmpty()) {
2402 nodeTemplate.setRequirements(null);
2407 private void removeVolumeConnectivity(
2408 ComputeTemplateConsolidationData computeTemplateConsolidationData,
2409 NodeTemplate computeNodeTemplate) {
2410 if (MapUtils.isEmpty(computeTemplateConsolidationData.getVolumes())) {
2413 Collection<List<RequirementAssignmentData>> volumeCollection =
2414 computeTemplateConsolidationData.getVolumes().values();
2415 for (List<RequirementAssignmentData> requirementAssignmentDataList : volumeCollection) {
2416 for (RequirementAssignmentData requirementAssignmentData : requirementAssignmentDataList) {
2417 DataModelUtil.removeRequirementsAssignment(computeNodeTemplate.getRequirements(),
2418 requirementAssignmentData.getRequirementId());
2421 if (computeNodeTemplate.getRequirements().isEmpty()) {
2422 computeNodeTemplate.setRequirements(null);
2426 private void createIndexInputParameter(ServiceTemplate substitutionServiceTemplate) {
2427 ParameterDefinition indexParameterDefinition =
2428 DataModelUtil.createParameterDefinition(PropertyType.INTEGER.getDisplayName(),
2429 "Index value of this substitution service template runtime instance", null,
2430 false, createIndexValueConstraint(), null, null, 0);
2431 DataModelUtil.addInputParameterToTopologyTemplate(substitutionServiceTemplate,
2432 ToscaConstants.INDEX_VALUE_PROPERTY_NAME, indexParameterDefinition);
2436 private List<Constraint> createIndexValueConstraint() {
2437 List<Constraint> constraints;
2438 constraints = new ArrayList<>();
2439 Constraint constraint = new Constraint();
2440 constraint.setGreater_or_equal(0);
2441 constraints.add(constraint);
2445 private Optional<UnifiedComposition> getUnifiedCompositionInstance(UnifiedCompositionMode mode) {
2446 String unifiedCompositionImplClassName =
2447 unifiedCompositionImplMap.get(mode.name()).getImplementationClass();
2448 if (StringUtils.isEmpty(unifiedCompositionImplClassName)) {
2449 return Optional.empty();
2452 .of(CommonMethods.newInstance(unifiedCompositionImplClassName, UnifiedComposition.class));
2455 private Optional<Map<String, Object>> createAbstractSubstitutionProperties(
2456 ServiceTemplate serviceTemplate,
2457 ServiceTemplate substitutionServiceTemplate,
2458 List<UnifiedCompositionData> unifiedCompositionDataList,
2459 TranslationContext context) {
2460 Map<String, Object> abstractSubstituteProperties = new LinkedHashMap<>();
2461 Map<String, ParameterDefinition> substitutionTemplateInputs = DataModelUtil
2462 .getInputParameters(substitutionServiceTemplate);
2463 if (substitutionTemplateInputs == null) {
2464 return Optional.empty();
2466 //Since all the computes have the same type fetching the type from the first entry
2467 NodeTemplate firstComputeNodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate,
2468 unifiedCompositionDataList.get(0)
2469 .getComputeTemplateConsolidationData().getNodeTemplateId());
2470 String computeType = getComputeTypeSuffix(firstComputeNodeTemplate.getType());
2471 for (Map.Entry<String, ParameterDefinition> input : substitutionTemplateInputs.entrySet()) {
2472 String substitutionTemplateInputName = input.getKey();
2473 ParameterDefinition inputParameterDefinition = input.getValue();
2474 String inputType = inputParameterDefinition.getType();
2475 UnifiedCompositionEntity inputUnifiedCompositionEntity =
2476 getInputCompositionEntity(substitutionTemplateInputName);
2478 if (!inputType.equalsIgnoreCase(PropertyType.LIST.getDisplayName())) {
2479 if (isIdenticalValueProperty(
2480 substitutionTemplateInputName, inputUnifiedCompositionEntity, context)) {
2481 //Handle identical value properties
2482 Optional<String> identicalValuePropertyName =
2483 getIdenticalValuePropertyName(substitutionTemplateInputName,
2484 inputUnifiedCompositionEntity, context);
2486 if (identicalValuePropertyName.isPresent()) {
2487 updateIdenticalPropertyValue(identicalValuePropertyName.get(),
2488 substitutionTemplateInputName, computeType, inputUnifiedCompositionEntity,
2489 unifiedCompositionDataList.get(0), serviceTemplate, abstractSubstituteProperties,
2496 //Check if the input is of type compute or port
2497 List<Object> abstractPropertyValue = new ArrayList<>();
2498 Object propertyValue = null;
2499 switch (inputUnifiedCompositionEntity) {
2501 for (UnifiedCompositionData compositionData : unifiedCompositionDataList) {
2502 ComputeTemplateConsolidationData computeTemplateConsolidationData =
2503 compositionData.getComputeTemplateConsolidationData();
2504 propertyValue = getComputePropertyValue(substitutionTemplateInputName,
2505 serviceTemplate, computeTemplateConsolidationData);
2506 if (!(propertyValue instanceof Optional)) {
2507 abstractPropertyValue.add(propertyValue);
2512 for (UnifiedCompositionData compositionData : unifiedCompositionDataList) {
2513 List<PortTemplateConsolidationData> portTemplateConsolidationDataList =
2514 getPortTemplateConsolidationDataList(compositionData);
2515 //Get the input type for this input whether it is of type
2516 // port_<port_node_template_id>_<property_name> or port_<port_type>_<property_name>
2517 PortInputType portInputType = getPortInputType(substitutionTemplateInputName,
2519 for (PortTemplateConsolidationData portTemplateConsolidationData :
2520 portTemplateConsolidationDataList) {
2521 //Get the port property value
2522 String portNodeTemplateId = portTemplateConsolidationData.getNodeTemplateId();
2523 propertyValue = getPortPropertyValue(substitutionTemplateInputName,
2524 computeType, portInputType, serviceTemplate,
2525 portNodeTemplateId);
2526 //If the value object is Optional.empty it implies that the property name was not
2527 // found in the input name
2528 if (!(propertyValue instanceof Optional)) {
2529 if (!abstractPropertyValue.contains(propertyValue)) {
2530 abstractPropertyValue.add(propertyValue);
2539 //Add the property only if it has at least one non-null value
2540 for (Object val : abstractPropertyValue) {
2541 if (Objects.nonNull(val)) {
2542 updateAbstractPropertyValue(substitutionTemplateInputName, inputParameterDefinition,
2543 abstractPropertyValue, abstractSubstituteProperties);
2548 return Optional.ofNullable(abstractSubstituteProperties);
2551 private void updateAbstractPropertyValue(String substitutionTemplateInputName,
2552 ParameterDefinition parameterDefinition,
2553 List<Object> abstractPropertyValue,
2554 Map<String, Object> abstractSubstituteProperties) {
2555 if (abstractPropertyValue.size() > 1) {
2556 abstractSubstituteProperties.put(substitutionTemplateInputName, abstractPropertyValue);
2558 Object propertyValue = abstractPropertyValue.get(0);
2559 String entrySchemaType = parameterDefinition.getEntry_schema().getType();
2560 if (entrySchemaType.equalsIgnoreCase(PropertyType.STRING.getDisplayName())
2561 || entrySchemaType.equalsIgnoreCase(PropertyType.INTEGER.getDisplayName())
2562 || entrySchemaType.equalsIgnoreCase(PropertyType.FLOAT.getDisplayName())
2563 || entrySchemaType.equalsIgnoreCase(PropertyType.BOOLEAN.getDisplayName())
2564 || entrySchemaType.equals(PropertyTypeExt.JSON.getDisplayName())) {
2565 abstractSubstituteProperties.put(substitutionTemplateInputName, abstractPropertyValue);
2567 abstractSubstituteProperties.put(substitutionTemplateInputName, propertyValue);
2572 private void updateIdenticalPropertyValue(String identicalValuePropertyName,
2573 String substitutionTemplateInputName,
2575 UnifiedCompositionEntity entity,
2576 UnifiedCompositionData unifiedCompositionData,
2577 ServiceTemplate serviceTemplate,
2578 Map<String, Object> abstractSubstituteProperties,
2579 TranslationContext context) {
2580 Optional<Object> identicalPropertyValueByType =
2581 getIdenticalPropertyValueByType(identicalValuePropertyName, substitutionTemplateInputName,
2582 entity, unifiedCompositionData, serviceTemplate, context);
2584 if (identicalPropertyValueByType.isPresent()) {
2585 abstractSubstituteProperties
2586 .put(substitutionTemplateInputName, identicalPropertyValueByType.get());
2593 private Optional<Object> getIdenticalPropertyValueByType(String identicalValuePropertyName,
2594 String substitutionTemplateInputName,
2595 UnifiedCompositionEntity entity,
2596 UnifiedCompositionData unifiedCompositionData,
2597 ServiceTemplate serviceTemplate,
2598 TranslationContext context) {
2600 ComputeTemplateConsolidationData computeTemplateConsolidationData =
2601 unifiedCompositionData.getComputeTemplateConsolidationData();
2603 Optional<Object> computeIdenticalPropertyValue;
2606 computeIdenticalPropertyValue =
2607 getIdenticalPropertyValue(identicalValuePropertyName, serviceTemplate,
2608 entity, computeTemplateConsolidationData, context);
2609 return computeIdenticalPropertyValue.isPresent() ? Optional.of(
2610 computeIdenticalPropertyValue.get()) : Optional.empty();
2613 computeIdenticalPropertyValue =
2614 getIdenticalPropertyValue(identicalValuePropertyName, serviceTemplate,
2615 entity, computeTemplateConsolidationData, context);
2616 return computeIdenticalPropertyValue.isPresent() ? Optional.of(
2617 computeIdenticalPropertyValue.get()) : Optional.empty();
2620 List<PortTemplateConsolidationData> portTemplateConsolidationDataList =
2621 unifiedCompositionData.getPortTemplateConsolidationDataList();
2622 for (PortTemplateConsolidationData portTemplateConsolidationData : portTemplateConsolidationDataList) {
2624 ConsolidationDataUtil.getPortType(portTemplateConsolidationData.getNodeTemplateId());
2625 if (substitutionTemplateInputName.contains(portType)) {
2626 return getIdenticalPropertyValue(identicalValuePropertyName, serviceTemplate,
2627 entity, portTemplateConsolidationData, context);
2632 return Optional.empty();
2637 private PortInputType getPortInputType(String inputName,
2638 UnifiedCompositionData unifiedCompositionData) {
2639 String portInputPrefix = UnifiedCompositionEntity.Port.name().toLowerCase() + "_";
2640 ComputeTemplateConsolidationData computeTemplateConsolidationData = unifiedCompositionData
2641 .getComputeTemplateConsolidationData();
2642 List<PortTemplateConsolidationData> portTemplateConsolidationDataList =
2643 getPortTemplateConsolidationDataList(unifiedCompositionData);
2644 //Scan the available port node template ids to check if the input is of the form
2645 // "port_<port_node_template_id>_<property_name>"
2646 for (PortTemplateConsolidationData portTemplateConsolidationData :
2647 portTemplateConsolidationDataList) {
2648 String portNodeTemplateId = portTemplateConsolidationData.getNodeTemplateId();
2649 String portNodeTemplateIdPrefix = portInputPrefix + portNodeTemplateId;
2650 if (inputName.startsWith(portNodeTemplateIdPrefix)) {
2651 return PortInputType.NodeTemplateId;
2654 //Check whether the input is of the form "port_<port_type>_<property_name>"
2655 Set<String> portTypes = computeTemplateConsolidationData.getPorts().keySet();
2656 for (String portType : portTypes) {
2657 String expectedPortTypeSusbtring = portInputPrefix + portType + "_";
2658 if (inputName.startsWith(expectedPortTypeSusbtring)) {
2659 return PortInputType.PortType;
2662 return PortInputType.Other;
2665 private void cleanServiceTemplate(ServiceTemplate serviceTemplate,
2666 EntityConsolidationData entity,
2667 TranslationContext context) {
2668 removeNodeTemplateFromServiceTemplate(serviceTemplate, entity, context);
2669 updateHeatStackGroup(serviceTemplate, entity, context);
2670 updateSubstitutionMapping(serviceTemplate, context);
2673 private void removeNodeTemplateFromServiceTemplate(ServiceTemplate serviceTemplate,
2674 EntityConsolidationData entity,
2675 TranslationContext context) {
2676 String nodeTemplateIdToRemove = entity.getNodeTemplateId();
2677 Map<String, NodeTemplate> nodeTemplates =
2678 serviceTemplate.getTopology_template().getNode_templates();
2679 NodeTemplate nodeTemplateToRemove =
2680 nodeTemplates.get(nodeTemplateIdToRemove);
2681 nodeTemplates.remove(nodeTemplateIdToRemove);
2683 context.addCleanedNodeTemplate(ToscaUtil.getServiceTemplateFileName(serviceTemplate),
2684 nodeTemplateIdToRemove,
2685 entity.getClass() == ComputeTemplateConsolidationData.class
2686 ? UnifiedCompositionEntity.Compute
2687 : UnifiedCompositionEntity.Port,
2688 nodeTemplateToRemove);
2692 private void removeCleanedNodeType(String cleanedNodeTemplateId,
2693 ServiceTemplate serviceTemplate,
2694 TranslationContext context) {
2695 NodeTemplate cleanedNodeTemplate =
2697 .getCleanedNodeTemplate(ToscaUtil.getServiceTemplateFileName(serviceTemplate),
2698 cleanedNodeTemplateId);
2699 String typeToRemove = cleanedNodeTemplate.getType();
2701 if (Objects.nonNull(typeToRemove)
2702 && serviceTemplate.getNode_types().containsKey(typeToRemove)) {
2703 serviceTemplate.getNode_types().remove(typeToRemove);
2707 private void updateHeatStackGroup(ServiceTemplate serviceTemplate,
2708 EntityConsolidationData entity,
2709 TranslationContext context) {
2710 Map<String, GroupDefinition> groups = serviceTemplate.getTopology_template()
2711 .getGroups() == null ? new HashMap<>()
2712 : serviceTemplate.getTopology_template().getGroups();
2713 String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate);
2714 String nodeRelatedAbstractNodeId =
2715 context.getUnifiedAbstractNodeTemplateId(serviceTemplate, entity.getNodeTemplateId());
2717 for (Map.Entry<String, GroupDefinition> groupEntry : groups.entrySet()) {
2718 GroupDefinition groupDefinition = groupEntry.getValue();
2719 if (isHeatStackGroup(groupDefinition.getType())) {
2720 updateGroupMembersWithNewUnifiedNodeTemplateId(entity, nodeRelatedAbstractNodeId,
2726 private void updateGroupMembersWithNewUnifiedNodeTemplateId(
2727 EntityConsolidationData entity,
2728 String newNodetemplateId,
2729 Map.Entry<String, GroupDefinition> groupEntry) {
2730 List<String> members = groupEntry.getValue().getMembers();
2731 if (members.contains(entity.getNodeTemplateId())) {
2732 members.remove(entity.getNodeTemplateId());
2733 if (!members.contains(newNodetemplateId)) {
2734 members.add(newNodetemplateId);
2737 groupEntry.getValue().setMembers(members);
2740 private void updateSubstitutableNodeTemplateRequirements(ServiceTemplate serviceTemplate,
2741 ServiceTemplate substitutionServiceTemplate){
2742 if(Objects.isNull(substitutionServiceTemplate.getTopology_template())){
2746 SubstitutionMapping substitution_mappings =
2747 substitutionServiceTemplate.getTopology_template().getSubstitution_mappings();
2749 if(Objects.isNull(substitution_mappings)){
2753 String node_type = substitution_mappings.getNode_type();
2754 Map<String, List<String>> requirements = substitution_mappings.getRequirements();
2759 private void updateSubstitutionMapping(ServiceTemplate serviceTemplate,
2760 TranslationContext context) {
2761 SubstitutionMapping substitutionMappings =
2762 DataModelUtil.getSubstitutionMappings(serviceTemplate);
2763 if (Objects.nonNull(substitutionMappings)) {
2765 if (Objects.nonNull(substitutionMappings.getRequirements())) {
2766 updateSubstitutionMappingRequirements(substitutionMappings.getRequirements(),
2767 serviceTemplate, context);
2770 if (Objects.nonNull(substitutionMappings.getCapabilities())) {
2771 updateSubstitutionMappingCapabilities(substitutionMappings.getCapabilities(),
2772 serviceTemplate, context);
2777 private void updateSubstitutionMappingRequirements(Map<String, List<String>>
2778 substitutionMappingRequirements,
2779 ServiceTemplate serviceTemplate,
2780 TranslationContext context) {
2781 for (Map.Entry<String, List<String>> entry : substitutionMappingRequirements.entrySet()) {
2782 List<String> requirement = entry.getValue();
2783 String oldNodeTemplateId = requirement.get(0);
2784 String newAbstractNodeTemplateId = context.getUnifiedAbstractNodeTemplateId(serviceTemplate,
2785 requirement.get(0));
2786 String newSubstitutionNodeTemplateId = context.getUnifiedSubstitutionNodeTemplateId(
2787 serviceTemplate, oldNodeTemplateId);
2788 if (Objects.nonNull(newAbstractNodeTemplateId)
2789 && Objects.nonNull(newSubstitutionNodeTemplateId)) {
2790 requirement.set(0, newAbstractNodeTemplateId);
2791 String newRequirementValue = requirement.get(1) + "_" + newSubstitutionNodeTemplateId;
2792 requirement.set(1, newRequirementValue);
2797 private void updateSubstitutionMappingCapabilities(Map<String, List<String>>
2798 substitutionMappingCapabilities,
2799 ServiceTemplate serviceTemplate,
2800 TranslationContext context) {
2801 for (Map.Entry<String, List<String>> entry : substitutionMappingCapabilities.entrySet()) {
2802 List<String> capability = entry.getValue();
2803 String oldNodeTemplateId = capability.get(0);
2804 String newAbstractNodeTemplateId = context.getUnifiedAbstractNodeTemplateId(serviceTemplate,
2806 String newSubstitutionNodeTemplateId = context.getUnifiedSubstitutionNodeTemplateId(
2807 serviceTemplate, oldNodeTemplateId);
2808 if (Objects.nonNull(newAbstractNodeTemplateId)
2809 && Objects.nonNull(newSubstitutionNodeTemplateId)) {
2810 capability.set(0, newAbstractNodeTemplateId);
2811 String newRequirementValue = capability.get(1) + "_" + newSubstitutionNodeTemplateId;
2812 capability.set(1, newRequirementValue);
2817 private void updateHeatStackGroupNestedComposition(ServiceTemplate serviceTemplate,
2818 EntityConsolidationData entity,
2819 TranslationContext context) {
2820 Map<String, GroupDefinition> groups = serviceTemplate.getTopology_template()
2821 .getGroups() == null ? new HashMap<>() : serviceTemplate.getTopology_template().getGroups();
2822 String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate);
2823 Optional<String> nestedNodeTemplateId =
2824 context.getUnifiedNestedNodeTemplateId(serviceTemplateFileName, entity.getNodeTemplateId());
2825 if (nestedNodeTemplateId.isPresent()) {
2826 for (Map.Entry<String, GroupDefinition> groupEntry : groups.entrySet()) {
2827 GroupDefinition groupDefinition = groupEntry.getValue();
2828 if (isHeatStackGroup(groupDefinition.getType())) {
2829 updateGroupMembersWithNewUnifiedNodeTemplateId(entity, nestedNodeTemplateId.get(),
2836 private void handleNestedNodeTemplateInMainServiceTemplate(String nestedNodeTemplateId,
2837 ServiceTemplate mainServiceTemplate,
2838 ServiceTemplate nestedServiceTemplate,
2839 TranslationContext context) {
2840 NodeTemplate nestedNodeTemplate = DataModelUtil.getNodeTemplate(mainServiceTemplate,
2841 nestedNodeTemplateId);
2842 if (Objects.isNull(nestedNodeTemplate)) {
2846 updateNestedNodeTemplateProperties(nestedServiceTemplate, nestedNodeTemplate, context);
2848 Optional<String> unifiedNestedNodeTypeId = context
2849 .getUnifiedNestedNodeTypeId(
2850 ToscaUtil.getServiceTemplateFileName(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME),
2851 nestedNodeTemplate.getType());
2852 unifiedNestedNodeTypeId
2853 .ifPresent(unifiedNestedNodeTypeIdVal -> updateNestedNodeTemplate(
2854 unifiedNestedNodeTypeIdVal, nestedNodeTemplateId, nestedNodeTemplate,
2855 mainServiceTemplate, context));
2857 updateNodeTemplateRequirements(nestedNodeTemplateId, mainServiceTemplate,
2858 nestedServiceTemplate, context);
2860 //updateNodeDependencyRequirement(mainServiceTemplate, context, nestedNodeTemplate);
2863 public void updateNodeTemplateRequirements(String nestedNodeTemplateId,
2864 ServiceTemplate mainServiceTemplate,
2865 ServiceTemplate nestedServiceTemplate,
2866 TranslationContext context){
2867 String computeNodeType = nestedServiceTemplate.getNode_types().keySet().iterator().next();
2868 NodeTemplate nestedNtFromMain =
2869 mainServiceTemplate.getTopology_template().getNode_templates().get(nestedNodeTemplateId);
2870 ServiceTemplate globalSubstitutionServiceTemplate =
2871 context.getGlobalSubstitutionServiceTemplate();
2873 if(Objects.isNull(computeNodeType)){
2877 NodeType nestedNodeType =
2878 globalSubstitutionServiceTemplate.getNode_types().get(computeNodeType);
2880 if(Objects.isNull(nestedNodeType)){
2884 List<Map<String, RequirementDefinition>> requirements = nestedNodeType.getRequirements();
2886 if(CollectionUtils.isEmpty(nestedNtFromMain.getRequirements())){
2887 nestedNtFromMain.setRequirements(new ArrayList<>());
2890 if(CollectionUtils.isEmpty(requirements)) {
2894 updateNodeTemplateRequirements(nestedNtFromMain, requirements);
2897 private void updateNodeTemplateRequirements(NodeTemplate nestedNtFromMain,
2898 List<Map<String, RequirementDefinition>> requirements) {
2899 for(Map<String, RequirementDefinition> requirementDefinitionMap : requirements){
2900 Map<String, RequirementAssignment> currReqAssignmentMap = new HashMap<>();
2901 for(Map.Entry<String, RequirementDefinition> requirementDefinitionEntry :
2902 requirementDefinitionMap.entrySet()){
2903 RequirementAssignment requirementAssignment =
2904 getRequirementAssignmentFromDefinition(requirementDefinitionEntry);
2905 currReqAssignmentMap.put(requirementDefinitionEntry.getKey(), requirementAssignment);
2908 if(!nestedNtFromMain.getRequirements().contains(currReqAssignmentMap)) {
2909 nestedNtFromMain.getRequirements().add(new HashMap(currReqAssignmentMap));
2913 List<Map<String, RequirementAssignment>> reqsToRemove = new ArrayList<>();
2914 for(Map<String, RequirementAssignment> requirementDefinitionMap : nestedNtFromMain.getRequirements()) {
2915 if (requirementDefinitionMap.containsKey("dependency")) {
2916 reqsToRemove.add(requirementDefinitionMap);
2920 nestedNtFromMain.getRequirements().removeAll(reqsToRemove);
2923 private RequirementAssignment getRequirementAssignmentFromDefinition(
2924 Map.Entry<String, RequirementDefinition> requirementDefinitionEntry) {
2926 RequirementAssignment requirementAssignment = new RequirementAssignment();
2927 if(requirementDefinitionEntry.getValue() instanceof RequirementDefinition) {
2928 requirementAssignment.setCapability(requirementDefinitionEntry.getValue().getCapability());
2929 requirementAssignment.setNode(requirementDefinitionEntry.getValue().getNode());
2930 requirementAssignment.setRelationship(requirementDefinitionEntry.getValue().getRelationship());
2932 else if(requirementDefinitionEntry.getValue() instanceof Map){
2933 Map<String, Object> reqAsMap = (Map<String, Object>) requirementDefinitionEntry.getValue();
2934 requirementAssignment.setCapability((String) reqAsMap.get("capability"));
2935 requirementAssignment.setNode((String) reqAsMap.get("node"));
2936 requirementAssignment.setRelationship((String) reqAsMap.get("relationship"));
2938 return requirementAssignment;
2941 private void updateNodeDependencyRequirement(ServiceTemplate mainServiceTemplate,
2942 TranslationContext context,
2943 NodeTemplate nestedNodeTemplate) {
2944 List<Map<String, RequirementAssignment>> requirements = nestedNodeTemplate.getRequirements();
2945 for(int i = 0; i < requirements.size(); i++){
2946 Map<String, RequirementAssignment> requirementAssignmentMap = requirements.get(i);
2947 Map<String, RequirementAssignment> updatedMap = new HashMap<>();
2948 for(Map.Entry<String, RequirementAssignment> requirementAssignmentEntry :
2949 requirementAssignmentMap.entrySet()){
2950 if(requirementAssignmentEntry.getKey().equals("dependency")){
2951 Optional<String> newReqAssignmentDependencyId =
2952 context.getNewReqAssignmentDependencyId(ToscaUtil.getServiceTemplateFileName
2953 (mainServiceTemplate), requirementAssignmentEntry.getValue());
2955 if(newReqAssignmentDependencyId.isPresent()){
2956 updatedMap.put(newReqAssignmentDependencyId.get(), requirementAssignmentEntry
2960 updatedMap.put(requirementAssignmentEntry.getKey(), requirementAssignmentEntry
2965 requirements.add(i, updatedMap);
2969 private void updateNestedNodeTemplateProperties(ServiceTemplate nestedServiceTemplate,
2970 NodeTemplate nestedNodeTemplate,
2971 TranslationContext context) {
2973 Map<String, Object> newPropertyInputParamIds =
2974 context.getAllNewPropertyInputParamIdsPerNodeTenplateId(ToscaUtil
2975 .getServiceTemplateFileName(nestedServiceTemplate));
2977 for (Map.Entry<String, Object> entry : newPropertyInputParamIds.entrySet()) {
2978 if (Objects.nonNull(entry.getValue())) {
2979 Object value = getClonedObject(entry.getValue());
2980 nestedNodeTemplate.getProperties().put(entry.getKey(), value);
2984 String subNodeType =
2985 nestedServiceTemplate.getTopology_template().getSubstitution_mappings().getNode_type();
2986 nestedNodeTemplate.setType(subNodeType);
2990 private void handleSubstitutionMappingInNestedServiceTemplate(
2991 String newNestedNodeType,
2992 ServiceTemplate nestedServiceTemplate,
2993 TranslationContext context) {
2994 if (Objects.isNull(newNestedNodeType)) {
2998 Set<String> relatedNestedNodeTypeIds =
2999 context.getAllRelatedNestedNodeTypeIds();
3001 SubstitutionMapping substitutionMappings =
3002 nestedServiceTemplate.getTopology_template().getSubstitution_mappings();
3003 if(!relatedNestedNodeTypeIds.contains(substitutionMappings.getNode_type())) {
3004 substitutionMappings.setNode_type(newNestedNodeType);
3008 private void updateNestedNodeTemplate(String newNestedNodeTypeId,
3009 String nestedNodeTemplateId,
3010 NodeTemplate nestedNodeTemplate,
3011 ServiceTemplate mainServiceTemplate,
3012 TranslationContext context) {
3013 String mainSTName = ToscaUtil.getServiceTemplateFileName(mainServiceTemplate);
3014 String globalSTName =
3015 ToscaUtil.getServiceTemplateFileName(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME);
3017 context.getHandledNestedComputeNodeTemplateIndex(globalSTName, newNestedNodeTypeId);
3018 String newNodeTemplateId =
3019 Constants.ABSTRACT_NODE_TEMPLATE_ID_PREFIX + getComputeTypeSuffix(newNestedNodeTypeId)
3022 nestedNodeTemplate.setType(newNestedNodeTypeId);
3023 mainServiceTemplate.getTopology_template().getNode_templates().remove(nestedNodeTemplateId);
3024 mainServiceTemplate.getTopology_template().getNode_templates()
3025 .put(newNodeTemplateId, nestedNodeTemplate);
3027 context.addUnifiedNestedNodeTemplateId(mainSTName, nestedNodeTemplateId, newNodeTemplateId);
3030 private void handleNestedNodeTypesInGlobalSubstituteServiceTemplate(
3031 String origNestedNodeTypeId,
3032 String newNestedNodeTypeId,
3033 ServiceTemplate globalSubstitutionServiceTemplate,
3034 TranslationContext context) {
3035 Set<String> relatedNestedNodeTypeIds =
3036 context.getAllRelatedNestedNodeTypeIds();
3038 Map<String, NodeType> nodeTypes = globalSubstitutionServiceTemplate.getNode_types();
3039 if (!relatedNestedNodeTypeIds.contains(origNestedNodeTypeId)) {
3040 NodeType nested = DataModelUtil.getNodeType(globalSubstitutionServiceTemplate,
3041 origNestedNodeTypeId);
3042 setNewValuesForNestedNodeType(origNestedNodeTypeId, newNestedNodeTypeId, nested, nodeTypes);
3045 (NodeType) DataModelUtil.getClonedObject(
3046 DataModelUtil.getNodeType(globalSubstitutionServiceTemplate, origNestedNodeTypeId));
3047 nested.setDerived_from(ToscaNodeType.VFC_ABSTRACT_SUBSTITUTE);
3048 nodeTypes.put(newNestedNodeTypeId, nested);
3050 context.addUnifiedNestedNodeTypeId(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME,
3051 origNestedNodeTypeId, newNestedNodeTypeId);
3054 private void setNewValuesForNestedNodeType(String origNestedNodeType,
3055 String newNestedNodeTypeId,
3057 Map<String, NodeType> nodeTypes) {
3058 if (Objects.nonNull(nested)) {
3059 nested.setDerived_from(ToscaNodeType.VFC_ABSTRACT_SUBSTITUTE);
3060 nodeTypes.remove(origNestedNodeType);
3061 nodeTypes.put(newNestedNodeTypeId, nested);
3065 private Optional<String> getNewNestedNodeTypeId(ServiceTemplate mainServiceTemplate,
3066 ServiceTemplate nestedServiceTemplate,
3067 TranslationContext context) {
3068 FileComputeConsolidationData fileComputeConsolidationData =
3069 context.getConsolidationData().getComputeConsolidationData()
3070 .getFileComputeConsolidationData(
3071 ToscaUtil.getServiceTemplateFileName(nestedServiceTemplate));
3073 if (Objects.nonNull(fileComputeConsolidationData)) {
3074 String nestedNodeTypePrefix = ToscaNodeType.ABSTRACT_NODE_TYPE_PREFIX + "heat.";
3076 .of(nestedNodeTypePrefix + getComputeTypeInNestedFile(fileComputeConsolidationData));
3078 return Optional.empty();
3081 private String getComputeTypeInNestedFile(
3082 FileComputeConsolidationData fileComputeConsolidationData) {
3083 List<TypeComputeConsolidationData> typeComputeConsolidationDatas =
3084 new ArrayList<>(fileComputeConsolidationData.getAllTypeComputeConsolidationData());
3085 if (typeComputeConsolidationDatas.size() == 0) {
3088 String computeNodeType = fileComputeConsolidationData.getAllComputeTypes().iterator().next();
3089 return getComputeTypeSuffix(computeNodeType);
3093 private void handleGetAttrInAbstractNodeTemplate(ServiceTemplate serviceTemplate,
3094 TranslationContext context,
3095 String serviceTemplateFileName,
3096 NodeTemplate abstractNodeTemplate) {
3097 Map<String, Object> properties =
3098 abstractNodeTemplate == null || abstractNodeTemplate.getProperties() == null
3100 : abstractNodeTemplate.getProperties();
3101 for (Object propertyValue : properties.values()) {
3102 List<List<Object>> getAttrList = extractGetAttrFunction(propertyValue);
3103 for (List<Object> getAttrFuncValue : getAttrList) {
3104 String origNodeTemplateId = (String) getAttrFuncValue.get(0);
3105 Optional<String> nestedNodeTemplateId = context.getUnifiedNestedNodeTemplateId(ToscaUtil
3106 .getServiceTemplateFileName(serviceTemplate), origNodeTemplateId);
3107 if (nestedNodeTemplateId.isPresent()) {
3108 getAttrFuncValue.set(0, nestedNodeTemplateId.get());
3110 replaceGetAttrNodeIdAndAttrName(serviceTemplate, context, serviceTemplateFileName,
3117 private void replaceGetAttrNodeIdAndAttrName(ServiceTemplate serviceTemplate,
3118 TranslationContext context,
3119 String serviceTemplateFileName,
3120 List<Object> getAttrFuncValue) {
3121 String origNodeTemplateId = (String) getAttrFuncValue.get(0);
3122 String attributeName = (String) getAttrFuncValue.get(1);
3124 String unifiedAbstractNodeTemplateId =
3125 context.getUnifiedAbstractNodeTemplateId(serviceTemplate, origNodeTemplateId);
3127 if (Objects.isNull(unifiedAbstractNodeTemplateId)) {
3131 String newNodeTemplateId =
3132 getNewNodeTemplateId(origNodeTemplateId, serviceTemplateFileName, serviceTemplate, context);
3134 String newSubstitutionOutputParameterId =
3135 getNewSubstitutionOutputParameterId(newNodeTemplateId, attributeName);
3137 getAttrFuncValue.set(0, unifiedAbstractNodeTemplateId);
3138 getAttrFuncValue.set(1, newSubstitutionOutputParameterId);
3141 private NodeTemplate getComputeNodeTemplate(String origNodeTemplateId,
3142 ServiceTemplate serviceTemplate,
3143 TranslationContext context) {
3144 NodeTemplate computeNodeTemplate =
3145 DataModelUtil.getNodeTemplate(serviceTemplate, origNodeTemplateId);
3146 if (computeNodeTemplate == null) {
3147 computeNodeTemplate =
3148 context.getCleanedNodeTemplate(ToscaUtil.getServiceTemplateFileName(serviceTemplate),
3149 origNodeTemplateId);
3151 return computeNodeTemplate;
3154 private String handleIdOfPort(String origNodeTemplateId, String serviceTemplateFileName,
3155 ConsolidationData consolidationData) {
3156 Optional<Pair<String, ComputeTemplateConsolidationData>>
3157 computeTypeAndComputeTemplateByPortId =
3158 getComputeTypeAndComputeTemplateByPortId(origNodeTemplateId, serviceTemplateFileName,
3160 if (computeTypeAndComputeTemplateByPortId.isPresent()) {
3161 Pair<String, ComputeTemplateConsolidationData> computeIdToComputeData =
3162 computeTypeAndComputeTemplateByPortId.get();
3163 return getNewPortNodeTemplateId(origNodeTemplateId, computeIdToComputeData.getKey(),
3164 computeIdToComputeData.getValue());
3170 private Optional<Pair<String, ComputeTemplateConsolidationData>>
3171 getComputeTypeAndComputeTemplateByPortId(String portId, String serviceTemplateFileName,
3172 ConsolidationData consolidationData) {
3173 FileComputeConsolidationData fileComputeConsolidationData =
3174 consolidationData.getComputeConsolidationData()
3175 .getFileComputeConsolidationData(serviceTemplateFileName);
3176 Set<String> computeTypes =
3177 fileComputeConsolidationData.getAllComputeTypes();
3179 for (String computeType : computeTypes) {
3180 Collection<ComputeTemplateConsolidationData> computeTemplateConsolidationDatas =
3181 fileComputeConsolidationData.getTypeComputeConsolidationData(computeType)
3182 .getAllComputeTemplateConsolidationData();
3184 for (ComputeTemplateConsolidationData compute : computeTemplateConsolidationDatas) {
3185 if (ConsolidationDataUtil.isComputeReferenceToPortId(compute, portId)) {
3186 return Optional.of(new ImmutablePair<>(computeType, compute));
3191 return Optional.empty();
3194 private boolean isIdIsOfExpectedType(String id,
3195 UnifiedCompositionEntity expectedUnifiedCompositionEntity,
3196 String serviceTemplateFileName,
3197 TranslationContext context) {
3198 UnifiedSubstitutionData unifiedSubstitutionData =
3199 context.getUnifiedSubstitutionData().get(serviceTemplateFileName);
3200 if (Objects.isNull(unifiedSubstitutionData)) {
3204 UnifiedCompositionEntity actualUnifiedCompositionEntity =
3205 unifiedSubstitutionData.getCleanedNodeTemplateCompositionEntity(id);
3207 return actualUnifiedCompositionEntity == null ? false
3208 : actualUnifiedCompositionEntity.equals(expectedUnifiedCompositionEntity);
3211 private boolean isHeatStackGroup(String groupType) {
3212 return groupType.equals(ToscaGroupType.HEAT_STACK);
3215 private Object getPortPropertyValue(String inputName,
3217 PortInputType portInputType,
3218 ServiceTemplate serviceTemplate,
3219 String portNodeTemplateId) {
3220 //Get the input prefix to extract the property name from the input name
3221 String portInputPrefix = getPortInputPrefix(
3222 portNodeTemplateId, portInputType);
3223 //Get the property name from the input
3224 Optional<String> propertyName = getPropertyNameFromInput(inputName,
3225 UnifiedCompositionEntity.Port, computeType, portInputPrefix);
3226 //Get the property value from the node template
3227 if (propertyName.isPresent()) {
3228 NodeTemplate portNodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate,
3229 portNodeTemplateId);
3230 if (Objects.nonNull(portNodeTemplate)) {
3231 return getPropertyValueFromNodeTemplate(propertyName.get(), portNodeTemplate);
3234 return Optional.empty();
3237 private Optional<String> getPortTypeFromInput(
3239 String portNodeTemplateId,
3240 ComputeTemplateConsolidationData computeTemplateConsolidationData) {
3241 String portTypeFromInput = null;
3242 String portInputPrefix = UnifiedCompositionEntity.Port.name().toLowerCase() + "_";
3243 String portNodeTemplateIdPrefix = portInputPrefix + portNodeTemplateId;
3244 if (inputName.startsWith(portNodeTemplateIdPrefix)) {
3245 return Optional.empty();
3247 Set<String> portTypes = computeTemplateConsolidationData.getPorts().keySet();
3248 for (String portType : portTypes) {
3249 String expectedPortTypeSusbtring = "_" + portType + "_";
3250 if (inputName.contains(expectedPortTypeSusbtring)) {
3251 portTypeFromInput = portType;
3255 return Optional.ofNullable(portTypeFromInput);
3258 private Object getComputePropertyValue(
3260 ServiceTemplate serviceTemplate,
3261 ComputeTemplateConsolidationData computeTemplateConsolidationData) {
3262 NodeTemplate nodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate,
3263 computeTemplateConsolidationData.getNodeTemplateId());
3264 String nodeType = getComputeTypeSuffix(nodeTemplate.getType());
3265 Optional<String> propertyName =
3266 getPropertyNameFromInput(inputName, UnifiedCompositionEntity.Compute, nodeType, null);
3267 if (propertyName.isPresent()) {
3268 return getPropertyValueFromNodeTemplate(propertyName.get(), nodeTemplate);
3270 return Optional.empty();
3273 private Optional<Object> getIdenticalPropertyValue(String identicalValuePropertyName,
3274 ServiceTemplate serviceTemplate,
3275 UnifiedCompositionEntity unifiedCompositionEntity,
3276 EntityConsolidationData entity,
3277 TranslationContext context) {
3278 NodeTemplate nodeTemplate =
3279 getNodeTemplate(entity.getNodeTemplateId(), serviceTemplate, context);
3281 Object propertyValueFromNodeTemplate =
3282 getPropertyValueFromNodeTemplate(identicalValuePropertyName, nodeTemplate);
3284 return Objects.isNull(propertyValueFromNodeTemplate) ? Optional.empty()
3285 : Optional.of(propertyValueFromNodeTemplate);
3288 private UnifiedCompositionEntity getInputCompositionEntity(String inputName) {
3289 UnifiedCompositionEntity inputCompositionEntity = UnifiedCompositionEntity.Other;
3290 String inputType = inputName.substring(0, inputName.indexOf('_'));
3291 if (inputType.equals(UnifiedCompositionEntity.Compute.name().toLowerCase())) {
3292 inputCompositionEntity = UnifiedCompositionEntity.Compute;
3293 } else if (inputType.equals(UnifiedCompositionEntity.Port.name().toLowerCase())) {
3294 inputCompositionEntity = UnifiedCompositionEntity.Port;
3296 return inputCompositionEntity;
3299 private Optional<String> getPropertyNameFromInput(
3301 UnifiedCompositionEntity compositionEntity,
3302 String computeType, String portInputPrefix) {
3303 String propertyName = null;
3304 switch (compositionEntity) {
3306 propertyName = inputName.substring(inputName.lastIndexOf(computeType)
3307 + computeType.length() + 1);
3310 if (inputName.startsWith(portInputPrefix)) {
3311 propertyName = inputName.split(portInputPrefix)[1];
3317 return Optional.ofNullable(propertyName);
3320 private String getPortInputPrefix(
3321 String portNodeTemplateId,
3322 PortInputType portInputType) {
3323 String portInputPrefix = UnifiedCompositionEntity.Port.name().toLowerCase() + "_";
3324 String portType = ConsolidationDataUtil.getPortType(portNodeTemplateId);
3325 if (portInputType == PortInputType.NodeTemplateId) {
3326 portInputPrefix += portNodeTemplateId + "_";
3327 } else if (portInputType == PortInputType.PortType) {
3328 portInputPrefix += portType + "_";
3330 return portInputPrefix;
3333 private boolean isIdenticalValueProperty(String inputName,
3334 UnifiedCompositionEntity unifiedCompositionEntity,
3335 TranslationContext context) {
3337 List<String> identicalValuePropertyList =
3338 consolidationService.getPropertiesWithIdenticalVal(unifiedCompositionEntity, context);
3340 StringBuilder builder = getPropertyValueStringBuilder(unifiedCompositionEntity);
3342 boolean isMatchingProperty = Pattern.matches(builder.toString(), inputName);
3343 return (isMatchingProperty
3344 && isPropertyFromIdenticalValuesList(inputName, unifiedCompositionEntity,
3345 identicalValuePropertyList));
3348 private boolean isPropertyFromIdenticalValuesList(String inputName,
3349 UnifiedCompositionEntity unifiedCompositionEntity,
3350 List<String> identicalValuePropertyList) {
3351 switch (unifiedCompositionEntity) {
3353 return identicalValuePropertyList.contains(getIdenticalValuePropertyName(inputName,
3354 unifiedCompositionEntity, null).get());
3357 return identicalValuePropertyList.contains(getIdenticalValuePropertyName(inputName,
3358 unifiedCompositionEntity, null).get());
3361 return getPortPropertyNameFromInput(inputName, identicalValuePropertyList).isPresent();
3368 private Optional<String> getPortPropertyNameFromInput(String inputName,
3369 List<String> identicalValuePropertyList) {
3370 for (String identicalProperty : identicalValuePropertyList) {
3371 if (inputName.contains(identicalProperty)) {
3372 return Optional.of(identicalProperty);
3375 return Optional.empty();
3378 private StringBuilder getPropertyValueStringBuilder(
3379 UnifiedCompositionEntity unifiedCompositionEntity) {
3381 switch (unifiedCompositionEntity) {
3383 return getComputePropertyValueStringBuilder();
3386 return getComputePropertyValueStringBuilder();
3389 return getPortPropertyValueStringBuilder();
3396 private StringBuilder getPortPropertyValueStringBuilder() {
3397 StringBuilder builder;
3398 builder = new StringBuilder(PORT_IDENTICAL_VALUE_PROPERTY_PREFIX);
3399 builder.append(".+");
3403 private StringBuilder getComputePropertyValueStringBuilder() {
3404 StringBuilder builder;
3405 builder = new StringBuilder(COMPUTE_IDENTICAL_VALUE_PROPERTY_PREFIX);
3406 builder.append("[a-z]+");
3407 builder.append(COMPUTE_IDENTICAL_VALUE_PROPERTY_SUFFIX);
3411 private Optional<String> getIdenticalValuePropertyName(String input,
3412 UnifiedCompositionEntity unifiedCompositionEntity,
3413 TranslationContext context) {
3414 switch (unifiedCompositionEntity) {
3416 return Optional.of(input.split("_")[1]);
3419 return Optional.of(input.split("_")[1]);
3422 return getPortPropertyNameFromInput(input, consolidationService
3423 .getPropertiesWithIdenticalVal(unifiedCompositionEntity, context));
3426 return Optional.empty();
3430 private Object getPropertyValueFromNodeTemplate(String propertyName, NodeTemplate nodeTemplate) {
3431 Map<String, Object> nodeTemplateProperties = nodeTemplate.getProperties();
3432 if (nodeTemplateProperties != null) {
3433 Object propertyValue = nodeTemplateProperties.get(propertyName);
3434 propertyValue = getClonedObject(propertyValue);
3435 return propertyValue;
3440 private Map<String, UnifiedCompositionEntity> getAllConsolidationNodeTemplateIdAndType(
3441 List<UnifiedCompositionData> unifiedCompositionDataList) {
3443 Map<String, UnifiedCompositionEntity> consolidationNodeTemplateIdAndType = new HashMap<>();
3444 for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) {
3445 ComputeTemplateConsolidationData computeTemplateConsolidationData =
3446 unifiedCompositionData.getComputeTemplateConsolidationData();
3447 if (Objects.nonNull(computeTemplateConsolidationData)) {
3448 consolidationNodeTemplateIdAndType
3449 .put(computeTemplateConsolidationData.getNodeTemplateId(),
3450 UnifiedCompositionEntity.Compute);
3452 List<PortTemplateConsolidationData> portTemplateConsolidationDataList =
3453 getPortTemplateConsolidationDataList(unifiedCompositionData);
3454 for (PortTemplateConsolidationData portTemplateConsolidationData :
3455 portTemplateConsolidationDataList) {
3456 consolidationNodeTemplateIdAndType.put(portTemplateConsolidationData.getNodeTemplateId(),
3457 UnifiedCompositionEntity.Port);
3459 NestedTemplateConsolidationData nestedTemplateConsolidationData =
3460 unifiedCompositionData.getNestedTemplateConsolidationData();
3461 if (Objects.nonNull(nestedTemplateConsolidationData)) {
3462 consolidationNodeTemplateIdAndType
3463 .put(nestedTemplateConsolidationData.getNodeTemplateId(),
3464 UnifiedCompositionEntity.Nested);
3467 return consolidationNodeTemplateIdAndType;
3470 private List<PortTemplateConsolidationData> getPortTemplateConsolidationDataList(
3471 UnifiedCompositionData unifiedCompositionData) {
3472 return unifiedCompositionData.getPortTemplateConsolidationDataList() == null ? new
3473 ArrayList<>() : unifiedCompositionData.getPortTemplateConsolidationDataList();
3476 private enum PortInputType {