/*- * ============LICENSE_START======================================================= * SDC * ================================================================================ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============LICENSE_END========================================================= */ package org.openecomp.sdc.translator; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.tuple.Pair; import org.junit.Assert; import org.openecomp.core.translator.api.HeatToToscaTranslator; import org.openecomp.core.utilities.file.FileUtils; import org.openecomp.sdc.common.utils.SdcCommon; import org.openecomp.sdc.tosca.datatypes.ToscaServiceModel; import org.openecomp.sdc.tosca.datatypes.model.GroupDefinition; import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate; import org.openecomp.sdc.tosca.datatypes.model.RequirementAssignment; import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; import org.openecomp.sdc.tosca.services.DataModelUtil; import org.openecomp.sdc.tosca.services.yamlutil.ToscaExtensionYamlUtil; import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.*; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.nio.file.NotDirectoryException; import java.util.*; public class TestUtils { private static final String MANIFEST_NAME = SdcCommon.MANIFEST_NAME; private static String zipFilename = "VSP.zip"; private static String validationFilename = "validationOutput.json"; private TestUtils() { } public static void addFilesToTranslator(HeatToToscaTranslator heatToToscaTranslator, String path) throws IOException { File manifestFile = new File(path); File[] files = manifestFile.listFiles(); byte[] fileContent; Assert.assertNotNull("manifest files is empty", files); for (File file : files) { try (FileInputStream fis = new FileInputStream(file)) { fileContent = FileUtils.toByteArray(fis); if (file.getName().equals(MANIFEST_NAME)) { heatToToscaTranslator.addManifest(MANIFEST_NAME, fileContent); } else { if (!file.getName().equals(zipFilename) && (!file.getName().equals(validationFilename))) { heatToToscaTranslator.addFile(file.getName(), fileContent); } } } } } /** * Get tosca service template models for the files in a directory * @param baseDirPath base directory for the tosca file * @return Map of for the files in this directory */ public static Map getServiceTemplates(String baseDirPath){ Map serviceTemplateMap = new HashMap<>(); ToscaExtensionYamlUtil toscaExtensionYamlUtil = new ToscaExtensionYamlUtil(); baseDirPath = "."+baseDirPath+"/"; try { String[] fileList = {}; URL filesDirUrl = TestUtils.class.getClassLoader().getResource(baseDirPath); if (filesDirUrl != null && filesDirUrl.getProtocol().equals("file")) { fileList = new File(filesDirUrl.toURI()).list(); } else { Assert.fail("Invalid expected output files directory"); } for (int i = 0; i < fileList.length; i++) { InputStream serviceTemplateInputStream = FileUtils.getFileInputStream(TestUtils.class .getClassLoader().getResource(baseDirPath + fileList[i])); ServiceTemplate serviceTemplate = toscaExtensionYamlUtil.yamlToObject (serviceTemplateInputStream, ServiceTemplate.class); serviceTemplateMap.put(fileList[i], serviceTemplate); } } catch (Exception e) { Assert.fail(e.getMessage()); } return serviceTemplateMap; } /** * Get tosca service template models * @param expectedResultMap Map of filename and payload of the expected result files * @return Map of for the files in this directory */ public static Map getServiceTemplates(Map expectedResultMap){ Map serviceTemplateMap = new HashMap<>(); ToscaExtensionYamlUtil toscaExtensionYamlUtil = new ToscaExtensionYamlUtil(); for(String fileName : expectedResultMap.keySet()){ ServiceTemplate serviceTemplate = toscaExtensionYamlUtil.yamlToObject (new String(expectedResultMap.get(fileName)), ServiceTemplate.class); serviceTemplateMap.put(fileName, serviceTemplate); } return serviceTemplateMap; } public static ToscaServiceModel loadToscaServiceModel(String serviceTemplatesPath, String globalServiceTemplatesPath, String entryDefinitionServiceTemplate) throws IOException { ToscaExtensionYamlUtil toscaExtensionYamlUtil = new ToscaExtensionYamlUtil(); Map serviceTemplates = new HashMap<>(); if (entryDefinitionServiceTemplate == null) { entryDefinitionServiceTemplate = "MainServiceTemplate.yaml"; } serviceTemplates = getServiceTemplates(serviceTemplatesPath); if (globalServiceTemplatesPath != null) { serviceTemplates = getServiceTemplates(globalServiceTemplatesPath); } return new ToscaServiceModel(null, serviceTemplates, entryDefinitionServiceTemplate); } public static ServiceTemplate loadServiceTemplate(String serviceTemplatePath) throws IOException { ServiceTemplate serviceTemplateFromYaml = new ServiceTemplate(); ToscaExtensionYamlUtil toscaExtensionYamlUtil = new ToscaExtensionYamlUtil(); URL urlFile = TestUtils.class.getResource(serviceTemplatePath); if (urlFile != null) { File pathFile = new File(urlFile.getFile()); File[] files = pathFile.listFiles(); for (File file : files) { try (InputStream yamlFile = new FileInputStream(file)) { serviceTemplateFromYaml = toscaExtensionYamlUtil.yamlToObject(yamlFile, ServiceTemplate.class); createConcreteRequirementObjectsInServiceTemplate(serviceTemplateFromYaml, toscaExtensionYamlUtil); try { yamlFile.close(); } catch (IOException ignore) { } } catch (FileNotFoundException e) { throw e; } catch (IOException e) { throw e; } } } else { throw new NotDirectoryException(serviceTemplatePath); } return serviceTemplateFromYaml; } public static void loadServiceTemplates(String serviceTemplatesPath, ToscaExtensionYamlUtil toscaExtensionYamlUtil, Map serviceTemplates) throws IOException { URL urlFile = TestUtils.class.getResource(serviceTemplatesPath); if (urlFile != null) { File pathFile = new File(urlFile.getFile()); File[] files = pathFile.listFiles(); if (files != null) { addServiceTemplateFiles(serviceTemplates, files, toscaExtensionYamlUtil); } else { throw new NotDirectoryException(serviceTemplatesPath); } } else { throw new NotDirectoryException(serviceTemplatesPath); } } private static void addServiceTemplateFiles(Map serviceTemplates, File[] files, ToscaExtensionYamlUtil toscaExtensionYamlUtil) throws IOException { for (File file : files) { try (InputStream yamlFile = new FileInputStream(file)) { ServiceTemplate serviceTemplateFromYaml = toscaExtensionYamlUtil.yamlToObject(yamlFile, ServiceTemplate.class); createConcreteRequirementObjectsInServiceTemplate(serviceTemplateFromYaml, toscaExtensionYamlUtil); serviceTemplates.put(file.getName(), serviceTemplateFromYaml); try { yamlFile.close(); } catch (IOException ignore) { } } catch (FileNotFoundException e) { throw e; } catch (IOException e) { throw e; } } } private static void createConcreteRequirementObjectsInServiceTemplate(ServiceTemplate serviceTemplateFromYaml, ToscaExtensionYamlUtil toscaExtensionYamlUtil) { if (serviceTemplateFromYaml == null || serviceTemplateFromYaml.getTopology_template() == null || serviceTemplateFromYaml.getTopology_template().getNode_templates() == null) { return; } //Creating concrete objects Map nodeTemplates = serviceTemplateFromYaml.getTopology_template().getNode_templates(); for (Map.Entry entry : nodeTemplates.entrySet()) { NodeTemplate nodeTemplate = entry.getValue(); List> requirements = nodeTemplate.getRequirements(); List> concreteRequirementList = new ArrayList<>(); if (requirements != null) { ListIterator> reqListIterator = requirements .listIterator(); while (reqListIterator.hasNext()){ Map requirement = reqListIterator.next(); Map concreteRequirement = new HashMap<>(); for (Map.Entry reqEntry : requirement.entrySet()) { RequirementAssignment requirementAssignment = (toscaExtensionYamlUtil .yamlToObject(toscaExtensionYamlUtil.objectToYaml(reqEntry.getValue()), RequirementAssignment.class)); concreteRequirement.put(reqEntry.getKey(), requirementAssignment); concreteRequirementList.add(concreteRequirement); reqListIterator.remove(); } } requirements.clear(); requirements.addAll(concreteRequirementList); nodeTemplate.setRequirements(requirements); } System.out.println(); //toscaExtensionYamlUtil.yamlToObject(nodeTemplate, NodeTemplate.class); } } public static void updateMultiplePortConsolidationDatas(String serviceTemplateName, List portNodeTemplateIds, List> nodesConnectedInIds, List> nodesConnectedOutIds, List> groupIds, List> getAttrInIds, List>> getAttrOutFuncDataList, ConsolidationData consolidationData){ for(int i = 0; i < portNodeTemplateIds.size(); i++){ updatePortConsolidationData(serviceTemplateName, portNodeTemplateIds.get(i), nodesConnectedInIds.get(i), nodesConnectedOutIds.get(i), groupIds.get(i), getAttrInIds.get(i),getAttrOutFuncDataList.get(i), consolidationData); } } public static void updatePortConsolidationData(String serviceTemplateFileName, String portNodeTemplateId, List nodesConnectedInIds, List nodesConnectedOutIds, List groupIds, List getAttrInIds, List> getAttrOutFuncDataList, ConsolidationData consolidationData) { PortTemplateConsolidationData portTemplateConsolidationData = createPortTemplateConsolidationData(portNodeTemplateId); updateRelationsForEntityConsolidationData(portNodeTemplateId, nodesConnectedInIds, nodesConnectedOutIds, groupIds, getAttrInIds, getAttrOutFuncDataList, portTemplateConsolidationData); consolidationData.getPortConsolidationData() .getFilePortConsolidationData(serviceTemplateFileName) .setPortTemplateConsolidationData(portNodeTemplateId, portTemplateConsolidationData); } public static PortTemplateConsolidationData createPortTemplateConsolidationData( String portNodeTemplateId) { PortTemplateConsolidationData portTemplateConsolidationData = new PortTemplateConsolidationData(); portTemplateConsolidationData.setNodeTemplateId(portNodeTemplateId); return portTemplateConsolidationData; } public static void initPortConsolidationData(String serviceTemplateFileName, ConsolidationData consolidationData) { consolidationData.getPortConsolidationData() .setFilePortConsolidationData(serviceTemplateFileName, new FilePortConsolidationData()); } public static void updateComputeTemplateConsolidationData(String serviceTemplateFileName, String computeNodeTypeName, String computeNodeTemplateId, List nodeIdsConnectedIn, List nodeIdsConnectedOut, List volumeIds, List groupIds, List getAttrInIds, List> getAttrOutIds, List> portTypeToIdList, ConsolidationData consolidationData) { initComputeNodeTemplateIdInConsolidationData(serviceTemplateFileName, computeNodeTypeName, computeNodeTemplateId, consolidationData); Map> volumes = consolidationData.getComputeConsolidationData().getFileComputeConsolidationData (serviceTemplateFileName).getTypeComputeConsolidationData(computeNodeTypeName) .getComputeTemplateConsolidationData(computeNodeTemplateId).getVolumes(); ComputeTemplateConsolidationData computeTemplateConsolidationData = createComputeTemplateConsolidationData(computeNodeTemplateId, portTypeToIdList, volumes); updateRelationsForEntityConsolidationData(computeNodeTemplateId, nodeIdsConnectedIn, nodeIdsConnectedOut, groupIds, getAttrInIds, getAttrOutIds, computeTemplateConsolidationData); updateVolumes(computeTemplateConsolidationData, volumeIds); consolidationData.getComputeConsolidationData() .getFileComputeConsolidationData(serviceTemplateFileName) .getTypeComputeConsolidationData(computeNodeTypeName) .setComputeTemplateConsolidationData(computeNodeTemplateId, computeTemplateConsolidationData); } private static void updateRelationsForEntityConsolidationData(String entityNodeTemplateId, List nodeIdsConnectedIn, List nodeIdsConnectedOut, List groupIds, List getAttrInIds, List> getAttrOutFuncDataList, EntityConsolidationData entity) { updateRelationsIn(entity, nodeIdsConnectedIn); updateRelationsOut(entity, entityNodeTemplateId, nodeIdsConnectedOut); updateGetAttrIn(entity, getAttrInIds); updateGetAttrOut(entity, getAttrOutFuncDataList); entity.setGroupIds(groupIds); } public static void initComputeNodeTemplateIdInConsolidationData(String serviceTemplateFileName, String computeNodeTypeName, String computeNodeTemplateId, ConsolidationData consolidationData) { if(Objects.isNull(consolidationData.getComputeConsolidationData().getFileComputeConsolidationData (serviceTemplateFileName))) { consolidationData.getComputeConsolidationData().setFileComputeConsolidationData (serviceTemplateFileName, new FileComputeConsolidationData()); } TypeComputeConsolidationData typeComputeConsolidationData = consolidationData.getComputeConsolidationData().getFileComputeConsolidationData (serviceTemplateFileName).getTypeComputeConsolidationData(computeNodeTypeName); if( typeComputeConsolidationData.getComputeTemplateConsolidationData(computeNodeTemplateId) == null) { consolidationData.getComputeConsolidationData() .getFileComputeConsolidationData(serviceTemplateFileName) .getTypeComputeConsolidationData(computeNodeTypeName) .setComputeTemplateConsolidationData(computeNodeTemplateId, new ComputeTemplateConsolidationData()); } } public static void updateNestedConsolidationData(String serviceTemplateName, List substitutionNodeTemplateIds, ConsolidationData consolidationData){ if(Objects.isNull(consolidationData.getNestedConsolidationData())){ consolidationData.setNestedConsolidationData(new NestedConsolidationData()); } FileNestedConsolidationData fileNestedConsolidationData = new FileNestedConsolidationData(); for(String substitutionNodeTemplateId : substitutionNodeTemplateIds) { NestedTemplateConsolidationData nestedTemplateConsolidationData = new NestedTemplateConsolidationData(); nestedTemplateConsolidationData.setNodeTemplateId(substitutionNodeTemplateId); fileNestedConsolidationData.setNestedTemplateConsolidationData(substitutionNodeTemplateId, nestedTemplateConsolidationData); } consolidationData.getNestedConsolidationData().setFileNestedConsolidationData(serviceTemplateName, fileNestedConsolidationData); } public static ComputeTemplateConsolidationData createComputeTemplateConsolidationData(String computeNodeTemplateId, List> portTypeToIdList, Map> volumes) { ComputeTemplateConsolidationData compute = new ComputeTemplateConsolidationData(); compute.setNodeTemplateId(computeNodeTemplateId); if (portTypeToIdList != null) { for (Pair port : portTypeToIdList) { compute.addPort(port.getLeft(), port.getRight()); } } compute.setVolumes(volumes); return compute; } public static void updateRelationsIn(EntityConsolidationData entity, List idsPontingTome){ if(CollectionUtils.isEmpty(idsPontingTome)){ return; } for(String pointingId : idsPontingTome){ entity.addNodesConnectedIn(pointingId, entity.getNodeTemplateId(), new RequirementAssignment()); } } public static void updateRelationsOut(EntityConsolidationData entity, String nodeTemplateId, List idsToUpdate){ if(CollectionUtils.isEmpty(idsToUpdate)){ return; } for(String id : idsToUpdate){ entity.addNodesConnectedOut(id, id, new RequirementAssignment()); } } public static void updateGetAttrIn(EntityConsolidationData entity, List idsToUpdate){ if(CollectionUtils.isEmpty(idsToUpdate)){ return; } for(String id : idsToUpdate){ entity.addNodesGetAttrIn(id, new GetAttrFuncData()); } } public static void updateGetAttrOut(EntityConsolidationData entity, List> getAttrOutIds){ if(CollectionUtils.isEmpty(getAttrOutIds)){ return; } for(Pair getAttrOutFunc : getAttrOutIds){ entity.addNodesGetAttrOut(getAttrOutFunc.getLeft(), getAttrOutFunc.getRight()); } } public static void updateVolumes(ComputeTemplateConsolidationData compute, List volumeIds){ if(CollectionUtils.isEmpty(volumeIds)){ return; } for(String id : volumeIds){ RequirementAssignment requirementAssignment = new RequirementAssignment(); requirementAssignment.setNode(id); compute.addVolume(id, requirementAssignment); } } public static void initComputeNodeTypeInConsolidationData(String serviceTemplateFileName, String computeNodeTypeName, ConsolidationData consolidationData) { ComputeConsolidationData computeConsolidationData = consolidationData.getComputeConsolidationData(); if (!computeConsolidationData.getAllServiceTemplateFileNames() .contains(serviceTemplateFileName)) { computeConsolidationData .setFileComputeConsolidationData(serviceTemplateFileName, new FileComputeConsolidationData()); } computeConsolidationData .getFileComputeConsolidationData(serviceTemplateFileName).setTypeComputeConsolidationData( computeNodeTypeName, new TypeComputeConsolidationData()); } public static Map> getNodeConnectedOutList( NodeTemplate nodeTemplate, String requirementKey) { Map> requirementAssignmentDataMap = new HashMap<>(); Optional> requirementAssignmentDataList = TestUtils.createRequirementAssignmentDataList(nodeTemplate, requirementKey); if (requirementAssignmentDataList.isPresent()) { for (RequirementAssignmentData requirementAssignmentData : requirementAssignmentDataList .get()) { String connectedNodeTemplateId = requirementAssignmentData.getRequirementAssignment() .getNode(); requirementAssignmentDataMap .computeIfAbsent(connectedNodeTemplateId, k -> new ArrayList<>()); requirementAssignmentDataMap.get(connectedNodeTemplateId).add(requirementAssignmentData); } } return requirementAssignmentDataMap; } public static void updatePortsInComputeTemplateConsolidationData( List> portIdToTypeList, ComputeTemplateConsolidationData compute){ compute.setPorts(new HashMap<>()); for(Pair portIdToType : portIdToTypeList){ compute.getPorts().putIfAbsent(portIdToType.getLeft(), new ArrayList<>()); compute.getPorts().get(portIdToType.getLeft()).add(portIdToType.getRight()); } } public static Map> getNodeConnectedInList( String sourceNodeTemplateId, ServiceTemplate serviceTemplate, String requirementKey) { Optional> requirementAssignmentDataList = Optional.empty(); List assignmentDataList = new ArrayList<>(); Map> requirementAssignmentDataMap = new HashMap<>(); Map nodeTemplates = serviceTemplate.getTopology_template() .getNode_templates(); for (Map.Entry entry : nodeTemplates.entrySet()) { String nodeTemplateId = entry.getKey(); List> requirements = entry.getValue().getRequirements(); if (requirements != null) { for (Map requirement : requirements) { if (requirement.get(requirementKey) != null) { RequirementAssignment requirementAssignment = requirement.get(requirementKey); if (requirementAssignment != null) { if (requirementAssignment.getNode().equals(sourceNodeTemplateId)) { RequirementAssignmentData data = new RequirementAssignmentData(requirementKey, requirementAssignment); assignmentDataList.add(data); } } } } requirementAssignmentDataList = Optional.ofNullable(assignmentDataList); if (requirementAssignmentDataList.isPresent()) { for (RequirementAssignmentData requirementAssignmentData : requirementAssignmentDataList .get()) { requirementAssignmentDataMap.computeIfAbsent(nodeTemplateId, k -> new ArrayList<>()); requirementAssignmentDataMap.get(nodeTemplateId).add(requirementAssignmentData); } } requirementAssignmentDataList = Optional.empty(); } } return requirementAssignmentDataMap; } public static List getGroupsForNode(ServiceTemplate serviceTemplate, String nodeTemplateId) { List entityGroups = new ArrayList<>(); Map groups = serviceTemplate.getTopology_template().getGroups(); Map nodeTemplates = serviceTemplate.getTopology_template().getNode_templates(); for (Map.Entry entry : groups.entrySet()) { String groupId = entry.getKey(); GroupDefinition groupDefinition = entry.getValue(); if (groupDefinition.getType().contains("HeatStack")) continue; List groupMembers = groupDefinition.getMembers(); for (String member : groupMembers) { if (groups.containsKey(member)) continue; if (member.equals(nodeTemplateId)) { entityGroups.add(groupId); } } } return entityGroups; } private static Optional> createRequirementAssignmentDataList( NodeTemplate nodeTemplate, String requirementKey) { Optional> requirementAssignmentLink = DataModelUtil.getRequirementAssignment(nodeTemplate.getRequirements(), requirementKey); if (!requirementAssignmentLink.isPresent()) { return Optional.empty(); } List requirementAssignmentDataList = new ArrayList<>(); for (RequirementAssignment requirementAssignment : requirementAssignmentLink.get()) { RequirementAssignmentData requirementAssignmentData = new RequirementAssignmentData (requirementKey, requirementAssignment); requirementAssignmentDataList.add(requirementAssignmentData); } return Optional.ofNullable(requirementAssignmentDataList); } public static Optional> getRequirementAssignmentDataList( NodeTemplate nodeTemplate, String requirementKey) { List returnedReqAssignmentDataList = new ArrayList<>(); Optional> requirementAssignmentDataList = TestUtils.createRequirementAssignmentDataList(nodeTemplate, requirementKey); if (requirementAssignmentDataList.isPresent()) { for (RequirementAssignmentData requirementAssignmentData : requirementAssignmentDataList .get()) { returnedReqAssignmentDataList.add(requirementAssignmentData); } return Optional.of(returnedReqAssignmentDataList); } return Optional.empty(); } }