2 * Copyright © 2016-2018 European Support Limited
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 package org.openecomp.sdc.translator.services.heattotosca;
19 import com.google.common.collect.ArrayListMultimap;
20 import com.google.common.collect.ListMultimap;
22 import java.util.ArrayList;
23 import java.util.Collection;
24 import java.util.Collections;
25 import java.util.HashMap;
26 import java.util.HashSet;
27 import java.util.Iterator;
28 import java.util.List;
30 import java.util.Objects;
32 import java.util.function.Function;
33 import java.util.function.Predicate;
34 import java.util.stream.Collectors;
36 import org.apache.commons.collections4.CollectionUtils;
37 import org.apache.commons.collections4.MapUtils;
38 import org.apache.commons.lang3.StringUtils;
39 import org.onap.sdc.tosca.datatypes.model.NodeTemplate;
40 import org.onap.sdc.tosca.datatypes.model.ServiceTemplate;
41 import org.openecomp.sdc.common.errors.CoreException;
42 import org.openecomp.sdc.tosca.datatypes.ToscaNodeType;
43 import org.openecomp.sdc.tosca.services.DataModelUtil;
44 import org.openecomp.sdc.tosca.services.ToscaAnalyzerService;
45 import org.openecomp.sdc.tosca.services.ToscaConstants;
46 import org.openecomp.sdc.tosca.services.ToscaUtil;
47 import org.openecomp.sdc.tosca.services.impl.ToscaAnalyzerServiceImpl;
48 import org.openecomp.sdc.translator.datatypes.heattotosca.TranslationContext;
49 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.UnifiedCompositionData;
50 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.UnifiedCompositionEntity;
51 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.UnifiedCompositionMode;
52 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.ComputeTemplateConsolidationData;
53 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.ConsolidationData;
54 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.EntityConsolidationData;
55 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.FileComputeConsolidationData;
56 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.FileNestedConsolidationData;
57 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.FilePortConsolidationData;
58 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.GetAttrFuncData;
59 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.NestedConsolidationData;
60 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.NestedTemplateConsolidationData;
61 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.PortTemplateConsolidationData;
62 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.RequirementAssignmentData;
63 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.SubInterfaceTemplateConsolidationData;
64 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.TypeComputeConsolidationData;
65 import org.openecomp.sdc.translator.services.heattotosca.errors.DuplicateResourceIdsInDifferentFilesErrorBuilder;
67 public class ConsolidationService {
69 private UnifiedCompositionService unifiedCompositionService;
71 public ConsolidationService(UnifiedCompositionService unifiedCompositionService) {
72 this.unifiedCompositionService = unifiedCompositionService;
75 ConsolidationService() {
79 void serviceTemplateConsolidation(ServiceTemplate serviceTemplate,
80 TranslationContext translationContext) {
82 ConsolidationData consolidationData = translationContext.getConsolidationData();
84 FileComputeConsolidationData fileComputeConsolidationData =
85 consolidationData.getComputeConsolidationData()
86 .getFileComputeConsolidationData(ToscaUtil.getServiceTemplateFileName(serviceTemplate));
88 if (Objects.isNull(fileComputeConsolidationData)) {
91 for (TypeComputeConsolidationData typeComputeConsolidationData :
92 fileComputeConsolidationData.getAllTypeComputeConsolidationData()) {
93 boolean preConditionResult =
94 consolidationPreCondition(
95 serviceTemplate, consolidationData, typeComputeConsolidationData);
97 List<UnifiedCompositionData> unifiedCompositionDataList =
98 createUnifiedCompositionDataList(
99 serviceTemplate, consolidationData, typeComputeConsolidationData);
101 if (preConditionResult) {
102 boolean consolidationRuleCheckResult =
103 checkConsolidationRules(serviceTemplate, typeComputeConsolidationData,
106 unifiedCompositionService.createUnifiedComposition(
107 serviceTemplate, null, unifiedCompositionDataList,
108 consolidationRuleCheckResult ? UnifiedCompositionMode.ScalingInstances
109 : UnifiedCompositionMode.CatalogInstance,
112 unifiedCompositionService.createUnifiedComposition(
113 serviceTemplate, null, unifiedCompositionDataList, UnifiedCompositionMode
121 static Map<String, String> getConsolidationEntityIdToType(ServiceTemplate serviceTemplate,
122 ConsolidationData consolidationData) {
123 Map<String, String> consolidationEntityIdToType = new HashMap<>();
125 String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate);
126 FileComputeConsolidationData fileComputeConsolidationData =
127 consolidationData.getComputeConsolidationData()
128 .getFileComputeConsolidationData(serviceTemplateFileName);
129 FilePortConsolidationData filePortConsolidationData =
130 consolidationData.getPortConsolidationData()
131 .getFilePortConsolidationData(serviceTemplateFileName);
132 if (Objects.nonNull(fileComputeConsolidationData)) {
133 for (String computeType : fileComputeConsolidationData.getAllComputeTypes()) {
134 TypeComputeConsolidationData typeComputeConsolidationData =
135 fileComputeConsolidationData.getTypeComputeConsolidationData(computeType);
136 Collection<String> computeNodeTemplateIds =
137 typeComputeConsolidationData.getAllComputeNodeTemplateIds();
138 for (String computeNodeTemplateId : computeNodeTemplateIds) {
139 consolidationEntityIdToType.put(computeNodeTemplateId, computeType);
144 if (Objects.nonNull(filePortConsolidationData)) {
145 Set<String> portNodeTemplateIds = filePortConsolidationData.getAllPortNodeTemplateIds();
146 for (String portNodeTemplateId : portNodeTemplateIds) {
147 consolidationEntityIdToType
148 .put(portNodeTemplateId, ConsolidationDataUtil.getPortType(portNodeTemplateId));
152 return consolidationEntityIdToType;
156 private boolean checkConsolidationRules(ServiceTemplate serviceTemplate,
157 TypeComputeConsolidationData typeComputeConsolidationData,
158 ConsolidationData consolidationData) {
159 return checkComputeConsolidation(serviceTemplate, typeComputeConsolidationData)
160 && checkPortConsolidation(serviceTemplate, typeComputeConsolidationData,
162 && !checkGetAttrBetweenEntityConsolidationOfTheSameType(serviceTemplate,
163 typeComputeConsolidationData, consolidationData);
166 private boolean checkGetAttrBetweenConsolidationDataEntitiesNotFromSameType(
167 ServiceTemplate serviceTemplate,
168 TypeComputeConsolidationData typeComputeConsolidationData,
169 ConsolidationData consolidationData) {
170 Collection<String> computeNodeTemplateIds = typeComputeConsolidationData.getAllComputeNodeTemplateIds();
172 Map<String, List<String>> portTypeToIds =
173 typeComputeConsolidationData.collectAllPortsOfEachTypeFromComputes();
175 return typeComputeConsolidationData.isGetAttrOutFromEntityLegal(portTypeToIds)
176 && checkGetAttrOutFromPortLegal(
177 ToscaUtil.getServiceTemplateFileName(serviceTemplate),
178 computeNodeTemplateIds, portTypeToIds, consolidationData);
182 private boolean checkGetAttrOutFromPortLegal(String serviceTemplateName,
183 Collection<String> computeNodeTemplateIds,
184 Map<String, List<String>> portTypeToIds,
185 ConsolidationData consolidationData) {
186 for (List<String> portIdsFromSameType : portTypeToIds.values()) {
187 List<PortTemplateConsolidationData> portTemplateConsolidationDataList =
188 collectAllPortsTemplateConsolidationData(portIdsFromSameType, serviceTemplateName,
191 if (!(checkGetAttrOutFromEntityToPortIsLegal(portTemplateConsolidationDataList, portTypeToIds)
192 && checkGetAttrOutFromConsolidationEntityToEntityNotFromSameTypeIsLegal(
193 portTemplateConsolidationDataList,
194 computeNodeTemplateIds))) {
202 private boolean checkGetAttrOutFromEntityToPortIsLegal(Collection<? extends EntityConsolidationData> entities,
203 Map<String, List<String>> portTypeToIds) {
204 return CollectionUtils.isEmpty(entities)
205 || entities.iterator().next().isGetAttrOutFromEntityLegal(entities, portTypeToIds);
208 private boolean checkGetAttrOutFromConsolidationEntityToEntityNotFromSameTypeIsLegal(
209 List entityConsolidationDataList,
210 Collection<String> consolidationEntityNodeTemplateIds) {
211 if (CollectionUtils.isEmpty(entityConsolidationDataList)) {
214 EntityConsolidationData startingEntityTemplate =
215 (EntityConsolidationData) entityConsolidationDataList.get(0);
216 Map<String, Set<GetAttrFuncData>> startingGetAttrOutFuncData =
217 getConsolidationEntityGetAttrOutFuncData(startingEntityTemplate.getNodesGetAttrOut(),
218 consolidationEntityNodeTemplateIds);
220 for (int i = 1; i < entityConsolidationDataList.size(); i++) {
221 EntityConsolidationData currentEntityTemplate =
222 (EntityConsolidationData) entityConsolidationDataList.get(i);
223 Map<String, Set<GetAttrFuncData>> currentGetAttrOutFuncData =
224 getConsolidationEntityGetAttrOutFuncData(currentEntityTemplate.getNodesGetAttrOut(),
225 consolidationEntityNodeTemplateIds);
227 if (!isGetAttrRelationToEntitySimilarBetweenEntities(startingGetAttrOutFuncData,
228 currentGetAttrOutFuncData)) {
236 private boolean isGetAttrRelationToEntitySimilarBetweenEntities(
237 Map<String, Set<GetAttrFuncData>> firstMap,
238 Map<String, Set<GetAttrFuncData>> secondMap) {
239 if (MapUtils.isEmpty(firstMap) != MapUtils.isEmpty(secondMap)) {
243 return (MapUtils.isEmpty(firstMap) && MapUtils.isEmpty(secondMap)) ||
244 (new ArrayList<>(firstMap.values()).equals(new ArrayList<>(secondMap.values())));
248 private boolean checkSubInterfaceConsolidationPreCondition(ServiceTemplate serviceTemplate,
249 ConsolidationData consolidationData,
250 TypeComputeConsolidationData typeComputeConsolidationData) {
251 FilePortConsolidationData filePortConsolidationData =
252 consolidationData.getPortConsolidationData()
253 .getFilePortConsolidationData(ToscaUtil.getServiceTemplateFileName(serviceTemplate));
255 if (Objects.isNull(filePortConsolidationData)) {
259 Map<String, List<String>> portTypeToPortIds =
260 typeComputeConsolidationData.collectAllPortsOfEachTypeFromComputes();
262 Collection<String> computeNodeTemplateIds =
263 typeComputeConsolidationData.getAllComputeNodeTemplateIds();
265 for (List<String> portIdsFromSameType : portTypeToPortIds.values()) {
266 List<PortTemplateConsolidationData> portTemplateConsolidationDataList =
267 getAllPortTemplateConsolidationData(portIdsFromSameType, filePortConsolidationData);
269 if (!areSubInterfacePreConditionRulesValid(portTypeToPortIds, computeNodeTemplateIds,
270 portTemplateConsolidationDataList, portTemplateConsolidationDataList.get(0))) {
277 private boolean areSubInterfacePreConditionRulesValid(Map<String, List<String>> portTypeToPortIds,
278 Collection<String> computeNodeTemplateIds,
279 List<PortTemplateConsolidationData> portTemplateConsolidationDataList,
280 PortTemplateConsolidationData subInterfaceConsolidationData) {
281 return areSubInterfaceTypesSimilarBetweenPorts(portTemplateConsolidationDataList,
282 subInterfaceConsolidationData)
283 && isNumberOfSubInterfacesPerTypeSimilar(portTemplateConsolidationDataList,
284 subInterfaceConsolidationData)
285 && isGetAttrFromSubInterfaceToOtherEntitiesLegal(computeNodeTemplateIds,
286 portTypeToPortIds, portTemplateConsolidationDataList);
289 private boolean isGetAttrFromSubInterfaceToOtherEntitiesLegal(
290 Collection<String> computeNodeTemplateIds,
291 Map<String, List<String>> portTypeToPortIds,
292 List<PortTemplateConsolidationData> portTemplateConsolidationDataList) {
294 ListMultimap<String, SubInterfaceTemplateConsolidationData> subInterfacesFromSameTypeFromPorts =
295 collectAllSubInterfacesFromSameTypeFromPorts(portTemplateConsolidationDataList);
297 List<SubInterfaceTemplateConsolidationData> subInterfaceList = new ArrayList<>(subInterfacesFromSameTypeFromPorts
299 return areGetAttrRelationshipsBetweenSubInterfaceToConsolidationEntitiesValid(
300 computeNodeTemplateIds, portTypeToPortIds, portTemplateConsolidationDataList, subInterfaceList);
303 private boolean areGetAttrRelationshipsBetweenSubInterfaceToConsolidationEntitiesValid(
304 Collection<String> computeNodeTemplateIds, Map<String, List<String>> portTypeToPortIds,
305 List<PortTemplateConsolidationData> portTemplateConsolidationDataList,
306 List<SubInterfaceTemplateConsolidationData> subInterfaceList) {
307 return checkGetAttrOutFromEntityToPortIsLegal(subInterfaceList, portTypeToPortIds)
308 && checkGetAttrOutFromConsolidationEntityToEntityNotFromSameTypeIsLegal(
309 portTemplateConsolidationDataList, getSubInterfaceIdsFromSameType(subInterfaceList))
310 && checkGetAttrOutFromConsolidationEntityToEntityNotFromSameTypeIsLegal(
311 subInterfaceList, computeNodeTemplateIds);
314 private boolean areSubInterfaceTypesSimilarBetweenPorts(
315 List<PortTemplateConsolidationData> portTemplateConsolidationDataList,
316 PortTemplateConsolidationData subInterfaceConsolidationData) {
318 return portTemplateConsolidationDataList.stream().allMatch(
319 element -> element.hasSameSubInterfaceTypes(subInterfaceConsolidationData));
322 private boolean isNumberOfSubInterfacesPerTypeSimilar(
323 List<PortTemplateConsolidationData> portTemplateConsolidationDataList,
324 PortTemplateConsolidationData subInterfaceConsolidationData) {
326 return portTemplateConsolidationDataList.stream()
327 .allMatch(element -> element.isNumberOfSubInterfacesPerTypeSimilar(subInterfaceConsolidationData));
330 private Map<String, Set<GetAttrFuncData>> getConsolidationEntityGetAttrOutFuncData(
331 Map<String, List<GetAttrFuncData>> nodesGetAttrOut,
332 Collection<String> computeNodeTemplateIds) {
333 Map<String, Set<GetAttrFuncData>> computeGetAttrFuncData = new HashMap<>();
335 if (MapUtils.isEmpty(nodesGetAttrOut)) {
336 return computeGetAttrFuncData;
339 for (Map.Entry<String, List<GetAttrFuncData>> getAttrFuncEntry : nodesGetAttrOut.entrySet()) {
340 if (computeNodeTemplateIds.contains(getAttrFuncEntry.getKey())) {
341 computeGetAttrFuncData.put(getAttrFuncEntry.getKey(), new HashSet<>(getAttrFuncEntry
346 return computeGetAttrFuncData;
349 private boolean checkGetAttrBetweenEntityConsolidationOfTheSameType(
350 ServiceTemplate serviceTemplate,
351 TypeComputeConsolidationData typeComputeConsolidationData,
352 ConsolidationData consolidationData) {
353 return areThereGetAttrRelationsBetweenComputesOfSameType(typeComputeConsolidationData)
354 || areThereGetAttrRelationsBetweenPortsOfTheSameType(serviceTemplate,
355 typeComputeConsolidationData, consolidationData);
359 private boolean areThereGetAttrRelationsBetweenComputesOfSameType(
360 TypeComputeConsolidationData typeComputeConsolidationData) {
362 Collection<ComputeTemplateConsolidationData> computeTemplateConsolidationEntities =
363 typeComputeConsolidationData.getAllComputeTemplateConsolidationData();
364 Collection<String> computeNodeTemplateIds =
365 typeComputeConsolidationData.getAllComputeNodeTemplateIds();
367 return checkGetAttrRelationsForEntityConsolidationData(
368 computeTemplateConsolidationEntities, computeNodeTemplateIds,
369 EntityConsolidationData::getNodesGetAttrIn);
372 private boolean areThereGetAttrRelationsBetweenPortsOfTheSameType(
373 ServiceTemplate serviceTemplate,
374 TypeComputeConsolidationData typeComputeConsolidationData,
375 ConsolidationData consolidationData) {
376 Map<String, List<String>> portTypeToPortIds =
377 typeComputeConsolidationData.collectAllPortsOfEachTypeFromComputes();
379 FilePortConsolidationData filePortConsolidationData =
380 consolidationData.getPortConsolidationData().getFilePortConsolidationData(
381 ToscaUtil.getServiceTemplateFileName(serviceTemplate));
383 for (List<String> portsOfTheSameTypeIds : portTypeToPortIds.values()) {
384 List<PortTemplateConsolidationData> portTemplateConsolidationDataOfSameType =
385 getAllPortTemplateConsolidationData(portsOfTheSameTypeIds, filePortConsolidationData);
386 if (!checkGetAttrRelationsForEntityConsolidationData(portTemplateConsolidationDataOfSameType,
387 portsOfTheSameTypeIds, EntityConsolidationData::getNodesGetAttrIn)) {
395 private boolean areThereGetAttrRelationsBetweenSubInterfacesOfSameType(
396 List<String> subInterfacesIdsFromSameType,
397 List<SubInterfaceTemplateConsolidationData> subInterfaceList) {
399 return checkGetAttrRelationsForEntityConsolidationData(subInterfaceList,
400 subInterfacesIdsFromSameType, EntityConsolidationData::getNodesGetAttrIn)
401 || checkGetAttrRelationsForEntityConsolidationData(subInterfaceList,
402 subInterfacesIdsFromSameType, EntityConsolidationData::getNodesGetAttrOut);
406 private List<PortTemplateConsolidationData> getAllPortTemplateConsolidationData(
407 List<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(Collection entities,
423 Collection<String> nodeTemplateIdsOfTheSameType,
424 Function<EntityConsolidationData, Map<String, List<GetAttrFuncData>>> getAttrValuesMethod) {
425 for (Object entity : entities) {
426 Map<String, List<GetAttrFuncData>> getAttrValue =
427 getAttrValuesMethod.apply((EntityConsolidationData) entity);
428 Set<String> getAttrNodeIds =
429 getAttrValue == null ? new HashSet<>()
430 : getAttrValue.keySet();
431 if (getAttrNodeIds.stream().anyMatch(nodeTemplateIdsOfTheSameType::contains)) {
439 private boolean checkComputeConsolidation(
440 ServiceTemplate serviceTemplate,
441 TypeComputeConsolidationData typeComputeConsolidationData) {
442 Collection<String> computeNodeTemplateIds =
443 typeComputeConsolidationData.getAllComputeNodeTemplateIds();
444 List<String> propertiesWithIdenticalVal = getComputePropertiesWithIdenticalVal();
446 return arePropertiesSimilarBetweenComputeNodeTemplates(serviceTemplate, computeNodeTemplateIds,
447 propertiesWithIdenticalVal)
448 && checkComputeRelations(
449 typeComputeConsolidationData.getAllComputeTemplateConsolidationData());
453 private boolean checkComputeRelations(
454 Collection<ComputeTemplateConsolidationData> computeTemplateConsolidationEntities) {
456 return checkEntityConsolidationDataRelations(computeTemplateConsolidationEntities)
457 && checkComputesRelationsToVolume(computeTemplateConsolidationEntities);
460 private boolean checkEntityConsolidationDataRelations(Collection entities) {
461 EntityConsolidationData startingEntity = (EntityConsolidationData) entities.iterator().next();
463 for (Object entity : entities) {
464 EntityConsolidationData currentEntity = (EntityConsolidationData) entity;
465 if (!(checkNodesConnectedInRelations(startingEntity, currentEntity)
466 && (checkNodesConnectedOutRelations(startingEntity, currentEntity))
467 && (checkGroupIdsRelations(startingEntity, currentEntity)))) {
474 private boolean checkNodesConnectedInRelations(EntityConsolidationData firstEntity,
475 EntityConsolidationData secondEntity) {
476 return compareNodeConnectivity(firstEntity.getNodesConnectedIn(),
477 secondEntity.getNodesConnectedIn());
480 private boolean checkNodesConnectedOutRelations(EntityConsolidationData firstEntity,
481 EntityConsolidationData secondEntity) {
482 return compareNodeConnectivity(firstEntity.getNodesConnectedOut(),
483 secondEntity.getNodesConnectedOut());
486 private boolean compareNodeConnectivity(
487 Map<String, List<RequirementAssignmentData>> firstEntityMap,
488 Map<String, List<RequirementAssignmentData>> secondEntityMap) {
490 if (MapUtils.isEmpty(firstEntityMap)
491 && MapUtils.isEmpty(secondEntityMap)) {
494 return !MapUtils.isEmpty(firstEntityMap) && !MapUtils.isEmpty(secondEntityMap)
495 && firstEntityMap.keySet().equals(secondEntityMap.keySet());
498 private boolean checkGroupIdsRelations(EntityConsolidationData startingEntity,
499 EntityConsolidationData currentEntity) {
500 return CollectionUtils.isEmpty(startingEntity.getGroupIds())
501 && CollectionUtils.isEmpty(currentEntity.getGroupIds())
502 || startingEntity.getGroupIds().equals(currentEntity.getGroupIds());
506 private boolean checkComputesRelationsToVolume(
507 Collection<ComputeTemplateConsolidationData> computeTemplateConsolidationEntities) {
508 Iterator<ComputeTemplateConsolidationData> iterator =
509 computeTemplateConsolidationEntities.iterator();
511 Map<String, List<RequirementAssignmentData>> startingVolumes =
512 iterator.next().getVolumes();
514 for (ComputeTemplateConsolidationData compute : computeTemplateConsolidationEntities) {
515 Map<String, List<RequirementAssignmentData>> currentVolumes =
516 compute.getVolumes();
517 if (!compareNodeConnectivity(startingVolumes, currentVolumes)) {
525 private boolean checkPortConsolidation(ServiceTemplate serviceTemplate,
526 TypeComputeConsolidationData typeComputeConsolidationData,
527 ConsolidationData consolidationData) {
528 return validateWantedPortProperties(serviceTemplate,
529 typeComputeConsolidationData)
530 && checkPortRelations(ToscaUtil.getServiceTemplateFileName(serviceTemplate),
531 typeComputeConsolidationData, consolidationData);
535 private boolean validateWantedPortProperties(ServiceTemplate serviceTemplate,
536 TypeComputeConsolidationData typeComputeConsolidationData) {
537 Map<String, List<String>> portTypeToIds =
538 typeComputeConsolidationData.collectAllPortsOfEachTypeFromComputes();
540 List<String> propertiesWithIdenticalVal = getPortPropertiesWithIdenticalVal();
541 List<String> propertiesThatNeedToHaveSameUsage = getPortPropertiesThatNeedToHaveSameUsage();
543 for (List<String> portsIds : portTypeToIds.values()) {
544 if (!arePortPropertiesValid(
545 serviceTemplate, propertiesWithIdenticalVal, propertiesThatNeedToHaveSameUsage, portsIds)) {
553 private boolean arePortPropertiesValid(ServiceTemplate serviceTemplate,
554 List<String> propertiesWithIdenticalVal,
555 List<String> propertiesThatNeedToHaveSameUsage,
556 List<String> portsIds) {
557 Map<String, NodeTemplate> nodeTemplates =
558 serviceTemplate.getTopology_template().getNode_templates();
560 Predicate<String> similar = property ->
561 isPropertyValueSimilarBetweenNodeTemplates(property,
562 portsIds, nodeTemplates);
564 Predicate<String> exists = property ->
565 isPropertyUsageSimilarBetweenAllNodeTemplates(property,
566 portsIds, nodeTemplates);
568 return areWantedPortPropertiesValid(
569 propertiesWithIdenticalVal, similar)
570 && areWantedPortPropertiesValid(
571 propertiesThatNeedToHaveSameUsage, exists);
574 private boolean checkPortRelations(String serviceTemplateName,
575 TypeComputeConsolidationData typeComputeConsolidationData,
576 ConsolidationData consolidationData) {
577 Map<String, List<String>> portTypeToIds =
578 typeComputeConsolidationData.collectAllPortsOfEachTypeFromComputes();
580 for (List<String> portIds : portTypeToIds.values()) {
581 List<PortTemplateConsolidationData> portTemplateConsolidationDataList =
582 collectAllPortsTemplateConsolidationData(portIds, serviceTemplateName, consolidationData);
584 if (!checkEntityConsolidationDataRelations(portTemplateConsolidationDataList) || !checkSubInterfaceRules(
585 portTemplateConsolidationDataList)) {
593 private boolean checkSubInterfaceRules(List<PortTemplateConsolidationData>
594 portTemplateConsolidationDataList) {
595 ListMultimap<String, SubInterfaceTemplateConsolidationData> subInterfaceTypeToEntity =
596 collectAllSubInterfacesFromSameTypeFromPorts(portTemplateConsolidationDataList);
597 List<SubInterfaceTemplateConsolidationData> subInterfaceList = new ArrayList<>(subInterfaceTypeToEntity.values());
598 return areSubInterfacePropertiesAndRelationsValid(subInterfaceList);
601 private boolean areSubInterfacePropertiesAndRelationsValid(
602 List<SubInterfaceTemplateConsolidationData> subInterfaceList) {
603 return isResourceGroupPropertiesSimilarBetweenSubPorts(subInterfaceList)
604 && checkSubInterfaceRelations(subInterfaceList)
605 && !areThereGetAttrRelationsBetweenSubInterfacesOfSameType(
606 getSubInterfaceIdsFromSameType(subInterfaceList), subInterfaceList);
609 private boolean checkSubInterfaceRelations(List<SubInterfaceTemplateConsolidationData>
611 return CollectionUtils.isEmpty(subInterfaceList)
612 || checkEntityConsolidationDataRelations(subInterfaceList);
615 private boolean isResourceGroupPropertiesSimilarBetweenSubPorts(
616 List<SubInterfaceTemplateConsolidationData> subInterfaceList) {
617 if (CollectionUtils.isEmpty(subInterfaceList)) {
621 SubInterfaceTemplateConsolidationData startingSubInterface = subInterfaceList.get(0);
622 for (SubInterfaceTemplateConsolidationData subInterface : subInterfaceList) {
623 if (!startingSubInterface.getResourceGroupCount().equals(subInterface.getResourceGroupCount())
624 || !StringUtils.equals(startingSubInterface.getNetworkRole(), subInterface.getNetworkRole())) {
632 private List<String> getSubInterfaceIdsFromSameType(List<SubInterfaceTemplateConsolidationData>
634 if (CollectionUtils.isEmpty(subInterfaceList)) {
635 return new ArrayList<>();
638 return subInterfaceList.stream().map(SubInterfaceTemplateConsolidationData::getNodeTemplateId)
639 .collect(Collectors.toList());
642 private ListMultimap<String, SubInterfaceTemplateConsolidationData> collectAllSubInterfacesFromSameTypeFromPorts(
643 List<PortTemplateConsolidationData> portTemplateConsolidationDataList) {
644 ListMultimap<String, SubInterfaceTemplateConsolidationData> subInterfaceTypeToEntity = ArrayListMultimap.create();
645 for (PortTemplateConsolidationData portTemplateConsolidationData : portTemplateConsolidationDataList) {
646 portTemplateConsolidationData.copyMappedInto(subInterfaceTypeToEntity);
649 return subInterfaceTypeToEntity;
652 private List<PortTemplateConsolidationData> collectAllPortsTemplateConsolidationData(List<String> portIds,
653 String serviceTemplateName,
654 ConsolidationData consolidationData) {
656 FilePortConsolidationData filePortConsolidationData =
657 consolidationData.getPortConsolidationData()
658 .getFilePortConsolidationData(serviceTemplateName);
659 List<PortTemplateConsolidationData> portTemplateConsolidationDataList = new ArrayList<>();
661 for (String portId : portIds) {
662 PortTemplateConsolidationData portTemplateConsolidationData = filePortConsolidationData
663 .getPortTemplateConsolidationData(portId);
664 if (Objects.nonNull(portTemplateConsolidationData)) {
665 portTemplateConsolidationDataList.add(portTemplateConsolidationData);
669 return portTemplateConsolidationDataList;
672 private boolean areWantedPortPropertiesValid(List<String> propertiesToCheck,
673 Predicate<String> condition) {
675 return propertiesToCheck.stream().allMatch(condition);
679 private boolean arePropertiesSimilarBetweenComputeNodeTemplates(
680 ServiceTemplate serviceTemplate,
681 Collection<String> computeNodeTemplateIds,
682 List<String> propertiesThatNeedToBeSimilar) {
684 Map<String, NodeTemplate> idToNodeTemplate =
685 serviceTemplate.getTopology_template().getNode_templates();
687 for (String property : propertiesThatNeedToBeSimilar) {
688 if (!isPropertyValueSimilarBetweenNodeTemplates(property, computeNodeTemplateIds,
696 private boolean isPropertyUsageSimilarBetweenAllNodeTemplates(String propertyToCheck,
697 List<String> entityNodeTemplateIds,
698 Map<String, NodeTemplate> idToNodeTemplate) {
699 NodeTemplate startingNodeTemplate = idToNodeTemplate.get(entityNodeTemplateIds.get(0));
700 if (Objects.isNull(startingNodeTemplate)) {
701 throw new CoreException(
702 new DuplicateResourceIdsInDifferentFilesErrorBuilder(entityNodeTemplateIds.get(0))
706 boolean propertyExistCondition =
707 isPropertyExistInNodeTemplate(propertyToCheck, startingNodeTemplate);
709 for (int i = 1; i < entityNodeTemplateIds.size(); i++) {
710 NodeTemplate currentNodeTemplate = idToNodeTemplate.get(entityNodeTemplateIds.get(i));
711 if (Objects.isNull(currentNodeTemplate)) {
712 throw new CoreException(
713 new DuplicateResourceIdsInDifferentFilesErrorBuilder(entityNodeTemplateIds.get(i))
716 if (propertyExistCondition != isPropertyExistInNodeTemplate(propertyToCheck, currentNodeTemplate)) {
725 private boolean isPropertyValueSimilarBetweenNodeTemplates(String propertyToCheck,
726 Collection<String> entityNodeTemplateIds,
727 Map<String, NodeTemplate> idToNodeTemplate) {
729 Set<Object> propertiesValues = new HashSet<>();
730 Iterator<String> iterator = entityNodeTemplateIds.iterator();
732 handlePropertyValue(propertyToCheck, idToNodeTemplate, propertiesValues, iterator.next());
734 while (iterator.hasNext()) {
735 handlePropertyValue(propertyToCheck, idToNodeTemplate, propertiesValues, iterator.next());
738 return propertiesValues.size() == 1;
741 private void handlePropertyValue(String propertyToCheck,
742 Map<String, NodeTemplate> idToNodeTemplate,
743 Set<Object> propertiesValues, String nodeId) {
744 NodeTemplate startingNodeTemplate = idToNodeTemplate.get(nodeId);
745 if (Objects.isNull(startingNodeTemplate)) {
746 throw new CoreException(
747 new DuplicateResourceIdsInDifferentFilesErrorBuilder(nodeId)
751 addPropertyValue(propertyToCheck, startingNodeTemplate, propertiesValues);
754 private void addPropertyValue(String property,
755 NodeTemplate nodeTemplate,
756 Set<Object> propertiesValues) {
757 propertiesValues.add(
758 isPropertyExistInNodeTemplate(property, nodeTemplate) ? nodeTemplate.getProperties()
759 .get(property) : "");
762 private boolean isPropertyExistInNodeTemplate(String propertyToCheck, NodeTemplate nodeTemplate) {
763 return !(nodeTemplate.getProperties() == null
764 || nodeTemplate.getProperties().get(propertyToCheck) == null);
767 void substitutionServiceTemplateConsolidation(String substituteNodeTemplateId,
768 ServiceTemplate serviceTemplate,
769 ServiceTemplate substitutionServiceTemplate,
770 TranslationContext translationContext) {
772 ConsolidationData consolidationData = translationContext.getConsolidationData();
774 boolean substitutionConsolidationRuleResult =
775 substitutionServiceTemplateConsolidationRule(substitutionServiceTemplate, translationContext);
777 if (substitutionConsolidationRuleResult) {
778 List<UnifiedCompositionData> unifiedCompositionDataList =
779 createSubstitutionUnifiedCompositionDataList(substituteNodeTemplateId, serviceTemplate,
780 substitutionServiceTemplate, consolidationData);
781 unifiedCompositionService
782 .createUnifiedComposition(serviceTemplate, substitutionServiceTemplate, unifiedCompositionDataList,
783 UnifiedCompositionMode.NestedSingleCompute, translationContext);
785 //The node template does not represent unified VFC but complexVFC
786 //Adding the id in the context for fixing connectivity from/to nested non-unified nodes
787 translationContext.addUnifiedNestedNodeTemplateId(ToscaUtil.getServiceTemplateFileName(serviceTemplate),
788 substituteNodeTemplateId, substituteNodeTemplateId);
790 if (!translationContext.isUnifiedHandledServiceTemplate(substitutionServiceTemplate)) {
791 serviceTemplateConsolidation(substitutionServiceTemplate, translationContext);
796 private boolean substitutionServiceTemplateConsolidationRule(ServiceTemplate nestedServiceTemplate,
797 TranslationContext context) {
798 ConsolidationData consolidationData = context.getConsolidationData();
800 return consolidationData.getComputeConsolidationDataHandler().isNumberOfComputeTypesLegal(
801 ToscaUtil.getServiceTemplateFileName(nestedServiceTemplate))
802 && !isThereMoreThanOneNestedLevel(nestedServiceTemplate, context);
805 private boolean isThereMoreThanOneNestedLevel(ServiceTemplate nestedServiceTemplate,
806 TranslationContext context) {
807 FileNestedConsolidationData fileNestedConsolidationData = null;
808 String nestedServiceTemplateName = ToscaUtil.getServiceTemplateFileName(nestedServiceTemplate);
809 if (Objects.isNull(nestedServiceTemplateName)) {
813 NestedConsolidationData nestedConsolidationData = context.getConsolidationData().getNestedConsolidationData();
814 if (Objects.nonNull(nestedConsolidationData)) {
815 fileNestedConsolidationData =
816 nestedConsolidationData.getFileNestedConsolidationData(nestedServiceTemplateName);
819 //Condition to check if there is nested file and if file contains only sub interfaces then
821 return Objects.nonNull(fileNestedConsolidationData) && !ifNestedFileContainsOnlySubInterface(
822 nestedServiceTemplate, context);
825 private boolean ifNestedFileContainsOnlySubInterface(ServiceTemplate serviceTemplate,
826 TranslationContext context) {
827 Map<String, NodeTemplate> nestedNodeTemplateMap =
828 DataModelUtil.getNodeTemplates(serviceTemplate);
830 ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl();
831 Set<Object> nestedHeatFileNames = nestedNodeTemplateMap.entrySet().stream()
832 .filter(entry -> toscaAnalyzerService.isSubstitutableNodeTemplate(entry.getValue())
833 && toscaAnalyzerService
834 .getSubstituteServiceTemplateName(entry.getKey(), entry.getValue()).isPresent())
835 .map(entry -> toscaAnalyzerService
836 .getSubstituteServiceTemplateName(entry.getKey(), entry.getValue()).get())
837 .collect(Collectors.toSet());
839 if (CollectionUtils.isNotEmpty(nestedHeatFileNames)) {
840 for (Object fileName : nestedHeatFileNames) {
841 String heatFileName = context.getNestedHeatFileName().get(String.valueOf(fileName));
843 if (Objects.nonNull(heatFileName)
844 && !ifAllResourceAreSubInterface(context.getTranslatedServiceTemplates()
845 .get(heatFileName).getTopology_template().getNode_templates().values())) {
854 // Method returns true if all of the resource are sub interface
855 private boolean ifAllResourceAreSubInterface(Collection<NodeTemplate> nodeTemplates) {
856 return nodeTemplates.stream().allMatch(nodeTemplate ->
857 ToscaNodeType.CONTRAILV2_VLAN_SUB_INTERFACE.equals(nodeTemplate.getType()));
860 private List<UnifiedCompositionData> createUnifiedCompositionDataList(
861 ServiceTemplate serviceTemplate,
862 ConsolidationData consolidationData,
863 TypeComputeConsolidationData typeComputeConsolidationData) {
865 List<UnifiedCompositionData> unifiedCompositionDataList = new ArrayList<>();
867 for (ComputeTemplateConsolidationData computeTemplateConsolidationData : typeComputeConsolidationData
868 .getAllComputeTemplateConsolidationData()) {
869 UnifiedCompositionData unifiedCompositionData = new UnifiedCompositionData();
870 unifiedCompositionData.setComputeTemplateConsolidationData(computeTemplateConsolidationData);
871 FilePortConsolidationData filePortConsolidationData =
872 consolidationData.getPortConsolidationData().getFilePortConsolidationData(ToscaUtil
873 .getServiceTemplateFileName(serviceTemplate));
874 setUnifiedCompositionDataWithPortTemplateData(computeTemplateConsolidationData, filePortConsolidationData,
875 unifiedCompositionData);
876 unifiedCompositionDataList.add(unifiedCompositionData);
878 return unifiedCompositionDataList;
881 private void setPortTemplateConsolidationData(FilePortConsolidationData filePortConsolidationData,
883 UnifiedCompositionData unifiedCompositionData,
884 List<SubInterfaceTemplateConsolidationData>
885 subInterfaceTemplateConsolidationDataList) {
886 if (Objects.isNull(filePortConsolidationData)) {
889 PortTemplateConsolidationData portTemplateConsolidationData =
890 filePortConsolidationData.getPortTemplateConsolidationData(portId);
891 unifiedCompositionData.addPortTemplateConsolidationData(portTemplateConsolidationData);
892 if (portTemplateConsolidationData != null) {
893 portTemplateConsolidationData.copyFlatInto(subInterfaceTemplateConsolidationDataList);
897 private List<UnifiedCompositionData> createSubstitutionUnifiedCompositionDataList(
898 String substituteNodeTemplateId,
899 ServiceTemplate serviceTemplate,
900 ServiceTemplate substitutionServiceTemplate,
901 ConsolidationData consolidationData) {
902 List<UnifiedCompositionData> unifiedCompositionDataList = new ArrayList<>();
903 FileNestedConsolidationData fileNestedConsolidationData =
904 consolidationData.getNestedConsolidationData()
905 .getFileNestedConsolidationData(ToscaUtil.getServiceTemplateFileName(serviceTemplate));
907 if (Objects.nonNull(fileNestedConsolidationData)) {
908 NestedTemplateConsolidationData nestedTemplateConsolidationData =
909 fileNestedConsolidationData.getNestedTemplateConsolidationData(substituteNodeTemplateId);
910 UnifiedCompositionData unifiedCompositionData = new UnifiedCompositionData();
911 unifiedCompositionData.setNestedTemplateConsolidationData(nestedTemplateConsolidationData);
912 unifiedCompositionDataList.add(unifiedCompositionData);
913 addSubInterfaceDataToNestedCompositionData(substitutionServiceTemplate, consolidationData,
914 unifiedCompositionData);
917 return unifiedCompositionDataList;
920 private void addSubInterfaceDataToNestedCompositionData(ServiceTemplate substitutionServiceTemplate,
921 ConsolidationData consolidationData,
922 UnifiedCompositionData unifiedCompositionData) {
923 FileComputeConsolidationData nestedFileComputeConsolidationData = consolidationData.getComputeConsolidationData()
924 .getFileComputeConsolidationData(ToscaUtil.getServiceTemplateFileName(substitutionServiceTemplate));
925 FilePortConsolidationData nestedFilePortConsolidationData = consolidationData.getPortConsolidationData()
926 .getFilePortConsolidationData(ToscaUtil.getServiceTemplateFileName(substitutionServiceTemplate));
927 if (Objects.isNull(nestedFileComputeConsolidationData)
928 || Objects.isNull(nestedFilePortConsolidationData)) {
931 TypeComputeConsolidationData computeType =
932 nestedFileComputeConsolidationData.getAllTypeComputeConsolidationData().iterator().next();
933 if (Objects.isNull(computeType)) {
936 ComputeTemplateConsolidationData computeTemplateConsolidationData =
937 computeType.getAllComputeTemplateConsolidationData().iterator().next();
938 setUnifiedCompositionDataWithPortTemplateData(computeTemplateConsolidationData, nestedFilePortConsolidationData,
939 unifiedCompositionData);
942 private void setUnifiedCompositionDataWithPortTemplateData(ComputeTemplateConsolidationData
943 computeTemplateConsolidationData,
944 FilePortConsolidationData filePortConsolidationData,
945 UnifiedCompositionData unifiedCompositionData) {
946 Collection<List<String>> portCollection =
947 computeTemplateConsolidationData.getPorts() == null ? Collections.emptyList()
948 : computeTemplateConsolidationData.getPorts().values();
949 List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList = new ArrayList<>();
950 portCollection.stream()
951 .flatMap(Collection::stream)
952 .forEach(portId -> setPortTemplateConsolidationData(filePortConsolidationData, portId,
953 unifiedCompositionData, subInterfaceTemplateConsolidationDataList));
954 unifiedCompositionData.setSubInterfaceTemplateConsolidationDataList(
955 subInterfaceTemplateConsolidationDataList);
958 private boolean consolidationPreCondition(
959 ServiceTemplate serviceTemplate,
960 ConsolidationData consolidationData,
961 TypeComputeConsolidationData typeComputeConsolidationData) {
963 return (isThereMoreThanOneComputeTypeInstance(typeComputeConsolidationData)
964 && isNumberOfPortsEqualsBetweenComputeNodes(typeComputeConsolidationData)
965 && isNumberOfPortFromEachTypeLegal(typeComputeConsolidationData)
966 && isPortTypesEqualsBetweenComputeNodes(typeComputeConsolidationData)
967 && checkGetAttrBetweenConsolidationDataEntitiesNotFromSameType(serviceTemplate,
968 typeComputeConsolidationData, consolidationData)
969 && checkSubInterfaceConsolidationPreCondition(serviceTemplate, consolidationData,
970 typeComputeConsolidationData));
974 private boolean isThereMoreThanOneComputeTypeInstance(
975 TypeComputeConsolidationData typeComputeConsolidationData) {
976 return typeComputeConsolidationData.getAllComputeNodeTemplateIds().size() > 1;
979 private boolean isNumberOfPortsEqualsBetweenComputeNodes(
980 TypeComputeConsolidationData typeComputeConsolidationData) {
981 int startingNumberOfPorts =
982 getNumberOfPortsPerCompute(typeComputeConsolidationData
983 .getAllComputeTemplateConsolidationData().iterator().next());
985 for (ComputeTemplateConsolidationData compute : typeComputeConsolidationData
986 .getAllComputeTemplateConsolidationData()) {
987 if (getNumberOfPortsPerCompute(compute) != startingNumberOfPorts) {
996 private boolean isNumberOfPortFromEachTypeLegal(
997 TypeComputeConsolidationData typeComputeConsolidationData) {
999 Collection<ComputeTemplateConsolidationData> computeTemplateConsolidationDataList =
1000 typeComputeConsolidationData.getAllComputeTemplateConsolidationData();
1002 for (ComputeTemplateConsolidationData computeTemplate : computeTemplateConsolidationDataList) {
1003 Map<String, List<String>> currPortsMap = computeTemplate.getPorts();
1004 if (MapUtils.isEmpty(currPortsMap)) {
1007 for (List<String> portList : currPortsMap.values()) {
1008 if (portList.size() > 1) {
1017 private boolean isPortTypesEqualsBetweenComputeNodes(
1018 TypeComputeConsolidationData typeComputeConsolidationData) {
1019 Set<String> staringPortIds = getPortsIds(
1020 typeComputeConsolidationData.getAllComputeTemplateConsolidationData().iterator().next());
1022 for (ComputeTemplateConsolidationData compute : typeComputeConsolidationData
1023 .getAllComputeTemplateConsolidationData()) {
1024 Set<String> currentPortIds = getPortsIds(compute);
1025 if (!currentPortIds.equals(staringPortIds)) {
1032 private int getNumberOfPortsPerCompute(
1033 ComputeTemplateConsolidationData computeTemplateConsolidationData) {
1034 return getPortsIds(computeTemplateConsolidationData).size();
1037 private Set<String> getPortsIds(
1038 ComputeTemplateConsolidationData computeTemplateConsolidationData) {
1039 return MapUtils.isEmpty(computeTemplateConsolidationData.getPorts()) ? new HashSet<>()
1040 : computeTemplateConsolidationData.getPorts().keySet();
1043 List<String> getPropertiesWithIdenticalVal(UnifiedCompositionEntity entity) {
1046 return getComputePropertiesWithIdenticalVal();
1049 return getComputePropertiesWithIdenticalVal();
1052 return getPortPropertiesWithIdenticalVal();
1055 return new ArrayList<>();
1059 private List<String> getComputePropertiesWithIdenticalVal() {
1060 List<String> propertyWithIdenticalValue = new ArrayList<>();
1061 propertyWithIdenticalValue.add(ToscaConstants.COMPUTE_IMAGE);
1062 propertyWithIdenticalValue.add(ToscaConstants.COMPUTE_FLAVOR);
1063 return propertyWithIdenticalValue;
1066 private List<String> getPortPropertiesWithIdenticalVal() {
1067 List<String> propertiesThatNeedToHaveIdenticalVal = new ArrayList<>();
1068 propertiesThatNeedToHaveIdenticalVal.add(ToscaConstants.PORT_ALLOWED_ADDRESS_PAIRS);
1069 propertiesThatNeedToHaveIdenticalVal.add(ToscaConstants.MAC_ADDRESS);
1071 propertiesThatNeedToHaveIdenticalVal
1072 .addAll(TranslationContext.getEnrichPortResourceProperties());
1074 return propertiesThatNeedToHaveIdenticalVal;
1077 private List<String> getPortPropertiesThatNeedToHaveSameUsage() {
1078 List<String> propertiesThatNeedToHaveSameUsage = new ArrayList<>();
1079 propertiesThatNeedToHaveSameUsage.add(ToscaConstants.PORT_FIXED_IPS);
1080 propertiesThatNeedToHaveSameUsage.add(ToscaConstants.PORT_ALLOWED_ADDRESS_PAIRS);
1081 propertiesThatNeedToHaveSameUsage.add(ToscaConstants.MAC_ADDRESS);
1083 propertiesThatNeedToHaveSameUsage.addAll(TranslationContext.getEnrichPortResourceProperties());
1085 return propertiesThatNeedToHaveSameUsage;