2  * ============LICENSE_START=======================================================
 
   4  * ================================================================================
 
   5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
 
   6  * ================================================================================
 
   7  * Licensed under the Apache License, Version 2.0 (the "License");
 
   8  * you may not use this file except in compliance with the License.
 
   9  * You may obtain a copy of the License at
 
  11  *      http://www.apache.org/licenses/LICENSE-2.0
 
  13  * Unless required by applicable law or agreed to in writing, software
 
  14  * distributed under the License is distributed on an "AS IS" BASIS,
 
  15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  16  * See the License for the specific language governing permissions and
 
  17  * limitations under the License.
 
  18  * ============LICENSE_END=========================================================
 
  21 package org.openecomp.sdc.translator;
 
  23 import org.apache.commons.collections4.CollectionUtils;
 
  24 import org.apache.commons.lang3.tuple.Pair;
 
  25 import org.junit.Assert;
 
  26 import org.openecomp.core.translator.api.HeatToToscaTranslator;
 
  27 import org.openecomp.core.utilities.file.FileUtils;
 
  28 import org.openecomp.sdc.common.utils.SdcCommon;
 
  29 import org.openecomp.sdc.tosca.datatypes.ToscaServiceModel;
 
  30 import org.openecomp.sdc.tosca.datatypes.model.GroupDefinition;
 
  31 import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate;
 
  32 import org.openecomp.sdc.tosca.datatypes.model.RequirementAssignment;
 
  33 import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate;
 
  34 import org.openecomp.sdc.tosca.services.DataModelUtil;
 
  35 import org.openecomp.sdc.tosca.services.yamlutil.ToscaExtensionYamlUtil;
 
  36 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.*;
 
  39 import java.io.FileInputStream;
 
  40 import java.io.FileNotFoundException;
 
  41 import java.io.IOException;
 
  42 import java.io.InputStream;
 
  44 import java.nio.file.NotDirectoryException;
 
  47 public class TestUtils {
 
  48   private static final String MANIFEST_NAME = SdcCommon.MANIFEST_NAME;
 
  49   private static String zipFilename = "VSP.zip";
 
  50   private static String validationFilename = "validationOutput.json";
 
  56   public static void addFilesToTranslator(HeatToToscaTranslator heatToToscaTranslator, String path)
 
  58     File manifestFile = new File(path);
 
  59     File[] files = manifestFile.listFiles();
 
  62     Assert.assertNotNull("manifest files is empty", files);
 
  64     for (File file : files) {
 
  66       try (FileInputStream fis = new FileInputStream(file)) {
 
  68         fileContent = FileUtils.toByteArray(fis);
 
  70         if (file.getName().equals(MANIFEST_NAME)) {
 
  71           heatToToscaTranslator.addManifest(MANIFEST_NAME, fileContent);
 
  73           if (!file.getName().equals(zipFilename) && (!file.getName().equals(validationFilename))) {
 
  74             heatToToscaTranslator.addFile(file.getName(), fileContent);
 
  82    * Get tosca service template models for the files in a directory
 
  83    * @param baseDirPath base directory for the tosca file
 
  84    * @return Map of <ServiceTemplateFilename, ServiceTemplate> for the files in this directory
 
  86   public static Map<String, ServiceTemplate> getServiceTemplates(String baseDirPath){
 
  87     Map<String, ServiceTemplate> serviceTemplateMap = new HashMap<>();
 
  88     ToscaExtensionYamlUtil toscaExtensionYamlUtil = new ToscaExtensionYamlUtil();
 
  89     baseDirPath = "."+baseDirPath+"/";
 
  91       String[] fileList = {};
 
  92       URL filesDirUrl = TestUtils.class.getClassLoader().getResource(baseDirPath);
 
  93       if (filesDirUrl != null && filesDirUrl.getProtocol().equals("file")) {
 
  94         fileList = new File(filesDirUrl.toURI()).list();
 
  96         Assert.fail("Invalid expected output files directory");
 
  98       for (int i = 0; i < fileList.length; i++) {
 
  99         InputStream serviceTemplateInputStream = FileUtils.getFileInputStream(TestUtils.class
 
 100             .getClassLoader().getResource(baseDirPath + fileList[i]));
 
 101         ServiceTemplate serviceTemplate = toscaExtensionYamlUtil.yamlToObject
 
 102             (serviceTemplateInputStream, ServiceTemplate.class);
 
 103         serviceTemplateMap.put(fileList[i], serviceTemplate);
 
 105     } catch (Exception e) {
 
 106       Assert.fail(e.getMessage());
 
 108     return serviceTemplateMap;
 
 112    * Get tosca service template models
 
 113    * @param expectedResultMap Map of filename and payload of the expected result files
 
 114    * @return Map of <ServiceTemplateFilename, ServiceTemplate> for the files in this directory
 
 116   public static Map<String, ServiceTemplate> getServiceTemplates(Map<String, byte[]>
 
 118     Map<String, ServiceTemplate> serviceTemplateMap = new HashMap<>();
 
 119     ToscaExtensionYamlUtil toscaExtensionYamlUtil = new ToscaExtensionYamlUtil();
 
 120     for(String fileName : expectedResultMap.keySet()){
 
 121       ServiceTemplate serviceTemplate = toscaExtensionYamlUtil.yamlToObject
 
 122           (new String(expectedResultMap.get(fileName)), ServiceTemplate.class);
 
 123       serviceTemplateMap.put(fileName, serviceTemplate);
 
 125     return serviceTemplateMap;
 
 129   public static ToscaServiceModel loadToscaServiceModel(String serviceTemplatesPath,
 
 130                                                         String globalServiceTemplatesPath,
 
 131                                                         String entryDefinitionServiceTemplate)
 
 133     ToscaExtensionYamlUtil toscaExtensionYamlUtil = new ToscaExtensionYamlUtil();
 
 134     Map<String, ServiceTemplate> serviceTemplates = new HashMap<>();
 
 135     if (entryDefinitionServiceTemplate == null) {
 
 136       entryDefinitionServiceTemplate = "MainServiceTemplate.yaml";
 
 139     serviceTemplates = getServiceTemplates(serviceTemplatesPath);
 
 140     if (globalServiceTemplatesPath != null) {
 
 141       serviceTemplates = getServiceTemplates(globalServiceTemplatesPath);
 
 144     return new ToscaServiceModel(null, serviceTemplates, entryDefinitionServiceTemplate);
 
 147   public static ServiceTemplate loadServiceTemplate(String serviceTemplatePath)
 
 149     ServiceTemplate serviceTemplateFromYaml = new ServiceTemplate();
 
 150     ToscaExtensionYamlUtil toscaExtensionYamlUtil = new ToscaExtensionYamlUtil();
 
 151     URL urlFile = TestUtils.class.getResource(serviceTemplatePath);
 
 152     if (urlFile != null) {
 
 153       File pathFile = new File(urlFile.getFile());
 
 154       File[] files = pathFile.listFiles();
 
 155       for (File file : files) {
 
 156         try (InputStream yamlFile = new FileInputStream(file)) {
 
 157           serviceTemplateFromYaml =
 
 158               toscaExtensionYamlUtil.yamlToObject(yamlFile, ServiceTemplate.class);
 
 159           createConcreteRequirementObjectsInServiceTemplate(serviceTemplateFromYaml, toscaExtensionYamlUtil);
 
 162           } catch (IOException ignore) {
 
 164         } catch (FileNotFoundException e) {
 
 166         } catch (IOException e) {
 
 171       throw new NotDirectoryException(serviceTemplatePath);
 
 173     return serviceTemplateFromYaml;
 
 177   public static void loadServiceTemplates(String serviceTemplatesPath,
 
 178                                           ToscaExtensionYamlUtil toscaExtensionYamlUtil,
 
 179                                           Map<String, ServiceTemplate> serviceTemplates)
 
 181     URL urlFile = TestUtils.class.getResource(serviceTemplatesPath);
 
 182     if (urlFile != null) {
 
 183       File pathFile = new File(urlFile.getFile());
 
 184       File[] files = pathFile.listFiles();
 
 186         addServiceTemplateFiles(serviceTemplates, files, toscaExtensionYamlUtil);
 
 188         throw new NotDirectoryException(serviceTemplatesPath);
 
 191       throw new NotDirectoryException(serviceTemplatesPath);
 
 195   private static void addServiceTemplateFiles(Map<String, ServiceTemplate> serviceTemplates,
 
 197                                               ToscaExtensionYamlUtil toscaExtensionYamlUtil)
 
 199     for (File file : files) {
 
 200       try (InputStream yamlFile = new FileInputStream(file)) {
 
 201         ServiceTemplate serviceTemplateFromYaml =
 
 202             toscaExtensionYamlUtil.yamlToObject(yamlFile, ServiceTemplate.class);
 
 203         createConcreteRequirementObjectsInServiceTemplate(serviceTemplateFromYaml, toscaExtensionYamlUtil);
 
 204         serviceTemplates.put(file.getName(), serviceTemplateFromYaml);
 
 207         } catch (IOException ignore) {
 
 209       } catch (FileNotFoundException e) {
 
 211       } catch (IOException e) {
 
 217   private static void createConcreteRequirementObjectsInServiceTemplate(ServiceTemplate
 
 218                                                                           serviceTemplateFromYaml,
 
 219                                                                       ToscaExtensionYamlUtil
 
 220                                                                           toscaExtensionYamlUtil) {
 
 222     if (serviceTemplateFromYaml == null
 
 223         || serviceTemplateFromYaml.getTopology_template() == null
 
 224         || serviceTemplateFromYaml.getTopology_template().getNode_templates() == null) {
 
 228     //Creating concrete objects
 
 229     Map<String, NodeTemplate> nodeTemplates =
 
 230         serviceTemplateFromYaml.getTopology_template().getNode_templates();
 
 231     for (Map.Entry<String, NodeTemplate> entry : nodeTemplates.entrySet()) {
 
 232       NodeTemplate nodeTemplate = entry.getValue();
 
 233       List<Map<String, RequirementAssignment>> requirements = nodeTemplate.getRequirements();
 
 234       List<Map<String, RequirementAssignment>> concreteRequirementList = new ArrayList<>();
 
 235       if (requirements != null) {
 
 236         ListIterator<Map<String, RequirementAssignment>> reqListIterator = requirements
 
 238         while (reqListIterator.hasNext()){
 
 239           Map<String, RequirementAssignment> requirement = reqListIterator.next();
 
 240           Map<String, RequirementAssignment> concreteRequirement = new HashMap<>();
 
 241           for (Map.Entry<String, RequirementAssignment> reqEntry : requirement.entrySet()) {
 
 242             RequirementAssignment requirementAssignment = (toscaExtensionYamlUtil
 
 243                 .yamlToObject(toscaExtensionYamlUtil.objectToYaml(reqEntry.getValue()),
 
 244                     RequirementAssignment.class));
 
 245             concreteRequirement.put(reqEntry.getKey(), requirementAssignment);
 
 246             concreteRequirementList.add(concreteRequirement);
 
 247             reqListIterator.remove();
 
 250         requirements.clear();
 
 251         requirements.addAll(concreteRequirementList);
 
 252         nodeTemplate.setRequirements(requirements);
 
 254       System.out.println();
 
 255       //toscaExtensionYamlUtil.yamlToObject(nodeTemplate, NodeTemplate.class);
 
 259   public static void updateMultiplePortConsolidationDatas(String serviceTemplateName,
 
 260                                                           List<String> portNodeTemplateIds,
 
 261                                                           List<List<String>> nodesConnectedInIds,
 
 262                                                           List<List<String>> nodesConnectedOutIds,
 
 263                                                           List<List<String>> groupIds,
 
 264                                                           List<List<String>> getAttrInIds,
 
 265                                                           List<List<Pair<String, GetAttrFuncData>>> getAttrOutFuncDataList,
 
 266                                                           ConsolidationData consolidationData){
 
 267     for(int i = 0; i < portNodeTemplateIds.size(); i++){
 
 268       updatePortConsolidationData(serviceTemplateName, portNodeTemplateIds.get(i),
 
 269           nodesConnectedInIds.get(i), nodesConnectedOutIds.get(i),
 
 270           groupIds.get(i), getAttrInIds.get(i),getAttrOutFuncDataList.get(i), consolidationData);
 
 274   public static void updatePortConsolidationData(String serviceTemplateFileName,
 
 275                                                  String portNodeTemplateId,
 
 276                                                  List<String> nodesConnectedInIds,
 
 277                                                  List<String> nodesConnectedOutIds,
 
 278                                                  List<String> groupIds, List<String> getAttrInIds,
 
 279                                                  List<Pair<String, GetAttrFuncData>> getAttrOutFuncDataList,
 
 280                                                  ConsolidationData consolidationData) {
 
 282     PortTemplateConsolidationData portTemplateConsolidationData =
 
 283         createPortTemplateConsolidationData(portNodeTemplateId);
 
 285     updateRelationsForEntityConsolidationData(portNodeTemplateId, nodesConnectedInIds,
 
 286         nodesConnectedOutIds, groupIds, getAttrInIds, getAttrOutFuncDataList, portTemplateConsolidationData);
 
 288     consolidationData.getPortConsolidationData()
 
 289         .getFilePortConsolidationData(serviceTemplateFileName)
 
 290         .setPortTemplateConsolidationData(portNodeTemplateId, portTemplateConsolidationData);
 
 293   public static PortTemplateConsolidationData createPortTemplateConsolidationData(
 
 294       String portNodeTemplateId) {
 
 295     PortTemplateConsolidationData portTemplateConsolidationData =
 
 296         new PortTemplateConsolidationData();
 
 297     portTemplateConsolidationData.setNodeTemplateId(portNodeTemplateId);
 
 298     return portTemplateConsolidationData;
 
 301   public static void initPortConsolidationData(String serviceTemplateFileName,
 
 302                                                ConsolidationData consolidationData) {
 
 304     consolidationData.getPortConsolidationData()
 
 305         .setFilePortConsolidationData(serviceTemplateFileName, new FilePortConsolidationData());
 
 308   public static void updateComputeTemplateConsolidationData(String serviceTemplateFileName,
 
 309                                                             String computeNodeTypeName,
 
 310                                                             String computeNodeTemplateId,
 
 311                                                             List<String> nodeIdsConnectedIn,
 
 312                                                             List<String> nodeIdsConnectedOut,
 
 313                                                             List<String> volumeIds,
 
 314                                                             List<String> groupIds,
 
 315                                                             List<String> getAttrInIds,
 
 316                                                             List<Pair<String, GetAttrFuncData>> getAttrOutIds,
 
 317                                                             List<Pair<String, String>> portTypeToIdList,
 
 318                                                             ConsolidationData consolidationData) {
 
 320     initComputeNodeTemplateIdInConsolidationData(serviceTemplateFileName, computeNodeTypeName,
 
 321         computeNodeTemplateId, consolidationData);
 
 323     Map<String, List<RequirementAssignmentData>> volumes =
 
 324         consolidationData.getComputeConsolidationData().getFileComputeConsolidationData
 
 325             (serviceTemplateFileName).getTypeComputeConsolidationData(computeNodeTypeName)
 
 326             .getComputeTemplateConsolidationData(computeNodeTemplateId).getVolumes();
 
 328     ComputeTemplateConsolidationData computeTemplateConsolidationData =
 
 329         createComputeTemplateConsolidationData(computeNodeTemplateId, portTypeToIdList, volumes);
 
 331     updateRelationsForEntityConsolidationData(computeNodeTemplateId, nodeIdsConnectedIn,
 
 332         nodeIdsConnectedOut, groupIds, getAttrInIds, getAttrOutIds, computeTemplateConsolidationData);
 
 334     updateVolumes(computeTemplateConsolidationData, volumeIds);
 
 336     consolidationData.getComputeConsolidationData()
 
 337         .getFileComputeConsolidationData(serviceTemplateFileName)
 
 338         .getTypeComputeConsolidationData(computeNodeTypeName)
 
 339         .setComputeTemplateConsolidationData(computeNodeTemplateId,
 
 340             computeTemplateConsolidationData);
 
 343   private static void updateRelationsForEntityConsolidationData(String entityNodeTemplateId,
 
 344                                                                 List<String> nodeIdsConnectedIn,
 
 345                                                                 List<String> nodeIdsConnectedOut,
 
 346                                                                 List<String> groupIds,
 
 347                                                                 List<String> getAttrInIds,
 
 348                                                                 List<Pair<String, GetAttrFuncData>> getAttrOutFuncDataList,
 
 349                                                                 EntityConsolidationData entity) {
 
 350     updateRelationsIn(entity, nodeIdsConnectedIn);
 
 351     updateRelationsOut(entity, entityNodeTemplateId, nodeIdsConnectedOut);
 
 352     updateGetAttrIn(entity, getAttrInIds);
 
 353     updateGetAttrOut(entity, getAttrOutFuncDataList);
 
 354     entity.setGroupIds(groupIds);
 
 357   public static void initComputeNodeTemplateIdInConsolidationData(String serviceTemplateFileName,
 
 358                                                                    String computeNodeTypeName,
 
 359                                                                    String computeNodeTemplateId,
 
 360                                                                    ConsolidationData consolidationData) {
 
 362     if(Objects.isNull(consolidationData.getComputeConsolidationData().getFileComputeConsolidationData
 
 363         (serviceTemplateFileName))) {
 
 364       consolidationData.getComputeConsolidationData().setFileComputeConsolidationData
 
 365           (serviceTemplateFileName, new FileComputeConsolidationData());
 
 367     TypeComputeConsolidationData typeComputeConsolidationData =
 
 368         consolidationData.getComputeConsolidationData().getFileComputeConsolidationData
 
 369             (serviceTemplateFileName).getTypeComputeConsolidationData(computeNodeTypeName);
 
 372         typeComputeConsolidationData.getComputeTemplateConsolidationData(computeNodeTemplateId) == null) {
 
 374       consolidationData.getComputeConsolidationData()
 
 375           .getFileComputeConsolidationData(serviceTemplateFileName)
 
 376           .getTypeComputeConsolidationData(computeNodeTypeName)
 
 377           .setComputeTemplateConsolidationData(computeNodeTemplateId, new ComputeTemplateConsolidationData());
 
 382   public static void updateNestedConsolidationData(String serviceTemplateName,
 
 383                                                    List<String> substitutionNodeTemplateIds,
 
 384                                                    ConsolidationData consolidationData){
 
 385     if(Objects.isNull(consolidationData.getNestedConsolidationData())){
 
 386       consolidationData.setNestedConsolidationData(new NestedConsolidationData());
 
 389     FileNestedConsolidationData fileNestedConsolidationData = new FileNestedConsolidationData();
 
 390     for(String substitutionNodeTemplateId : substitutionNodeTemplateIds) {
 
 391       NestedTemplateConsolidationData nestedTemplateConsolidationData = new NestedTemplateConsolidationData();
 
 392       nestedTemplateConsolidationData.setNodeTemplateId(substitutionNodeTemplateId);
 
 393       fileNestedConsolidationData.setNestedTemplateConsolidationData(substitutionNodeTemplateId, nestedTemplateConsolidationData);
 
 395     consolidationData.getNestedConsolidationData().setFileNestedConsolidationData(serviceTemplateName, fileNestedConsolidationData);
 
 398   public static ComputeTemplateConsolidationData createComputeTemplateConsolidationData(String computeNodeTemplateId,
 
 399                                                                                         List<Pair<String, String>> portTypeToIdList,
 
 400                                                                                         Map<String,List<RequirementAssignmentData>> volumes) {
 
 401     ComputeTemplateConsolidationData compute = new ComputeTemplateConsolidationData();
 
 402     compute.setNodeTemplateId(computeNodeTemplateId);
 
 403     if (portTypeToIdList != null) {
 
 404       for (Pair<String, String> port : portTypeToIdList) {
 
 405         compute.addPort(port.getLeft(), port.getRight());
 
 408     compute.setVolumes(volumes);
 
 412   public static void updateRelationsIn(EntityConsolidationData entity,
 
 413                                        List<String> idsPontingTome){
 
 414     if(CollectionUtils.isEmpty(idsPontingTome)){
 
 418     for(String pointingId : idsPontingTome){
 
 419       entity.addNodesConnectedIn(pointingId, entity.getNodeTemplateId(), new RequirementAssignment());
 
 423   public static void updateRelationsOut(EntityConsolidationData entity,
 
 424                                         String nodeTemplateId,
 
 425                                         List<String> idsToUpdate){
 
 426     if(CollectionUtils.isEmpty(idsToUpdate)){
 
 430     for(String id : idsToUpdate){
 
 431       entity.addNodesConnectedOut(id, id, new RequirementAssignment());
 
 435   public static void updateGetAttrIn(EntityConsolidationData entity,
 
 436                                      List<String> idsToUpdate){
 
 437     if(CollectionUtils.isEmpty(idsToUpdate)){
 
 441     for(String id : idsToUpdate){
 
 442       entity.addNodesGetAttrIn(id, new GetAttrFuncData());
 
 446   public static void updateGetAttrOut(EntityConsolidationData entity,
 
 447                                       List<Pair<String, GetAttrFuncData>> getAttrOutIds){
 
 448     if(CollectionUtils.isEmpty(getAttrOutIds)){
 
 452     for(Pair<String, GetAttrFuncData> getAttrOutFunc : getAttrOutIds){
 
 453       entity.addNodesGetAttrOut(getAttrOutFunc.getLeft(), getAttrOutFunc.getRight());
 
 457   public static void updateVolumes(ComputeTemplateConsolidationData compute,
 
 458                                    List<String> volumeIds){
 
 459     if(CollectionUtils.isEmpty(volumeIds)){
 
 463     for(String id : volumeIds){
 
 464       RequirementAssignment requirementAssignment = new RequirementAssignment();
 
 465       requirementAssignment.setNode(id);
 
 466       compute.addVolume(id, requirementAssignment);
 
 470   public static void initComputeNodeTypeInConsolidationData(String serviceTemplateFileName,
 
 471                                                             String computeNodeTypeName,
 
 472                                                             ConsolidationData consolidationData) {
 
 473     ComputeConsolidationData computeConsolidationData =
 
 474         consolidationData.getComputeConsolidationData();
 
 475     if (!computeConsolidationData.getAllServiceTemplateFileNames()
 
 476         .contains(serviceTemplateFileName)) {
 
 477       computeConsolidationData
 
 478           .setFileComputeConsolidationData(serviceTemplateFileName,
 
 479               new FileComputeConsolidationData());
 
 481     computeConsolidationData
 
 482         .getFileComputeConsolidationData(serviceTemplateFileName).setTypeComputeConsolidationData(
 
 483         computeNodeTypeName, new TypeComputeConsolidationData());
 
 486   public static Map<String, List<RequirementAssignmentData>> getNodeConnectedOutList(
 
 487       NodeTemplate nodeTemplate, String requirementKey) {
 
 488     Map<String, List<RequirementAssignmentData>> requirementAssignmentDataMap = new HashMap<>();
 
 489     Optional<List<RequirementAssignmentData>> requirementAssignmentDataList =
 
 490         TestUtils.createRequirementAssignmentDataList(nodeTemplate, requirementKey);
 
 491     if (requirementAssignmentDataList.isPresent()) {
 
 492       for (RequirementAssignmentData requirementAssignmentData : requirementAssignmentDataList
 
 494         String connectedNodeTemplateId = requirementAssignmentData.getRequirementAssignment()
 
 496         requirementAssignmentDataMap
 
 497             .computeIfAbsent(connectedNodeTemplateId, k -> new ArrayList<>());
 
 498         requirementAssignmentDataMap.get(connectedNodeTemplateId).add(requirementAssignmentData);
 
 501     return requirementAssignmentDataMap;
 
 504   public static void updatePortsInComputeTemplateConsolidationData(
 
 505       List<Pair<String, String>> portIdToTypeList, ComputeTemplateConsolidationData
 
 507     compute.setPorts(new HashMap<>());
 
 508     for(Pair<String, String> portIdToType : portIdToTypeList){
 
 509       compute.getPorts().putIfAbsent(portIdToType.getLeft(), new ArrayList<>());
 
 510       compute.getPorts().get(portIdToType.getLeft()).add(portIdToType.getRight());
 
 514   public static Map<String, List<RequirementAssignmentData>> getNodeConnectedInList(
 
 515       String sourceNodeTemplateId,
 
 516       ServiceTemplate serviceTemplate, String requirementKey) {
 
 517     Optional<List<RequirementAssignmentData>> requirementAssignmentDataList = Optional.empty();
 
 518     List<RequirementAssignmentData> assignmentDataList = new ArrayList<>();
 
 519     Map<String, List<RequirementAssignmentData>> requirementAssignmentDataMap = new HashMap<>();
 
 520     Map<String, NodeTemplate> nodeTemplates = serviceTemplate.getTopology_template()
 
 521         .getNode_templates();
 
 522     for (Map.Entry<String, NodeTemplate> entry : nodeTemplates.entrySet()) {
 
 523       String nodeTemplateId = entry.getKey();
 
 524       List<Map<String, RequirementAssignment>> requirements = entry.getValue().getRequirements();
 
 525       if (requirements != null) {
 
 526         for (Map<String, RequirementAssignment> requirement : requirements) {
 
 527           if (requirement.get(requirementKey) != null) {
 
 528             RequirementAssignment requirementAssignment = requirement.get(requirementKey);
 
 529             if (requirementAssignment != null) {
 
 530               if (requirementAssignment.getNode().equals(sourceNodeTemplateId)) {
 
 531                 RequirementAssignmentData data = new RequirementAssignmentData(requirementKey,
 
 532                     requirementAssignment);
 
 533                 assignmentDataList.add(data);
 
 538         requirementAssignmentDataList = Optional.ofNullable(assignmentDataList);
 
 539         if (requirementAssignmentDataList.isPresent()) {
 
 540           for (RequirementAssignmentData requirementAssignmentData : requirementAssignmentDataList
 
 542             requirementAssignmentDataMap.computeIfAbsent(nodeTemplateId, k -> new ArrayList<>());
 
 543             requirementAssignmentDataMap.get(nodeTemplateId).add(requirementAssignmentData);
 
 546         requirementAssignmentDataList = Optional.empty();
 
 549     return requirementAssignmentDataMap;
 
 552   public static List<String> getGroupsForNode(ServiceTemplate serviceTemplate, String
 
 554     List<String> entityGroups = new ArrayList<>();
 
 555     Map<String, GroupDefinition> groups = serviceTemplate.getTopology_template().getGroups();
 
 556     Map<String, NodeTemplate> nodeTemplates =
 
 557         serviceTemplate.getTopology_template().getNode_templates();
 
 558     for (Map.Entry<String, GroupDefinition> entry : groups.entrySet()) {
 
 559       String groupId = entry.getKey();
 
 560       GroupDefinition groupDefinition = entry.getValue();
 
 561       if (groupDefinition.getType().contains("HeatStack"))
 
 563       List<String> groupMembers = groupDefinition.getMembers();
 
 564       for (String member : groupMembers) {
 
 565         if (groups.containsKey(member))
 
 567         if (member.equals(nodeTemplateId)) {
 
 568           entityGroups.add(groupId);
 
 575   private static Optional<List<RequirementAssignmentData>> createRequirementAssignmentDataList(
 
 576       NodeTemplate nodeTemplate, String requirementKey) {
 
 578     Optional<List<RequirementAssignment>> requirementAssignmentLink =
 
 579         DataModelUtil.getRequirementAssignment(nodeTemplate.getRequirements(), requirementKey);
 
 580     if (!requirementAssignmentLink.isPresent()) {
 
 581       return Optional.empty();
 
 584     List<RequirementAssignmentData> requirementAssignmentDataList = new ArrayList<>();
 
 585     for (RequirementAssignment requirementAssignment : requirementAssignmentLink.get()) {
 
 586       RequirementAssignmentData requirementAssignmentData = new RequirementAssignmentData
 
 587           (requirementKey, requirementAssignment);
 
 588       requirementAssignmentDataList.add(requirementAssignmentData);
 
 590     return Optional.ofNullable(requirementAssignmentDataList);
 
 593   public static Optional<List<RequirementAssignmentData>> getRequirementAssignmentDataList(
 
 594       NodeTemplate nodeTemplate, String requirementKey) {
 
 595     List<RequirementAssignmentData> returnedReqAssignmentDataList = new ArrayList<>();
 
 596     Optional<List<RequirementAssignmentData>> requirementAssignmentDataList =
 
 597         TestUtils.createRequirementAssignmentDataList(nodeTemplate, requirementKey);
 
 599     if (requirementAssignmentDataList.isPresent()) {
 
 600       for (RequirementAssignmentData requirementAssignmentData : requirementAssignmentDataList
 
 602         returnedReqAssignmentDataList.add(requirementAssignmentData);
 
 604       return Optional.of(returnedReqAssignmentDataList);
 
 606     return Optional.empty();