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;
 
  21 import org.apache.commons.collections4.CollectionUtils;
 
  22 import org.apache.commons.collections4.MapUtils;
 
  23 import org.apache.commons.lang3.StringUtils;
 
  24 import org.openecomp.sdc.common.errors.CoreException;
 
  25 import org.openecomp.sdc.tosca.datatypes.ToscaNodeType;
 
  26 import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate;
 
  27 import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate;
 
  28 import org.openecomp.sdc.tosca.services.DataModelUtil;
 
  29 import org.openecomp.sdc.tosca.services.ToscaAnalyzerService;
 
  30 import org.openecomp.sdc.tosca.services.ToscaConstants;
 
  31 import org.openecomp.sdc.tosca.services.ToscaUtil;
 
  32 import org.openecomp.sdc.tosca.services.impl.ToscaAnalyzerServiceImpl;
 
  33 import org.openecomp.sdc.translator.datatypes.heattotosca.TranslationContext;
 
  34 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.UnifiedCompositionData;
 
  35 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.UnifiedCompositionEntity;
 
  36 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.UnifiedCompositionMode;
 
  37 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.ComputeTemplateConsolidationData;
 
  38 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.ConsolidationData;
 
  39 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.EntityConsolidationData;
 
  40 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.FileComputeConsolidationData;
 
  41 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.FileNestedConsolidationData;
 
  42 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.FilePortConsolidationData;
 
  43 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.GetAttrFuncData;
 
  44 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.NestedConsolidationData;
 
  45 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.NestedTemplateConsolidationData;
 
  46 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.PortTemplateConsolidationData;
 
  47 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.RequirementAssignmentData;
 
  48 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.SubInterfaceTemplateConsolidationData;
 
  49 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.TypeComputeConsolidationData;
 
  50 import org.openecomp.sdc.translator.services.heattotosca.errors.DuplicateResourceIdsInDifferentFilesErrorBuilder;
 
  52 import java.util.ArrayList;
 
  53 import java.util.Collection;
 
  54 import java.util.Collections;
 
  55 import java.util.HashMap;
 
  56 import java.util.HashSet;
 
  57 import java.util.Iterator;
 
  58 import java.util.List;
 
  60 import java.util.Objects;
 
  62 import java.util.function.Function;
 
  63 import java.util.function.Predicate;
 
  64 import java.util.stream.Collectors;
 
  66 public class ConsolidationService {
 
  68   private UnifiedCompositionService unifiedCompositionService;
 
  70   public ConsolidationService(UnifiedCompositionService unifiedCompositionService) {
 
  71     this.unifiedCompositionService = unifiedCompositionService;
 
  74   ConsolidationService() {
 
  78   void serviceTemplateConsolidation(ServiceTemplate serviceTemplate,
 
  79                                     TranslationContext translationContext) {
 
  81     ConsolidationData consolidationData = translationContext.getConsolidationData();
 
  83     FileComputeConsolidationData fileComputeConsolidationData =
 
  84         consolidationData.getComputeConsolidationData()
 
  85             .getFileComputeConsolidationData(ToscaUtil.getServiceTemplateFileName(serviceTemplate));
 
  87     if (Objects.isNull(fileComputeConsolidationData)) {
 
  90     for (TypeComputeConsolidationData typeComputeConsolidationData :
 
  91         fileComputeConsolidationData.getAllTypeComputeConsolidationData()) {
 
  92       boolean preConditionResult =
 
  93           consolidationPreCondition(
 
  94               serviceTemplate, consolidationData, typeComputeConsolidationData);
 
  96       List<UnifiedCompositionData> unifiedCompositionDataList =
 
  97           createUnifiedCompositionDataList(
 
  98               serviceTemplate, consolidationData, typeComputeConsolidationData);
 
 100       if (preConditionResult) {
 
 101         boolean consolidationRuleCheckResult =
 
 102             checkConsolidationRules(serviceTemplate, typeComputeConsolidationData,
 
 105         unifiedCompositionService.createUnifiedComposition(
 
 106             serviceTemplate, null, unifiedCompositionDataList,
 
 107             consolidationRuleCheckResult ? UnifiedCompositionMode.ScalingInstances
 
 108                 : UnifiedCompositionMode.CatalogInstance,
 
 111         unifiedCompositionService.createUnifiedComposition(
 
 112             serviceTemplate, null, unifiedCompositionDataList, UnifiedCompositionMode
 
 120   static Map<String, String> getConsolidationEntityIdToType(ServiceTemplate serviceTemplate,
 
 121                                                             ConsolidationData consolidationData) {
 
 122     Map<String, String> consolidationEntityIdToType = new HashMap<>();
 
 124     String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate);
 
 125     FileComputeConsolidationData fileComputeConsolidationData =
 
 126         consolidationData.getComputeConsolidationData()
 
 127             .getFileComputeConsolidationData(serviceTemplateFileName);
 
 128     FilePortConsolidationData filePortConsolidationData =
 
 129         consolidationData.getPortConsolidationData()
 
 130             .getFilePortConsolidationData(serviceTemplateFileName);
 
 131     if (Objects.nonNull(fileComputeConsolidationData)) {
 
 132       for (String computeType : fileComputeConsolidationData.getAllComputeTypes()) {
 
 133         TypeComputeConsolidationData typeComputeConsolidationData =
 
 134             fileComputeConsolidationData.getTypeComputeConsolidationData(computeType);
 
 135         Collection<String> computeNodeTemplateIds =
 
 136             typeComputeConsolidationData.getAllComputeNodeTemplateIds();
 
 137         for (String computeNodeTemplateId : computeNodeTemplateIds) {
 
 138           consolidationEntityIdToType.put(computeNodeTemplateId, computeType);
 
 143     if (Objects.nonNull(filePortConsolidationData)) {
 
 144       Set<String> portNodeTemplateIds = filePortConsolidationData.getAllPortNodeTemplateIds();
 
 145       for (String portNodeTemplateId : portNodeTemplateIds) {
 
 146         consolidationEntityIdToType
 
 147             .put(portNodeTemplateId, ConsolidationDataUtil.getPortType(portNodeTemplateId));
 
 151     return consolidationEntityIdToType;
 
 155   private boolean checkConsolidationRules(ServiceTemplate serviceTemplate,
 
 156                                           TypeComputeConsolidationData typeComputeConsolidationData,
 
 157                                           ConsolidationData consolidationData) {
 
 158     return checkComputeConsolidation(serviceTemplate, typeComputeConsolidationData)
 
 159         && checkPortConsolidation(serviceTemplate, typeComputeConsolidationData,
 
 161         && !checkGetAttrBetweenEntityConsolidationOfTheSameType(serviceTemplate,
 
 162         typeComputeConsolidationData, consolidationData);
 
 165   private boolean checkGetAttrBetweenConsolidationDataEntitiesNotFromSameType(
 
 166       ServiceTemplate serviceTemplate,
 
 167       TypeComputeConsolidationData typeComputeConsolidationData,
 
 168       ConsolidationData consolidationData) {
 
 169     Collection<ComputeTemplateConsolidationData> computeTemplateConsolidationDataList =
 
 170         typeComputeConsolidationData.getAllComputeTemplateConsolidationData();
 
 172     Collection<String> computeNodeTemplateIds =
 
 173         typeComputeConsolidationData.getAllComputeNodeTemplateIds();
 
 175     Map<String, List<String>> portTypeToIds = UnifiedCompositionUtil
 
 176         .collectAllPortsFromEachTypesFromComputes(computeTemplateConsolidationDataList);
 
 179         checkGetAttrOutFromEntityToPortIsLegal(computeTemplateConsolidationDataList, portTypeToIds)
 
 180             && checkGetAttrOutFromPortLegal(ToscaUtil.getServiceTemplateFileName(serviceTemplate),
 
 181             computeNodeTemplateIds, portTypeToIds, consolidationData);
 
 185   private boolean checkGetAttrOutFromPortLegal(String serviceTemplateName,
 
 186                                                Collection<String> computeNodeTemplateIds,
 
 187                                                Map<String, List<String>> portTypeToIds,
 
 188                                                ConsolidationData consolidationData) {
 
 189     for (List<String> portIdsFromSameType : portTypeToIds.values()) {
 
 190       List<PortTemplateConsolidationData> portTemplateConsolidationDataList =
 
 191           collectAllPortsTemplateConsolidationData(portIdsFromSameType, serviceTemplateName,
 
 194       if (!(checkGetAttrOutFromEntityToPortIsLegal(portTemplateConsolidationDataList, portTypeToIds)
 
 195           && checkGetAttrOutFromConsolidationEntityToEntityNotFromSameTypeIsLegal(
 
 196           portTemplateConsolidationDataList,
 
 197           computeNodeTemplateIds))) {
 
 205   private boolean checkGetAttrOutFromEntityToPortIsLegal(Collection entities,
 
 206                                                          Map<String, List<String>> portTypeToIds) {
 
 208     for (String portType : portTypeToIds.keySet()) {
 
 209       if (CollectionUtils.isEmpty(entities)) {
 
 212       Set<GetAttrFuncData> startingGetAttrFunc =
 
 213           getEntityGetAttrFuncAsSet(portType,
 
 214               (EntityConsolidationData) entities.iterator().next());
 
 215       for (Object entity : entities) {
 
 216         EntityConsolidationData currentEntity = (EntityConsolidationData) entity;
 
 217         Set<GetAttrFuncData> currentGetAttrFuncData =
 
 218             getEntityGetAttrFuncAsSet(portType, currentEntity);
 
 219         if (!(startingGetAttrFunc.equals(currentGetAttrFuncData))) {
 
 228   private boolean checkGetAttrOutFromConsolidationEntityToEntityNotFromSameTypeIsLegal(
 
 229       List entityConsolidationDataList,
 
 230       Collection<String> consolidationEntityNodeTemplateIds) {
 
 231     if (CollectionUtils.isEmpty(entityConsolidationDataList)) {
 
 234     EntityConsolidationData startingEntityTemplate =
 
 235         (EntityConsolidationData) entityConsolidationDataList.get(0);
 
 236     Map<String, Set<GetAttrFuncData>> startingGetAttrOutFuncData =
 
 237         getConsolidationEntityGetAttrOutFuncData(startingEntityTemplate.getNodesGetAttrOut(),
 
 238             consolidationEntityNodeTemplateIds);
 
 240     for (int i = 1; i < entityConsolidationDataList.size(); i++) {
 
 241       EntityConsolidationData currentEntityTemplate =
 
 242           (EntityConsolidationData) entityConsolidationDataList.get(i);
 
 243       Map<String, Set<GetAttrFuncData>> currentGetAttrOutFuncData =
 
 244           getConsolidationEntityGetAttrOutFuncData(currentEntityTemplate.getNodesGetAttrOut(),
 
 245               consolidationEntityNodeTemplateIds);
 
 247       if (!isGetAttrRelationToEntitySimilarBetweenEntities(startingGetAttrOutFuncData,
 
 248           currentGetAttrOutFuncData)) {
 
 256   private boolean isGetAttrRelationToEntitySimilarBetweenEntities(
 
 257       Map<String, Set<GetAttrFuncData>> firstMap,
 
 258       Map<String, Set<GetAttrFuncData>> secondMap) {
 
 259     if (MapUtils.isEmpty(firstMap) != MapUtils.isEmpty(secondMap)) {
 
 263     return (MapUtils.isEmpty(firstMap) && MapUtils.isEmpty(secondMap)) ||
 
 264         (new ArrayList<>(firstMap.values()).equals(new ArrayList<>(secondMap.values())));
 
 268   private boolean checkSubInterfaceConsolidationPreCondition(ServiceTemplate serviceTemplate,
 
 269                                                              ConsolidationData consolidationData,
 
 270                                                              TypeComputeConsolidationData typeComputeConsolidationData) {
 
 271     FilePortConsolidationData filePortConsolidationData =
 
 272         consolidationData.getPortConsolidationData()
 
 273             .getFilePortConsolidationData(ToscaUtil.getServiceTemplateFileName(serviceTemplate));
 
 275     if (Objects.isNull(filePortConsolidationData)) {
 
 279     Map<String, List<String>> portTypeToPortIds = UnifiedCompositionUtil
 
 280         .collectAllPortsFromEachTypesFromComputes(
 
 281             typeComputeConsolidationData.getAllComputeTemplateConsolidationData());
 
 283     Collection<String> computeNodeTemplateIds =
 
 284         typeComputeConsolidationData.getAllComputeNodeTemplateIds();
 
 286     for (List<String> portIdsFromSameType : portTypeToPortIds.values()) {
 
 287       List<PortTemplateConsolidationData> portTemplateConsolidationDataList =
 
 288           getAllPortTemplateConsolidationData(portIdsFromSameType, filePortConsolidationData);
 
 290       if (!areSubInterfacePreConditionRulesValid(portTypeToPortIds, computeNodeTemplateIds,
 
 291           portTemplateConsolidationDataList, portTemplateConsolidationDataList.get(0))) {
 
 298   private boolean areSubInterfacePreConditionRulesValid(Map<String, List<String>> portTypeToPortIds,
 
 299                                                         Collection<String> computeNodeTemplateIds,
 
 300                                                         List<PortTemplateConsolidationData> portTemplateConsolidationDataList,
 
 301                                                          PortTemplateConsolidationData subInterfaceConsolidationData) {
 
 302     return areSubInterfaceTypesSimilarBetweenPorts(portTemplateConsolidationDataList,
 
 303         subInterfaceConsolidationData)
 
 304         && isNumberOfSubInterfacesPerTypeSimilar(portTemplateConsolidationDataList,
 
 305         subInterfaceConsolidationData)
 
 306         && isGetAttrFromSubInterfaceToOtherEntitiesLegal(computeNodeTemplateIds,
 
 307         portTypeToPortIds, portTemplateConsolidationDataList);
 
 310   private boolean isGetAttrFromSubInterfaceToOtherEntitiesLegal(
 
 311       Collection<String> computeNodeTemplateIds,
 
 312       Map<String, List<String>> portTypeToPortIds,
 
 313       List<PortTemplateConsolidationData> portTemplateConsolidationDataList) {
 
 315     ListMultimap<String, SubInterfaceTemplateConsolidationData> subInterfacesFromSameTypeFromPorts =
 
 316         collectAllSubInterfacesFromSameTypeFromPorts(portTemplateConsolidationDataList);
 
 318     List<SubInterfaceTemplateConsolidationData> subInterfaceList = new ArrayList<>(subInterfacesFromSameTypeFromPorts
 
 320     return areGetAttrRelationshipsBetweenSubInterfaceToConsolidationEntitiesValid(
 
 321         computeNodeTemplateIds, portTypeToPortIds, portTemplateConsolidationDataList, subInterfaceList);
 
 324   private boolean areGetAttrRelationshipsBetweenSubInterfaceToConsolidationEntitiesValid(
 
 325       Collection<String> computeNodeTemplateIds, Map<String, List<String>> portTypeToPortIds,
 
 326       List<PortTemplateConsolidationData> portTemplateConsolidationDataList,
 
 327       List<SubInterfaceTemplateConsolidationData> subInterfaceList) {
 
 328     return checkGetAttrOutFromEntityToPortIsLegal(subInterfaceList, portTypeToPortIds)
 
 329         && checkGetAttrOutFromConsolidationEntityToEntityNotFromSameTypeIsLegal(
 
 330         portTemplateConsolidationDataList, getSubInterfaceIdsFromSameType(subInterfaceList))
 
 331         && checkGetAttrOutFromConsolidationEntityToEntityNotFromSameTypeIsLegal(
 
 332         subInterfaceList, computeNodeTemplateIds);
 
 335   private boolean areSubInterfaceTypesSimilarBetweenPorts(
 
 336       List<PortTemplateConsolidationData> portTemplateConsolidationDataList,
 
 337       PortTemplateConsolidationData subInterfaceConsolidationData) {
 
 339     return portTemplateConsolidationDataList.stream().allMatch(
 
 340         element -> element.hasSameSubInterfaceTypes(subInterfaceConsolidationData));
 
 343   private boolean isNumberOfSubInterfacesPerTypeSimilar(
 
 344       List<PortTemplateConsolidationData> portTemplateConsolidationDataList,
 
 345       PortTemplateConsolidationData subInterfaceConsolidationData) {
 
 347     return portTemplateConsolidationDataList.stream()
 
 348         .allMatch(element -> element.isNumberOfSubInterfacesPerTypeSimilar(subInterfaceConsolidationData));
 
 352   private Set<GetAttrFuncData> getEntityGetAttrFuncAsSet(
 
 354       EntityConsolidationData entityConsolidationData) {
 
 356     Set<GetAttrFuncData> getAttrFuncDataFromPortsWithSameType = new HashSet<>();
 
 357     Map<String, List<GetAttrFuncData>> nodesGetAttrOut =
 
 358         entityConsolidationData.getNodesGetAttrOut();
 
 360     if (MapUtils.isEmpty(nodesGetAttrOut)) {
 
 361       return getAttrFuncDataFromPortsWithSameType;
 
 364     for (Map.Entry<String, List<GetAttrFuncData>> entry : nodesGetAttrOut.entrySet()) {
 
 365       if (portType.equals(ConsolidationDataUtil.getPortType(entry.getKey()))) {
 
 366         getAttrFuncDataFromPortsWithSameType.addAll(entry.getValue());
 
 370     return getAttrFuncDataFromPortsWithSameType;
 
 373   private Map<String, Set<GetAttrFuncData>> getConsolidationEntityGetAttrOutFuncData(
 
 374       Map<String, List<GetAttrFuncData>> nodesGetAttrOut,
 
 375       Collection<String> computeNodeTemplateIds) {
 
 376     Map<String, Set<GetAttrFuncData>> computeGetAttrFuncData = new HashMap<>();
 
 378     if (MapUtils.isEmpty(nodesGetAttrOut)) {
 
 379       return computeGetAttrFuncData;
 
 382     for (Map.Entry<String, List<GetAttrFuncData>> getAttrFuncEntry : nodesGetAttrOut.entrySet()) {
 
 383       if (computeNodeTemplateIds.contains(getAttrFuncEntry.getKey())) {
 
 384         computeGetAttrFuncData.put(getAttrFuncEntry.getKey(), new HashSet<>(getAttrFuncEntry
 
 389     return computeGetAttrFuncData;
 
 392   private boolean checkGetAttrBetweenEntityConsolidationOfTheSameType(
 
 393       ServiceTemplate serviceTemplate,
 
 394       TypeComputeConsolidationData typeComputeConsolidationData,
 
 395       ConsolidationData consolidationData) {
 
 396     return areThereGetAttrRelationsBetweenComputesOfSameType(typeComputeConsolidationData)
 
 397         || areThereGetAttrRelationsBetweenPortsOfTheSameType(serviceTemplate,
 
 398         typeComputeConsolidationData, consolidationData);
 
 402   private boolean areThereGetAttrRelationsBetweenComputesOfSameType(
 
 403       TypeComputeConsolidationData typeComputeConsolidationData) {
 
 405     Collection<ComputeTemplateConsolidationData> computeTemplateConsolidationEntities =
 
 406         typeComputeConsolidationData.getAllComputeTemplateConsolidationData();
 
 407     Collection<String> computeNodeTemplateIds =
 
 408         typeComputeConsolidationData.getAllComputeNodeTemplateIds();
 
 410     return checkGetAttrRelationsForEntityConsolidationData(
 
 411         computeTemplateConsolidationEntities, computeNodeTemplateIds,
 
 412         EntityConsolidationData::getNodesGetAttrIn);
 
 415   private boolean areThereGetAttrRelationsBetweenPortsOfTheSameType(
 
 416       ServiceTemplate serviceTemplate,
 
 417       TypeComputeConsolidationData typeComputeConsolidationData,
 
 418       ConsolidationData consolidationData) {
 
 420     Collection<ComputeTemplateConsolidationData> computeTemplateConsolidationEntities =
 
 421         typeComputeConsolidationData.getAllComputeTemplateConsolidationData();
 
 422     Map<String, List<String>> portTypeToPortIds = UnifiedCompositionUtil
 
 423         .collectAllPortsFromEachTypesFromComputes(computeTemplateConsolidationEntities);
 
 425     FilePortConsolidationData filePortConsolidationData =
 
 426         consolidationData.getPortConsolidationData().getFilePortConsolidationData(ToscaUtil
 
 427             .getServiceTemplateFileName(serviceTemplate));
 
 429     for (List<String> portsOfTheSameTypeIds : portTypeToPortIds.values()) {
 
 430       List<PortTemplateConsolidationData> portTemplateConsolidationDataOfSameType =
 
 431           getAllPortTemplateConsolidationData(portsOfTheSameTypeIds, filePortConsolidationData);
 
 432       if (!checkGetAttrRelationsForEntityConsolidationData(portTemplateConsolidationDataOfSameType,
 
 433           portsOfTheSameTypeIds, EntityConsolidationData::getNodesGetAttrIn)) {
 
 441   private boolean areThereGetAttrRelationsBetweenSubInterfacesOfSameType(
 
 442       List<String> subInterfacesIdsFromSameType,
 
 443       List<SubInterfaceTemplateConsolidationData> subInterfaceList) {
 
 445     return checkGetAttrRelationsForEntityConsolidationData(subInterfaceList,
 
 446         subInterfacesIdsFromSameType, EntityConsolidationData::getNodesGetAttrIn)
 
 447         || checkGetAttrRelationsForEntityConsolidationData(subInterfaceList,
 
 448         subInterfacesIdsFromSameType, EntityConsolidationData::getNodesGetAttrOut);
 
 452   private List<PortTemplateConsolidationData> getAllPortTemplateConsolidationData(
 
 453       List<String> portsIds,
 
 454       FilePortConsolidationData filePortConsolidationData) {
 
 455     List<PortTemplateConsolidationData> portTemplateConsolidationDataOfSameType = new ArrayList<>();
 
 457     for (String portId : portsIds) {
 
 458       PortTemplateConsolidationData portTemplateConsolidationData =
 
 459           filePortConsolidationData.getPortTemplateConsolidationData(portId);
 
 460       if (Objects.nonNull(portTemplateConsolidationData)) {
 
 461         portTemplateConsolidationDataOfSameType.add(portTemplateConsolidationData);
 
 465     return portTemplateConsolidationDataOfSameType;
 
 468   private boolean checkGetAttrRelationsForEntityConsolidationData(Collection entities,
 
 469                                                                   Collection<String> nodeTemplateIdsOfTheSameType,
 
 470                                                                   Function<EntityConsolidationData, Map<String, List<GetAttrFuncData>>> getAttrValuesMethod) {
 
 471     for (Object entity : entities) {
 
 472       Map<String, List<GetAttrFuncData>> getAttrValue =
 
 473           getAttrValuesMethod.apply((EntityConsolidationData) entity);
 
 474       Set<String> getAttrNodeIds =
 
 475           getAttrValue == null ? new HashSet<>()
 
 476               : getAttrValue.keySet();
 
 477       if (getAttrNodeIds.stream().anyMatch(nodeTemplateIdsOfTheSameType::contains)) {
 
 485   private boolean checkComputeConsolidation(
 
 486       ServiceTemplate serviceTemplate,
 
 487       TypeComputeConsolidationData typeComputeConsolidationData) {
 
 488     Collection<String> computeNodeTemplateIds =
 
 489         typeComputeConsolidationData.getAllComputeNodeTemplateIds();
 
 490     List<String> propertiesWithIdenticalVal = getComputePropertiesWithIdenticalVal();
 
 492     return arePropertiesSimilarBetweenComputeNodeTemplates(serviceTemplate, computeNodeTemplateIds,
 
 493         propertiesWithIdenticalVal)
 
 494         && checkComputeRelations(
 
 495         typeComputeConsolidationData.getAllComputeTemplateConsolidationData());
 
 499   private boolean checkComputeRelations(
 
 500       Collection<ComputeTemplateConsolidationData> computeTemplateConsolidationEntities) {
 
 502     return checkEntityConsolidationDataRelations(computeTemplateConsolidationEntities)
 
 503         && checkComputesRelationsToVolume(computeTemplateConsolidationEntities);
 
 506   private boolean checkEntityConsolidationDataRelations(Collection entities) {
 
 507     EntityConsolidationData startingEntity = (EntityConsolidationData) entities.iterator().next();
 
 509     for (Object entity : entities) {
 
 510       EntityConsolidationData currentEntity = (EntityConsolidationData) entity;
 
 511       if (!(checkNodesConnectedInRelations(startingEntity, currentEntity)
 
 512           && (checkNodesConnectedOutRelations(startingEntity, currentEntity))
 
 513           && (checkGroupIdsRelations(startingEntity, currentEntity)))) {
 
 520   private boolean checkNodesConnectedInRelations(EntityConsolidationData firstEntity,
 
 521                                                  EntityConsolidationData secondEntity) {
 
 522     return compareNodeConnectivity(firstEntity.getNodesConnectedIn(),
 
 523         secondEntity.getNodesConnectedIn());
 
 526   private boolean checkNodesConnectedOutRelations(EntityConsolidationData firstEntity,
 
 527                                                   EntityConsolidationData secondEntity) {
 
 528     return compareNodeConnectivity(firstEntity.getNodesConnectedOut(),
 
 529         secondEntity.getNodesConnectedOut());
 
 532   private boolean compareNodeConnectivity(
 
 533       Map<String, List<RequirementAssignmentData>> firstEntityMap,
 
 534       Map<String, List<RequirementAssignmentData>> secondEntityMap) {
 
 536     if (MapUtils.isEmpty(firstEntityMap)
 
 537         && MapUtils.isEmpty(secondEntityMap)) {
 
 540     return !MapUtils.isEmpty(firstEntityMap) && !MapUtils.isEmpty(secondEntityMap)
 
 541         && firstEntityMap.keySet().equals(secondEntityMap.keySet());
 
 544   private boolean checkGroupIdsRelations(EntityConsolidationData startingEntity,
 
 545                                          EntityConsolidationData currentEntity) {
 
 546     return CollectionUtils.isEmpty(startingEntity.getGroupIds())
 
 547         && CollectionUtils.isEmpty(currentEntity.getGroupIds())
 
 548         || startingEntity.getGroupIds().equals(currentEntity.getGroupIds());
 
 552   private boolean checkComputesRelationsToVolume(
 
 553       Collection<ComputeTemplateConsolidationData> computeTemplateConsolidationEntities) {
 
 554     Iterator<ComputeTemplateConsolidationData> iterator =
 
 555         computeTemplateConsolidationEntities.iterator();
 
 557     Map<String, List<RequirementAssignmentData>> startingVolumes =
 
 558         iterator.next().getVolumes();
 
 560     for (ComputeTemplateConsolidationData compute : computeTemplateConsolidationEntities) {
 
 561       Map<String, List<RequirementAssignmentData>> currentVolumes =
 
 562           compute.getVolumes();
 
 563       if (!compareNodeConnectivity(startingVolumes, currentVolumes)) {
 
 571   private boolean checkPortConsolidation(ServiceTemplate serviceTemplate,
 
 572                                          TypeComputeConsolidationData typeComputeConsolidationData,
 
 573                                          ConsolidationData consolidationData) {
 
 574     return validateWantedPortProperties(serviceTemplate,
 
 575         typeComputeConsolidationData)
 
 576         && checkPortRelations(ToscaUtil.getServiceTemplateFileName(serviceTemplate),
 
 577         typeComputeConsolidationData, consolidationData);
 
 581   private boolean validateWantedPortProperties(ServiceTemplate serviceTemplate,
 
 582                                                TypeComputeConsolidationData typeComputeConsolidationData) {
 
 584     Collection<ComputeTemplateConsolidationData> computeTemplateConsolidationDataCollection =
 
 585         typeComputeConsolidationData.getAllComputeTemplateConsolidationData();
 
 586     Map<String, List<String>> portTypeToIds = UnifiedCompositionUtil
 
 587         .collectAllPortsFromEachTypesFromComputes(computeTemplateConsolidationDataCollection);
 
 588     List<String> propertiesWithIdenticalVal = getPortPropertiesWithIdenticalVal();
 
 589     List<String> propertiesThatNeedToHaveSameUsage =
 
 590         getPortPropertiesThatNeedToHaveSameUsage();
 
 592     for (List<String> portsIds : portTypeToIds.values()) {
 
 593       if (!arePortPropertiesValid(serviceTemplate, propertiesWithIdenticalVal,
 
 594           propertiesThatNeedToHaveSameUsage, portsIds)) {
 
 602   private boolean arePortPropertiesValid(ServiceTemplate serviceTemplate,
 
 603                                          List<String> propertiesWithIdenticalVal,
 
 604                                          List<String> propertiesThatNeedToHaveSameUsage,
 
 605                                          List<String> portsIds) {
 
 606     Map<String, NodeTemplate> nodeTemplates =
 
 607         serviceTemplate.getTopology_template().getNode_templates();
 
 609     Predicate<String> similar = property ->
 
 610         isPropertyValueSimilarBetweenNodeTemplates(property,
 
 611             portsIds, nodeTemplates);
 
 613     Predicate<String> exists = property ->
 
 614         isPropertyUsageSimilarBetweenAllNodeTemplates(property,
 
 615             portsIds, nodeTemplates);
 
 617     return areWantedPortPropertiesValid(
 
 618         propertiesWithIdenticalVal, similar)
 
 619         && areWantedPortPropertiesValid(
 
 620         propertiesThatNeedToHaveSameUsage, exists);
 
 623   private boolean checkPortRelations(String serviceTemplateName,
 
 624                                      TypeComputeConsolidationData typeComputeConsolidationData,
 
 625                                      ConsolidationData consolidationData) {
 
 626     Collection<ComputeTemplateConsolidationData> computeTemplateConsolidationDataCollection =
 
 627         typeComputeConsolidationData.getAllComputeTemplateConsolidationData();
 
 628     Map<String, List<String>> portTypeToIds = UnifiedCompositionUtil
 
 629         .collectAllPortsFromEachTypesFromComputes(computeTemplateConsolidationDataCollection);
 
 631     for (List<String> portIds : portTypeToIds.values()) {
 
 632       List<PortTemplateConsolidationData> portTemplateConsolidationDataList =
 
 633           collectAllPortsTemplateConsolidationData(
 
 634               portIds, serviceTemplateName, consolidationData);
 
 636       if (!checkEntityConsolidationDataRelations(portTemplateConsolidationDataList)
 
 637           || !checkSubInterfaceRules(portTemplateConsolidationDataList)) {
 
 645   private boolean checkSubInterfaceRules(List<PortTemplateConsolidationData>
 
 646                                              portTemplateConsolidationDataList) {
 
 647     ListMultimap<String, SubInterfaceTemplateConsolidationData> subInterfaceTypeToEntity =
 
 648         collectAllSubInterfacesFromSameTypeFromPorts(portTemplateConsolidationDataList);
 
 649     List<SubInterfaceTemplateConsolidationData> subInterfaceList = new ArrayList<>(subInterfaceTypeToEntity.values());
 
 650     return areSubInterfacePropertiesAndRelationsValid(subInterfaceList);
 
 653   private boolean areSubInterfacePropertiesAndRelationsValid(
 
 654       List<SubInterfaceTemplateConsolidationData> subInterfaceList) {
 
 655     return isResourceGroupPropertiesSimilarBetweenSubPorts(subInterfaceList)
 
 656         && checkSubInterfaceRelations(subInterfaceList)
 
 657         && !areThereGetAttrRelationsBetweenSubInterfacesOfSameType(
 
 658         getSubInterfaceIdsFromSameType(subInterfaceList), subInterfaceList);
 
 661   private boolean checkSubInterfaceRelations(List<SubInterfaceTemplateConsolidationData>
 
 663     return CollectionUtils.isEmpty(subInterfaceList)
 
 664         || checkEntityConsolidationDataRelations(subInterfaceList);
 
 667   private boolean isResourceGroupPropertiesSimilarBetweenSubPorts(
 
 668       List<SubInterfaceTemplateConsolidationData> subInterfaceList) {
 
 669     if (CollectionUtils.isEmpty(subInterfaceList)) {
 
 673     SubInterfaceTemplateConsolidationData startingSubInterface = subInterfaceList.get(0);
 
 674     for (SubInterfaceTemplateConsolidationData subInterface : subInterfaceList) {
 
 675       if (!startingSubInterface.getResourceGroupCount().equals(subInterface.getResourceGroupCount())
 
 676           || !StringUtils.equals(startingSubInterface.getNetworkRole(), subInterface.getNetworkRole())) {
 
 684   private List<String> getSubInterfaceIdsFromSameType(List<SubInterfaceTemplateConsolidationData>
 
 686     if (CollectionUtils.isEmpty(subInterfaceList)) {
 
 687       return new ArrayList<>();
 
 690     return subInterfaceList.stream().map(SubInterfaceTemplateConsolidationData::getNodeTemplateId)
 
 691         .collect(Collectors.toList());
 
 694   private ListMultimap<String, SubInterfaceTemplateConsolidationData> collectAllSubInterfacesFromSameTypeFromPorts(
 
 695       List<PortTemplateConsolidationData> portTemplateConsolidationDataList) {
 
 696     ListMultimap<String, SubInterfaceTemplateConsolidationData>  subInterfaceTypeToEntity = ArrayListMultimap.create();
 
 697     for (PortTemplateConsolidationData portTemplateConsolidationData : portTemplateConsolidationDataList) {
 
 698       portTemplateConsolidationData.copyMappedInto(subInterfaceTypeToEntity);
 
 701     return subInterfaceTypeToEntity;
 
 704   private List<PortTemplateConsolidationData> collectAllPortsTemplateConsolidationData(List<String> portIds,
 
 705                                                                                        String serviceTemplateName,
 
 706                                                                                        ConsolidationData consolidationData) {
 
 708     FilePortConsolidationData filePortConsolidationData =
 
 709         consolidationData.getPortConsolidationData()
 
 710             .getFilePortConsolidationData(serviceTemplateName);
 
 711     List<PortTemplateConsolidationData> portTemplateConsolidationDataList = new ArrayList<>();
 
 713     for (String portId : portIds) {
 
 714       PortTemplateConsolidationData portTemplateConsolidationData = filePortConsolidationData
 
 715           .getPortTemplateConsolidationData(portId);
 
 716       if (Objects.nonNull(portTemplateConsolidationData)) {
 
 717         portTemplateConsolidationDataList.add(portTemplateConsolidationData);
 
 721     return portTemplateConsolidationDataList;
 
 724   private boolean areWantedPortPropertiesValid(List<String> propertiesToCheck,
 
 725                                                Predicate<String> condition) {
 
 727     return propertiesToCheck.stream().allMatch(condition);
 
 731   private boolean arePropertiesSimilarBetweenComputeNodeTemplates(
 
 732       ServiceTemplate serviceTemplate,
 
 733       Collection<String> computeNodeTemplateIds,
 
 734       List<String> propertiesThatNeedToBeSimilar) {
 
 736     Map<String, NodeTemplate> idToNodeTemplate =
 
 737         serviceTemplate.getTopology_template().getNode_templates();
 
 739     for (String property : propertiesThatNeedToBeSimilar) {
 
 740       if (!isPropertyValueSimilarBetweenNodeTemplates(property, computeNodeTemplateIds,
 
 748   private boolean isPropertyUsageSimilarBetweenAllNodeTemplates(String propertyToCheck,
 
 749                                                                 List<String> entityNodeTemplateIds,
 
 750                                                                 Map<String, NodeTemplate> idToNodeTemplate) {
 
 751     NodeTemplate startingNodeTemplate = idToNodeTemplate.get(entityNodeTemplateIds.get(0));
 
 752     if (Objects.isNull(startingNodeTemplate)) {
 
 753       throw new CoreException(
 
 754           new DuplicateResourceIdsInDifferentFilesErrorBuilder(entityNodeTemplateIds.get(0))
 
 758     boolean propertyExistCondition =
 
 759         isPropertyExistInNodeTemplate(propertyToCheck, startingNodeTemplate);
 
 761     for (int i = 1; i < entityNodeTemplateIds.size(); i++) {
 
 762       NodeTemplate currentNodeTemplate = idToNodeTemplate.get(entityNodeTemplateIds.get(i));
 
 763       if (Objects.isNull(currentNodeTemplate)) {
 
 764         throw new CoreException(
 
 765             new DuplicateResourceIdsInDifferentFilesErrorBuilder(entityNodeTemplateIds.get(i))
 
 768       if (propertyExistCondition != isPropertyExistInNodeTemplate(propertyToCheck, currentNodeTemplate)) {
 
 777   private boolean isPropertyValueSimilarBetweenNodeTemplates(String propertyToCheck,
 
 778                                                              Collection<String> entityNodeTemplateIds,
 
 779                                                              Map<String, NodeTemplate> idToNodeTemplate) {
 
 781     Set<Object> propertiesValues = new HashSet<>();
 
 782     Iterator<String> iterator = entityNodeTemplateIds.iterator();
 
 784     handlePropertyValue(propertyToCheck, idToNodeTemplate, propertiesValues, iterator.next());
 
 786     while (iterator.hasNext()) {
 
 787       handlePropertyValue(propertyToCheck, idToNodeTemplate, propertiesValues, iterator.next());
 
 790     return propertiesValues.size() == 1;
 
 793   private void handlePropertyValue(String propertyToCheck,
 
 794                                    Map<String, NodeTemplate> idToNodeTemplate,
 
 795                                    Set<Object> propertiesValues, String nodeId) {
 
 796     NodeTemplate startingNodeTemplate = idToNodeTemplate.get(nodeId);
 
 797     if (Objects.isNull(startingNodeTemplate)) {
 
 798       throw new CoreException(
 
 799           new DuplicateResourceIdsInDifferentFilesErrorBuilder(nodeId)
 
 803     addPropertyValue(propertyToCheck, startingNodeTemplate, propertiesValues);
 
 806   private void addPropertyValue(String property,
 
 807                                 NodeTemplate nodeTemplate,
 
 808                                 Set<Object> propertiesValues) {
 
 809     propertiesValues.add(
 
 810         isPropertyExistInNodeTemplate(property, nodeTemplate) ? nodeTemplate.getProperties()
 
 811             .get(property) : "");
 
 814   private boolean isPropertyExistInNodeTemplate(String propertyToCheck, NodeTemplate nodeTemplate) {
 
 815     return !(nodeTemplate.getProperties() == null
 
 816        || nodeTemplate.getProperties().get(propertyToCheck) == null);
 
 819   void substitutionServiceTemplateConsolidation(String substituteNodeTemplateId,
 
 820                                                 ServiceTemplate serviceTemplate,
 
 821                                                 ServiceTemplate substitutionServiceTemplate,
 
 822                                                 TranslationContext translationContext) {
 
 824     ConsolidationData consolidationData = translationContext.getConsolidationData();
 
 826     FileComputeConsolidationData fileComputeConsolidationData =
 
 827         translationContext.getConsolidationData().getComputeConsolidationData()
 
 828             .getFileComputeConsolidationData(
 
 829                 ToscaUtil.getServiceTemplateFileName(substitutionServiceTemplate));
 
 830     boolean substitutionConsolidationRuleResult =
 
 831         substitutionServiceTemplateConsolidationRule(substitutionServiceTemplate,
 
 832             fileComputeConsolidationData, translationContext);
 
 834     if (substitutionConsolidationRuleResult) {
 
 835       List<UnifiedCompositionData> unifiedCompositionDataList =
 
 836           createSubstitutionUnifiedCompositionDataList(substituteNodeTemplateId,
 
 837               serviceTemplate, substitutionServiceTemplate, consolidationData);
 
 838       unifiedCompositionService
 
 839           .createUnifiedComposition(serviceTemplate, substitutionServiceTemplate,
 
 840               unifiedCompositionDataList, UnifiedCompositionMode.NestedSingleCompute,
 
 843       //The node template does not represent unified VFC but complexVFC
 
 844       //Adding the id in the context for fixing connectivity from/to nested non-unified nodes
 
 845       translationContext.addUnifiedNestedNodeTemplateId(ToscaUtil
 
 846               .getServiceTemplateFileName(serviceTemplate),
 
 847           substituteNodeTemplateId, substituteNodeTemplateId);
 
 849       if (!translationContext.isUnifiedHandledServiceTemplate(substitutionServiceTemplate)) {
 
 850         serviceTemplateConsolidation(substitutionServiceTemplate, translationContext);
 
 855   private boolean substitutionServiceTemplateConsolidationRule(
 
 856       ServiceTemplate nestedServiceTemplate,
 
 857       FileComputeConsolidationData fileComputeConsolidationData,
 
 858       TranslationContext context) {
 
 860     return Objects.nonNull(fileComputeConsolidationData)
 
 861         && isNumberOfComputeTypesLegal(fileComputeConsolidationData)
 
 862         && isNumberOfComputeConsolidationDataPerTypeLegal(
 
 863         fileComputeConsolidationData.getAllTypeComputeConsolidationData().iterator().next())
 
 864         && !isThereMoreThanOneNestedLevel(nestedServiceTemplate, context);
 
 867   private boolean isNumberOfComputeTypesLegal(
 
 868       FileComputeConsolidationData fileComputeConsolidationData) {
 
 869     return fileComputeConsolidationData.getAllTypeComputeConsolidationData().size() == 1;
 
 872   private boolean isNumberOfComputeConsolidationDataPerTypeLegal(
 
 873       TypeComputeConsolidationData typeComputeConsolidationData) {
 
 874     return typeComputeConsolidationData.getAllComputeTemplateConsolidationData().size() == 1;
 
 877   private boolean isThereMoreThanOneNestedLevel(ServiceTemplate nestedServiceTemplate,
 
 878                                                 TranslationContext context) {
 
 879     FileNestedConsolidationData fileNestedConsolidationData = null;
 
 880     String nestedServiceTemplateName = ToscaUtil.getServiceTemplateFileName(nestedServiceTemplate);
 
 881     if (Objects.isNull(nestedServiceTemplateName)) {
 
 885     NestedConsolidationData nestedConsolidationData = context.getConsolidationData()
 
 886                                                                 .getNestedConsolidationData();
 
 887     if (Objects.nonNull(nestedConsolidationData)) {
 
 888       fileNestedConsolidationData =
 
 889           nestedConsolidationData.getFileNestedConsolidationData(nestedServiceTemplateName);
 
 892     //Condition to check if there is nested file and if file contains only sub interfaces then
 
 894     return Objects.nonNull(fileNestedConsolidationData)
 
 895         && !ifNestedFileContainsOnlySubInterface(nestedServiceTemplate, context);
 
 898   private boolean ifNestedFileContainsOnlySubInterface(ServiceTemplate serviceTemplate,
 
 899                                                        TranslationContext context) {
 
 900     Map<String, NodeTemplate> nestedNodeTemplateMap =
 
 901         DataModelUtil.getNodeTemplates(serviceTemplate);
 
 903     ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl();
 
 904     Set<Object> nestedHeatFileNames = nestedNodeTemplateMap.entrySet().stream()
 
 905         .filter(entry -> toscaAnalyzerService.isSubstitutableNodeTemplate(entry.getValue())
 
 906         && toscaAnalyzerService
 
 907             .getSubstituteServiceTemplateName(entry.getKey(), entry.getValue()).isPresent())
 
 908         .map(entry -> toscaAnalyzerService
 
 909             .getSubstituteServiceTemplateName(entry.getKey(), entry.getValue()).get())
 
 910         .collect(Collectors.toSet());
 
 912     if (CollectionUtils.isNotEmpty(nestedHeatFileNames)) {
 
 913       for (Object fileName : nestedHeatFileNames) {
 
 914         String heatFileName = context.getNestedHeatFileName().get(String.valueOf(fileName));
 
 916         if (Objects.nonNull(heatFileName)
 
 917               && !ifAllResourceAreSubInterface(context.getTranslatedServiceTemplates()
 
 918                     .get(heatFileName).getTopology_template().getNode_templates().values())) {
 
 927   // Method returns true if all of the resource are sub interface
 
 928   private boolean ifAllResourceAreSubInterface(Collection<NodeTemplate> nodeTemplates) {
 
 929     return nodeTemplates.stream().allMatch(nodeTemplate ->
 
 930         ToscaNodeType.CONTRAILV2_VLAN_SUB_INTERFACE.equals(nodeTemplate.getType()));
 
 933   private List<UnifiedCompositionData> createUnifiedCompositionDataList(
 
 934       ServiceTemplate serviceTemplate,
 
 935       ConsolidationData consolidationData,
 
 936       TypeComputeConsolidationData typeComputeConsolidationData) {
 
 938     List<UnifiedCompositionData> unifiedCompositionDataList = new ArrayList<>();
 
 940     for (ComputeTemplateConsolidationData computeTemplateConsolidationData : typeComputeConsolidationData
 
 941         .getAllComputeTemplateConsolidationData()) {
 
 942       UnifiedCompositionData unifiedCompositionData = new UnifiedCompositionData();
 
 943       unifiedCompositionData.setComputeTemplateConsolidationData(computeTemplateConsolidationData);
 
 944       FilePortConsolidationData filePortConsolidationData =
 
 945           consolidationData.getPortConsolidationData().getFilePortConsolidationData(ToscaUtil
 
 946               .getServiceTemplateFileName(serviceTemplate));
 
 947       setUnifiedCompositionDataWithPortTemplateData(computeTemplateConsolidationData, filePortConsolidationData,
 
 948           unifiedCompositionData);
 
 949       unifiedCompositionDataList.add(unifiedCompositionData);
 
 951     return unifiedCompositionDataList;
 
 954   private void setPortTemplateConsolidationData(FilePortConsolidationData filePortConsolidationData,
 
 956                                                 UnifiedCompositionData unifiedCompositionData,
 
 957                                                 List<SubInterfaceTemplateConsolidationData>
 
 958                                                                  subInterfaceTemplateConsolidationDataList) {
 
 959     if (Objects.isNull(filePortConsolidationData)) {
 
 962     PortTemplateConsolidationData portTemplateConsolidationData =
 
 963         filePortConsolidationData.getPortTemplateConsolidationData(portId);
 
 964     unifiedCompositionData.addPortTemplateConsolidationData(portTemplateConsolidationData);
 
 965     if (portTemplateConsolidationData != null) {
 
 966       portTemplateConsolidationData.copyFlatInto(subInterfaceTemplateConsolidationDataList);
 
 970   private List<UnifiedCompositionData> createSubstitutionUnifiedCompositionDataList(
 
 971       String substituteNodeTemplateId,
 
 972       ServiceTemplate serviceTemplate,
 
 973       ServiceTemplate substitutionServiceTemplate,
 
 974       ConsolidationData consolidationData) {
 
 975     List<UnifiedCompositionData> unifiedCompositionDataList = new ArrayList<>();
 
 976     FileNestedConsolidationData fileNestedConsolidationData =
 
 977         consolidationData.getNestedConsolidationData()
 
 978             .getFileNestedConsolidationData(ToscaUtil.getServiceTemplateFileName(serviceTemplate));
 
 980     if (Objects.nonNull(fileNestedConsolidationData)) {
 
 981       NestedTemplateConsolidationData nestedTemplateConsolidationData =
 
 982           fileNestedConsolidationData.getNestedTemplateConsolidationData(substituteNodeTemplateId);
 
 983       UnifiedCompositionData unifiedCompositionData = new UnifiedCompositionData();
 
 984       unifiedCompositionData.setNestedTemplateConsolidationData(nestedTemplateConsolidationData);
 
 985       unifiedCompositionDataList.add(unifiedCompositionData);
 
 986       addSubInterfaceDataToNestedCompositionData(substitutionServiceTemplate, consolidationData,
 
 987           unifiedCompositionData);
 
 990     return unifiedCompositionDataList;
 
 993   private void addSubInterfaceDataToNestedCompositionData(ServiceTemplate substitutionServiceTemplate,
 
 994                                                           ConsolidationData consolidationData,
 
 995                                                           UnifiedCompositionData unifiedCompositionData) {
 
 996     FileComputeConsolidationData nestedFileComputeConsolidationData = consolidationData.getComputeConsolidationData()
 
 997         .getFileComputeConsolidationData(ToscaUtil.getServiceTemplateFileName(substitutionServiceTemplate));
 
 998     FilePortConsolidationData nestedFilePortConsolidationData = consolidationData.getPortConsolidationData()
 
 999         .getFilePortConsolidationData(ToscaUtil.getServiceTemplateFileName(substitutionServiceTemplate));
 
1000     if (Objects.isNull(nestedFileComputeConsolidationData)
 
1001         || Objects.isNull(nestedFilePortConsolidationData)) {
 
1004     TypeComputeConsolidationData computeType =
 
1005         nestedFileComputeConsolidationData.getAllTypeComputeConsolidationData().iterator().next();
 
1006     if (Objects.isNull(computeType)) {
 
1009     ComputeTemplateConsolidationData computeTemplateConsolidationData =
 
1010         computeType.getAllComputeTemplateConsolidationData().iterator().next();
 
1011     setUnifiedCompositionDataWithPortTemplateData(computeTemplateConsolidationData, nestedFilePortConsolidationData,
 
1012         unifiedCompositionData);
 
1015   private void setUnifiedCompositionDataWithPortTemplateData(ComputeTemplateConsolidationData
 
1016                                                                  computeTemplateConsolidationData,
 
1017                                                              FilePortConsolidationData filePortConsolidationData,
 
1018                                                              UnifiedCompositionData unifiedCompositionData) {
 
1019     Collection<List<String>> portCollection =
 
1020         computeTemplateConsolidationData.getPorts() == null ? Collections.emptyList()
 
1021             : computeTemplateConsolidationData.getPorts().values();
 
1022     List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList = new ArrayList<>();
 
1023     portCollection.stream()
 
1024         .flatMap(Collection::stream)
 
1025         .forEach(portId -> setPortTemplateConsolidationData(filePortConsolidationData, portId,
 
1026             unifiedCompositionData, subInterfaceTemplateConsolidationDataList));
 
1027     unifiedCompositionData.setSubInterfaceTemplateConsolidationDataList(
 
1028         subInterfaceTemplateConsolidationDataList);
 
1031   private boolean consolidationPreCondition(
 
1032       ServiceTemplate serviceTemplate,
 
1033       ConsolidationData consolidationData,
 
1034       TypeComputeConsolidationData typeComputeConsolidationData) {
 
1036     return (isThereMoreThanOneComputeTypeInstance(typeComputeConsolidationData)
 
1037         && isNumberOfPortsEqualsBetweenComputeNodes(typeComputeConsolidationData)
 
1038         && isNumberOfPortFromEachTypeLegal(typeComputeConsolidationData)
 
1039         && isPortTypesEqualsBetweenComputeNodes(typeComputeConsolidationData)
 
1040         && checkGetAttrBetweenConsolidationDataEntitiesNotFromSameType(serviceTemplate,
 
1041         typeComputeConsolidationData, consolidationData)
 
1042         && checkSubInterfaceConsolidationPreCondition(serviceTemplate, consolidationData,
 
1043         typeComputeConsolidationData));
 
1047   private boolean isThereMoreThanOneComputeTypeInstance(
 
1048       TypeComputeConsolidationData typeComputeConsolidationData) {
 
1049     return typeComputeConsolidationData.getAllComputeNodeTemplateIds().size() > 1;
 
1052   private boolean isNumberOfPortsEqualsBetweenComputeNodes(
 
1053       TypeComputeConsolidationData typeComputeConsolidationData) {
 
1054     int startingNumberOfPorts =
 
1055         getNumberOfPortsPerCompute(typeComputeConsolidationData
 
1056             .getAllComputeTemplateConsolidationData().iterator().next());
 
1058     for (ComputeTemplateConsolidationData compute : typeComputeConsolidationData
 
1059         .getAllComputeTemplateConsolidationData()) {
 
1060       if (getNumberOfPortsPerCompute(compute) != startingNumberOfPorts) {
 
1069   private boolean isNumberOfPortFromEachTypeLegal(
 
1070       TypeComputeConsolidationData typeComputeConsolidationData) {
 
1072     Collection<ComputeTemplateConsolidationData> computeTemplateConsolidationDataList =
 
1073         typeComputeConsolidationData.getAllComputeTemplateConsolidationData();
 
1075     for (ComputeTemplateConsolidationData computeTemplate : computeTemplateConsolidationDataList) {
 
1076       Map<String, List<String>> currPortsMap = computeTemplate.getPorts();
 
1077       if (MapUtils.isEmpty(currPortsMap)) {
 
1080       for (List<String> portList : currPortsMap.values()) {
 
1081         if (portList.size() > 1) {
 
1090   private boolean isPortTypesEqualsBetweenComputeNodes(
 
1091       TypeComputeConsolidationData typeComputeConsolidationData) {
 
1092     Set<String> staringPortIds = getPortsIds(
 
1093         typeComputeConsolidationData.getAllComputeTemplateConsolidationData().iterator().next());
 
1095     for (ComputeTemplateConsolidationData compute : typeComputeConsolidationData
 
1096         .getAllComputeTemplateConsolidationData()) {
 
1097       Set<String> currentPortIds = getPortsIds(compute);
 
1098       if (!currentPortIds.equals(staringPortIds)) {
 
1105   private int getNumberOfPortsPerCompute(
 
1106       ComputeTemplateConsolidationData computeTemplateConsolidationData) {
 
1107     return getPortsIds(computeTemplateConsolidationData).size();
 
1110   private Set<String> getPortsIds(
 
1111       ComputeTemplateConsolidationData computeTemplateConsolidationData) {
 
1112     return MapUtils.isEmpty(computeTemplateConsolidationData.getPorts()) ? new HashSet<>()
 
1113         : computeTemplateConsolidationData.getPorts().keySet();
 
1116   List<String> getPropertiesWithIdenticalVal(UnifiedCompositionEntity entity) {
 
1119         return getComputePropertiesWithIdenticalVal();
 
1122         return getComputePropertiesWithIdenticalVal();
 
1125         return getPortPropertiesWithIdenticalVal();
 
1128         return new ArrayList<>();
 
1132   private List<String> getComputePropertiesWithIdenticalVal() {
 
1133     List<String> propertyWithIdenticalValue = new ArrayList<>();
 
1134     propertyWithIdenticalValue.add(ToscaConstants.COMPUTE_IMAGE);
 
1135     propertyWithIdenticalValue.add(ToscaConstants.COMPUTE_FLAVOR);
 
1136     return propertyWithIdenticalValue;
 
1139   private List<String> getPortPropertiesWithIdenticalVal() {
 
1140     List<String> propertiesThatNeedToHaveIdenticalVal = new ArrayList<>();
 
1141     propertiesThatNeedToHaveIdenticalVal.add(ToscaConstants.PORT_ALLOWED_ADDRESS_PAIRS);
 
1142     propertiesThatNeedToHaveIdenticalVal.add(ToscaConstants.MAC_ADDRESS);
 
1144     propertiesThatNeedToHaveIdenticalVal
 
1145         .addAll(TranslationContext.getEnrichPortResourceProperties());
 
1147     return propertiesThatNeedToHaveIdenticalVal;
 
1150   private List<String> getPortPropertiesThatNeedToHaveSameUsage() {
 
1151     List<String> propertiesThatNeedToHaveSameUsage = new ArrayList<>();
 
1152     propertiesThatNeedToHaveSameUsage.add(ToscaConstants.PORT_FIXED_IPS);
 
1153     propertiesThatNeedToHaveSameUsage.add(ToscaConstants.PORT_ALLOWED_ADDRESS_PAIRS);
 
1154     propertiesThatNeedToHaveSameUsage.add(ToscaConstants.MAC_ADDRESS);
 
1156     propertiesThatNeedToHaveSameUsage.addAll(TranslationContext.getEnrichPortResourceProperties());
 
1158     return propertiesThatNeedToHaveSameUsage;