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.common.errors.ErrorCode;
7 import org.openecomp.sdc.logging.context.impl.MdcDataDebugMessage;
8 import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate;
9 import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate;
10 import org.openecomp.sdc.tosca.services.ToscaConstants;
11 import org.openecomp.sdc.tosca.services.ToscaUtil;
12 import org.openecomp.sdc.translator.datatypes.heattotosca.TranslationContext;
13 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.UnifiedCompositionData;
14 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.UnifiedCompositionEntity;
15 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.UnifiedCompositionMode;
16 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.ComputeTemplateConsolidationData;
17 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.ConsolidationData;
18 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.EntityConsolidationData;
19 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.FileComputeConsolidationData;
20 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.FileNestedConsolidationData;
21 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.FilePortConsolidationData;
22 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.GetAttrFuncData;
23 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.NestedTemplateConsolidationData;
24 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.PortTemplateConsolidationData;
25 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.RequirementAssignmentData;
26 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.TypeComputeConsolidationData;
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 mainServiceTemplateConsolidation(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 private 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);
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);
115 Set<String> portNodeTemplateIds = filePortConsolidationData.getAllPortNodeTemplateIds();
116 for (String portNodeTemplateId : portNodeTemplateIds) {
117 consolidationEntityIdToType
118 .put(portNodeTemplateId, ConsolidationDataUtil.getPortType(portNodeTemplateId));
121 return consolidationEntityIdToType;
125 private boolean checkConsolidationRules(ServiceTemplate serviceTemplate,
126 TypeComputeConsolidationData typeComputeConsolidationData,
127 ConsolidationData consolidationData,
128 TranslationContext context) {
129 return checkComputeConsolidation(serviceTemplate, typeComputeConsolidationData)
130 && checkPortConsolidation(serviceTemplate, typeComputeConsolidationData,
131 consolidationData, context)
132 && !checkGetAttrBetweenEntityConsolidationOfTheSameType(serviceTemplate,
133 typeComputeConsolidationData, consolidationData);
136 private boolean checkGetAttrBetweenConsolidationDataEntitiesNotFromSameType(
137 ServiceTemplate serviceTemplate,
138 TypeComputeConsolidationData typeComputeConsolidationData,
139 ConsolidationData consolidationData) {
140 List<ComputeTemplateConsolidationData> computeTemplateConsolidationDataList =
141 new ArrayList(typeComputeConsolidationData.getAllComputeTemplateConsolidationData());
143 Set<String> computeNodeTemplateIds =
144 typeComputeConsolidationData.getAllComputeNodeTemplateIds();
146 Map<String, Set<String>> portTypeToIds = UnifiedCompositionUtil
147 .collectAllPortsFromEachTypesFromComputes(computeTemplateConsolidationDataList);
150 checkGetAttrOutFromEntityToPortIsLegal(computeTemplateConsolidationDataList, portTypeToIds)
151 && checkGetAttrOutFromPortLegal(ToscaUtil.getServiceTemplateFileName(serviceTemplate),
152 computeNodeTemplateIds, portTypeToIds, consolidationData);
156 private boolean checkGetAttrInEntityConsolidationWithPortIsLegal(
157 List entityConsolidationDatas,
158 TypeComputeConsolidationData typeComputeConsolidationData) {
159 Map<String, Set<String>> portTypeToIds =
160 UnifiedCompositionUtil.collectAllPortsFromEachTypesFromComputes(
161 typeComputeConsolidationData.getAllComputeTemplateConsolidationData());
163 Set<String> startingPortTypesPointByGetAttr =
164 getPortTypesPointedByGetAttrFromEntity(
165 (EntityConsolidationData) entityConsolidationDatas.get(0), portTypeToIds);
167 for (int i = 1; i < entityConsolidationDatas.size(); i++) {
168 Set<String> currentPortTypesPointByGetAttr =
169 getPortTypesPointedByGetAttrFromEntity(
170 (EntityConsolidationData) entityConsolidationDatas.get(i), portTypeToIds);
171 if (!startingPortTypesPointByGetAttr.equals(currentPortTypesPointByGetAttr)) {
179 private Set<String> getPortTypesPointedByGetAttrFromEntity(
180 EntityConsolidationData entity,
181 Map<String, Set<String>> portTypeToIds) {
182 return getPortTypeToIdPointByGetAttrInOrOut(
183 entity.getNodesGetAttrIn(), portTypeToIds, entity).keySet();
186 private boolean checkGetAttrInToPortIsLegal(
187 ServiceTemplate serviceTemplate,
188 TypeComputeConsolidationData typeComputeConsolidationData,
189 ConsolidationData consolidationData) {
191 Map<String, Set<String>> portTypeToIds = UnifiedCompositionUtil
192 .collectAllPortsFromEachTypesFromComputes(
193 typeComputeConsolidationData.getAllComputeTemplateConsolidationData());
195 for (Set<String> portIdsFromSameType : portTypeToIds.values()) {
196 List<PortTemplateConsolidationData> portTemplateConsolidationDataList =
197 collectAllPortsTemplateConsolidationData(
198 portIdsFromSameType, ToscaUtil.getServiceTemplateFileName(serviceTemplate),
201 if (!checkGetAttrInEntityConsolidationWithPortIsLegal(
202 portTemplateConsolidationDataList, typeComputeConsolidationData)) {
211 private boolean checkGetAttrOutFromPortLegal(String serviceTemplateName,
212 Set<String> computeNodeTemplateIds,
213 Map<String, Set<String>> portTypeToIds,
214 ConsolidationData consolidationData) {
215 for (Set<String> portIdsFromSameType : portTypeToIds.values()) {
216 List<PortTemplateConsolidationData> portTemplateConsolidationDataList =
217 collectAllPortsTemplateConsolidationData(portIdsFromSameType, serviceTemplateName,
220 if (!(checkGetAttrOutFromEntityToPortIsLegal(portTemplateConsolidationDataList, portTypeToIds)
221 && checkGetAttrOutFromPortToComputeIsLegal(portTemplateConsolidationDataList,
222 computeNodeTemplateIds))) {
230 private boolean checkGetAttrOutFromEntityToPortIsLegal(List entityConsolidationDataList,
231 Map<String, Set<String>> portTypeToIds) {
233 for (String portType : portTypeToIds.keySet()) {
234 Set<GetAttrFuncData> startingGetAttrFunc =
235 getEntityGetAttrFuncAsSet(portType,
236 (EntityConsolidationData) entityConsolidationDataList.get(0));
237 for (int i = 1; i < entityConsolidationDataList.size(); i++) {
238 Object entity = entityConsolidationDataList.get(i);
239 Set<GetAttrFuncData> currentGetAttrFuncData =
240 getEntityGetAttrFuncAsSet(portType,
241 (EntityConsolidationData) entity);
242 if (!(startingGetAttrFunc.equals(currentGetAttrFuncData))) {
251 private boolean checkGetAttrOutFromPortToComputeIsLegal(
252 List<PortTemplateConsolidationData> portTemplateConsolidationDataList,
253 Set<String> computeNodeTemplateIds) {
254 PortTemplateConsolidationData startingPortTemplate =
255 portTemplateConsolidationDataList.get(0);
256 Map<String, Set<GetAttrFuncData>> startingComputeGetAttrOutFuncData =
257 getComputeGetAttrOutFuncData(startingPortTemplate.getNodesGetAttrOut(),
258 computeNodeTemplateIds);
260 for (int i = 1; i < portTemplateConsolidationDataList.size(); i++) {
261 PortTemplateConsolidationData currentPortTemplate =
262 portTemplateConsolidationDataList.get(i);
263 Map<String, Set<GetAttrFuncData>> currentComputeGetAttrOutFuncData =
264 getComputeGetAttrOutFuncData(currentPortTemplate.getNodesGetAttrOut(),
265 computeNodeTemplateIds);
267 if (!isGetAttrRelationToComputeSimilarBetweenEntities(startingComputeGetAttrOutFuncData,
268 currentComputeGetAttrOutFuncData)) {
276 private boolean isGetAttrRelationToComputeSimilarBetweenEntities(
277 Map<String, Set<GetAttrFuncData>> firstMap,
278 Map<String, Set<GetAttrFuncData>> secondMap) {
279 if (MapUtils.isEmpty(firstMap) != MapUtils.isEmpty(secondMap)) {
283 if (MapUtils.isEmpty(firstMap) && MapUtils.isEmpty(secondMap)) {
287 return new ArrayList<>(firstMap.values()).equals(new ArrayList<>(secondMap.values()));
290 private Set<GetAttrFuncData> getEntityGetAttrFuncAsSet(String portType,
291 EntityConsolidationData entityConsolidationData) {
293 Set<GetAttrFuncData> getAttrFuncDataFromPortsWithSameType = new HashSet<>();
294 Map<String, List<GetAttrFuncData>> nodesGetAttrOut =
295 entityConsolidationData.getNodesGetAttrOut();
297 if (MapUtils.isEmpty(nodesGetAttrOut)) {
298 return getAttrFuncDataFromPortsWithSameType;
301 for (Map.Entry<String, List<GetAttrFuncData>> entry : nodesGetAttrOut.entrySet()) {
302 if (portType.equals(ConsolidationDataUtil.getPortType(entry.getKey()))) {
303 getAttrFuncDataFromPortsWithSameType.addAll(entry.getValue());
307 return getAttrFuncDataFromPortsWithSameType;
310 private Map<String, Set<GetAttrFuncData>> getComputeGetAttrOutFuncData(
311 Map<String, List<GetAttrFuncData>> nodesGetAttrOut,
312 Set<String> computeNodeTemplateIds) {
313 Map<String, Set<GetAttrFuncData>> computeGetAttrFuncData = new HashMap<>();
315 if (MapUtils.isEmpty(nodesGetAttrOut)) {
316 return computeGetAttrFuncData;
319 for (Map.Entry<String, List<GetAttrFuncData>> getAttrFuncEntry : nodesGetAttrOut.entrySet()) {
320 if (computeNodeTemplateIds.contains(getAttrFuncEntry.getKey())) {
321 computeGetAttrFuncData.put(getAttrFuncEntry.getKey(), new HashSet<>(getAttrFuncEntry
326 return computeGetAttrFuncData;
329 private Map<String, List<String>> getPortTypeToIdPointByGetAttrInOrOut(
330 Map<String, List<GetAttrFuncData>> getAttr,
331 Map<String, Set<String>> portTypeToIds,
332 EntityConsolidationData entityConsolidationData) {
333 Map<String, List<String>> portIdToType = new HashMap<>();
335 if (MapUtils.isEmpty(getAttr)) {
339 for (String getAttrId : getAttr.keySet()) {
340 if (isNodeTemplateIdIsInComputeConsolidationData(getAttrId, portTypeToIds)) {
341 String portType = ConsolidationDataUtil.getPortType(getAttrId);
342 portIdToType.putIfAbsent(portType, new ArrayList<>());
343 portIdToType.get(portType).add(getAttrId);
352 private boolean isNodeTemplateIdIsInComputeConsolidationData(
354 Map<String, Set<String>> portTypeToIds) {
355 return portTypeToIds.keySet().contains(ConsolidationDataUtil.getPortType(getAttrInId));
358 private boolean checkGetAttrBetweenEntityConsolidationOfTheSameType(
359 ServiceTemplate serviceTemplate,
360 TypeComputeConsolidationData typeComputeConsolidationData,
361 ConsolidationData consolidationData) {
362 return checkGetAttrRelationsBetweenComputesOfSameType(typeComputeConsolidationData)
363 || checkGetAttrRelationsBetweenPortsOfTheSameType(serviceTemplate,
364 typeComputeConsolidationData, consolidationData);
368 private boolean checkGetAttrRelationsBetweenComputesOfSameType(
369 TypeComputeConsolidationData typeComputeConsolidationData) {
371 Collection<ComputeTemplateConsolidationData> computeTemplateConsolidationDatas =
372 typeComputeConsolidationData.getAllComputeTemplateConsolidationData();
373 Set<String> computeNodeTemplateIds =
374 typeComputeConsolidationData.getAllComputeNodeTemplateIds();
376 return checkGetAttrRelationsForEntityConsolidationData(
377 computeTemplateConsolidationDatas, computeNodeTemplateIds);
380 private boolean checkGetAttrRelationsBetweenPortsOfTheSameType(
381 ServiceTemplate serviceTemplate,
382 TypeComputeConsolidationData typeComputeConsolidationData,
383 ConsolidationData consolidationData) {
385 Collection<ComputeTemplateConsolidationData> computeTemplateConsolidationDatas =
386 typeComputeConsolidationData.getAllComputeTemplateConsolidationData();
387 Map<String, Set<String>> portTypeToPortIds = UnifiedCompositionUtil
388 .collectAllPortsFromEachTypesFromComputes(computeTemplateConsolidationDatas);
390 FilePortConsolidationData filePortConsolidationData =
391 consolidationData.getPortConsolidationData().getFilePortConsolidationData(ToscaUtil
392 .getServiceTemplateFileName(serviceTemplate));
394 for (Set<String> portsOfTheSameTypeIds : portTypeToPortIds.values()) {
395 List<PortTemplateConsolidationData> portTemplateConsolidationDataOfSameType =
396 getAllPortTemplateConsolidationData(portsOfTheSameTypeIds, filePortConsolidationData);
397 if (!checkGetAttrRelationsForEntityConsolidationData(portTemplateConsolidationDataOfSameType,
398 portsOfTheSameTypeIds)) {
406 private List<PortTemplateConsolidationData> getAllPortTemplateConsolidationData(
407 Set<String> portsIds,
408 FilePortConsolidationData filePortConsolidationData) {
409 List<PortTemplateConsolidationData> portTemplateConsolidationDataOfSameType = new ArrayList<>();
411 for (String portId : portsIds) {
412 PortTemplateConsolidationData portTemplateConsolidationData =
413 filePortConsolidationData.getPortTemplateConsolidationData(portId);
414 if (Objects.nonNull(portTemplateConsolidationData)) {
415 portTemplateConsolidationDataOfSameType.add(portTemplateConsolidationData);
419 return portTemplateConsolidationDataOfSameType;
422 private boolean checkGetAttrRelationsForEntityConsolidationData(
424 Set<String> nodeTemplateIdsOfTheSameType) {
426 List<EntityConsolidationData> entityConsolidationDataList =
427 new ArrayList(entities);
429 for (EntityConsolidationData entityConsolidationData : entityConsolidationDataList) {
430 Set<String> getAttrInNodeIds =
431 entityConsolidationData.getNodesGetAttrIn() == null ? new HashSet<>()
432 : entityConsolidationData.getNodesGetAttrIn().keySet();
433 for (String nodeId : getAttrInNodeIds) {
434 if (nodeTemplateIdsOfTheSameType.contains(nodeId)) {
444 private boolean checkComputeConsolidation(
445 ServiceTemplate serviceTemplate,
446 TypeComputeConsolidationData typeComputeConsolidationData) {
447 List<String> computeNodeTemplateIds =
448 new ArrayList(typeComputeConsolidationData.getAllComputeNodeTemplateIds());
449 List<String> propertiesWithIdenticalVal = getComputePropertiesWithIdenticalVal();
451 return arePropertiesSimilarBetweenComputeNodeTemplates(
452 serviceTemplate, computeNodeTemplateIds, propertiesWithIdenticalVal)
453 && checkComputeRelations(
454 typeComputeConsolidationData.getAllComputeTemplateConsolidationData());
458 private boolean checkComputeRelations(
459 Collection<ComputeTemplateConsolidationData> computeTemplateConsolidationDatas) {
461 return checkEntityConsolidationDataRelations(computeTemplateConsolidationDatas)
462 && checkComputesRelationsToVolume(computeTemplateConsolidationDatas);
465 private boolean checkEntityConsolidationDataRelations(Collection entities) {
466 List<EntityConsolidationData> entityConsolidationDataList =
467 new ArrayList(entities);
468 EntityConsolidationData startingEntity = entityConsolidationDataList.get(0);
470 for (int i = 1; i < entityConsolidationDataList.size(); i++) {
471 EntityConsolidationData currentEntity = entityConsolidationDataList.get(i);
472 if (!(checkNodesConnectedInRelations(startingEntity, currentEntity)
473 && (checkNodesConnectedOutRelations(startingEntity, currentEntity))
474 && (checkGroupIdsRelations(startingEntity, currentEntity)))) {
481 private boolean checkNodesConnectedInRelations(EntityConsolidationData firstEntity,
482 EntityConsolidationData secondEntity) {
483 return compareNodeConnectivity(firstEntity.getNodesConnectedIn(),
484 secondEntity.getNodesConnectedIn());
487 private boolean checkNodesConnectedOutRelations(EntityConsolidationData firstEntity,
488 EntityConsolidationData secondEntity) {
489 return compareNodeConnectivity(firstEntity.getNodesConnectedOut(),
490 secondEntity.getNodesConnectedOut());
493 private boolean compareNodeConnectivity(
494 Map<String, List<RequirementAssignmentData>> firstEntityMap,
495 Map<String, List<RequirementAssignmentData>> secondEntityMap) {
496 if (MapUtils.isEmpty(firstEntityMap)
497 && MapUtils.isEmpty(secondEntityMap)) {
500 if (!MapUtils.isEmpty(firstEntityMap)
501 && !MapUtils.isEmpty(secondEntityMap)) {
502 return firstEntityMap.keySet().equals(secondEntityMap.keySet());
507 private boolean checkGroupIdsRelations(EntityConsolidationData startingEntity,
508 EntityConsolidationData currentEntity) {
509 if (CollectionUtils.isEmpty(startingEntity.getGroupIds()) &&
510 CollectionUtils.isEmpty(currentEntity.getGroupIds())) {
514 return startingEntity.getGroupIds().equals(currentEntity.getGroupIds());
517 private boolean checkComputesRelationsToVolume(
518 Collection<ComputeTemplateConsolidationData> computeTemplateConsolidationDatas) {
520 Set<String> volumeRelationsFromComputes = new HashSet<>();
521 List<ComputeTemplateConsolidationData> computeTemplateConsolidationDataList =
522 new ArrayList(computeTemplateConsolidationDatas);
524 Map<String, List<RequirementAssignmentData>> startingVolumes =
525 computeTemplateConsolidationDataList.get(0).getVolumes();
527 for (int i = 1; i < computeTemplateConsolidationDataList.size(); i++) {
528 Map<String, List<RequirementAssignmentData>> currentVolumes =
529 computeTemplateConsolidationDataList.get(i).getVolumes();
530 if (!compareNodeConnectivity(startingVolumes, currentVolumes)) {
538 private boolean checkPortConsolidation(ServiceTemplate serviceTemplate,
539 TypeComputeConsolidationData typeComputeConsolidationData,
540 ConsolidationData consolidationData,
541 TranslationContext context) {
542 return isWantedPortPropertiesUsageIsSimilarInAllPorts(serviceTemplate,
543 typeComputeConsolidationData, context)
544 && checkPortRelations(ToscaUtil.getServiceTemplateFileName(serviceTemplate),
545 typeComputeConsolidationData, consolidationData);
549 private boolean isWantedPortPropertiesUsageIsSimilarInAllPorts(ServiceTemplate serviceTemplate,
550 TypeComputeConsolidationData typeComputeConsolidationData,
551 TranslationContext context) {
553 Collection<ComputeTemplateConsolidationData> computeTemplateConsolidationDataCollection =
554 typeComputeConsolidationData.getAllComputeTemplateConsolidationData();
555 List<String> propertiesThatNeedHaveUsage = getPortPropertiesWithIdenticalVal(context);
556 Map<String, Set<String>> portTypeToIds = UnifiedCompositionUtil
557 .collectAllPortsFromEachTypesFromComputes(computeTemplateConsolidationDataCollection);
559 for (Set<String> portsIds : portTypeToIds.values()) {
560 if (!areAllPortsFromSameTypeHaveIdenticalValForProperties(
561 serviceTemplate, portsIds, propertiesThatNeedHaveUsage)) {
569 private boolean checkPortRelations(String serviceTemplateName,
570 TypeComputeConsolidationData typeComputeConsolidationData,
571 ConsolidationData consolidationData) {
572 Collection<ComputeTemplateConsolidationData> computeTemplateConsolidationDataCollection =
573 typeComputeConsolidationData.getAllComputeTemplateConsolidationData();
574 Map<String, Set<String>> portTypeToIds = UnifiedCompositionUtil
575 .collectAllPortsFromEachTypesFromComputes(computeTemplateConsolidationDataCollection);
577 for (Set<String> portIds : portTypeToIds.values()) {
578 List<PortTemplateConsolidationData> portTemplateConsolidationDataList =
579 collectAllPortsTemplateConsolidationData(
580 portIds, serviceTemplateName, consolidationData);
582 if (!checkEntityConsolidationDataRelations(portTemplateConsolidationDataList)) {
590 private List<PortTemplateConsolidationData>
591 collectAllPortsTemplateConsolidationData(Set<String> portIds,
592 String serviceTemplateName,
593 ConsolidationData consolidationData) {
595 FilePortConsolidationData filePortConsolidationData =
596 consolidationData.getPortConsolidationData()
597 .getFilePortConsolidationData(serviceTemplateName);
598 List<PortTemplateConsolidationData> portTemplateConsolidationDataList = new ArrayList<>();
600 for (String portId : portIds) {
601 PortTemplateConsolidationData portTemplateConsolidationData = filePortConsolidationData
602 .getPortTemplateConsolidationData(portId);
603 if (Objects.nonNull(portTemplateConsolidationData)) {
604 portTemplateConsolidationDataList.add(portTemplateConsolidationData);
608 return portTemplateConsolidationDataList;
611 private boolean areAllPortsFromSameTypeHaveIdenticalValForProperties(
612 ServiceTemplate serviceTemplate,
613 Set<String> portNodeTemplateIds,
614 List<String> propertiesThatNeedToHaveUsage) {
615 Map<String, NodeTemplate> nodeTemplates =
616 serviceTemplate.getTopology_template().getNode_templates();
618 for (String property : propertiesThatNeedToHaveUsage) {
619 if (!areAllPortsHaveIdenticalValForProperties(property, portNodeTemplateIds, nodeTemplates)) {
627 private boolean areAllPortsHaveIdenticalValForProperties(
628 String propertyToCheck,
629 Set<String> portNodeTemplateIds,
630 Map<String, NodeTemplate> nodeTemplates) {
632 List<String> portNodeTemplateIdList = new ArrayList(portNodeTemplateIds);
633 NodeTemplate startingPortNodeTemplate = nodeTemplates.get(portNodeTemplateIdList.get(0));
635 if (Objects.isNull(startingPortNodeTemplate)) {
636 throw new CoreException((new ErrorCode.ErrorCodeBuilder())
637 .withMessage("Resource with id "
638 + portNodeTemplateIdList.get(0) + " occures more than once in different addOn files")
642 for (int i = 1; i < portNodeTemplateIdList.size(); i++) {
643 NodeTemplate portNodeTemplate = nodeTemplates.get(portNodeTemplateIdList.get(i));
645 if (Objects.isNull(portNodeTemplate)) {
646 throw new CoreException((new ErrorCode.ErrorCodeBuilder())
647 .withMessage("Resource with id "
648 + portNodeTemplateIdList.get(i) + " occures more than once in different addOn "
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((new ErrorCode.ErrorCodeBuilder())
695 .withMessage("Resource with id "
696 + entityNodeTemplateIds.get(i) + " occures more than once in different addOn files").build());
698 if(propertyExistCondition != isPropertyExistInNodeTemplate(propertyToCheck, currentNodeTemplate)){
702 .add(currentNodeTemplate.getProperties().get(propertyToCheck));
705 return propertiesValues.size() == 1;
708 private boolean isPropertyExistInNodeTemplate(String propertyToCheck, NodeTemplate nodeTemplate){
709 return !(nodeTemplate.getProperties() == null || nodeTemplate.getProperties().get(propertyToCheck) == null);
712 public void substitutionServiceTemplateConsolidation(String substituteNodeTemplateId,
713 ServiceTemplate mainServiceTemplate,
714 ServiceTemplate substitutionServiceTemplate,
715 TranslationContext translationContext) {
717 ConsolidationData consolidationData = translationContext.getConsolidationData();
719 FileComputeConsolidationData fileComputeConsolidationData =
720 translationContext.getConsolidationData().getComputeConsolidationData()
721 .getFileComputeConsolidationData(
722 ToscaUtil.getServiceTemplateFileName(substitutionServiceTemplate));
723 boolean consolidationRuleResult =
724 substitutionServiceTemplateConsolidationRule(substitutionServiceTemplate,
725 fileComputeConsolidationData, translationContext);
727 if (consolidationRuleResult) {
728 List<UnifiedCompositionData> unifiedCompositionDataList =
729 createSubstitutionUnifiedCompositionDataList(substituteNodeTemplateId,
730 mainServiceTemplate, consolidationData);
731 unifiedCompositionService
732 .createUnifiedComposition(mainServiceTemplate, substitutionServiceTemplate,
733 unifiedCompositionDataList, UnifiedCompositionMode.NestedSingleCompute,
736 //The node template does not qualify for unified composition
737 //Adding the id in the context for fixing connectivity from/to nested non-unified nodes
738 translationContext.addUnifiedNestedNodeTemplateId(ToscaUtil
739 .getServiceTemplateFileName(mainServiceTemplate),
740 substituteNodeTemplateId, substituteNodeTemplateId);
744 private boolean substitutionServiceTemplateConsolidationRule(
745 ServiceTemplate nestedServiceTemplate,
746 FileComputeConsolidationData fileComputeConsolidationData,
747 TranslationContext context) {
748 if (Objects.isNull(fileComputeConsolidationData)) {
751 return isNumberOfComputeTypesLegal(fileComputeConsolidationData)
752 && isNumberOfComputeConsolidationDataPerTypeLegal(
753 fileComputeConsolidationData.getAllTypeComputeConsolidationData().iterator().next())
754 && !isThereMoreThanOneNestedLevel(nestedServiceTemplate, context.getConsolidationData());
757 private boolean isNumberOfComputeTypesLegal(
758 FileComputeConsolidationData fileComputeConsolidationData) {
759 return fileComputeConsolidationData.getAllTypeComputeConsolidationData().size() == 1;
762 private boolean isNumberOfComputeConsolidationDataPerTypeLegal(
763 TypeComputeConsolidationData typeComputeConsolidationData) {
764 return typeComputeConsolidationData.getAllComputeTemplateConsolidationData().size() == 1;
767 private boolean isThereMoreThanOneNestedLevel(ServiceTemplate nestedServiceTemplate,
768 ConsolidationData consolidationData) {
769 String nestedServiceTemplateName = ToscaUtil.getServiceTemplateFileName(nestedServiceTemplate);
770 if (Objects.isNull(nestedServiceTemplateName)) {
774 FileNestedConsolidationData fileNestedConsolidationData =
775 consolidationData.getNestedConsolidationData() == null ? new FileNestedConsolidationData()
776 : consolidationData.getNestedConsolidationData()
777 .getFileNestedConsolidationData(nestedServiceTemplateName);
779 if (Objects.isNull(fileNestedConsolidationData)) {
783 return !CollectionUtils.isEmpty(fileNestedConsolidationData.getAllNestedNodeTemplateIds());
787 private List<UnifiedCompositionData> createUnifiedCompositionDataList(
788 ServiceTemplate serviceTemplate,
789 ConsolidationData consolidationData,
790 TypeComputeConsolidationData typeComputeConsolidationData) {
792 List<UnifiedCompositionData> unifiedCompositionDataList = new ArrayList<>();
794 for (ComputeTemplateConsolidationData computeTemplateConsolidationData : typeComputeConsolidationData
795 .getAllComputeTemplateConsolidationData()) {
797 UnifiedCompositionData unifiedCompositionData = new UnifiedCompositionData();
798 unifiedCompositionData.setComputeTemplateConsolidationData(computeTemplateConsolidationData);
800 Collection<List<String>> portCollection =
801 computeTemplateConsolidationData.getPorts() == null ? Collections.emptyList()
802 : computeTemplateConsolidationData.getPorts().values();
804 FilePortConsolidationData filePortConsolidationData =
805 consolidationData.getPortConsolidationData().getFilePortConsolidationData(ToscaUtil
806 .getServiceTemplateFileName(serviceTemplate));
808 for (List<String> portList : portCollection) {
809 for (String portId : portList) {
810 if (!Objects.isNull(filePortConsolidationData)) {
811 unifiedCompositionData.addPortTemplateConsolidationData(
812 (filePortConsolidationData.getPortTemplateConsolidationData(portId)));
816 unifiedCompositionDataList.add(unifiedCompositionData);
819 return unifiedCompositionDataList;
822 private List<UnifiedCompositionData> createSubstitutionUnifiedCompositionDataList(
823 String substituteNodeTemplateId,
824 ServiceTemplate serviceTemplate,
825 ConsolidationData consolidationData) {
826 List<UnifiedCompositionData> unifiedCompositionDataList = new ArrayList<>();
827 FileNestedConsolidationData fileNestedConsolidationData =
828 consolidationData.getNestedConsolidationData()
829 .getFileNestedConsolidationData(ToscaUtil.getServiceTemplateFileName(serviceTemplate));
831 if (Objects.nonNull(fileNestedConsolidationData)) {
832 Collection<NestedTemplateConsolidationData> nestedConsolidationDatas =
833 fileNestedConsolidationData.getAllNestedConsolidationData();
835 for (NestedTemplateConsolidationData nested : nestedConsolidationDatas) {
836 if (nested.getNodeTemplateId().equals(substituteNodeTemplateId)) {
837 UnifiedCompositionData unifiedCompositionData = new UnifiedCompositionData();
838 unifiedCompositionData.setNestedTemplateConsolidationData(nested);
839 unifiedCompositionDataList.add(unifiedCompositionData);
844 return unifiedCompositionDataList;
847 private boolean consolidationPreCondition(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;