1 package org.openecomp.sdc.translator.services.heattotosca;
3 import org.apache.commons.collections4.CollectionUtils;
4 import org.apache.commons.collections4.MapUtils;
5 import org.openecomp.sdc.common.errors.CoreException;
6 import org.openecomp.sdc.logging.context.impl.MdcDataDebugMessage;
7 import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate;
8 import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate;
9 import org.openecomp.sdc.tosca.services.ToscaConstants;
10 import org.openecomp.sdc.tosca.services.ToscaUtil;
11 import org.openecomp.sdc.translator.datatypes.heattotosca.TranslationContext;
12 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.UnifiedCompositionData;
13 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.UnifiedCompositionEntity;
14 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.UnifiedCompositionMode;
15 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.ComputeTemplateConsolidationData;
16 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.ConsolidationData;
17 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.EntityConsolidationData;
18 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.FileComputeConsolidationData;
19 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.FileNestedConsolidationData;
20 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.FilePortConsolidationData;
21 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.GetAttrFuncData;
22 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.NestedTemplateConsolidationData;
23 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.PortTemplateConsolidationData;
24 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.RequirementAssignmentData;
25 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.TypeComputeConsolidationData;
26 import org.openecomp.sdc.translator.services.heattotosca.errors.DuplicateResourceIdsInDifferentFilesErrorBuilder;
28 import java.util.ArrayList;
29 import java.util.Collection;
30 import java.util.Collections;
31 import java.util.HashMap;
32 import java.util.HashSet;
33 import java.util.List;
35 import java.util.Objects;
38 public class ConsolidationService {
40 private MdcDataDebugMessage mdcDataDebugMessage = new MdcDataDebugMessage();
41 private UnifiedCompositionService unifiedCompositionService;
43 public ConsolidationService(UnifiedCompositionService unifiedCompositionService) {
44 this.unifiedCompositionService = unifiedCompositionService;
47 ConsolidationService() {
51 void serviceTemplateConsolidation(ServiceTemplate serviceTemplate,
52 TranslationContext translationContext) {
54 ConsolidationData consolidationData = translationContext.getConsolidationData();
56 FileComputeConsolidationData fileComputeConsolidationData =
57 consolidationData.getComputeConsolidationData()
58 .getFileComputeConsolidationData(ToscaUtil.getServiceTemplateFileName(serviceTemplate));
60 if (Objects.isNull(fileComputeConsolidationData)) {
63 for (TypeComputeConsolidationData typeComputeConsolidationData :
64 fileComputeConsolidationData.getAllTypeComputeConsolidationData()) {
65 boolean preConditionResult =
66 consolidationPreCondition(
67 serviceTemplate, consolidationData, typeComputeConsolidationData);
69 List<UnifiedCompositionData> unifiedCompositionDataList =
70 createUnifiedCompositionDataList(
71 serviceTemplate, consolidationData, typeComputeConsolidationData);
73 if (preConditionResult) {
74 boolean consolidationRuleCheckResult =
75 checkConsolidationRules(serviceTemplate, typeComputeConsolidationData,
76 consolidationData, translationContext);
78 unifiedCompositionService.createUnifiedComposition(
79 serviceTemplate, null, unifiedCompositionDataList,
80 consolidationRuleCheckResult ? UnifiedCompositionMode.ScalingInstances
81 : UnifiedCompositionMode.CatalogInstance,
84 unifiedCompositionService.createUnifiedComposition(
85 serviceTemplate, null, unifiedCompositionDataList, UnifiedCompositionMode
93 public static Map<String, String> getConsolidationEntityIdToType(ServiceTemplate serviceTemplate,
94 ConsolidationData consolidationData) {
95 Map<String, String> consolidationEntityIdToType = new HashMap<>();
97 String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate);
98 FileComputeConsolidationData fileComputeConsolidationData =
99 consolidationData.getComputeConsolidationData()
100 .getFileComputeConsolidationData(serviceTemplateFileName);
101 FilePortConsolidationData filePortConsolidationData =
102 consolidationData.getPortConsolidationData()
103 .getFilePortConsolidationData(serviceTemplateFileName);
104 if(Objects.nonNull(fileComputeConsolidationData)) {
105 for (String computeType : fileComputeConsolidationData.getAllComputeTypes()) {
106 TypeComputeConsolidationData typeComputeConsolidationData =
107 fileComputeConsolidationData.getTypeComputeConsolidationData(computeType);
108 Set<String> computeNodeTemplateIds =
109 typeComputeConsolidationData.getAllComputeNodeTemplateIds();
110 for (String computeNodeTemplateId : computeNodeTemplateIds) {
111 consolidationEntityIdToType.put(computeNodeTemplateId, computeType);
116 if(Objects.nonNull(filePortConsolidationData)) {
117 Set<String> portNodeTemplateIds = filePortConsolidationData.getAllPortNodeTemplateIds();
118 for (String portNodeTemplateId : portNodeTemplateIds) {
119 consolidationEntityIdToType
120 .put(portNodeTemplateId, ConsolidationDataUtil.getPortType(portNodeTemplateId));
124 return consolidationEntityIdToType;
128 private boolean checkConsolidationRules(ServiceTemplate serviceTemplate,
129 TypeComputeConsolidationData typeComputeConsolidationData,
130 ConsolidationData consolidationData,
131 TranslationContext context) {
132 return checkComputeConsolidation(serviceTemplate, typeComputeConsolidationData)
133 && checkPortConsolidation(serviceTemplate, typeComputeConsolidationData,
134 consolidationData, context)
135 && !checkGetAttrBetweenEntityConsolidationOfTheSameType(serviceTemplate,
136 typeComputeConsolidationData, consolidationData);
139 private boolean checkGetAttrBetweenConsolidationDataEntitiesNotFromSameType(
140 ServiceTemplate serviceTemplate,
141 TypeComputeConsolidationData typeComputeConsolidationData,
142 ConsolidationData consolidationData) {
143 List<ComputeTemplateConsolidationData> computeTemplateConsolidationDataList =
144 new ArrayList(typeComputeConsolidationData.getAllComputeTemplateConsolidationData());
146 Set<String> computeNodeTemplateIds =
147 typeComputeConsolidationData.getAllComputeNodeTemplateIds();
149 Map<String, Set<String>> portTypeToIds = UnifiedCompositionUtil
150 .collectAllPortsFromEachTypesFromComputes(computeTemplateConsolidationDataList);
153 checkGetAttrOutFromEntityToPortIsLegal(computeTemplateConsolidationDataList, portTypeToIds)
154 && checkGetAttrOutFromPortLegal(ToscaUtil.getServiceTemplateFileName(serviceTemplate),
155 computeNodeTemplateIds, portTypeToIds, consolidationData);
159 private boolean checkGetAttrInEntityConsolidationWithPortIsLegal(
160 List entityConsolidationDatas,
161 TypeComputeConsolidationData typeComputeConsolidationData) {
162 Map<String, Set<String>> portTypeToIds =
163 UnifiedCompositionUtil.collectAllPortsFromEachTypesFromComputes(
164 typeComputeConsolidationData.getAllComputeTemplateConsolidationData());
166 Set<String> startingPortTypesPointByGetAttr =
167 getPortTypesPointedByGetAttrFromEntity(
168 (EntityConsolidationData) entityConsolidationDatas.get(0), portTypeToIds);
170 for (int i = 1; i < entityConsolidationDatas.size(); i++) {
171 Set<String> currentPortTypesPointByGetAttr =
172 getPortTypesPointedByGetAttrFromEntity(
173 (EntityConsolidationData) entityConsolidationDatas.get(i), portTypeToIds);
174 if (!startingPortTypesPointByGetAttr.equals(currentPortTypesPointByGetAttr)) {
182 private Set<String> getPortTypesPointedByGetAttrFromEntity(
183 EntityConsolidationData entity,
184 Map<String, Set<String>> portTypeToIds) {
185 return getPortTypeToIdPointByGetAttrInOrOut(
186 entity.getNodesGetAttrIn(), portTypeToIds, entity).keySet();
189 private boolean checkGetAttrInToPortIsLegal(
190 ServiceTemplate serviceTemplate,
191 TypeComputeConsolidationData typeComputeConsolidationData,
192 ConsolidationData consolidationData) {
194 Map<String, Set<String>> portTypeToIds = UnifiedCompositionUtil
195 .collectAllPortsFromEachTypesFromComputes(
196 typeComputeConsolidationData.getAllComputeTemplateConsolidationData());
198 for (Set<String> portIdsFromSameType : portTypeToIds.values()) {
199 List<PortTemplateConsolidationData> portTemplateConsolidationDataList =
200 collectAllPortsTemplateConsolidationData(
201 portIdsFromSameType, ToscaUtil.getServiceTemplateFileName(serviceTemplate),
204 if (!checkGetAttrInEntityConsolidationWithPortIsLegal(
205 portTemplateConsolidationDataList, typeComputeConsolidationData)) {
214 private boolean checkGetAttrOutFromPortLegal(String serviceTemplateName,
215 Set<String> computeNodeTemplateIds,
216 Map<String, Set<String>> portTypeToIds,
217 ConsolidationData consolidationData) {
218 for (Set<String> portIdsFromSameType : portTypeToIds.values()) {
219 List<PortTemplateConsolidationData> portTemplateConsolidationDataList =
220 collectAllPortsTemplateConsolidationData(portIdsFromSameType, serviceTemplateName,
223 if (!(checkGetAttrOutFromEntityToPortIsLegal(portTemplateConsolidationDataList, portTypeToIds)
224 && checkGetAttrOutFromPortToComputeIsLegal(portTemplateConsolidationDataList,
225 computeNodeTemplateIds))) {
233 private boolean checkGetAttrOutFromEntityToPortIsLegal(List entityConsolidationDataList,
234 Map<String, Set<String>> portTypeToIds) {
236 for (String portType : portTypeToIds.keySet()) {
237 Set<GetAttrFuncData> startingGetAttrFunc =
238 getEntityGetAttrFuncAsSet(portType,
239 (EntityConsolidationData) entityConsolidationDataList.get(0));
240 for (int i = 1; i < entityConsolidationDataList.size(); i++) {
241 Object entity = entityConsolidationDataList.get(i);
242 Set<GetAttrFuncData> currentGetAttrFuncData =
243 getEntityGetAttrFuncAsSet(portType,
244 (EntityConsolidationData) entity);
245 if (!(startingGetAttrFunc.equals(currentGetAttrFuncData))) {
254 private boolean checkGetAttrOutFromPortToComputeIsLegal(
255 List<PortTemplateConsolidationData> portTemplateConsolidationDataList,
256 Set<String> computeNodeTemplateIds) {
257 PortTemplateConsolidationData startingPortTemplate =
258 portTemplateConsolidationDataList.get(0);
259 Map<String, Set<GetAttrFuncData>> startingComputeGetAttrOutFuncData =
260 getComputeGetAttrOutFuncData(startingPortTemplate.getNodesGetAttrOut(),
261 computeNodeTemplateIds);
263 for (int i = 1; i < portTemplateConsolidationDataList.size(); i++) {
264 PortTemplateConsolidationData currentPortTemplate =
265 portTemplateConsolidationDataList.get(i);
266 Map<String, Set<GetAttrFuncData>> currentComputeGetAttrOutFuncData =
267 getComputeGetAttrOutFuncData(currentPortTemplate.getNodesGetAttrOut(),
268 computeNodeTemplateIds);
270 if (!isGetAttrRelationToComputeSimilarBetweenEntities(startingComputeGetAttrOutFuncData,
271 currentComputeGetAttrOutFuncData)) {
279 private boolean isGetAttrRelationToComputeSimilarBetweenEntities(
280 Map<String, Set<GetAttrFuncData>> firstMap,
281 Map<String, Set<GetAttrFuncData>> secondMap) {
282 if (MapUtils.isEmpty(firstMap) != MapUtils.isEmpty(secondMap)) {
286 if (MapUtils.isEmpty(firstMap) && MapUtils.isEmpty(secondMap)) {
290 return new ArrayList<>(firstMap.values()).equals(new ArrayList<>(secondMap.values()));
293 private Set<GetAttrFuncData> getEntityGetAttrFuncAsSet(
295 EntityConsolidationData entityConsolidationData) {
297 Set<GetAttrFuncData> getAttrFuncDataFromPortsWithSameType = new HashSet<>();
298 Map<String, List<GetAttrFuncData>> nodesGetAttrOut =
299 entityConsolidationData.getNodesGetAttrOut();
301 if (MapUtils.isEmpty(nodesGetAttrOut)) {
302 return getAttrFuncDataFromPortsWithSameType;
305 for (Map.Entry<String, List<GetAttrFuncData>> entry : nodesGetAttrOut.entrySet()) {
306 if (portType.equals(ConsolidationDataUtil.getPortType(entry.getKey()))) {
307 getAttrFuncDataFromPortsWithSameType.addAll(entry.getValue());
311 return getAttrFuncDataFromPortsWithSameType;
314 private Map<String, Set<GetAttrFuncData>> getComputeGetAttrOutFuncData(
315 Map<String, List<GetAttrFuncData>> nodesGetAttrOut,
316 Set<String> computeNodeTemplateIds) {
317 Map<String, Set<GetAttrFuncData>> computeGetAttrFuncData = new HashMap<>();
319 if (MapUtils.isEmpty(nodesGetAttrOut)) {
320 return computeGetAttrFuncData;
323 for (Map.Entry<String, List<GetAttrFuncData>> getAttrFuncEntry : nodesGetAttrOut.entrySet()) {
324 if (computeNodeTemplateIds.contains(getAttrFuncEntry.getKey())) {
325 computeGetAttrFuncData.put(getAttrFuncEntry.getKey(), new HashSet<>(getAttrFuncEntry
330 return computeGetAttrFuncData;
333 private Map<String, List<String>> getPortTypeToIdPointByGetAttrInOrOut(
334 Map<String, List<GetAttrFuncData>> getAttr,
335 Map<String, Set<String>> portTypeToIds,
336 EntityConsolidationData entityConsolidationData) {
337 Map<String, List<String>> portIdToType = new HashMap<>();
339 if (MapUtils.isEmpty(getAttr)) {
343 for (String getAttrId : getAttr.keySet()) {
344 if (isNodeTemplateIdIsInComputeConsolidationData(getAttrId, portTypeToIds)) {
345 String portType = ConsolidationDataUtil.getPortType(getAttrId);
346 portIdToType.putIfAbsent(portType, new ArrayList<>());
347 portIdToType.get(portType).add(getAttrId);
356 private boolean isNodeTemplateIdIsInComputeConsolidationData(
358 Map<String, Set<String>> portTypeToIds) {
359 return portTypeToIds.keySet().contains(ConsolidationDataUtil.getPortType(getAttrInId));
362 private boolean checkGetAttrBetweenEntityConsolidationOfTheSameType(
363 ServiceTemplate serviceTemplate,
364 TypeComputeConsolidationData typeComputeConsolidationData,
365 ConsolidationData consolidationData) {
366 return checkGetAttrRelationsBetweenComputesOfSameType(typeComputeConsolidationData)
367 || checkGetAttrRelationsBetweenPortsOfTheSameType(serviceTemplate,
368 typeComputeConsolidationData, consolidationData);
372 private boolean checkGetAttrRelationsBetweenComputesOfSameType(
373 TypeComputeConsolidationData typeComputeConsolidationData) {
375 Collection<ComputeTemplateConsolidationData> computeTemplateConsolidationDatas =
376 typeComputeConsolidationData.getAllComputeTemplateConsolidationData();
377 Set<String> computeNodeTemplateIds =
378 typeComputeConsolidationData.getAllComputeNodeTemplateIds();
380 return checkGetAttrRelationsForEntityConsolidationData(
381 computeTemplateConsolidationDatas, computeNodeTemplateIds);
384 private boolean checkGetAttrRelationsBetweenPortsOfTheSameType(
385 ServiceTemplate serviceTemplate,
386 TypeComputeConsolidationData typeComputeConsolidationData,
387 ConsolidationData consolidationData) {
389 Collection<ComputeTemplateConsolidationData> computeTemplateConsolidationDatas =
390 typeComputeConsolidationData.getAllComputeTemplateConsolidationData();
391 Map<String, Set<String>> portTypeToPortIds = UnifiedCompositionUtil
392 .collectAllPortsFromEachTypesFromComputes(computeTemplateConsolidationDatas);
394 FilePortConsolidationData filePortConsolidationData =
395 consolidationData.getPortConsolidationData().getFilePortConsolidationData(ToscaUtil
396 .getServiceTemplateFileName(serviceTemplate));
398 for (Set<String> portsOfTheSameTypeIds : portTypeToPortIds.values()) {
399 List<PortTemplateConsolidationData> portTemplateConsolidationDataOfSameType =
400 getAllPortTemplateConsolidationData(portsOfTheSameTypeIds, filePortConsolidationData);
401 if (!checkGetAttrRelationsForEntityConsolidationData(portTemplateConsolidationDataOfSameType,
402 portsOfTheSameTypeIds)) {
410 private List<PortTemplateConsolidationData> getAllPortTemplateConsolidationData(
411 Set<String> portsIds,
412 FilePortConsolidationData filePortConsolidationData) {
413 List<PortTemplateConsolidationData> portTemplateConsolidationDataOfSameType = new ArrayList<>();
415 for (String portId : portsIds) {
416 PortTemplateConsolidationData portTemplateConsolidationData =
417 filePortConsolidationData.getPortTemplateConsolidationData(portId);
418 if (Objects.nonNull(portTemplateConsolidationData)) {
419 portTemplateConsolidationDataOfSameType.add(portTemplateConsolidationData);
423 return portTemplateConsolidationDataOfSameType;
426 private boolean checkGetAttrRelationsForEntityConsolidationData(
428 Set<String> nodeTemplateIdsOfTheSameType) {
430 List<EntityConsolidationData> entityConsolidationDataList =
431 new ArrayList(entities);
433 for (EntityConsolidationData entityConsolidationData : entityConsolidationDataList) {
434 Set<String> getAttrInNodeIds =
435 entityConsolidationData.getNodesGetAttrIn() == null ? new HashSet<>()
436 : entityConsolidationData.getNodesGetAttrIn().keySet();
437 for (String nodeId : getAttrInNodeIds) {
438 if (nodeTemplateIdsOfTheSameType.contains(nodeId)) {
448 private boolean checkComputeConsolidation(
449 ServiceTemplate serviceTemplate,
450 TypeComputeConsolidationData typeComputeConsolidationData) {
451 List<String> computeNodeTemplateIds =
452 new ArrayList(typeComputeConsolidationData.getAllComputeNodeTemplateIds());
453 List<String> propertiesWithIdenticalVal = getComputePropertiesWithIdenticalVal();
455 return arePropertiesSimilarBetweenComputeNodeTemplates(
456 serviceTemplate, computeNodeTemplateIds, propertiesWithIdenticalVal)
457 && checkComputeRelations(
458 typeComputeConsolidationData.getAllComputeTemplateConsolidationData());
462 private boolean checkComputeRelations(
463 Collection<ComputeTemplateConsolidationData> computeTemplateConsolidationDatas) {
465 return checkEntityConsolidationDataRelations(computeTemplateConsolidationDatas)
466 && checkComputesRelationsToVolume(computeTemplateConsolidationDatas);
469 private boolean checkEntityConsolidationDataRelations(Collection entities) {
470 List<EntityConsolidationData> entityConsolidationDataList =
471 new ArrayList(entities);
472 EntityConsolidationData startingEntity = entityConsolidationDataList.get(0);
474 for (int i = 1; i < entityConsolidationDataList.size(); i++) {
475 EntityConsolidationData currentEntity = entityConsolidationDataList.get(i);
476 if (!(checkNodesConnectedInRelations(startingEntity, currentEntity)
477 && (checkNodesConnectedOutRelations(startingEntity, currentEntity))
478 && (checkGroupIdsRelations(startingEntity, currentEntity)))) {
485 private boolean checkNodesConnectedInRelations(EntityConsolidationData firstEntity,
486 EntityConsolidationData secondEntity) {
487 return compareNodeConnectivity(firstEntity.getNodesConnectedIn(),
488 secondEntity.getNodesConnectedIn());
491 private boolean checkNodesConnectedOutRelations(EntityConsolidationData firstEntity,
492 EntityConsolidationData secondEntity) {
493 return compareNodeConnectivity(firstEntity.getNodesConnectedOut(),
494 secondEntity.getNodesConnectedOut());
497 private boolean compareNodeConnectivity(
498 Map<String, List<RequirementAssignmentData>> firstEntityMap,
499 Map<String, List<RequirementAssignmentData>> secondEntityMap) {
500 if (MapUtils.isEmpty(firstEntityMap)
501 && MapUtils.isEmpty(secondEntityMap)) {
504 if (!MapUtils.isEmpty(firstEntityMap)
505 && !MapUtils.isEmpty(secondEntityMap)) {
506 return firstEntityMap.keySet().equals(secondEntityMap.keySet());
511 private boolean checkGroupIdsRelations(EntityConsolidationData startingEntity,
512 EntityConsolidationData currentEntity) {
513 if (CollectionUtils.isEmpty(startingEntity.getGroupIds())
514 && CollectionUtils.isEmpty(currentEntity.getGroupIds())) {
518 return startingEntity.getGroupIds().equals(currentEntity.getGroupIds());
521 private boolean checkComputesRelationsToVolume(
522 Collection<ComputeTemplateConsolidationData> computeTemplateConsolidationDatas) {
524 Set<String> volumeRelationsFromComputes = new HashSet<>();
525 List<ComputeTemplateConsolidationData> computeTemplateConsolidationDataList =
526 new ArrayList(computeTemplateConsolidationDatas);
528 Map<String, List<RequirementAssignmentData>> startingVolumes =
529 computeTemplateConsolidationDataList.get(0).getVolumes();
531 for (int i = 1; i < computeTemplateConsolidationDataList.size(); i++) {
532 Map<String, List<RequirementAssignmentData>> currentVolumes =
533 computeTemplateConsolidationDataList.get(i).getVolumes();
534 if (!compareNodeConnectivity(startingVolumes, currentVolumes)) {
542 private boolean checkPortConsolidation(ServiceTemplate serviceTemplate,
543 TypeComputeConsolidationData typeComputeConsolidationData,
544 ConsolidationData consolidationData,
545 TranslationContext context) {
546 return isWantedPortPropertiesUsageIsSimilarInAllPorts(serviceTemplate,
547 typeComputeConsolidationData, context)
548 && checkPortRelations(ToscaUtil.getServiceTemplateFileName(serviceTemplate),
549 typeComputeConsolidationData, consolidationData);
553 private boolean isWantedPortPropertiesUsageIsSimilarInAllPorts(ServiceTemplate serviceTemplate,
554 TypeComputeConsolidationData typeComputeConsolidationData,
555 TranslationContext context) {
557 Collection<ComputeTemplateConsolidationData> computeTemplateConsolidationDataCollection =
558 typeComputeConsolidationData.getAllComputeTemplateConsolidationData();
559 List<String> propertiesThatNeedHaveUsage = getPortPropertiesWithIdenticalVal(context);
560 Map<String, Set<String>> portTypeToIds = UnifiedCompositionUtil
561 .collectAllPortsFromEachTypesFromComputes(computeTemplateConsolidationDataCollection);
563 for (Set<String> portsIds : portTypeToIds.values()) {
564 if (!areAllPortsFromSameTypeHaveIdenticalValForProperties(
565 serviceTemplate, portsIds, propertiesThatNeedHaveUsage)) {
573 private boolean checkPortRelations(String serviceTemplateName,
574 TypeComputeConsolidationData typeComputeConsolidationData,
575 ConsolidationData consolidationData) {
576 Collection<ComputeTemplateConsolidationData> computeTemplateConsolidationDataCollection =
577 typeComputeConsolidationData.getAllComputeTemplateConsolidationData();
578 Map<String, Set<String>> portTypeToIds = UnifiedCompositionUtil
579 .collectAllPortsFromEachTypesFromComputes(computeTemplateConsolidationDataCollection);
581 for (Set<String> portIds : portTypeToIds.values()) {
582 List<PortTemplateConsolidationData> portTemplateConsolidationDataList =
583 collectAllPortsTemplateConsolidationData(
584 portIds, serviceTemplateName, consolidationData);
586 if (!checkEntityConsolidationDataRelations(portTemplateConsolidationDataList)) {
594 private List<PortTemplateConsolidationData>
595 collectAllPortsTemplateConsolidationData(Set<String> portIds,
596 String serviceTemplateName,
597 ConsolidationData consolidationData) {
599 FilePortConsolidationData filePortConsolidationData =
600 consolidationData.getPortConsolidationData()
601 .getFilePortConsolidationData(serviceTemplateName);
602 List<PortTemplateConsolidationData> portTemplateConsolidationDataList = new ArrayList<>();
604 for (String portId : portIds) {
605 PortTemplateConsolidationData portTemplateConsolidationData = filePortConsolidationData
606 .getPortTemplateConsolidationData(portId);
607 if (Objects.nonNull(portTemplateConsolidationData)) {
608 portTemplateConsolidationDataList.add(portTemplateConsolidationData);
612 return portTemplateConsolidationDataList;
615 private boolean areAllPortsFromSameTypeHaveIdenticalValForProperties(
616 ServiceTemplate serviceTemplate,
617 Set<String> portNodeTemplateIds,
618 List<String> propertiesThatNeedToHaveUsage) {
619 Map<String, NodeTemplate> nodeTemplates =
620 serviceTemplate.getTopology_template().getNode_templates();
622 for (String property : propertiesThatNeedToHaveUsage) {
623 if (!areAllPortsHaveIdenticalValForProperties(property, portNodeTemplateIds, nodeTemplates)) {
631 private boolean areAllPortsHaveIdenticalValForProperties(
632 String propertyToCheck,
633 Set<String> portNodeTemplateIds,
634 Map<String, NodeTemplate> nodeTemplates) {
636 List<String> portNodeTemplateIdList = new ArrayList(portNodeTemplateIds);
637 NodeTemplate startingPortNodeTemplate = nodeTemplates.get(portNodeTemplateIdList.get(0));
639 if (Objects.isNull(startingPortNodeTemplate)) {
640 throw new CoreException(
641 new DuplicateResourceIdsInDifferentFilesErrorBuilder(portNodeTemplateIdList.get(0)).build());
644 for (int i = 1; i < portNodeTemplateIdList.size(); i++) {
645 NodeTemplate portNodeTemplate = nodeTemplates.get(portNodeTemplateIdList.get(i));
647 if (Objects.isNull(portNodeTemplate)) {
648 throw new CoreException(
649 new DuplicateResourceIdsInDifferentFilesErrorBuilder(portNodeTemplateIdList.get(i)).build());
652 if (!isPropertySimilarBetweenNodeTemplates(propertyToCheck, portNodeTemplateIdList, nodeTemplates)) {
661 private boolean arePropertiesSimilarBetweenComputeNodeTemplates(
662 ServiceTemplate serviceTemplate,
663 List<String> computeNodeTemplateIds,
664 List<String> propertiesThatNeedToBeSimilar) {
666 Map<String, NodeTemplate> idToNodeTemplate =
667 serviceTemplate.getTopology_template().getNode_templates();
669 for (String property : propertiesThatNeedToBeSimilar) {
670 if (!isPropertySimilarBetweenNodeTemplates(property, computeNodeTemplateIds,
678 private boolean isPropertySimilarBetweenNodeTemplates(
679 String propertyToCheck,
680 List<String> entityNodeTemplateIds,
681 Map<String, NodeTemplate> idToNodeTemplate) {
683 NodeTemplate startingNodeTemplate = idToNodeTemplate.get(entityNodeTemplateIds.get(0));
684 boolean propertyExistCondition =
685 isPropertyExistInNodeTemplate(propertyToCheck, startingNodeTemplate);
687 Set<Object> propertiesValues = new HashSet<>();
689 .add(startingNodeTemplate.getProperties().get(propertyToCheck));
691 for (int i = 1; i < entityNodeTemplateIds.size(); i++) {
692 NodeTemplate currentNodeTemplate = idToNodeTemplate.get(entityNodeTemplateIds.get(i));
693 if (Objects.isNull(currentNodeTemplate)) {
694 throw new CoreException(
695 new DuplicateResourceIdsInDifferentFilesErrorBuilder(entityNodeTemplateIds.get(i)).build());
697 if(propertyExistCondition != isPropertyExistInNodeTemplate(propertyToCheck, currentNodeTemplate)){
701 .add(currentNodeTemplate.getProperties().get(propertyToCheck));
704 return propertiesValues.size() == 1;
707 private boolean isPropertyExistInNodeTemplate(String propertyToCheck, NodeTemplate nodeTemplate){
708 return !(nodeTemplate.getProperties() == null || nodeTemplate.getProperties().get(propertyToCheck) == null);
711 public void substitutionServiceTemplateConsolidation(String substituteNodeTemplateId,
712 ServiceTemplate serviceTemplate,
713 ServiceTemplate substitutionServiceTemplate,
714 TranslationContext translationContext) {
716 ConsolidationData consolidationData = translationContext.getConsolidationData();
718 FileComputeConsolidationData fileComputeConsolidationData =
719 translationContext.getConsolidationData().getComputeConsolidationData()
720 .getFileComputeConsolidationData(
721 ToscaUtil.getServiceTemplateFileName(substitutionServiceTemplate));
722 boolean substitutionConsolidationRuleResult =
723 substitutionServiceTemplateConsolidationRule(substitutionServiceTemplate,
724 fileComputeConsolidationData, translationContext);
726 if (substitutionConsolidationRuleResult) {
727 List<UnifiedCompositionData> unifiedCompositionDataList =
728 createSubstitutionUnifiedCompositionDataList(substituteNodeTemplateId,
729 serviceTemplate, consolidationData);
730 unifiedCompositionService
731 .createUnifiedComposition(serviceTemplate, substitutionServiceTemplate,
732 unifiedCompositionDataList, UnifiedCompositionMode.NestedSingleCompute,
735 //The node template does not represent unified VFC but complexVFC
736 //Adding the id in the context for fixing connectivity from/to nested non-unified nodes
737 translationContext.addUnifiedNestedNodeTemplateId(ToscaUtil
738 .getServiceTemplateFileName(serviceTemplate),
739 substituteNodeTemplateId, substituteNodeTemplateId);
741 if (!translationContext.isUnifiedHandledServiceTemplate(substitutionServiceTemplate)) {
742 serviceTemplateConsolidation(substitutionServiceTemplate, translationContext);
747 private boolean substitutionServiceTemplateConsolidationRule(
748 ServiceTemplate nestedServiceTemplate,
749 FileComputeConsolidationData fileComputeConsolidationData,
750 TranslationContext context) {
751 if (Objects.isNull(fileComputeConsolidationData)) {
754 return isNumberOfComputeTypesLegal(fileComputeConsolidationData)
755 && isNumberOfComputeConsolidationDataPerTypeLegal(
756 fileComputeConsolidationData.getAllTypeComputeConsolidationData().iterator().next())
757 && !isThereMoreThanOneNestedLevel(nestedServiceTemplate, context.getConsolidationData());
760 private boolean isNumberOfComputeTypesLegal(
761 FileComputeConsolidationData fileComputeConsolidationData) {
762 return fileComputeConsolidationData.getAllTypeComputeConsolidationData().size() == 1;
765 private boolean isNumberOfComputeConsolidationDataPerTypeLegal(
766 TypeComputeConsolidationData typeComputeConsolidationData) {
767 return typeComputeConsolidationData.getAllComputeTemplateConsolidationData().size() == 1;
770 private boolean isThereMoreThanOneNestedLevel(ServiceTemplate nestedServiceTemplate,
771 ConsolidationData consolidationData) {
772 String nestedServiceTemplateName = ToscaUtil.getServiceTemplateFileName(nestedServiceTemplate);
773 if (Objects.isNull(nestedServiceTemplateName)) {
777 FileNestedConsolidationData fileNestedConsolidationData =
778 consolidationData.getNestedConsolidationData() == null ? new FileNestedConsolidationData()
779 : consolidationData.getNestedConsolidationData()
780 .getFileNestedConsolidationData(nestedServiceTemplateName);
782 if (Objects.isNull(fileNestedConsolidationData)) {
786 return !CollectionUtils.isEmpty(fileNestedConsolidationData.getAllNestedNodeTemplateIds());
790 private List<UnifiedCompositionData> createUnifiedCompositionDataList(
791 ServiceTemplate serviceTemplate,
792 ConsolidationData consolidationData,
793 TypeComputeConsolidationData typeComputeConsolidationData) {
795 List<UnifiedCompositionData> unifiedCompositionDataList = new ArrayList<>();
797 for (ComputeTemplateConsolidationData computeTemplateConsolidationData : typeComputeConsolidationData
798 .getAllComputeTemplateConsolidationData()) {
800 UnifiedCompositionData unifiedCompositionData = new UnifiedCompositionData();
801 unifiedCompositionData.setComputeTemplateConsolidationData(computeTemplateConsolidationData);
803 Collection<List<String>> portCollection =
804 computeTemplateConsolidationData.getPorts() == null ? Collections.emptyList()
805 : computeTemplateConsolidationData.getPorts().values();
807 FilePortConsolidationData filePortConsolidationData =
808 consolidationData.getPortConsolidationData().getFilePortConsolidationData(ToscaUtil
809 .getServiceTemplateFileName(serviceTemplate));
811 for (List<String> portList : portCollection) {
812 for (String portId : portList) {
813 if (!Objects.isNull(filePortConsolidationData)) {
814 unifiedCompositionData.addPortTemplateConsolidationData(
815 (filePortConsolidationData.getPortTemplateConsolidationData(portId)));
819 unifiedCompositionDataList.add(unifiedCompositionData);
822 return unifiedCompositionDataList;
825 private List<UnifiedCompositionData> createSubstitutionUnifiedCompositionDataList(
826 String substituteNodeTemplateId,
827 ServiceTemplate serviceTemplate,
828 ConsolidationData consolidationData) {
829 List<UnifiedCompositionData> unifiedCompositionDataList = new ArrayList<>();
830 FileNestedConsolidationData fileNestedConsolidationData =
831 consolidationData.getNestedConsolidationData()
832 .getFileNestedConsolidationData(ToscaUtil.getServiceTemplateFileName(serviceTemplate));
834 if (Objects.nonNull(fileNestedConsolidationData)) {
835 NestedTemplateConsolidationData nestedTemplateConsolidationData =
836 fileNestedConsolidationData.getNestedTemplateConsolidationData(substituteNodeTemplateId);
837 UnifiedCompositionData unifiedCompositionData = new UnifiedCompositionData();
838 unifiedCompositionData.setNestedTemplateConsolidationData(nestedTemplateConsolidationData);
839 unifiedCompositionDataList.add(unifiedCompositionData);
840 return unifiedCompositionDataList;
843 return unifiedCompositionDataList;
846 private boolean consolidationPreCondition(
847 ServiceTemplate serviceTemplate,
848 ConsolidationData consolidationData,
849 TypeComputeConsolidationData typeComputeConsolidationData) {
851 return (isThereMoreThanOneComputeTypeInstance(typeComputeConsolidationData)
852 && isNumberOfPortsEqualsBetweenComputeNodes(typeComputeConsolidationData)
853 && isNumberOfPortFromEachTypeLegal(typeComputeConsolidationData)
854 && isPortTypesEqualsBetweenComputeNodes(typeComputeConsolidationData)
855 && checkGetAttrBetweenConsolidationDataEntitiesNotFromSameType(serviceTemplate,
856 typeComputeConsolidationData, consolidationData));
860 private boolean isThereMoreThanOneComputeTypeInstance(
861 TypeComputeConsolidationData typeComputeConsolidationData) {
862 return typeComputeConsolidationData.getAllComputeNodeTemplateIds().size() > 1;
865 private boolean isNumberOfPortsEqualsBetweenComputeNodes(
866 TypeComputeConsolidationData typeComputeConsolidationData) {
868 ArrayList<ComputeTemplateConsolidationData> computeTemplateConsolidationDataList =
869 new ArrayList(typeComputeConsolidationData.getAllComputeTemplateConsolidationData());
870 int startingNumberOfPorts =
871 getNumberOfPortsPerCompute(computeTemplateConsolidationDataList.get(0));
874 for (int i = 1; i < computeTemplateConsolidationDataList.size(); i++) {
875 int currNumberOfPorts =
876 getNumberOfPortsPerCompute(computeTemplateConsolidationDataList.get(i));
877 if (currNumberOfPorts != startingNumberOfPorts) {
886 private boolean isNumberOfPortFromEachTypeLegal(
887 TypeComputeConsolidationData typeComputeConsolidationData) {
889 ArrayList<ComputeTemplateConsolidationData> computeTemplateConsolidationDataList =
890 new ArrayList(typeComputeConsolidationData.getAllComputeTemplateConsolidationData());
892 for (ComputeTemplateConsolidationData computeTemplate : computeTemplateConsolidationDataList) {
893 Map<String, List<String>> currPortsMap = computeTemplate.getPorts();
894 if (MapUtils.isEmpty(currPortsMap)) {
897 for (List<String> portList : currPortsMap.values()) {
898 if (portList.size() > 1) {
907 private boolean isPortTypesEqualsBetweenComputeNodes(
908 TypeComputeConsolidationData typeComputeConsolidationData) {
910 ArrayList<ComputeTemplateConsolidationData> computeTemplateConsolidationDataList =
911 new ArrayList(typeComputeConsolidationData.getAllComputeTemplateConsolidationData());
912 Set<String> staringPortIds = getPortsIds(computeTemplateConsolidationDataList.get(0));
914 for (int i = 1; i < computeTemplateConsolidationDataList.size(); i++) {
915 Set<String> currentPortIds = getPortsIds(computeTemplateConsolidationDataList.get(i));
916 if (!currentPortIds.equals(staringPortIds)) {
924 private int getNumberOfPortsPerCompute(
925 ComputeTemplateConsolidationData computeTemplateConsolidationData) {
926 return getPortsIds(computeTemplateConsolidationData) == null ? 0 :
927 getPortsIds(computeTemplateConsolidationData).size();
930 private Set<String> getPortsIds(
931 ComputeTemplateConsolidationData computeTemplateConsolidationData) {
932 return computeTemplateConsolidationData.getPorts() == null ? new HashSet<>()
933 : computeTemplateConsolidationData
934 .getPorts().keySet();
937 public List<String> getPropertiesWithIdenticalVal(UnifiedCompositionEntity entity,
938 TranslationContext context){
941 return getComputePropertiesWithIdenticalVal();
944 return getComputePropertiesWithIdenticalVal();
947 return getPortPropertiesWithIdenticalVal(context);
950 return new ArrayList<>();
954 private List<String> getComputePropertiesWithIdenticalVal() {
955 List<String> propertyWithIdenticalValue = new ArrayList<>();
956 propertyWithIdenticalValue.add(ToscaConstants.COMPUTE_IMAGE);
957 propertyWithIdenticalValue.add(ToscaConstants.COMPUTE_FLAVOR);
958 return propertyWithIdenticalValue;
961 private List<String> getPortPropertiesWithIdenticalVal(TranslationContext context) {
962 List<String> propertiesThatNeedToHaveUsage = new ArrayList<>();
963 propertiesThatNeedToHaveUsage.add(ToscaConstants.PORT_FIXED_IPS);
964 propertiesThatNeedToHaveUsage.add(ToscaConstants.PORT_ALLOWED_ADDRESS_PAIRS);
965 propertiesThatNeedToHaveUsage.add(ToscaConstants.MAC_ADDRESS);
967 propertiesThatNeedToHaveUsage.addAll(context.getEnrichPortResourceProperties());
969 return propertiesThatNeedToHaveUsage;