diff options
Diffstat (limited to 'openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org')
126 files changed, 13645 insertions, 7010 deletions
diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/AttachedPropertyVal.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/AttachedPropertyVal.java new file mode 100644 index 0000000000..38bfc99c54 --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/AttachedPropertyVal.java @@ -0,0 +1,57 @@ +/*- + * ============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.datatypes.heattotosca; + +public class AttachedPropertyVal { + private Object propertyValue; + private ReferenceType referenceType; + + /** + * Instantiates a new Attached resource id. + * + * @param propertyValue the property value + * @param referenceType the reference type + */ + public AttachedPropertyVal(Object propertyValue, ReferenceType referenceType) { + this.referenceType = referenceType; + this.propertyValue = propertyValue; + } + + public Object getPropertyValue() { + return propertyValue; + } + + public ReferenceType getReferenceType() { + return referenceType; + } + + public boolean isGetResource() { + return referenceType == ReferenceType.GET_RESOURCE; + } + + public boolean isGetParam() { + return referenceType == ReferenceType.GET_PARAM; + } + + public boolean isGetAttr() { + return referenceType == ReferenceType.GET_ATTR; + } +} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/AttachedResourceId.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/AttachedResourceId.java index 4286666392..16baf4e84b 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/AttachedResourceId.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/AttachedResourceId.java @@ -23,7 +23,7 @@ package org.openecomp.sdc.translator.datatypes.heattotosca; public class AttachedResourceId { private Object translatedId; private Object entityId; - private ResourceReferenceType resourceReferenceType; + private ReferenceType resourceReferenceType; /** * Instantiates a new Attached resource id. @@ -33,7 +33,7 @@ public class AttachedResourceId { * @param resourceReferenceType the resource reference type */ public AttachedResourceId(Object translatedId, Object entityId, - ResourceReferenceType resourceReferenceType) { + ReferenceType resourceReferenceType) { this.translatedId = translatedId; this.resourceReferenceType = resourceReferenceType; this.entityId = entityId; @@ -47,19 +47,19 @@ public class AttachedResourceId { return translatedId; } - public ResourceReferenceType getResourceReferenceType() { + public ReferenceType getResourceReferenceType() { return resourceReferenceType; } public boolean isGetResource() { - return resourceReferenceType == ResourceReferenceType.GET_RESOURCE; + return resourceReferenceType == ReferenceType.GET_RESOURCE; } public boolean isGetParam() { - return resourceReferenceType == ResourceReferenceType.GET_PARAM; + return resourceReferenceType == ReferenceType.GET_PARAM; } public boolean isGetAttr() { - return resourceReferenceType == ResourceReferenceType.GET_ATTR; + return resourceReferenceType == ReferenceType.GET_ATTR; } } diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/helper/PropertyRegexMatcher.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/PropertyRegexMatcher.java index b04234b413..06d96bc3c1 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/helper/PropertyRegexMatcher.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/PropertyRegexMatcher.java @@ -18,7 +18,7 @@ * ============LICENSE_END========================================================= */ -package org.openecomp.sdc.translator.services.heattotosca.helper; +package org.openecomp.sdc.translator.datatypes.heattotosca; import org.apache.commons.collections.CollectionUtils; @@ -31,6 +31,20 @@ public class PropertyRegexMatcher { private List<Pattern> regexPatterns; private String stringToSearchForPropertyValue; + /** + * Constractor for creating PropertyRegexMatcher. + * @param propertyName property name + * @param regexPatterns regex pattern + * @param stringToSearchForPropertyValue string for search in the property value manipulation + */ + public PropertyRegexMatcher(String propertyName, + List<String> regexPatterns, + String stringToSearchForPropertyValue) { + this.propertyName = propertyName; + setRegex(regexPatterns); + this.stringToSearchForPropertyValue = stringToSearchForPropertyValue; + } + public String getPropertyName() { return propertyName; } diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/ResourceReferenceType.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/ReferenceType.java index 81ccd69a66..1f90db9cb3 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/ResourceReferenceType.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/ReferenceType.java @@ -20,6 +20,6 @@ package org.openecomp.sdc.translator.datatypes.heattotosca; -public enum ResourceReferenceType { +public enum ReferenceType { GET_RESOURCE, GET_PARAM, GET_ATTR, OTHER } diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/TranslationContext.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/TranslationContext.java new file mode 100644 index 0000000000..736318bcab --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/TranslationContext.java @@ -0,0 +1,452 @@ +/*- + * ============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.datatypes.heattotosca; + +import org.openecomp.config.api.Configuration; +import org.openecomp.config.api.ConfigurationManager; +import org.openecomp.core.utilities.CommonMethods; +import org.openecomp.core.utilities.file.FileContentHandler; +import org.openecomp.sdc.common.utils.SdcCommon; +import org.openecomp.sdc.datatypes.configuration.ImplementationConfiguration; +import org.openecomp.sdc.heat.datatypes.manifest.FileData; +import org.openecomp.sdc.heat.datatypes.manifest.ManifestFile; +import org.openecomp.sdc.heat.datatypes.model.Resource; +import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate; +import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; +import org.openecomp.sdc.tosca.services.ToscaUtil; +import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslatedHeatResource; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.UnifiedCompositionEntity; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.UnifiedSubstitutionData; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.ConsolidationData; +import org.openecomp.sdc.translator.services.heattotosca.ConfigConstants; +import org.openecomp.sdc.translator.services.heattotosca.Constants; +import org.openecomp.sdc.translator.services.heattotosca.NameExtractor; +import org.openecomp.sdc.translator.services.heattotosca.globaltypes.GlobalTypesGenerator; + +import java.io.InputStream; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; + + +public class TranslationContext { + + + private static Map<String, Map<String, Map<String, String>>> translationMapping; + private static Map<String, ServiceTemplate> globalServiceTemplates; + private static Map<String, ImplementationConfiguration> nameExtractorImplMap; + private static Map<String, ImplementationConfiguration> supportedConsolidationComputeResources; + private static Map<String, ImplementationConfiguration> supportedConsolidationPortResources; + + static { + Configuration config = ConfigurationManager.lookup(); + String propertyFileName = SdcCommon.HEAT_TO_TOSCA_MAPPING_CONF; + translationMapping = + config.generateMap(ConfigConstants.MAPPING_NAMESPACE, ConfigConstants.RESOURCE_MAPPING_KEY); + try { + globalServiceTemplates = GlobalTypesGenerator.getGlobalTypesServiceTemplate(); + } catch (Exception e) { + throw new RuntimeException("Failed to load GlobalTypes", e); + } + nameExtractorImplMap = config.populateMap(ConfigConstants.TRANSLATOR_NAMESPACE, + ConfigConstants.NAMING_CONVENTION_EXTRACTOR_IMPL_KEY, ImplementationConfiguration.class); + supportedConsolidationComputeResources = config.populateMap(ConfigConstants + .MANDATORY_UNIFIED_MODEL_NAMESPACE, ConfigConstants + .SUPPORTED_CONSOLIDATION_COMPUTE_RESOURCES_KEY, ImplementationConfiguration.class); + supportedConsolidationPortResources = config.populateMap(ConfigConstants + .MANDATORY_UNIFIED_MODEL_NAMESPACE, ConfigConstants + .SUPPORTED_CONSOLIDATION_PORT_RESOURCES_KEY, ImplementationConfiguration.class); + + } + + private Map<String, UnifiedSubstitutionData> unifiedSubstitutionData = new HashMap<>(); + private ManifestFile manifest; + private FileContentHandler files = new FileContentHandler(); + private Map<String, FileData.Type> manifestFiles = new HashMap<>(); + //Key - file name, value - file type + private Set<String> nestedHeatsFiles = new HashSet<>(); + private FileContentHandler externalArtifacts = new FileContentHandler(); + // Key - heat file name,value - set of heat resource ids which were translated + private Map<String, Set<String>> translatedResources = new HashMap<>(); + // Key - heat file name, value - translated Node template id + private Map<String, Set<String>> heatStackGroupMembers = new HashMap<>(); + // Key - heat file name, value - Map with Key - heat resource Id, Value - tosca entity template id + private Map<String, Map<String, String>> translatedIds = new HashMap<>(); + // key - service template type, value - translated service templates + private Map<String, ServiceTemplate> translatedServiceTemplates = new HashMap<>(); + //key - heat param name, value - shared resource data + private Map<String, TranslatedHeatResource> heatSharedResourcesByParam = new HashMap<>(); + //key - translated substitute service template file name, value - source nested heat file name + private Map<String, String> nestedHeatFileName = new HashMap<>(); + //Key - heat file name,value - Map eith key - heat pseudo param name, + // value - translated tosca parameter name + private Map<String, Map<String, String>> usedHeatPseudoParams = new HashMap<>(); + //Consolidation data gathered for Unified TOSCA model + private ConsolidationData consolidationData = new ConsolidationData(); + + public static Map<String, ImplementationConfiguration> + getSupportedConsolidationComputeResources() { + return supportedConsolidationComputeResources; + } + + public static void setSupportedConsolidationComputeResources( + Map<String, ImplementationConfiguration> supportedConsolidationComputeResources) { + TranslationContext.supportedConsolidationComputeResources = + supportedConsolidationComputeResources; + } + + public static Map<String, ImplementationConfiguration> getSupportedConsolidationPortResources() { + return supportedConsolidationPortResources; + } + + public static void setSupportedConsolidationPortResources( + Map<String, ImplementationConfiguration> supportedConsolidationPortResources) { + TranslationContext.supportedConsolidationPortResources = supportedConsolidationPortResources; + } + + /** + * Get nameExtractor implemetation class instance. + * + * @param extractorImplKey configuration key for the implementation class + * @return implemetation class instance + */ + public static NameExtractor getNameExtractorImpl(String extractorImplKey) { + String nameExtractorImplClassName = + nameExtractorImplMap.get(extractorImplKey).getImplementationClass(); + + return CommonMethods.newInstance(nameExtractorImplClassName, NameExtractor.class); + } + + public Map<String, UnifiedSubstitutionData> getUnifiedSubstitutionData() { + return unifiedSubstitutionData; + } + + public void setUnifiedSubstitutionData( + Map<String, UnifiedSubstitutionData> unifiedSubstitutionData) { + this.unifiedSubstitutionData = unifiedSubstitutionData; + } + + public void addCleanedNodeTemplate(String serviceTemplateName, + String nodeTemplateId, + UnifiedCompositionEntity unifiedCompositionEntity, + NodeTemplate nodeTemplate) { + this.unifiedSubstitutionData.putIfAbsent(serviceTemplateName, new UnifiedSubstitutionData()); + this.unifiedSubstitutionData + .get(serviceTemplateName) + .addCleanedNodeTemplate(nodeTemplateId, unifiedCompositionEntity, nodeTemplate); + } + + public NodeTemplate getCleanedNodeTemplate(String serviceTemplateName, + String nodeTemplateId) { + return this.unifiedSubstitutionData.get(serviceTemplateName) + .getCleanedNodeTemplate(nodeTemplateId); + } + + public void addUnifiedNestedNodeTemplateId(String serviceTemplateName, + String nestedNodeTemplateId, + String unifiedNestedNodeTemplateId) { + this.unifiedSubstitutionData.putIfAbsent(serviceTemplateName, new UnifiedSubstitutionData()); + this.unifiedSubstitutionData.get(serviceTemplateName) + .addUnifiedNestedNodeTemplateId(nestedNodeTemplateId, unifiedNestedNodeTemplateId); + } + + public Optional<String> getUnifiedNestedNodeTemplateId(String serviceTemplateName, + String nestedNodeTemplateId) { + return this.unifiedSubstitutionData.get(serviceTemplateName) == null ? Optional.empty() + :this.unifiedSubstitutionData.get(serviceTemplateName).getUnifiedNestedNodeTemplateId(nestedNodeTemplateId); + } + + public void addUnifiedNestedNodeTypeId(String serviceTemplateName, + String nestedNodeTypeId, + String unifiedNestedNodeTypeId){ + this.unifiedSubstitutionData.putIfAbsent(serviceTemplateName, new UnifiedSubstitutionData()); + this.unifiedSubstitutionData.get(serviceTemplateName).addUnifiedNestedNodeTypeId(nestedNodeTypeId, unifiedNestedNodeTypeId); + } + + public Optional<String> getUnifiedNestedNodeTypeId(String serviceTemplateName, + String nestedNodeTemplateId) { + return this.unifiedSubstitutionData.get(serviceTemplateName) == null ? Optional.empty() + : this.unifiedSubstitutionData.get(serviceTemplateName).getUnifiedNestedNodeTypeId(nestedNodeTemplateId); + } + + public ConsolidationData getConsolidationData() { + return consolidationData; + } + + public void setConsolidationData(ConsolidationData consolidationData) { + this.consolidationData = consolidationData; + } + + public void addManifestFile(String fileName, FileData.Type fileType) { + this.manifestFiles.put(fileName, fileType); + } + + public Set<String> getNestedHeatsFiles() { + return nestedHeatsFiles; + } + + public Map<String, Set<String>> getHeatStackGroupMembers() { + return heatStackGroupMembers; + } + + public FileContentHandler getFiles() { + return files; + } + + public void setFiles(Map<String, byte[]> files) { + this.files.putAll(files); + } + + public InputStream getFileContent(String fileName) { + return files.getFileContent(fileName); + } + + public void addFile(String name, byte[] content) { + files.addFile(name, content); + } + + public ManifestFile getManifest() { + return manifest; + } + + public void setManifest(ManifestFile manifest) { + this.manifest = manifest; + } + + public Map<String, Set<String>> getTranslatedResources() { + return translatedResources; + } + + public Map<String, Map<String, String>> getTranslatedIds() { + return translatedIds; + } + + // get tosca name from mapping configuration file + //element type - parameter/attribute + // element name - heat parameter/attribute name + //return value - tosca parameter/attribute name + public String getElementMapping(String resourceType, String elementType, String elementName) { + if (Objects.isNull(translationMapping.get(resourceType))) { + return null; + } + if (Objects.isNull(translationMapping.get(resourceType).get(elementType))) { + return null; + } + return translationMapping.get(resourceType).get(elementType).get(elementName); + } + + public Map<String, String> getElementMapping(String resourceType, String elementType) { + if (Objects.isNull(translationMapping.get(resourceType))) { + return null; + } + return translationMapping.get(resourceType).get(elementType); + } + + public Set<String> getElementSet(String resourceType, String elementType) { + if (Objects.isNull(translationMapping.get(resourceType))) { + return new HashSet<>(); + } + if (Objects.isNull(translationMapping.get(resourceType).get(elementType))) { + return new HashSet<>(); + } + return translationMapping.get(resourceType).get(elementType).keySet(); + } + + public Map<String, ServiceTemplate> getTranslatedServiceTemplates() { + return translatedServiceTemplates; + } + + public ServiceTemplate getGlobalSubstitutionServiceTemplate() { + return getTranslatedServiceTemplates().get(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME); + } + + public FileContentHandler getExternalArtifacts() { + return externalArtifacts; + } + + public void addExternalArtifacts(String name, byte[] content) { + this.externalArtifacts.addFile(name, content); + } + + public Map<String, TranslatedHeatResource> getHeatSharedResourcesByParam() { + return heatSharedResourcesByParam; + } + + public void addHeatSharedResourcesByParam(String parameterName, String resourceId, + Resource resource) { + this.addHeatSharedResourcesByParam(parameterName, + new TranslatedHeatResource(resourceId, resource)); + } + + private void addHeatSharedResourcesByParam(String parameterName, + TranslatedHeatResource translatedHeatResource) { + this.heatSharedResourcesByParam.put(parameterName, translatedHeatResource); + } + + public Map<String, ServiceTemplate> getGlobalServiceTemplates() { + return globalServiceTemplates; + } + + public Map<String, String> getNestedHeatFileName() { + return nestedHeatFileName; + } + + public void addNestedHeatFileName(String substituteServiceTempalteName, + String nestedHeatFileName) { + this.nestedHeatFileName.put(substituteServiceTempalteName, nestedHeatFileName); + } + + public Map<String, Map<String, String>> getUsedHeatPseudoParams() { + return usedHeatPseudoParams; + } + + public void addUsedHeatPseudoParams(String heatFileName, String heatPseudoParam, String + translatedToscaParam) { + if (Objects.isNull(this.usedHeatPseudoParams.get(heatFileName))) { + this.usedHeatPseudoParams.put(heatFileName, new HashMap<>()); + } + this.usedHeatPseudoParams.get(heatFileName).put(heatPseudoParam, translatedToscaParam); + } + + /** + * Add the unified substitution data info in context. Contains a mapping of original node + * template id and the new node template id in the abstract substitute + * + * @param serviceTemplateFileName the service template file name + * @param originalNodeTemplateId the original node template id + * @param abstractNodeTemplateId the node template id in the abstract substitute + */ + public void addUnifiedSubstitutionData(String serviceTemplateFileName, + String originalNodeTemplateId, + String abstractNodeTemplateId) { + + Map<String, String> nodeAbstractNodeTemplateIdMap = this.getUnifiedSubstitutionData() + .computeIfAbsent(serviceTemplateFileName, k -> new UnifiedSubstitutionData()) + .getNodesRelatedAbstractNode(); + + if (nodeAbstractNodeTemplateIdMap == null) { + nodeAbstractNodeTemplateIdMap = new HashMap<>(); + } + nodeAbstractNodeTemplateIdMap.put(originalNodeTemplateId, abstractNodeTemplateId); + this.getUnifiedSubstitutionData().get(serviceTemplateFileName).setNodesRelatedAbstractNode( + nodeAbstractNodeTemplateIdMap); + } + + /** + * Add the unified substitution data info in context. Contains a mapping of original node + * template id and the new node template id in the abstract substitute + * + * @param serviceTemplateFileName the service template file name + * @param originalNodeTemplateId the original node template id + * @param substitutionServiceTemplateNodeTemplateId the node template id in the substitution + * service template + */ + public void addSubstitutionServiceTemplateUnifiedSubstitutionData(String serviceTemplateFileName, + String originalNodeTemplateId, + String substitutionServiceTemplateNodeTemplateId) { + + Map<String, String> nodesRelatedSubstitutionServiceTemplateNodeTemplateIdMap = this + .getUnifiedSubstitutionData() + .computeIfAbsent(serviceTemplateFileName, k -> new UnifiedSubstitutionData()) + .getNodesRelatedSubstitutionServiceTemplateNode(); + + if (nodesRelatedSubstitutionServiceTemplateNodeTemplateIdMap == null) { + nodesRelatedSubstitutionServiceTemplateNodeTemplateIdMap = new HashMap<>(); + } + nodesRelatedSubstitutionServiceTemplateNodeTemplateIdMap.put(originalNodeTemplateId, + substitutionServiceTemplateNodeTemplateId); + this.getUnifiedSubstitutionData().get(serviceTemplateFileName) + .setNodesRelatedSubstitutionServiceTemplateNode( + nodesRelatedSubstitutionServiceTemplateNodeTemplateIdMap); + } + + /** + * Get unified abstract node template which is mapped to the input node template id. + * + * @param serviceTemplate the service template + * @param nodeTemplateId the node template id + */ + public String getUnifiedAbstractNodeTemplateId(ServiceTemplate serviceTemplate, + String nodeTemplateId) { + UnifiedSubstitutionData unifiedSubstitutionData = + this.unifiedSubstitutionData.get(ToscaUtil.getServiceTemplateFileName(serviceTemplate)); + return unifiedSubstitutionData.getNodesRelatedAbstractNode().get(nodeTemplateId); + } + + /** + * Get unified node template in the substitution service template which is mapped to the + * original input node template id. + * + * @param serviceTemplate the service template + * @param nodeTemplateId the node template id + */ + public String getUnifiedSubstitutionNodeTemplateId(ServiceTemplate serviceTemplate, + String nodeTemplateId) { + UnifiedSubstitutionData unifiedSubstitutionData = + this.unifiedSubstitutionData.get(ToscaUtil.getServiceTemplateFileName(serviceTemplate)); + return unifiedSubstitutionData.getNodesRelatedSubstitutionServiceTemplateNode() + .get(nodeTemplateId); + } + + public int getHandledNestedComputeNodeTemplateIndex(String serviceTemplateName, + String computeType){ + return this.unifiedSubstitutionData.get(serviceTemplateName) + .getHandledNestedComputeNodeTemplateIndex(computeType); + } + + public void updateHandledComputeType(String serviceTemplateName, + String nestedServiceTemplateFileName, + String handledComputeType){ + this.unifiedSubstitutionData.putIfAbsent(serviceTemplateName, new UnifiedSubstitutionData()); + this.unifiedSubstitutionData.get(serviceTemplateName) + .addHandledComputeType(nestedServiceTemplateFileName, handledComputeType); + } + + public boolean isNestedServiceTemplateWasHandled(String serviceTemplateName, + String nestedServiceTemplateFileName){ + if(Objects.isNull(this.unifiedSubstitutionData.get(serviceTemplateName))){ + return false; + } + return this.unifiedSubstitutionData.get(serviceTemplateName) + .isNestedServiceTemplateWasHandled(nestedServiceTemplateFileName); + } + + public void addNestedFileToUsedNestedComputeType(String serviceTemplateName, + String nestedServiceTemplateFileName, + String computeType){ + this.unifiedSubstitutionData.putIfAbsent(serviceTemplateName, new UnifiedSubstitutionData()); + + this.unifiedSubstitutionData.get(serviceTemplateName).addNestedFileToUsedNestedComputeType + (computeType, nestedServiceTemplateFileName); + } + + public int getGlobalNodeTypeIndex(String serviceTemplateName, + String computeType){ + if(Objects.isNull(this.unifiedSubstitutionData.get(serviceTemplateName))){ + return 0; + } + return this.unifiedSubstitutionData.get(serviceTemplateName).getGlobalNodeTypeIndex + (computeType); + } +} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/to/ResourceFileDataAndIDs.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/to/ResourceFileDataAndIDs.java index b8349444d7..24eef115e2 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/to/ResourceFileDataAndIDs.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/to/ResourceFileDataAndIDs.java @@ -23,6 +23,7 @@ package org.openecomp.sdc.translator.datatypes.heattotosca.to; import org.openecomp.sdc.heat.datatypes.manifest.FileData; + public class ResourceFileDataAndIDs { private String resourceId; private String translatedResourceId; diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/to/TranslateTo.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/to/TranslateTo.java index 6c56715f79..56ba9d120d 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/to/TranslateTo.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/to/TranslateTo.java @@ -24,7 +24,7 @@ package org.openecomp.sdc.translator.datatypes.heattotosca.to; import org.openecomp.sdc.heat.datatypes.model.HeatOrchestrationTemplate; import org.openecomp.sdc.heat.datatypes.model.Resource; import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; -import org.openecomp.sdc.translator.services.heattotosca.TranslationContext; +import org.openecomp.sdc.translator.datatypes.heattotosca.TranslationContext; public class TranslateTo { private String heatFileName; diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/composition/NodeTemplateInformation.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/composition/NodeTemplateInformation.java new file mode 100644 index 0000000000..bd1263da5f --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/composition/NodeTemplateInformation.java @@ -0,0 +1,38 @@ +package org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition; + +import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate; +import org.openecomp.sdc.translator.services.heattotosca.UnifiedCompositionService; + +/** + * Created by Talio on 4/4/2017. + */ +public class NodeTemplateInformation { + UnifiedCompositionEntity unifiedCompositionEntity; + private NodeTemplate nodeTemplate; + + public NodeTemplateInformation(){} + + public NodeTemplateInformation( + UnifiedCompositionEntity unifiedCompositionEntity, + NodeTemplate nodeTemplate) { + this.unifiedCompositionEntity = unifiedCompositionEntity; + this.nodeTemplate = nodeTemplate; + } + + public UnifiedCompositionEntity getUnifiedCompositionEntity() { + return unifiedCompositionEntity; + } + + public void setUnifiedCompositionEntity( + UnifiedCompositionEntity unifiedCompositionEntity) { + this.unifiedCompositionEntity = unifiedCompositionEntity; + } + + public NodeTemplate getNodeTemplate() { + return nodeTemplate; + } + + public void setNodeTemplate(NodeTemplate nodeTemplate) { + this.nodeTemplate = nodeTemplate; + } +} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/composition/UnifiedCompositionData.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/composition/UnifiedCompositionData.java new file mode 100644 index 0000000000..a3635391ba --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/composition/UnifiedCompositionData.java @@ -0,0 +1,95 @@ +package org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition; + +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.ComputeTemplateConsolidationData; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.NestedTemplateConsolidationData; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.PortTemplateConsolidationData; + +import java.util.ArrayList; +import java.util.List; + +/** + * The type Unified composition data. + */ +public class UnifiedCompositionData { + /** + * The Compute template consolidation data. + */ + private ComputeTemplateConsolidationData computeTemplateConsolidationData; + /** + * The Port template consolidation data list. + */ + private List<PortTemplateConsolidationData> portTemplateConsolidationDataList; + + + private NestedTemplateConsolidationData nestedTemplateConsolidationData; + + /** + * Gets compute template consolidation data. + * + * @return the compute template consolidation data + */ + public ComputeTemplateConsolidationData getComputeTemplateConsolidationData() { + return computeTemplateConsolidationData; + } + + /** + * Sets compute template consolidation data. + * + * @param computeTemplateConsolidationData the compute template consolidation data + */ + public void setComputeTemplateConsolidationData( + ComputeTemplateConsolidationData computeTemplateConsolidationData) { + this.computeTemplateConsolidationData = computeTemplateConsolidationData; + } + + /** + * Gets port template consolidation data list. + * + * @return the port template consolidation data list + */ + public List<PortTemplateConsolidationData> getPortTemplateConsolidationDataList() { + return portTemplateConsolidationDataList; + } + + /** + * Sets port template consolidation data list. + * + * @param portTemplateConsolidationDataList the port template consolidation data list + */ + public void setPortTemplateConsolidationDataList( + List<PortTemplateConsolidationData> portTemplateConsolidationDataList) { + this.portTemplateConsolidationDataList = portTemplateConsolidationDataList; + } + + /** + * Add port consolidation data. + * + * @param portTemplateConsolidationData the port consolidation data + */ + public void addPortTemplateConsolidationData( + PortTemplateConsolidationData portTemplateConsolidationData) { + if (this.portTemplateConsolidationDataList == null) { + this.portTemplateConsolidationDataList = new ArrayList<>(); + } + this.portTemplateConsolidationDataList.add(portTemplateConsolidationData); + } + + /** + * Gets nested template consolidation data. + * + * @return the nested template consolidation data + */ + public NestedTemplateConsolidationData getNestedTemplateConsolidationData() { + return nestedTemplateConsolidationData; + } + + /** + * Sets nested template consolidation data. + * + * @param nestedTemplateConsolidationData the nested template consolidation data + */ + public void setNestedTemplateConsolidationData( + NestedTemplateConsolidationData nestedTemplateConsolidationData) { + this.nestedTemplateConsolidationData = nestedTemplateConsolidationData; + } +} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/composition/UnifiedCompositionEntity.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/composition/UnifiedCompositionEntity.java new file mode 100644 index 0000000000..d0bb826904 --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/composition/UnifiedCompositionEntity.java @@ -0,0 +1,8 @@ +package org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition; + +public enum UnifiedCompositionEntity { + Compute, + Port, + Nested, + Other; +} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/composition/UnifiedCompositionMode.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/composition/UnifiedCompositionMode.java new file mode 100644 index 0000000000..c4e6f1ce4a --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/composition/UnifiedCompositionMode.java @@ -0,0 +1,13 @@ +package org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition; + +/** + * @author SHIRIA + * @since March 02, 2017. + */ +public enum UnifiedCompositionMode { + SingleSubstitution, + ScalingInstances, + // todo - support B1 SingleSubstitution, but create diff types/services vm_type+<index> + CatalogInstance, + NestedSingleCompute; +} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/composition/UnifiedSubstitutionData.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/composition/UnifiedSubstitutionData.java new file mode 100644 index 0000000000..57f77a51e5 --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/composition/UnifiedSubstitutionData.java @@ -0,0 +1,145 @@ +package org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition; + +import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate; + +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Optional; +import java.util.Set; + +public class UnifiedSubstitutionData { + + //Key - node template id, Value - related abstract node template id + private Map<String, String> nodesRelatedAbstractNode = new HashMap<>(); + //Key - node template id, Value - related node template id in the substitution service template + private Map<String, String> nodesRelatedSubstitutionServiceTemplateNode = new HashMap<>(); + private Map<String, NodeTemplateInformation> cleanedNodeTemplates = new HashMap<>(); + //Key - nested node template id, Value - related unified nested node template id + private Map<String, String> nestedNodeTemplateRelatedUnifiedTranslatedId = new HashMap<>(); + //Key - nested node type id, Value - related unified nested node template id + private Map<String, String> nestedNodeTypeRelatedUnifiedTranslatedId = new HashMap<>(); + //Key - handled compute type, Value - number of times it was handled + private Map<String, Integer> handledComputeTypesInNestedSubstitutionTemplate = + new HashMap<>(); + //Key - nested compute type, Value - list of nested files that the compute type is present + private Map<String, Set<String>> handledNestedComputeTypesNestedFiles = new HashMap<>(); + //handled nested files + private Set<String> handledNestedFiles = new HashSet<>(); + + public Map<String, String> getNodesRelatedAbstractNode() { + return nodesRelatedAbstractNode; + } + + public void setNodesRelatedAbstractNode( + Map<String, String> nodesRelatedAbstractNode) { + this.nodesRelatedAbstractNode = nodesRelatedAbstractNode; + } + + public Map<String, String> getNodesRelatedSubstitutionServiceTemplateNode() { + return nodesRelatedSubstitutionServiceTemplateNode; + } + + public void setNodesRelatedSubstitutionServiceTemplateNode( + Map<String, String> nodesRelatedSubstitutionServiceTemplateNode) { + this.nodesRelatedSubstitutionServiceTemplateNode = nodesRelatedSubstitutionServiceTemplateNode; + } + + public String getNodeRelatedAbstractNode(String origNodeId) { + return this.nodesRelatedAbstractNode.get(origNodeId); + } + + public Collection<String> getAllRelatedAbstractNodeIds() { + return this.nodesRelatedAbstractNode.values(); + } + + public Collection<String> getAllUnifiedNestedNodeTemplateIds() { + return this.nestedNodeTemplateRelatedUnifiedTranslatedId.values(); + } + + /** + * Add cleaned node template. + * + * @param nodeTemplateId the node template id + * @param unifiedCompositionEntity the unified composition entity + * @param nodeTemplate the node template + */ + public void addCleanedNodeTemplate(String nodeTemplateId, + UnifiedCompositionEntity unifiedCompositionEntity, + NodeTemplate nodeTemplate) { + NodeTemplateInformation nodeTemplateInformation = new NodeTemplateInformation( + unifiedCompositionEntity, nodeTemplate); + this.cleanedNodeTemplates.putIfAbsent(nodeTemplateId, nodeTemplateInformation); + } + + public NodeTemplate getCleanedNodeTemplate(String nodeTemplateId) { + return this.cleanedNodeTemplates.get(nodeTemplateId).getNodeTemplate().clone(); + } + + public UnifiedCompositionEntity getCleanedNodeTemplateCompositionEntity(String nodeTemplateId) { + return this.cleanedNodeTemplates.get(nodeTemplateId).getUnifiedCompositionEntity(); + } + + public void addUnifiedNestedNodeTemplateId(String nestedNodeTemplateId, + String unifiedNestedNodeRelatedId) { + this.nestedNodeTemplateRelatedUnifiedTranslatedId + .put(nestedNodeTemplateId, unifiedNestedNodeRelatedId); + } + + public Optional<String> getUnifiedNestedNodeTemplateId(String nestedNodeTemplateId) { + return this.nestedNodeTemplateRelatedUnifiedTranslatedId.get(nestedNodeTemplateId) == null + ? Optional.empty() + : Optional.of(this.nestedNodeTemplateRelatedUnifiedTranslatedId.get(nestedNodeTemplateId)); + } + + public void addUnifiedNestedNodeTypeId(String nestedNodeTypeId, + String unifiedNestedNodeRelatedId) { + this.nestedNodeTypeRelatedUnifiedTranslatedId.put(nestedNodeTypeId, unifiedNestedNodeRelatedId); + } + + public Optional<String> getUnifiedNestedNodeTypeId(String nestedNodeTypeId) { + return this.nestedNodeTypeRelatedUnifiedTranslatedId.get(nestedNodeTypeId) == null ? Optional + .empty() + : Optional.of(this.nestedNodeTypeRelatedUnifiedTranslatedId.get(nestedNodeTypeId)); + } + + public void addHandledComputeType(String nestedServiceTemplateFileName, + String handledComputeType) { + + if (this.handledComputeTypesInNestedSubstitutionTemplate.containsKey(handledComputeType)) { + Integer timesHandled = + this.handledComputeTypesInNestedSubstitutionTemplate.get(handledComputeType); + this.handledComputeTypesInNestedSubstitutionTemplate + .put(handledComputeType, timesHandled + 1); + } else { + this.handledNestedFiles.add(nestedServiceTemplateFileName); + handledComputeTypesInNestedSubstitutionTemplate.put(handledComputeType, 0); + } + } + + public boolean isComputeTypeHandledInServiceTemplate(String computeType) { + return this.handledComputeTypesInNestedSubstitutionTemplate.containsKey(computeType); + } + + public int getHandledNestedComputeNodeTemplateIndex(String computeType) { + return this.handledComputeTypesInNestedSubstitutionTemplate.containsKey(computeType) ? + this.handledComputeTypesInNestedSubstitutionTemplate.get(computeType): + 0; + } + + public boolean isNestedServiceTemplateWasHandled(String nestedServiceTemplateFileName) { + return this.handledNestedFiles.contains(nestedServiceTemplateFileName); + } + + public void addNestedFileToUsedNestedComputeType(String computeType, + String nestedServiceTemplateFileName){ + this.handledNestedComputeTypesNestedFiles.putIfAbsent(computeType, new HashSet<>()); + this.handledNestedComputeTypesNestedFiles.get(computeType).add(nestedServiceTemplateFileName); + } + + public int getGlobalNodeTypeIndex(String computeType){ + return this.handledNestedComputeTypesNestedFiles.get(computeType).size() == 1 ? 0: + this.handledNestedComputeTypesNestedFiles.get(computeType).size() - 1; + } +} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/consolidation/ComputeConsolidationData.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/consolidation/ComputeConsolidationData.java new file mode 100644 index 0000000000..d2f6083d23 --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/consolidation/ComputeConsolidationData.java @@ -0,0 +1,52 @@ +package org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation; + +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +/** + * The type Compute consolidation data. + */ +public class ComputeConsolidationData { + + //Key - Service template file name + private Map<String, FileComputeConsolidationData> fileComputeConsolidationData; + + /** + * Instantiates a new Compute consolidation data. + */ + public ComputeConsolidationData() { + fileComputeConsolidationData = new HashMap<>(); + } + + /** + * Gets all files. + * + * @return the all files + */ + public Set<String> getAllServiceTemplateFileNames() { + return fileComputeConsolidationData.keySet(); + } + + /** + * Gets file compute consolidation data. + * + * @param serviceTemplateFileName the file name + * @return the file compute consolidation data + */ + public FileComputeConsolidationData getFileComputeConsolidationData(String + serviceTemplateFileName) { + return fileComputeConsolidationData.get(serviceTemplateFileName); + } + + /** + * Sets file compute consolidation data. + * + * @param serviceTemplateFileName the file name + * @param fileComputeConsolidationData the file compute consolidation data + */ + public void setFileComputeConsolidationData(String serviceTemplateFileName, + FileComputeConsolidationData fileComputeConsolidationData) { + this.fileComputeConsolidationData.put(serviceTemplateFileName, fileComputeConsolidationData); + } +} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/consolidation/ComputeTemplateConsolidationData.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/consolidation/ComputeTemplateConsolidationData.java new file mode 100644 index 0000000000..c6721ce18f --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/consolidation/ComputeTemplateConsolidationData.java @@ -0,0 +1,88 @@ +package org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation; + +import org.openecomp.sdc.tosca.datatypes.model.RequirementAssignment; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * The type Compute template consolidation data. + */ +public class ComputeTemplateConsolidationData extends EntityConsolidationData { + // key - volume node template id + // List of requirement id and the requirement assignment on the + // compute node which connect to this volume + private Map<String,List<RequirementAssignmentData>> volumes; + + // key - port type (port id excluding index), + // value - List of connected port node template ids, with this port type + private Map<String, List<String>> ports; + + /** + * Gets volumes. + * + * @return the volumes + */ + public Map<String,List<RequirementAssignmentData>> getVolumes() { + return volumes; + } + + /** + * Sets volumes. + * + * @param volumes the volumes + */ + public void setVolumes(Map<String,List<RequirementAssignmentData>> volumes) { + this.volumes = volumes; + } + + /** + * Gets ports. + * + * @return the ports + */ + public Map<String, List<String>> getPorts() { + return ports; + } + + /** + * Sets ports. + * + * @param ports the ports + */ + public void setPorts(Map<String, List<String>> ports) { + this.ports = ports; + } + + /** + * Add port. + * + * @param portType the port type + * @param portNodeTemplateId the port node template id + */ + public void addPort(String portType, String portNodeTemplateId) { + if (this.ports == null) { + this.ports = new HashMap<>(); + } + this.ports.putIfAbsent(portType, new ArrayList<>()); + this.ports.get(portType).add(portNodeTemplateId); + } + + + /** + * Add volume. + * + * @param requirementId the requirement id + * @param requirementAssignment the requirement assignment + */ + public void addVolume(String requirementId, RequirementAssignment requirementAssignment) { + if (this.volumes == null) { + this.volumes = new HashMap<>(); + } + this.volumes.computeIfAbsent(requirementAssignment.getNode(), k -> new ArrayList<>()) + .add(new RequirementAssignmentData(requirementId, + requirementAssignment)); + } +} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/consolidation/ConsolidationData.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/consolidation/ConsolidationData.java new file mode 100644 index 0000000000..496da78f76 --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/consolidation/ConsolidationData.java @@ -0,0 +1,109 @@ +package org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * The type Consolidation data. + */ +public class ConsolidationData { + + //Compute consolidation data + private ComputeConsolidationData computeConsolidationData; + + //Port Consolidation data + private PortConsolidationData portConsolidationData; + + //Key - Service Template file name + //value - List of the abstract/substitute node template id + private Map<String, List<String>> substituteNodeTemplates; // todo - remove this one and use + // nestedConsolidationData instead + + //Nested Consolidation data + private NestedConsolidationData nestedConsolidationData; + + + /** + * Instantiates a new Consolidation data. + */ + public ConsolidationData() { + computeConsolidationData = new ComputeConsolidationData(); + portConsolidationData = new PortConsolidationData(); + nestedConsolidationData = new NestedConsolidationData(); + substituteNodeTemplates = new HashMap<>(); + } + + /** + * Gets compute consolidation data. + * + * @return the compute consolidation data + */ + public ComputeConsolidationData getComputeConsolidationData() { + return computeConsolidationData; + } + + /** + * Sets compute consolidation data. + * + * @param computeConsolidationData the compute consolidation data + */ + public void setComputeConsolidationData(ComputeConsolidationData computeConsolidationData) { + this.computeConsolidationData = computeConsolidationData; + } + + /** + * Gets port consolidation data. + * + * @return the port consolidation data + */ + public PortConsolidationData getPortConsolidationData() { + return portConsolidationData; + } + + /** + * Sets port consolidation data. + * + * @param portConsolidationData the port consolidation data + */ + public void setPortConsolidationData( + PortConsolidationData portConsolidationData) { + this.portConsolidationData = portConsolidationData; + } + + /** + * Gets substitute node templates. + * + * @return the substitute node templates + */ + public Map<String, List<String>> getSubstituteNodeTemplates() { + return substituteNodeTemplates; + } + + /** + * Sets substitute node templates. + * + * @param substituteNodeTemplates the substitute node templates + */ + public void setSubstituteNodeTemplates(Map<String, List<String>> substituteNodeTemplates) { + this.substituteNodeTemplates = substituteNodeTemplates; + } + + /** + * Gets nested consolidation data. + * + * @return the nested consolidation data + */ + public NestedConsolidationData getNestedConsolidationData() { + return nestedConsolidationData; + } + + /** + * Sets nested consolidation data. + * + * @param nestedConsolidationData the nested consolidation data + */ + public void setNestedConsolidationData(NestedConsolidationData nestedConsolidationData) { + this.nestedConsolidationData = nestedConsolidationData; + } +} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/consolidation/EntityConsolidationData.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/consolidation/EntityConsolidationData.java new file mode 100644 index 0000000000..4545d5cdbd --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/consolidation/EntityConsolidationData.java @@ -0,0 +1,245 @@ +package org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation; + +import org.openecomp.sdc.tosca.datatypes.model.RequirementAssignment; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * The type Entity consolidation data. + */ +public class EntityConsolidationData { + + private String nodeTemplateId; + + //groups that point to this entity node template + private List<String> groupIds; + + // key - node template id which has connection to this entity + // value - List of Requirement assignment data which connect to this entity + private Map<String, List<RequirementAssignmentData>> nodesConnectedIn; + + // key - node template id which connected from this entity + // List of Requirement assignment data which connect to the key node template id + private Map<String, List<RequirementAssignmentData>> nodesConnectedOut; + + //key - node template id which include get attribute function from this entity + //key - node template id which include get attribute function from this entity + //value - List of getAttr data + private Map<String, List<GetAttrFuncData>> nodesGetAttrIn; + + //key - node template id which is pointed by this entity using get attribute function + //value - List of getAttr data + private Map<String, List<GetAttrFuncData>> nodesGetAttrOut; + + //List of getAttr data + private List<GetAttrFuncData> outputParametersGetAttrIn; + + /** + * Gets node template id. + * + * @return the node template id + */ + public String getNodeTemplateId() { + return nodeTemplateId; + } + + /** + * Sets node template id. + * + * @param nodeTemplateId the node template id + */ + public void setNodeTemplateId(String nodeTemplateId) { + this.nodeTemplateId = nodeTemplateId; + } + + /** + * Gets group ids point to me. + * + * @return the group ids point to me + */ + public List<String> getGroupIds() { + return groupIds; + } + + /** + * Sets group ids point to me. + * + * @param groupIds the group ids point to me + */ + public void setGroupIds(List<String> groupIds) { + this.groupIds = groupIds; + } + + + /** + * Sets node connected to me. + * + * @param nodesConnectedIn the node connected to me + */ + public void setNodesConnectedIn(Map<String, List<RequirementAssignmentData>> nodesConnectedIn) { + this.nodesConnectedIn = nodesConnectedIn; + } + + /** + * Add nodeConnectedIn. + * + * @param nodeTemplateId the node template id which has connection to me + * @param requirementId the requirement id + * @param requirementAssignment the requirement assignment + */ + public void addNodesConnectedIn(String nodeTemplateId, String requirementId, + RequirementAssignment requirementAssignment) { + if (this.nodesConnectedIn == null) { + this.nodesConnectedIn = new HashMap<>(); + } + this.nodesConnectedIn.computeIfAbsent(nodeTemplateId, k -> new ArrayList<>()); + this.nodesConnectedIn.get(nodeTemplateId).add(new RequirementAssignmentData(requirementId, + requirementAssignment)); + } + + /** + * Gets node connected to me. + * + * @return the node connected to me + */ + public Map<String, List<RequirementAssignmentData>> getNodesConnectedIn() { + return nodesConnectedIn; + } + + + /** + * Gets node connected from me. + * + * @return the node connected from me + */ + public Map<String, List<RequirementAssignmentData>> getNodesConnectedOut() { + return nodesConnectedOut; + } + + /** + * Sets node connected from me. + * + * @param nodesConnectedOut the node connected from me + */ + public void setNodesConnectedOut( + Map<String, List<RequirementAssignmentData>> nodesConnectedOut) { + this.nodesConnectedOut = nodesConnectedOut; + } + + /** + * Add nodeConnectedOut. + * + * @param nodeTemplateId the node template id which is connected from me + * @param requirementId the requirement id + * @param requirementAssignment the requirement assignment + */ + public void addNodesConnectedOut(String nodeTemplateId, String requirementId, + RequirementAssignment + requirementAssignment) { + if (this.nodesConnectedOut == null) { + this.nodesConnectedOut = new HashMap<>(); + } + this.nodesConnectedOut.computeIfAbsent(nodeTemplateId, k -> new ArrayList<>()); + this.nodesConnectedOut.get(nodeTemplateId).add(new RequirementAssignmentData(requirementId, + requirementAssignment)); + } + + /** + * Gets nodes get attr in. + * + * @return the get attr in + */ + public Map<String, List<GetAttrFuncData>> getNodesGetAttrIn() { + return nodesGetAttrIn; + } + + /** + * Sets nodes get attr in. + * + * @param nodesGetAttrIn the get attr in + */ + public void setNodesGetAttrIn( + Map<String, List<GetAttrFuncData>> nodesGetAttrIn) { + this.nodesGetAttrIn = nodesGetAttrIn; + } + + /** + * Add nodes get attr in data. + * + * @param nodeTemplateId the node template id + * @param getAttrFuncData get attr data + */ + public void addNodesGetAttrIn(String nodeTemplateId, GetAttrFuncData getAttrFuncData) { + if (nodesGetAttrIn == null) { + nodesGetAttrIn = new HashMap<>(); + } + this.nodesGetAttrIn.putIfAbsent(nodeTemplateId, new ArrayList<>()); + this.nodesGetAttrIn.get(nodeTemplateId).add(getAttrFuncData); + } + + /** + * Gets output parameters get attr from me. + * + * @return the get attr from me + */ + public List<GetAttrFuncData> getOutputParametersGetAttrIn() { + return outputParametersGetAttrIn; + } + + /** + * Sets output parameters get attr from me. + * + * @param outputParametersGetAttrIn the output parameters get attr from me + */ + public void setOutputParametersGetAttrIn(List<GetAttrFuncData> outputParametersGetAttrIn) { + this.outputParametersGetAttrIn = outputParametersGetAttrIn; + } + + /** + * Add output parameters get attr data. + * + * @param getAttrFuncData get attr data + */ + public void addOutputParamGetAttrIn(GetAttrFuncData getAttrFuncData) { + if (outputParametersGetAttrIn == null) { + outputParametersGetAttrIn = new ArrayList<>(); + } + this.outputParametersGetAttrIn.add(getAttrFuncData); + } + + /** + * Gets nodes get attr out. + * + * @return the get attr out + */ + public Map<String, List<GetAttrFuncData>> getNodesGetAttrOut() { + return nodesGetAttrOut; + } + + /** + * Sets nodes get attr out. + * + * @param nodesGetAttrOut the get attr out + */ + public void setNodesGetAttrOut( + Map<String, List<GetAttrFuncData>> nodesGetAttrOut) { + this.nodesGetAttrOut = nodesGetAttrOut; + } + + /** + * Add nodes get attr out data. + * + * @param nodeTemplateId the node template id + * @param getAttrFuncData get attr data + */ + public void addNodesGetAttrOut(String nodeTemplateId, GetAttrFuncData getAttrFuncData) { + if (nodesGetAttrOut == null) { + nodesGetAttrOut = new HashMap<>(); + } + this.nodesGetAttrOut.putIfAbsent(nodeTemplateId, new ArrayList<>()); + this.nodesGetAttrOut.get(nodeTemplateId).add(getAttrFuncData); + } +} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/consolidation/FileComputeConsolidationData.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/consolidation/FileComputeConsolidationData.java new file mode 100644 index 0000000000..04a75d37b2 --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/consolidation/FileComputeConsolidationData.java @@ -0,0 +1,56 @@ +package org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +/** + * The type File compute consolidation data. + */ +public class FileComputeConsolidationData { + + //key - compute node type name (vm_type) + private Map<String, TypeComputeConsolidationData> typeComputeConsolidationData; + + /** + * Instantiates a new File compute consolidation data. + */ + public FileComputeConsolidationData() { + typeComputeConsolidationData = new HashMap<>(); + } + + /** + * Gets all compute types. + * + * @return the all compute types + */ + public Set<String> getAllComputeTypes() { + return typeComputeConsolidationData.keySet(); + } + + public Collection<TypeComputeConsolidationData> getAllTypeComputeConsolidationData(){ + return typeComputeConsolidationData.values(); + } + + /** + * Gets type compute consolidation data. + * + * @param computeType the compute type + * @return the type compute consolidation data + */ + public TypeComputeConsolidationData getTypeComputeConsolidationData(String computeType) { + return typeComputeConsolidationData.get(computeType); + } + + /** + * Sets type compute consolidation data. + * + * @param computeType the compute type + * @param typeComputeConsolidationData the type compute consolidation data + */ + public void setTypeComputeConsolidationData(String computeType, TypeComputeConsolidationData + typeComputeConsolidationData) { + this.typeComputeConsolidationData.put(computeType, typeComputeConsolidationData); + } +} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/consolidation/FileNestedConsolidationData.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/consolidation/FileNestedConsolidationData.java new file mode 100644 index 0000000000..1a3948a3a8 --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/consolidation/FileNestedConsolidationData.java @@ -0,0 +1,55 @@ +package org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +/** + * The type File nested node consolidation data. + */ +public class FileNestedConsolidationData { + + //key - nested node template id + private Map<String, NestedTemplateConsolidationData> nestedTemplateConsolidationData; + + public FileNestedConsolidationData() { + this.nestedTemplateConsolidationData = new HashMap<>(); + } + + /** + * Gets all nested node template ids. + * + * @return the all nested node template ids + */ + public Set<String> getAllNestedNodeTemplateIds() { + return nestedTemplateConsolidationData.keySet(); + } + + public Collection<NestedTemplateConsolidationData> getAllNestedConsolidationData() { + return nestedTemplateConsolidationData.values(); + } + + /** + * Gets nested template consolidation data. + * + * @param nestedNodeTemplateId the nested node template id + * @return the nested template consolidation data + */ + public NestedTemplateConsolidationData getNestedTemplateConsolidationData( + String nestedNodeTemplateId) { + return nestedTemplateConsolidationData.get(nestedNodeTemplateId); + } + + /** + * Sets nested template consolidation data. + * + * @param nestedNodeTemplateId the nested node template id + * @param nestedTemplateConsolidationData the nested template consolidation data + */ + public void setNestedTemplateConsolidationData( + String nestedNodeTemplateId, + NestedTemplateConsolidationData nestedTemplateConsolidationData) { + this.nestedTemplateConsolidationData.put(nestedNodeTemplateId, nestedTemplateConsolidationData); + } +} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/consolidation/FilePortConsolidationData.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/consolidation/FilePortConsolidationData.java new file mode 100644 index 0000000000..fd02edb818 --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/consolidation/FilePortConsolidationData.java @@ -0,0 +1,54 @@ +package org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +/** + * The type File port consolidation data. + */ +public class FilePortConsolidationData { + + //key - port node template id + private Map<String, PortTemplateConsolidationData> portTemplateConsolidationData; + + public FilePortConsolidationData() { + this.portTemplateConsolidationData = new HashMap<>(); + } + + /** + * Gets all port node template ids. + * + * @return the all port node template ids + */ + public Set<String> getAllPortNodeTemplateIds() { + return portTemplateConsolidationData.keySet(); + } + + public Collection<PortTemplateConsolidationData> getAllPortConsolidationData() { + return portTemplateConsolidationData.values(); + } + + /** + * Gets port template consolidation data. + * + * @param portNodeTemplateId the port node template id + * @return the port template consolidation data + */ + public PortTemplateConsolidationData getPortTemplateConsolidationData(String portNodeTemplateId) { + return portTemplateConsolidationData.get(portNodeTemplateId); + } + + /** + * Sets port template consolidation data. + * + * @param portNodeTemplateId the port node template id + * @param portTemplateConsolidationData the port template consolidation data + */ + public void setPortTemplateConsolidationData(String portNodeTemplateId, + PortTemplateConsolidationData + portTemplateConsolidationData) { + this.portTemplateConsolidationData.put(portNodeTemplateId, portTemplateConsolidationData); + } +} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/consolidation/GetAttrFuncData.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/consolidation/GetAttrFuncData.java new file mode 100644 index 0000000000..8c88232e57 --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/consolidation/GetAttrFuncData.java @@ -0,0 +1,62 @@ +package org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation; + +/** + * The type get attribute data. + */ +public class GetAttrFuncData { + + private String fieldName; + private String attributeName; + + public GetAttrFuncData(){} + + public GetAttrFuncData(String fieldName, String attributeName) { + this.fieldName = fieldName; + this.attributeName = attributeName; + } + + public String getFieldName() { + return fieldName; + } + + public void setFieldName(String fieldName) { + this.fieldName = fieldName; + } + + public String getAttributeName() { + return attributeName; + } + + public void setAttributeName(String attributeName) { + this.attributeName = attributeName; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + GetAttrFuncData that = (GetAttrFuncData) o; + + if (fieldName != null ? !fieldName.equals(that.fieldName) : that.fieldName != null) { + return false; + } + if (attributeName != null ? !attributeName.equals(that.attributeName) + : that.attributeName != null) { + return false; + } + + return true; + } + + @Override + public int hashCode() { + int result = fieldName != null ? fieldName.hashCode() : 0; + result = 31 * result + (attributeName != null ? attributeName.hashCode() : 0); + return result; + } +} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/consolidation/NestedConsolidationData.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/consolidation/NestedConsolidationData.java new file mode 100644 index 0000000000..8dde9510e2 --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/consolidation/NestedConsolidationData.java @@ -0,0 +1,50 @@ +package org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation; + +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +/** + * The type Nested Node consolidation data. + */ +public class NestedConsolidationData { + + //Key - Service template file name + private Map<String, FileNestedConsolidationData> fileNestedConsolidationData; + + public NestedConsolidationData() { + this.fileNestedConsolidationData = new HashMap<>(); + } + + /** + * Gets all files. + * + * @return the all files + */ + public Set<String> getAllServiceTemplateFileNames() { + return fileNestedConsolidationData.keySet(); + } + + /** + * Gets file nested consolidation data. + * + * @param serviceTemplateFileName the service template file name + * @return the file nested consolidation data + */ + public FileNestedConsolidationData getFileNestedConsolidationData(String + serviceTemplateFileName) { + return fileNestedConsolidationData.get(serviceTemplateFileName); + } + + /** + * Sets file nested consolidation data. + * + * @param serviceTemplateFileName the service template file name + * @param fileNestedConsolidationData the file nested consolidation data + */ + public void setFileNestedConsolidationData(String serviceTemplateFileName, + FileNestedConsolidationData + fileNestedConsolidationData) { + this.fileNestedConsolidationData.put(serviceTemplateFileName, fileNestedConsolidationData); + } +} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/consolidation/NestedTemplateConsolidationData.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/consolidation/NestedTemplateConsolidationData.java new file mode 100644 index 0000000000..b07c2039b8 --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/consolidation/NestedTemplateConsolidationData.java @@ -0,0 +1,11 @@ +package org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation; + +import java.util.List; + + +/** + * The type nested template consolidation data. + */ +public class NestedTemplateConsolidationData extends EntityConsolidationData { + +}
\ No newline at end of file diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/consolidation/PortConsolidationData.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/consolidation/PortConsolidationData.java new file mode 100644 index 0000000000..5c1d38b6e4 --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/consolidation/PortConsolidationData.java @@ -0,0 +1,48 @@ +package org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation; + +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +/** + * The type Port consolidation data. + */ +public class PortConsolidationData { + + //Key - Service template file name + private Map<String, FilePortConsolidationData> filePortConsolidationData; + + public PortConsolidationData() { + this.filePortConsolidationData = new HashMap<>(); + } + + /** + * Gets all files. + * + * @return the all files + */ + public Set<String> getAllServiceTemplateFileNames() { + return filePortConsolidationData.keySet(); + } + + /** + * Gets file port consolidation data. + * + * @param serviceTemplateFileName the service template file name + * @return the file port consolidation data + */ + public FilePortConsolidationData getFilePortConsolidationData(String serviceTemplateFileName) { + return filePortConsolidationData.get(serviceTemplateFileName); + } + + /** + * Sets file port consolidation data. + * + * @param serviceTemplateFileName the service template file name + * @param filePortConsolidationData the file port consolidation data + */ + public void setFilePortConsolidationData(String serviceTemplateFileName, FilePortConsolidationData + filePortConsolidationData) { + this.filePortConsolidationData.put(serviceTemplateFileName, filePortConsolidationData); + } +} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/consolidation/PortTemplateConsolidationData.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/consolidation/PortTemplateConsolidationData.java new file mode 100644 index 0000000000..c9b59f99db --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/consolidation/PortTemplateConsolidationData.java @@ -0,0 +1,30 @@ +package org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation; + +import java.util.List; + + +/** + * The type Port template consolidation data. + */ +public class PortTemplateConsolidationData extends EntityConsolidationData { + + private List<String> subPortIds; //sub ports which point to this port + + /** + * Gets sub port ids. + * + * @return the sub port ids + */ + public List<String> getSubPortIds() { + return subPortIds; + } + + /** + * Sets sub port ids. + * + * @param subPortIds the sub port ids + */ + public void setSubPortIds(List<String> subPortIds) { + this.subPortIds = subPortIds; + } +}
\ No newline at end of file diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/consolidation/RequirementAssignmentData.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/consolidation/RequirementAssignmentData.java new file mode 100644 index 0000000000..a2fffd5a3b --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/consolidation/RequirementAssignmentData.java @@ -0,0 +1,60 @@ +package org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation; + +import org.openecomp.sdc.tosca.datatypes.model.RequirementAssignment; + +/** + * The type Requirement assignment data. + */ +public class RequirementAssignmentData { + + private String requirementId; + private RequirementAssignment requirementAssignment; + + /** + * Instantiates a new Requirement assignment data. + * + * @param requirementId the requirement id + * @param requirementAssignment the requirement assignment + */ + public RequirementAssignmentData(String requirementId, RequirementAssignment + requirementAssignment) { + this.requirementId = requirementId; + this.requirementAssignment = requirementAssignment; + } + + /** + * Gets requirement id. + * + * @return the requirement id + */ + public String getRequirementId() { + return requirementId; + } + + /** + * Sets requirement id. + * + * @param requirementId the requirement id + */ + public void setRequirementId(String requirementId) { + this.requirementId = requirementId; + } + + /** + * Gets requirement assignment. + * + * @return the requirement assignment + */ + public RequirementAssignment getRequirementAssignment() { + return requirementAssignment; + } + + /** + * Sets requirement assignment. + * + * @param requirementAssignment the requirement assignment + */ + public void setRequirementAssignment(RequirementAssignment requirementAssignment) { + this.requirementAssignment = requirementAssignment; + } +} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/consolidation/TypeComputeConsolidationData.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/consolidation/TypeComputeConsolidationData.java new file mode 100644 index 0000000000..c95db52b95 --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/consolidation/TypeComputeConsolidationData.java @@ -0,0 +1,59 @@ +package org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +/** + * The type Type compute consolidation data. + */ +public class TypeComputeConsolidationData { + + //key - compute node template id + private Map<String, ComputeTemplateConsolidationData> computeTemplateConsolidationData; + + /** + * Instantiates a new Type compute consolidation data. + */ + public TypeComputeConsolidationData() { + computeTemplateConsolidationData = new HashMap<>(); + } + + /** + * Gets all compute node template ids. + * + * @return the all compute node template ids + */ + public Set<String> getAllComputeNodeTemplateIds() { + return computeTemplateConsolidationData.keySet(); + } + + public Collection<ComputeTemplateConsolidationData> getAllComputeTemplateConsolidationData(){ + return computeTemplateConsolidationData.values(); + } + + /** + * Gets compute template consolidation data. + * + * @param computeNodeTemplateId the compute node template id + * @return the compute template consolidation data + */ + public ComputeTemplateConsolidationData getComputeTemplateConsolidationData( + String computeNodeTemplateId) { + return computeTemplateConsolidationData.get(computeNodeTemplateId); + } + + /** + * Sets compute template consolidation data. + * + * @param computeNodeTemplateId the compute node template id + * @param computeTemplateConsolidationData the compute template consolidation data + */ + public void setComputeTemplateConsolidationData(String computeNodeTemplateId, + ComputeTemplateConsolidationData + computeTemplateConsolidationData) { + this.computeTemplateConsolidationData.put(computeNodeTemplateId, + computeTemplateConsolidationData); + } +} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/impl/heattotosca/HeatToToscaTranslatorFactoryImpl.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/impl/heattotosca/HeatToToscaTranslatorFactoryImpl.java index 57f753f103..fe2286c912 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/impl/heattotosca/HeatToToscaTranslatorFactoryImpl.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/impl/heattotosca/HeatToToscaTranslatorFactoryImpl.java @@ -23,6 +23,7 @@ package org.openecomp.sdc.translator.impl.heattotosca; import org.openecomp.core.translator.api.HeatToToscaTranslator; import org.openecomp.core.translator.factory.HeatToToscaTranslatorFactory; + public class HeatToToscaTranslatorFactoryImpl extends HeatToToscaTranslatorFactory { private static HeatToToscaTranslator INSTANCE = new HeatToToscaTranslatorImpl(); diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/impl/heattotosca/HeatToToscaTranslatorImpl.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/impl/heattotosca/HeatToToscaTranslatorImpl.java index 0a6986816c..e09be6cdd9 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/impl/heattotosca/HeatToToscaTranslatorImpl.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/impl/heattotosca/HeatToToscaTranslatorImpl.java @@ -21,22 +21,30 @@ package org.openecomp.sdc.translator.impl.heattotosca; import org.apache.commons.collections4.MapUtils; +import org.openecomp.config.api.Configuration; +import org.openecomp.config.api.ConfigurationManager; import org.openecomp.core.translator.api.HeatToToscaTranslator; import org.openecomp.core.translator.datatypes.TranslatorOutput; import org.openecomp.core.utilities.file.FileUtils; import org.openecomp.core.utilities.json.JsonUtil; import org.openecomp.core.validation.api.ValidationManager; -import org.openecomp.core.validation.errors.Messages; import org.openecomp.core.validation.factory.ValidationManagerFactory; -import org.openecomp.core.validation.types.MessageContainerUtil; -import org.openecomp.sdc.common.utils.AsdcCommon; +import org.openecomp.core.validation.util.MessageContainerUtil; +import org.openecomp.sdc.common.errors.Messages; +import org.openecomp.sdc.common.utils.SdcCommon; +import org.openecomp.sdc.datatypes.configuration.ImplementationConfiguration; import org.openecomp.sdc.datatypes.error.ErrorLevel; import org.openecomp.sdc.datatypes.error.ErrorMessage; import org.openecomp.sdc.heat.datatypes.manifest.FileData; import org.openecomp.sdc.heat.datatypes.manifest.ManifestContent; import org.openecomp.sdc.heat.datatypes.manifest.ManifestFile; -import org.openecomp.sdc.translator.services.heattotosca.TranslationContext; +import org.openecomp.sdc.tosca.datatypes.ToscaServiceModel; +import org.openecomp.sdc.translator.datatypes.heattotosca.TranslationContext; +import org.openecomp.sdc.translator.services.heattotosca.ConfigConstants; +import org.openecomp.sdc.translator.services.heattotosca.ConsolidationService; import org.openecomp.sdc.translator.services.heattotosca.TranslationService; +import org.openecomp.sdc.translator.services.heattotosca.UnifiedCompositionManager; +import org.openecomp.sdc.translator.services.heattotosca.UnifiedCompositionService; import java.io.InputStream; import java.util.HashMap; @@ -59,7 +67,7 @@ public class HeatToToscaTranslatorImpl implements HeatToToscaTranslator { manifest.setContent(manifestData); translationContext.setManifest(manifest); translationContext.addFile(name, content); - validationManager.addFile(AsdcCommon.MANIFEST_NAME, content); + validationManager.addFile(SdcCommon.MANIFEST_NAME, content); addFilesFromManifestToTranslationContextManifestFilesMap(manifestData.getData()); isValid = false; } @@ -82,7 +90,7 @@ public class HeatToToscaTranslatorImpl implements HeatToToscaTranslator { Map<String, List<ErrorMessage>> errors = new HashMap<>(); if (translationContext.getManifest() == null) { - ErrorMessage.ErrorMessageUtil.addMessage(AsdcCommon.MANIFEST_NAME, errors) + ErrorMessage.ErrorMessageUtil.addMessage(SdcCommon.MANIFEST_NAME, errors) .add(new ErrorMessage(ErrorLevel.ERROR, Messages.MANIFEST_NOT_EXIST.getErrorMessage())); return errors; } @@ -90,7 +98,7 @@ public class HeatToToscaTranslatorImpl implements HeatToToscaTranslator { if (MapUtils.isEmpty(errors)) { errors = validationManager.validate(); } - if (MapUtils.isEmpty(errors)) { + if (MapUtils.isEmpty(MessageContainerUtil.getMessageByLevel(ErrorLevel.ERROR, errors))) { isValid = true; } return errors; @@ -100,6 +108,8 @@ public class HeatToToscaTranslatorImpl implements HeatToToscaTranslator { public TranslatorOutput translate() { TranslationService translationService = new TranslationService(); TranslatorOutput translatorOutput = new TranslatorOutput(); + UnifiedCompositionManager unifiedCompositionManager = new UnifiedCompositionManager(new + ConsolidationService(new UnifiedCompositionService())); if (!isValid) { Map<String, List<ErrorMessage>> errors = validate(); @@ -110,6 +120,9 @@ public class HeatToToscaTranslatorImpl implements HeatToToscaTranslator { } translatorOutput = translationService.translateHeatFiles(translationContext); + ToscaServiceModel unifiedToscaServiceModel = unifiedCompositionManager + .createUnifiedComposition(translatorOutput.getToscaServiceModel(), translationContext); + translatorOutput.setToscaServiceModel(unifiedToscaServiceModel); return translatorOutput; } diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/ConfigConstants.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/ConfigConstants.java new file mode 100644 index 0000000000..f6918e382b --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/ConfigConstants.java @@ -0,0 +1,49 @@ +/*- + * ============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.services.heattotosca; + +public class ConfigConstants { + //namespaces + public static final String MANDATORY_TRANSLATOR_NAMESPACE = "mandatoryHeatToToscaTranslator"; + public static final String MANDATORY_UNIFIED_MODEL_NAMESPACE = "mandatoryUnifiedModel"; + public static final String TRANSLATOR_NAMESPACE = "heatToToscaTranslator"; + public static final String MAPPING_NAMESPACE = "heatToToscaMapping"; + + //keys + public static final String RESOURCE_TRANSLATION_IMPL_KEY = "resourceTranslationImpl"; + public static final String NESTED_RESOURCE_TRANSLATION_IMPL_KEY = "NestedResource"; + public static final String DEFAULT_RESOURCE_TRANSLATION_IMPL_KEY = "DefaultResource"; + public static final String FUNCTION_TRANSLATION_IMPL_KEY = "functionTranslationImpl"; + public static final String NAMING_CONVENTION_EXTRACTOR_IMPL_KEY = "namingConventionExtractImpl"; + public static final String UNIFIED_COMPOSITION_IMPL_KEY = "unifiedCompositionImpl"; + public static final String CONTRAIL_COMPUTE_NODE_TYPE_IMPL_KEY = "ContrailComputeNodeTypeName"; + public static final String RESOURCE_MAPPING_KEY = "resourceMapping"; + public static final String SUPPORTED_CONSOLIDATION_COMPUTE_RESOURCES_KEY = + "supportedConsolidationComputeResources"; + public static final String SUPPORTED_CONSOLIDATION_PORT_RESOURCES_KEY = + "supportedConsolidationPortResources"; + + //others + public static final String TRANS_MAPPING_DELIMITER_CHAR = "#"; + + private ConfigConstants() { + } +} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/ConsolidationDataUtil.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/ConsolidationDataUtil.java new file mode 100644 index 0000000000..a89d08bcf6 --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/ConsolidationDataUtil.java @@ -0,0 +1,621 @@ +package org.openecomp.sdc.translator.services.heattotosca; + +import org.apache.commons.collections4.MapUtils; +import org.apache.commons.lang3.math.NumberUtils; +import org.openecomp.sdc.datatypes.configuration.ImplementationConfiguration; +import org.openecomp.sdc.heat.datatypes.model.HeatOrchestrationTemplate; +import org.openecomp.sdc.heat.datatypes.model.HeatResourcesTypes; +import org.openecomp.sdc.heat.datatypes.model.Resource; +import org.openecomp.sdc.logging.api.Logger; +import org.openecomp.sdc.logging.api.LoggerFactory; +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.ToscaUtil; +import org.openecomp.sdc.translator.datatypes.heattotosca.TranslationContext; +import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.ComputeConsolidationData; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.ComputeTemplateConsolidationData; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.ConsolidationData; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.EntityConsolidationData; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.FileComputeConsolidationData; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.FileNestedConsolidationData; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.FilePortConsolidationData; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.GetAttrFuncData; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.NestedConsolidationData; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.NestedTemplateConsolidationData; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.PortConsolidationData; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.PortTemplateConsolidationData; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.RequirementAssignmentData; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.TypeComputeConsolidationData; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Objects; + + +/** + * Utility class for consolidation data collection helper methods. + */ +public class ConsolidationDataUtil { + + protected static Logger logger = (Logger) LoggerFactory.getLogger(ConsolidationDataUtil.class); + + /** + * Gets compute template consolidation data. + * + * @param context the translation context + * @param serviceTemplate the service template + * @param computeNodeType the compute node type + * @param computeNodeTemplateId the compute node template id + * @return the compute template consolidation data + */ + public static ComputeTemplateConsolidationData getComputeTemplateConsolidationData( + TranslationContext context, + ServiceTemplate serviceTemplate, + String computeNodeType, + String computeNodeTemplateId) { + + ConsolidationData consolidationData = context.getConsolidationData(); + String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate); + + ComputeConsolidationData computeConsolidationData = consolidationData + .getComputeConsolidationData(); + + FileComputeConsolidationData fileComputeConsolidationData = computeConsolidationData + .getFileComputeConsolidationData(serviceTemplateFileName); + + if (fileComputeConsolidationData == null) { + fileComputeConsolidationData = new FileComputeConsolidationData(); + computeConsolidationData.setFileComputeConsolidationData(serviceTemplateFileName, + fileComputeConsolidationData); + } + + TypeComputeConsolidationData typeComputeConsolidationData = fileComputeConsolidationData + .getTypeComputeConsolidationData(computeNodeType); + if (typeComputeConsolidationData == null) { + typeComputeConsolidationData = new TypeComputeConsolidationData(); + fileComputeConsolidationData.setTypeComputeConsolidationData(computeNodeType, + typeComputeConsolidationData); + } + + ComputeTemplateConsolidationData computeTemplateConsolidationData = + typeComputeConsolidationData.getComputeTemplateConsolidationData(computeNodeTemplateId); + if (computeTemplateConsolidationData == null) { + computeTemplateConsolidationData = new ComputeTemplateConsolidationData(); + computeTemplateConsolidationData.setNodeTemplateId(computeNodeTemplateId); + typeComputeConsolidationData.setComputeTemplateConsolidationData(computeNodeTemplateId, + computeTemplateConsolidationData); + } + + return computeTemplateConsolidationData; + } + + + /** + * Gets port template consolidation data. + * + * @param context the context + * @param serviceTemplate the service template + * @param portNodeTemplateId the port node template id + * @return the port template consolidation data + */ + public static PortTemplateConsolidationData getPortTemplateConsolidationData( + TranslationContext context, + ServiceTemplate serviceTemplate, + String portNodeTemplateId) { + + ConsolidationData consolidationData = context.getConsolidationData(); + String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate); + + PortConsolidationData portConsolidationData = consolidationData.getPortConsolidationData(); + + FilePortConsolidationData filePortConsolidationData = portConsolidationData + .getFilePortConsolidationData(serviceTemplateFileName); + + if (filePortConsolidationData == null) { + filePortConsolidationData = new FilePortConsolidationData(); + portConsolidationData.setFilePortConsolidationData(serviceTemplateFileName, + filePortConsolidationData); + } + + PortTemplateConsolidationData portTemplateConsolidationData = + filePortConsolidationData.getPortTemplateConsolidationData(portNodeTemplateId); + if (portTemplateConsolidationData == null) { + portTemplateConsolidationData = new PortTemplateConsolidationData(); + portTemplateConsolidationData.setNodeTemplateId(portNodeTemplateId); + filePortConsolidationData.setPortTemplateConsolidationData(portNodeTemplateId, + portTemplateConsolidationData); + } + + return portTemplateConsolidationData; + } + + + /** + * Gets nested template consolidation data. + * + * @param context the context + * @param serviceTemplate the service template + * @param nestedNodeTemplateId the nested node template id + * @return the nested template consolidation data + */ + public static NestedTemplateConsolidationData getNestedTemplateConsolidationData( + TranslationContext context, + ServiceTemplate serviceTemplate, + String nestedNodeTemplateId) { + + ConsolidationData consolidationData = context.getConsolidationData(); + String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate); + + NestedConsolidationData nestedConsolidationData = consolidationData + .getNestedConsolidationData(); + + FileNestedConsolidationData fileNestedConsolidationData = nestedConsolidationData + .getFileNestedConsolidationData(serviceTemplateFileName); + + if (fileNestedConsolidationData == null) { + fileNestedConsolidationData = new FileNestedConsolidationData(); + nestedConsolidationData.setFileNestedConsolidationData(serviceTemplateFileName, + fileNestedConsolidationData); + } + + NestedTemplateConsolidationData nestedTemplateConsolidationData = + fileNestedConsolidationData.getNestedTemplateConsolidationData(nestedNodeTemplateId); + if (nestedTemplateConsolidationData == null) { + nestedTemplateConsolidationData = new NestedTemplateConsolidationData(); + nestedTemplateConsolidationData.setNodeTemplateId(nestedNodeTemplateId); + fileNestedConsolidationData.setNestedTemplateConsolidationData(nestedNodeTemplateId, + nestedTemplateConsolidationData); + } + + return nestedTemplateConsolidationData; + } + + /** + * Update group id information in consolidation data. + * + * @param entityConsolidationData Entity consolidation data (Port/Compute) + * @param translatedGroupId Group id of which compute node is a part + */ + public static void updateGroupIdInConsolidationData(EntityConsolidationData + entityConsolidationData, + String translatedGroupId) { + if (entityConsolidationData.getGroupIds() == null) { + entityConsolidationData.setGroupIds(new ArrayList<>()); + } + entityConsolidationData.getGroupIds().add(translatedGroupId); + } + + /** + * Update volume information in consolidation data. + * + * @param translateTo {@link TranslateTo} object + * @param computeType Local type of the compute node + * @param computeNodeTemplateId Node template id of the compute node + * @param requirementAssignment RequirementAssignment object + */ + public static void updateComputeConsolidationDataVolumes(TranslateTo translateTo, + String computeType, + String computeNodeTemplateId, + String requirementId, + RequirementAssignment + requirementAssignment) { + TranslationContext translationContext = translateTo.getContext(); + ServiceTemplate serviceTemplate = translateTo.getServiceTemplate(); + ComputeTemplateConsolidationData computeTemplateConsolidationData = + getComputeTemplateConsolidationData(translationContext, serviceTemplate, computeType, + computeNodeTemplateId); + computeTemplateConsolidationData.addVolume(requirementId, requirementAssignment); + } + + + /** + * Update port in consolidation data. + * + * @param translateTo the translate to + * @param computeNodeType the compute node type + * @param portNodeTemplateId the port node template id + */ + public static void updatePortInConsolidationData(TranslateTo translateTo, + String computeNodeType, + String portNodeTemplateId) { + TranslationContext translationContext = translateTo.getContext(); + ServiceTemplate serviceTemplate = translateTo.getServiceTemplate(); + ComputeTemplateConsolidationData computeTemplateConsolidationData = + getComputeTemplateConsolidationData(translationContext, serviceTemplate, computeNodeType, + translateTo.getTranslatedId()); + computeTemplateConsolidationData.addPort(getPortType(portNodeTemplateId), portNodeTemplateId); + // create port in consolidation data + getPortTemplateConsolidationData(translationContext, serviceTemplate, portNodeTemplateId); + } + + /** + * Update nodes connected in and out for Depends on and connectivity in consolidation data. + * + * @param translateTo the translate to + * @param targetResourceId the target resource id + * @param nodeTemplateId the source node template id + * @param requirementAssignment the requirement assignment + */ + public static void updateNodesConnectedData(TranslateTo translateTo, String targetResourceId, + Resource targetResource, Resource sourceResource, + String nodeTemplateId, String requirementId, + RequirementAssignment requirementAssignment) { + ConsolidationEntityType consolidationEntityType = ConsolidationEntityType.OTHER; + HeatOrchestrationTemplate heatOrchestrationTemplate = translateTo + .getHeatOrchestrationTemplate(); + TranslationContext translationContext = translateTo.getContext(); + + consolidationEntityType.setEntityType(heatOrchestrationTemplate, sourceResource, + targetResource, translateTo.getContext()); + // Add resource dependency information in nodesConnectedIn if the target node + // is a consolidation entity + if (isConsolidationEntity(consolidationEntityType.getTargetEntityType()) + && HeatToToscaUtil + .isValidDependsOnCandidate(heatOrchestrationTemplate, sourceResource, + targetResource, consolidationEntityType, translationContext)) { + ConsolidationDataUtil.updateNodesConnectedIn(translateTo, + nodeTemplateId, consolidationEntityType.getTargetEntityType(), targetResourceId, + requirementId, requirementAssignment); + } + + //Add resource dependency information in nodesConnectedOut if the source node + //is a consolidation entity + if (isConsolidationEntity(consolidationEntityType.getSourceEntityType()) + && HeatToToscaUtil + .isValidDependsOnCandidate(heatOrchestrationTemplate, sourceResource, + targetResource, consolidationEntityType, translationContext)) { + ConsolidationDataUtil.updateNodesConnectedOut(translateTo, + requirementAssignment.getNode(), consolidationEntityType.getSourceEntityType(), + requirementId, requirementAssignment); + } + } + + + private static boolean isConsolidationEntity(ConsolidationEntityType consolidationEntityType) { + return (consolidationEntityType == ConsolidationEntityType.COMPUTE + || consolidationEntityType == ConsolidationEntityType.PORT + || consolidationEntityType == ConsolidationEntityType.NESTED + || consolidationEntityType == ConsolidationEntityType.VFC_NESTED); + } + + /** + * Update nodes connected from this node in consolidation data. + * + * @param translateTo the translate to + * @param nodeTemplateId the node template id of the target node + * @param consolidationEntityType the entity type (compute or port) + * @param requirementId the requirement id + * @param requirementAssignment the requirement assignment + */ + public static void updateNodesConnectedOut(TranslateTo translateTo, + String nodeTemplateId, + ConsolidationEntityType consolidationEntityType, + String requirementId, + RequirementAssignment requirementAssignment) { + EntityConsolidationData entityConsolidationData = null; + TranslationContext translationContext = translateTo.getContext(); + ServiceTemplate serviceTemplate = translateTo.getServiceTemplate(); + RequirementAssignmentData requirementAssignmentData = new RequirementAssignmentData( + requirementId, requirementAssignment); + + if (consolidationEntityType == ConsolidationEntityType.COMPUTE) { + String nodeType = DataModelUtil.getNodeTemplate(serviceTemplate, translateTo + .getTranslatedId()).getType(); + entityConsolidationData = getComputeTemplateConsolidationData(translationContext, + serviceTemplate, nodeType, translateTo.getTranslatedId()); + } else if (consolidationEntityType == ConsolidationEntityType.PORT) { + entityConsolidationData = getPortTemplateConsolidationData(translationContext, + serviceTemplate, translateTo.getTranslatedId()); + } else if (consolidationEntityType == ConsolidationEntityType.VFC_NESTED + || consolidationEntityType == ConsolidationEntityType.NESTED) { + //ConnectedOut data for nested is not updated + return; + } + + if (entityConsolidationData.getNodesConnectedOut() == null) { + entityConsolidationData.setNodesConnectedOut(new HashMap<>()); + } + + entityConsolidationData.getNodesConnectedOut() + .computeIfAbsent(nodeTemplateId, k -> new ArrayList<>()) + .add(requirementAssignmentData); + } + + /** + * Update nodes connected from this node in consolidation data. + * + * @param translateTo the translate to + * @param sourceNodeTemplateId the node template id of the source node + * @param consolidationEntityType Entity type (compute or port) + * @param requirementId Requirement Id + * @param requirementAssignment the requirement assignment + */ + public static void updateNodesConnectedIn(TranslateTo translateTo, String sourceNodeTemplateId, + ConsolidationEntityType consolidationEntityType, + String targetResourceId, + String requirementId, + RequirementAssignment requirementAssignment) { + EntityConsolidationData entityConsolidationData = null; + TranslationContext translationContext = translateTo.getContext(); + ServiceTemplate serviceTemplate = translateTo.getServiceTemplate(); + RequirementAssignmentData requirementAssignmentData = new RequirementAssignmentData( + requirementId, requirementAssignment); + String dependentNodeTemplateId = requirementAssignment.getNode(); + if (consolidationEntityType == ConsolidationEntityType.COMPUTE) { + NodeTemplate computeNodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate, + dependentNodeTemplateId); + String nodeType = null; + if (Objects.isNull(computeNodeTemplate)) { + Resource targetResource = + translateTo.getHeatOrchestrationTemplate().getResources().get(targetResourceId); + NameExtractor nodeTypeNameExtractor = + translateTo.getContext().getNameExtractorImpl(targetResource.getType()); + nodeType = + nodeTypeNameExtractor.extractNodeTypeName(translateTo.getHeatOrchestrationTemplate() + .getResources().get(dependentNodeTemplateId), + dependentNodeTemplateId, dependentNodeTemplateId); + } else { + nodeType = computeNodeTemplate.getType(); + } + + entityConsolidationData = getComputeTemplateConsolidationData(translationContext, + serviceTemplate, nodeType, dependentNodeTemplateId); + } else if (consolidationEntityType == ConsolidationEntityType.PORT) { + entityConsolidationData = getPortTemplateConsolidationData(translationContext, + serviceTemplate, dependentNodeTemplateId); + } else if (consolidationEntityType == ConsolidationEntityType.NESTED + || consolidationEntityType == ConsolidationEntityType.VFC_NESTED) { + entityConsolidationData = getNestedTemplateConsolidationData(translationContext, + serviceTemplate, dependentNodeTemplateId); + } + + if (entityConsolidationData.getNodesConnectedIn() == null) { + entityConsolidationData.setNodesConnectedIn(new HashMap<>()); + } + + entityConsolidationData.getNodesConnectedIn() + .computeIfAbsent(sourceNodeTemplateId, k -> new ArrayList<>()) + .add(requirementAssignmentData); + + } + + /** + * Checks if the current HEAT resource if of type compute. + * + * @param heatOrchestrationTemplate the heat orchestration template + * @param resourceId the resource id + * @return true if the resource is of compute type and false otherwise + */ + public static boolean isComputeResource(HeatOrchestrationTemplate heatOrchestrationTemplate, + String resourceId) { + String resourceType = heatOrchestrationTemplate.getResources().get(resourceId).getType(); + Map<String, ImplementationConfiguration> supportedComputeResources = TranslationContext + .getSupportedConsolidationComputeResources(); + if (supportedComputeResources.containsKey(resourceType)) { + if (supportedComputeResources.get(resourceType).isEnable()) { + return true; + } + return false; + } + return false; + } + + /** + * Checks if the current HEAT resource if of type compute. + * + * @param resource the resource + * @return true if the resource is of compute type and false otherwise + */ + public static boolean isComputeResource(Resource resource) { + String resourceType = resource.getType(); + Map<String, ImplementationConfiguration> supportedComputeResources = TranslationContext + .getSupportedConsolidationComputeResources(); + if (supportedComputeResources.containsKey(resourceType)) { + if (supportedComputeResources.get(resourceType).isEnable()) { + return true; + } + return false; + } + return false; + } + + /** + * Checks if the current HEAT resource if of type port. + * + * @param heatOrchestrationTemplate the heat orchestration template + * @param resourceId the resource id + * @return true if the resource is of port type and false otherwise + */ + public static boolean isPortResource(HeatOrchestrationTemplate heatOrchestrationTemplate, + String resourceId) { + String resourceType = heatOrchestrationTemplate.getResources().get(resourceId).getType(); + Map<String, ImplementationConfiguration> supportedPortResources = TranslationContext + .getSupportedConsolidationPortResources(); + if (supportedPortResources.containsKey(resourceType)) { + if (supportedPortResources.get(resourceType).isEnable()) { + return true; + } + return false; + } + return false; + } + + /** + * Checks if the current HEAT resource if of type port. + * + * @param resource the resource + * @return true if the resource is of port type and false otherwise + */ + public static boolean isPortResource(Resource resource) { + String resourceType = resource.getType(); + Map<String, ImplementationConfiguration> supportedPortResources = TranslationContext + .getSupportedConsolidationPortResources(); + if (supportedPortResources.containsKey(resourceType)) { + if (supportedPortResources.get(resourceType).isEnable()) { + return true; + } + return false; + } + return false; + } + + /** + * Checks if the current HEAT resource if of type volume. + * + * @param heatOrchestrationTemplate the heat orchestration template + * @param resourceId the resource id + * @return true if the resource is of volume type and false otherwise + */ + public static boolean isVolumeResource(HeatOrchestrationTemplate heatOrchestrationTemplate, + String resourceId) { + String resourceType = heatOrchestrationTemplate.getResources().get(resourceId).getType(); + return (resourceType.equals(HeatResourcesTypes.CINDER_VOLUME_RESOURCE_TYPE.getHeatResource()) + || resourceType.equals(HeatResourcesTypes.CINDER_VOLUME_ATTACHMENT_RESOURCE_TYPE + .getHeatResource())); + } + + /** + * Checks if the current HEAT resource if of type volume. + * + * @param resource the resource + * @return true if the resource is of volume type and false otherwise + */ + public static boolean isVolumeResource(Resource resource) { + String resourceType = resource.getType(); + return (resourceType.equals(HeatResourcesTypes.CINDER_VOLUME_RESOURCE_TYPE.getHeatResource()) + || resourceType.equals(HeatResourcesTypes.CINDER_VOLUME_ATTACHMENT_RESOURCE_TYPE + .getHeatResource())); + } + + /** + * Gets port type. + * + * @param portNodeTemplateId the port node template id + * @return the port type + */ + public static String getPortType(String portNodeTemplateId) { + String[] portSplitArr = portNodeTemplateId.split("(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)"); + String finalValue = ""; + if (NumberUtils.isNumber(portSplitArr[portSplitArr.length - 1])) { + for (String id : portSplitArr) { + finalValue = finalValue + id; + } + while (finalValue.length() > 0) { + if (Character.isLetter(finalValue.charAt(finalValue.length() - 1))) { + break; + } + finalValue = finalValue.substring(0, finalValue.length() - 1); + } + } else { + for (String id : portSplitArr) { + if (!NumberUtils.isNumber(id)) { + finalValue = finalValue + id; + } + } + } + return finalValue; + } + + /** + * Update node template id for the nested node templates in the consolidation data. + * + * @param translateTo the translate to + */ + public static void updateNestedNodeTemplateId(TranslateTo translateTo) { + TranslationContext context = translateTo.getContext(); + ServiceTemplate serviceTemplate = translateTo.getServiceTemplate(); + getNestedTemplateConsolidationData(context, serviceTemplate, translateTo.getTranslatedId()); + } + + public static void removeSharedResource(ServiceTemplate serviceTemplate, + HeatOrchestrationTemplate heatOrchestrationTemplate, + TranslationContext context, + String paramName, + String contrailSharedResourceId, + String sharedTranslatedResourceId) { + if (ConsolidationDataUtil.isComputeResource(heatOrchestrationTemplate, + contrailSharedResourceId)) { + NodeTemplate nodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate, + sharedTranslatedResourceId); + EntityConsolidationData entityConsolidationData = getComputeTemplateConsolidationData( + context, serviceTemplate, nodeTemplate.getType(), sharedTranslatedResourceId); + List<GetAttrFuncData> getAttrFuncDataList = entityConsolidationData + .getOutputParametersGetAttrIn(); + removeParamNameFromAttrFuncList(paramName, getAttrFuncDataList); + } + if (ConsolidationDataUtil.isPortResource(heatOrchestrationTemplate, + contrailSharedResourceId)) { + NodeTemplate nodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate, + sharedTranslatedResourceId); + EntityConsolidationData entityConsolidationData = getPortTemplateConsolidationData(context, + serviceTemplate, sharedTranslatedResourceId); + List<GetAttrFuncData> getAttrFuncDataList = entityConsolidationData + .getOutputParametersGetAttrIn(); + removeParamNameFromAttrFuncList(paramName, getAttrFuncDataList); + } + } + + private static void removeParamNameFromAttrFuncList(String paramName, + List<GetAttrFuncData> getAttrFuncDataList) { + Iterator<GetAttrFuncData> itr = getAttrFuncDataList.iterator(); + while (itr.hasNext()) { + GetAttrFuncData getAttrFuncData = itr.next(); + if (paramName.equals(getAttrFuncData.getFieldName())) { + itr.remove(); + } + } + } + + public static void updateNodeGetAttributeIn(EntityConsolidationData entityConsolidationData, + String nodeTemplateId, String propertyName, + String attributeName) { + GetAttrFuncData getAttrFuncData = new GetAttrFuncData(); + getAttrFuncData.setFieldName(propertyName); + getAttrFuncData.setAttributeName(attributeName); + entityConsolidationData.addNodesGetAttrIn(nodeTemplateId, getAttrFuncData); + + } + + public static void updateNodeGetAttributeOut(EntityConsolidationData entityConsolidationData, + String nodeTemplateId, String propertyName, + String attributeName) { + GetAttrFuncData getAttrFuncData = new GetAttrFuncData(); + getAttrFuncData.setFieldName(propertyName); + getAttrFuncData.setAttributeName(attributeName); + entityConsolidationData.addNodesGetAttrOut(nodeTemplateId, getAttrFuncData); + + } + + public static void updateOutputGetAttributeInConsolidationData(EntityConsolidationData + entityConsolidationData, + String outputParameterName, + String attributeName) { + + + GetAttrFuncData getAttrFuncData = new GetAttrFuncData(); + getAttrFuncData.setFieldName(outputParameterName); + getAttrFuncData.setAttributeName(attributeName); + entityConsolidationData.addOutputParamGetAttrIn(getAttrFuncData); + + } + + public static boolean isComputeReferenceToPortId(ComputeTemplateConsolidationData compute, + String portId) { + if (MapUtils.isEmpty(compute.getPorts())) { + return false; + } + for (List<String> portIdsPerType : compute.getPorts().values()) { + if (portIdsPerType.contains(portId)) { + return true; + } + } + return false; + } + +} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/ConsolidationEntityType.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/ConsolidationEntityType.java new file mode 100644 index 0000000000..c2de58fd5a --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/ConsolidationEntityType.java @@ -0,0 +1,86 @@ +package org.openecomp.sdc.translator.services.heattotosca; + +import static org.openecomp.sdc.translator.services.heattotosca.ConsolidationDataUtil.isComputeResource; +import static org.openecomp.sdc.translator.services.heattotosca.ConsolidationDataUtil.isPortResource; +import static org.openecomp.sdc.translator.services.heattotosca.ConsolidationDataUtil.isVolumeResource; + +import org.apache.commons.lang3.ObjectUtils; +import org.openecomp.core.utilities.yaml.YamlUtil; +import org.openecomp.sdc.heat.datatypes.manifest.FileData; +import org.openecomp.sdc.heat.datatypes.model.HeatOrchestrationTemplate; +import org.openecomp.sdc.heat.datatypes.model.Resource; +import org.openecomp.sdc.translator.datatypes.heattotosca.TranslationContext; + +import java.util.Collection; +import java.util.Objects; +import java.util.Optional; + +/** + * The enum Entity type. + */ +public enum ConsolidationEntityType { + COMPUTE, + PORT, + VOLUME, + NESTED, + VFC_NESTED, + SUB_PORT, + OTHER; + + private ConsolidationEntityType sourceEntityType; + private ConsolidationEntityType targetEntityType; + + public ConsolidationEntityType getSourceEntityType() { + return sourceEntityType; + } + + public ConsolidationEntityType getTargetEntityType() { + return targetEntityType; + } + + /** + * Sets entity type. + * + * @param heatOrchestrationTemplate the heat orchestration template + * @param sourceResource the source resource + * @param targetResource the target resource + */ + public void setEntityType(HeatOrchestrationTemplate heatOrchestrationTemplate, + Resource sourceResource, + Resource targetResource, + TranslationContext context) { + targetEntityType = + getEntityType(heatOrchestrationTemplate, targetResource, context); + sourceEntityType = + getEntityType(heatOrchestrationTemplate, sourceResource, context); + } + + private ConsolidationEntityType getEntityType(HeatOrchestrationTemplate heatOrchestrationTemplate, + Resource resource, TranslationContext context) { + if (isComputeResource(resource)) { + return ConsolidationEntityType.COMPUTE; + } else if (isPortResource(resource)) { + return ConsolidationEntityType.PORT; + } else if (isVolumeResource(resource)) { + return ConsolidationEntityType.VOLUME; + } else if (HeatToToscaUtil.isNestedResource(resource)) { + Optional<String> nestedHeatFileName = HeatToToscaUtil.getNestedHeatFileName(resource); + if (nestedHeatFileName.isPresent()) { + HeatOrchestrationTemplate nestedHeatOrchestrationTemplate = new YamlUtil() + .yamlToObject(context.getFileContent(nestedHeatFileName.get()), + HeatOrchestrationTemplate.class); + if (Objects.nonNull(nestedHeatOrchestrationTemplate.getResources())) { + for (String innerResourceId : nestedHeatOrchestrationTemplate.getResources().keySet()) { + if (ConsolidationDataUtil + .isComputeResource(nestedHeatOrchestrationTemplate, innerResourceId)) { + return ConsolidationEntityType.VFC_NESTED; + } + } + } + } + return ConsolidationEntityType.NESTED; + } else { + return ConsolidationEntityType.OTHER; + } + } +}
\ No newline at end of file diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/ConsolidationService.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/ConsolidationService.java new file mode 100644 index 0000000000..607dc36c4b --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/ConsolidationService.java @@ -0,0 +1,937 @@ +package org.openecomp.sdc.translator.services.heattotosca; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.MapUtils; +import org.openecomp.sdc.common.errors.CoreException; +import org.openecomp.sdc.common.errors.ErrorCode; +import org.openecomp.sdc.logging.context.impl.MdcDataDebugMessage; +import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate; +import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; +import org.openecomp.sdc.tosca.services.ToscaConstants; +import org.openecomp.sdc.tosca.services.ToscaUtil; +import org.openecomp.sdc.translator.datatypes.heattotosca.TranslationContext; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.UnifiedCompositionData; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.UnifiedCompositionMode; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.ComputeTemplateConsolidationData; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.ConsolidationData; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.EntityConsolidationData; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.FileComputeConsolidationData; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.FileNestedConsolidationData; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.FilePortConsolidationData; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.GetAttrFuncData; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.NestedTemplateConsolidationData; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.PortTemplateConsolidationData; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.RequirementAssignmentData; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.TypeComputeConsolidationData; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; + +public class ConsolidationService { + + private MdcDataDebugMessage mdcDataDebugMessage = new MdcDataDebugMessage(); + private UnifiedCompositionService unifiedCompositionService; + + public ConsolidationService(UnifiedCompositionService unifiedCompositionService) { + this.unifiedCompositionService = unifiedCompositionService; + } + + ConsolidationService() { + + } + + void mainServiceTemplateConsolidation(ServiceTemplate serviceTemplate, + TranslationContext translationContext) { + + ConsolidationData consolidationData = translationContext.getConsolidationData(); + + FileComputeConsolidationData fileComputeConsolidationData = + consolidationData.getComputeConsolidationData() + .getFileComputeConsolidationData(ToscaUtil.getServiceTemplateFileName(serviceTemplate)); + + if (Objects.isNull(fileComputeConsolidationData)) { + return; + } + for (TypeComputeConsolidationData typeComputeConsolidationData : + fileComputeConsolidationData.getAllTypeComputeConsolidationData()) { + boolean preConditionResult = + consolidationPreCondition( + serviceTemplate, consolidationData, typeComputeConsolidationData); + + List<UnifiedCompositionData> unifiedCompositionDataList = + createUnifiedCompositionDataList( + serviceTemplate, consolidationData, typeComputeConsolidationData); + + if (preConditionResult) { + boolean consolidationRuleCheckResult = + checkConsolidationRules(serviceTemplate, typeComputeConsolidationData, + consolidationData); + + unifiedCompositionService.createUnifiedComposition( + serviceTemplate, null, unifiedCompositionDataList, + consolidationRuleCheckResult ? UnifiedCompositionMode.ScalingInstances + : UnifiedCompositionMode.CatalogInstance, + translationContext); + } else { + unifiedCompositionService.createUnifiedComposition( + serviceTemplate, null, unifiedCompositionDataList, UnifiedCompositionMode + .SingleSubstitution, + translationContext); + } + } + + } + + private Map<String, String> getConsolidationEntityIdToType(ServiceTemplate serviceTemplate, + ConsolidationData consolidationData) { + Map<String, String> consolidationEntityIdToType = new HashMap<>(); + + String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate); + FileComputeConsolidationData fileComputeConsolidationData = + consolidationData.getComputeConsolidationData() + .getFileComputeConsolidationData(serviceTemplateFileName); + FilePortConsolidationData filePortConsolidationData = + consolidationData.getPortConsolidationData() + .getFilePortConsolidationData(serviceTemplateFileName); + + for (String computeType : fileComputeConsolidationData.getAllComputeTypes()) { + TypeComputeConsolidationData typeComputeConsolidationData = + fileComputeConsolidationData.getTypeComputeConsolidationData(computeType); + Set<String> computeNodeTemplateIds = + typeComputeConsolidationData.getAllComputeNodeTemplateIds(); + for (String computeNodeTemplateId : computeNodeTemplateIds) { + consolidationEntityIdToType.put(computeNodeTemplateId, computeType); + } + } + + Set<String> portNodeTemplateIds = filePortConsolidationData.getAllPortNodeTemplateIds(); + for (String portNodeTemplateId : portNodeTemplateIds) { + consolidationEntityIdToType + .put(portNodeTemplateId, ConsolidationDataUtil.getPortType(portNodeTemplateId)); + } + + return consolidationEntityIdToType; + } + + + private boolean checkConsolidationRules(ServiceTemplate serviceTemplate, + TypeComputeConsolidationData typeComputeConsolidationData, + ConsolidationData consolidationData) { + return checkComputeConsolidation(serviceTemplate, typeComputeConsolidationData) + && checkPortConsolidation(serviceTemplate, typeComputeConsolidationData, consolidationData) + && !checkGetAttrBetweenEntityConsolidationOfTheSameType(serviceTemplate, + typeComputeConsolidationData, consolidationData); + } + + private boolean checkGetAttrBetweenConsolidationDataEntitiesNotFromSameType( + ServiceTemplate serviceTemplate, + TypeComputeConsolidationData typeComputeConsolidationData, + ConsolidationData consolidationData) { + List<ComputeTemplateConsolidationData> computeTemplateConsolidationDataList = + new ArrayList(typeComputeConsolidationData.getAllComputeTemplateConsolidationData()); + + Set<String> computeNodeTemplateIds = + typeComputeConsolidationData.getAllComputeNodeTemplateIds(); + + Map<String, Set<String>> portTypeToIds = UnifiedCompositionUtil + .collectAllPortsFromEachTypesFromComputes(computeTemplateConsolidationDataList); + + return + checkGetAttrOutFromEntityToPortIsLegal(computeTemplateConsolidationDataList, portTypeToIds) + && checkGetAttrOutFromPortLegal(ToscaUtil.getServiceTemplateFileName(serviceTemplate), + computeNodeTemplateIds, portTypeToIds, consolidationData); + + } + + private boolean checkGetAttrInEntityConsolidationWithPortIsLegal( + List entityConsolidationDatas, + TypeComputeConsolidationData typeComputeConsolidationData) { + Map<String, Set<String>> portTypeToIds = + UnifiedCompositionUtil.collectAllPortsFromEachTypesFromComputes( + typeComputeConsolidationData.getAllComputeTemplateConsolidationData()); + + Set<String> startingPortTypesPointByGetAttr = + getPortTypesPointedByGetAttrFromEntity( + (EntityConsolidationData) entityConsolidationDatas.get(0), portTypeToIds); + + for (int i = 1; i < entityConsolidationDatas.size(); i++) { + Set<String> currentPortTypesPointByGetAttr = + getPortTypesPointedByGetAttrFromEntity( + (EntityConsolidationData) entityConsolidationDatas.get(i), portTypeToIds); + if (!startingPortTypesPointByGetAttr.equals(currentPortTypesPointByGetAttr)) { + return false; + } + } + + return true; + } + + private Set<String> getPortTypesPointedByGetAttrFromEntity( + EntityConsolidationData entity, + Map<String, Set<String>> portTypeToIds) { + return getPortTypeToIdPointByGetAttrInOrOut( + entity.getNodesGetAttrIn(), portTypeToIds, entity).keySet(); + } + + private boolean checkGetAttrInToPortIsLegal( + ServiceTemplate serviceTemplate, + TypeComputeConsolidationData typeComputeConsolidationData, + ConsolidationData consolidationData) { + + Map<String, Set<String>> portTypeToIds = UnifiedCompositionUtil + .collectAllPortsFromEachTypesFromComputes( + typeComputeConsolidationData.getAllComputeTemplateConsolidationData()); + + for (Set<String> portIdsFromSameType : portTypeToIds.values()) { + List<PortTemplateConsolidationData> portTemplateConsolidationDataList = + collectAllPortsTemplateConsolidationData( + portIdsFromSameType, ToscaUtil.getServiceTemplateFileName(serviceTemplate), + consolidationData); + + if (!checkGetAttrInEntityConsolidationWithPortIsLegal( + portTemplateConsolidationDataList, typeComputeConsolidationData)) { + return false; + } + } + + return true; + } + + + private boolean checkGetAttrOutFromPortLegal(String serviceTemplateName, + Set<String> computeNodeTemplateIds, + Map<String, Set<String>> portTypeToIds, + ConsolidationData consolidationData) { + for (Set<String> portIdsFromSameType : portTypeToIds.values()) { + List<PortTemplateConsolidationData> portTemplateConsolidationDataList = + collectAllPortsTemplateConsolidationData(portIdsFromSameType, serviceTemplateName, + consolidationData); + + if (!(checkGetAttrOutFromEntityToPortIsLegal(portTemplateConsolidationDataList, portTypeToIds) + && checkGetAttrOutFromPortToComputeIsLegal(portTemplateConsolidationDataList, + computeNodeTemplateIds))) { + return false; + } + } + + return true; + } + + private boolean checkGetAttrOutFromEntityToPortIsLegal(List entityConsolidationDataList, + Map<String, Set<String>> portTypeToIds) { + + for (String portType : portTypeToIds.keySet()) { + Set<GetAttrFuncData> startingGetAttrFunc = + getEntityGetAttrFuncAsSet(portType, + (EntityConsolidationData) entityConsolidationDataList.get(0)); + for (int i = 1; i < entityConsolidationDataList.size(); i++) { + Object entity = entityConsolidationDataList.get(i); + Set<GetAttrFuncData> currentGetAttrFuncData = + getEntityGetAttrFuncAsSet(portType, + (EntityConsolidationData) entity); + if (!(startingGetAttrFunc.equals(currentGetAttrFuncData))) { + return false; + } + } + } + + return true; + } + + private boolean checkGetAttrOutFromPortToComputeIsLegal( + List<PortTemplateConsolidationData> portTemplateConsolidationDataList, + Set<String> computeNodeTemplateIds) { + PortTemplateConsolidationData startingPortTemplate = + portTemplateConsolidationDataList.get(0); + Map<String, Set<GetAttrFuncData>> startingComputeGetAttrOutFuncData = + getComputeGetAttrOutFuncData(startingPortTemplate.getNodesGetAttrOut(), + computeNodeTemplateIds); + + for (int i = 1; i < portTemplateConsolidationDataList.size(); i++) { + PortTemplateConsolidationData currentPortTemplate = + portTemplateConsolidationDataList.get(i); + Map<String, Set<GetAttrFuncData>> currentComputeGetAttrOutFuncData = + getComputeGetAttrOutFuncData(currentPortTemplate.getNodesGetAttrOut(), + computeNodeTemplateIds); + + if (!isGetAttrRelationToComputeSimilarBetweenEntities(startingComputeGetAttrOutFuncData, + currentComputeGetAttrOutFuncData)) { + return false; + } + } + + return true; + } + + private boolean isGetAttrRelationToComputeSimilarBetweenEntities( + Map<String, Set<GetAttrFuncData>> firstMap, + Map<String, Set<GetAttrFuncData>> secondMap) { + if (MapUtils.isEmpty(firstMap) != MapUtils.isEmpty(secondMap)) { + return false; + } + + if (MapUtils.isEmpty(firstMap) && MapUtils.isEmpty(secondMap)) { + return true; + } + + return new ArrayList<>(firstMap.values()).equals(new ArrayList<>(secondMap.values())); + } + + private Set<GetAttrFuncData> getEntityGetAttrFuncAsSet(String portType, + EntityConsolidationData entityConsolidationData) { + + Set<GetAttrFuncData> getAttrFuncDataFromPortsWithSameType = new HashSet<>(); + Map<String, List<GetAttrFuncData>> nodesGetAttrOut = + entityConsolidationData.getNodesGetAttrOut(); + + if (MapUtils.isEmpty(nodesGetAttrOut)) { + return getAttrFuncDataFromPortsWithSameType; + } + + for (Map.Entry<String, List<GetAttrFuncData>> entry : nodesGetAttrOut.entrySet()) { + if (portType.equals(ConsolidationDataUtil.getPortType(entry.getKey()))) { + getAttrFuncDataFromPortsWithSameType.addAll(entry.getValue()); + } + } + + return getAttrFuncDataFromPortsWithSameType; + } + + private Map<String, Set<GetAttrFuncData>> getComputeGetAttrOutFuncData( + Map<String, List<GetAttrFuncData>> nodesGetAttrOut, + Set<String> computeNodeTemplateIds) { + Map<String, Set<GetAttrFuncData>> computeGetAttrFuncData = new HashMap<>(); + + if (MapUtils.isEmpty(nodesGetAttrOut)) { + return computeGetAttrFuncData; + } + + for (Map.Entry<String, List<GetAttrFuncData>> getAttrFuncEntry : nodesGetAttrOut.entrySet()) { + if (computeNodeTemplateIds.contains(getAttrFuncEntry.getKey())) { + computeGetAttrFuncData.put(getAttrFuncEntry.getKey(), new HashSet<>(getAttrFuncEntry + .getValue())); + } + } + + return computeGetAttrFuncData; + } + + private Map<String, List<String>> getPortTypeToIdPointByGetAttrInOrOut( + Map<String, List<GetAttrFuncData>> getAttr, + Map<String, Set<String>> portTypeToIds, + EntityConsolidationData entityConsolidationData) { + Map<String, List<String>> portIdToType = new HashMap<>(); + + if (MapUtils.isEmpty(getAttr)) { + return portIdToType; + } + + for (String getAttrId : getAttr.keySet()) { + if (isNodeTemplateIdIsInComputeConsolidationData(getAttrId, portTypeToIds)) { + String portType = ConsolidationDataUtil.getPortType(getAttrId); + portIdToType.putIfAbsent(portType, new ArrayList<>()); + portIdToType.get(portType).add(getAttrId); + } + } + + return portIdToType; + + } + + + private boolean isNodeTemplateIdIsInComputeConsolidationData( + String getAttrInId, + Map<String, Set<String>> portTypeToIds) { + return portTypeToIds.keySet().contains(ConsolidationDataUtil.getPortType(getAttrInId)); + } + + private boolean checkGetAttrBetweenEntityConsolidationOfTheSameType( + ServiceTemplate serviceTemplate, + TypeComputeConsolidationData typeComputeConsolidationData, + ConsolidationData consolidationData) { + return checkGetAttrRelationsBetweenComputesOfSameType(typeComputeConsolidationData) + || checkGetAttrRelationsBetweenPortsOfTheSameType(serviceTemplate, + typeComputeConsolidationData, consolidationData); + + } + + private boolean checkGetAttrRelationsBetweenComputesOfSameType( + TypeComputeConsolidationData typeComputeConsolidationData) { + + Collection<ComputeTemplateConsolidationData> computeTemplateConsolidationDatas = + typeComputeConsolidationData.getAllComputeTemplateConsolidationData(); + Set<String> computeNodeTemplateIds = + typeComputeConsolidationData.getAllComputeNodeTemplateIds(); + + return checkGetAttrRelationsForEntityConsolidationData( + computeTemplateConsolidationDatas, computeNodeTemplateIds); + } + + private boolean checkGetAttrRelationsBetweenPortsOfTheSameType( + ServiceTemplate serviceTemplate, + TypeComputeConsolidationData typeComputeConsolidationData, + ConsolidationData consolidationData) { + + Collection<ComputeTemplateConsolidationData> computeTemplateConsolidationDatas = + typeComputeConsolidationData.getAllComputeTemplateConsolidationData(); + Map<String, Set<String>> portTypeToPortIds = UnifiedCompositionUtil + .collectAllPortsFromEachTypesFromComputes(computeTemplateConsolidationDatas); + + FilePortConsolidationData filePortConsolidationData = + consolidationData.getPortConsolidationData().getFilePortConsolidationData(ToscaUtil + .getServiceTemplateFileName(serviceTemplate)); + + for (Set<String> portsOfTheSameTypeIds : portTypeToPortIds.values()) { + List<PortTemplateConsolidationData> portTemplateConsolidationDataOfSameType = + getAllPortTemplateConsolidationData(portsOfTheSameTypeIds, filePortConsolidationData); + if (!checkGetAttrRelationsForEntityConsolidationData(portTemplateConsolidationDataOfSameType, + portsOfTheSameTypeIds)) { + return false; + } + } + + return true; + } + + private List<PortTemplateConsolidationData> getAllPortTemplateConsolidationData( + Set<String> portsIds, + FilePortConsolidationData filePortConsolidationData) { + List<PortTemplateConsolidationData> portTemplateConsolidationDataOfSameType = new ArrayList<>(); + + for (String portId : portsIds) { + PortTemplateConsolidationData portTemplateConsolidationData = + filePortConsolidationData.getPortTemplateConsolidationData(portId); + if (Objects.nonNull(portTemplateConsolidationData)) { + portTemplateConsolidationDataOfSameType.add(portTemplateConsolidationData); + } + } + + return portTemplateConsolidationDataOfSameType; + } + + private boolean checkGetAttrRelationsForEntityConsolidationData( + Collection entities, + Set<String> nodeTemplateIdsOfTheSameType) { + + List<EntityConsolidationData> entityConsolidationDataList = + new ArrayList(entities); + + for (EntityConsolidationData entityConsolidationData : entityConsolidationDataList) { + Set<String> getAttrInNodeIds = + entityConsolidationData.getNodesGetAttrIn() == null ? new HashSet<>() + : entityConsolidationData.getNodesGetAttrIn().keySet(); + for (String nodeId : getAttrInNodeIds) { + if (nodeTemplateIdsOfTheSameType.contains(nodeId)) { + return true; + } + } + } + + return false; + } + + + private boolean checkComputeConsolidation( + ServiceTemplate serviceTemplate, + TypeComputeConsolidationData typeComputeConsolidationData) { + List<String> computeNodeTemplateIds = + new ArrayList(typeComputeConsolidationData.getAllComputeNodeTemplateIds()); + List<String> propertiesWithIdenticalVal = getPropertiesWithIdenticalVal(); + + return arePropertiesSimilarBetweenComputeNodeTemplates( + serviceTemplate, computeNodeTemplateIds, propertiesWithIdenticalVal) + && checkComputeRelations( + typeComputeConsolidationData.getAllComputeTemplateConsolidationData()); + } + + + private boolean checkComputeRelations( + Collection<ComputeTemplateConsolidationData> computeTemplateConsolidationDatas) { + + return checkEntityConsolidationDataRelations(computeTemplateConsolidationDatas) + && checkComputesRelationsToVolume(computeTemplateConsolidationDatas); + } + + private boolean checkEntityConsolidationDataRelations(Collection entities) { + List<EntityConsolidationData> entityConsolidationDataList = + new ArrayList(entities); + EntityConsolidationData startingEntity = entityConsolidationDataList.get(0); + + for (int i = 1; i < entityConsolidationDataList.size(); i++) { + EntityConsolidationData currentEntity = entityConsolidationDataList.get(i); + if (!(checkNodesConnectedInRelations(startingEntity, currentEntity) + && (checkNodesConnectedOutRelations(startingEntity, currentEntity)) + && (checkGroupIdsRelations(startingEntity, currentEntity)))) { + return false; + } + } + return true; + } + + private boolean checkNodesConnectedInRelations(EntityConsolidationData firstEntity, + EntityConsolidationData secondEntity) { + return compareNodeConnectivity(firstEntity.getNodesConnectedIn(), + secondEntity.getNodesConnectedIn()); + } + + private boolean checkNodesConnectedOutRelations(EntityConsolidationData firstEntity, + EntityConsolidationData secondEntity) { + return compareNodeConnectivity(firstEntity.getNodesConnectedOut(), + secondEntity.getNodesConnectedOut()); + } + + private boolean compareNodeConnectivity( + Map<String, List<RequirementAssignmentData>> firstEntityMap, + Map<String, List<RequirementAssignmentData>> secondEntityMap) { + if (MapUtils.isEmpty(firstEntityMap) + && MapUtils.isEmpty(secondEntityMap)) { + return true; + } + if (!MapUtils.isEmpty(firstEntityMap) + && !MapUtils.isEmpty(secondEntityMap)) { + return firstEntityMap.keySet().equals(secondEntityMap.keySet()); + } + return false; + } + + private boolean checkGroupIdsRelations(EntityConsolidationData startingEntity, + EntityConsolidationData currentEntity) { + if (CollectionUtils.isEmpty(startingEntity.getGroupIds()) && + CollectionUtils.isEmpty(currentEntity.getGroupIds())) { + return true; + } + + return startingEntity.getGroupIds().equals(currentEntity.getGroupIds()); + } + + private boolean checkComputesRelationsToVolume( + Collection<ComputeTemplateConsolidationData> computeTemplateConsolidationDatas) { + + Set<String> volumeRelationsFromComputes = new HashSet<>(); + List<ComputeTemplateConsolidationData> computeTemplateConsolidationDataList = + new ArrayList(computeTemplateConsolidationDatas); + + Map<String, List<RequirementAssignmentData>> startingVolumes = + computeTemplateConsolidationDataList.get(0).getVolumes(); + + for (int i = 1; i < computeTemplateConsolidationDataList.size(); i++) { + Map<String, List<RequirementAssignmentData>> currentVolumes = + computeTemplateConsolidationDataList.get(i).getVolumes(); + if (!compareNodeConnectivity(startingVolumes, currentVolumes)) { + return false; + } + } + return true; + } + + + private boolean checkPortConsolidation(ServiceTemplate serviceTemplate, + TypeComputeConsolidationData typeComputeConsolidationData, + ConsolidationData consolidationData) { + return isWantedPortPropertiesUsageIsSimilarInAllPorts(serviceTemplate, + typeComputeConsolidationData) + && checkPortRelations(ToscaUtil.getServiceTemplateFileName(serviceTemplate), + typeComputeConsolidationData, consolidationData); + } + + + private boolean isWantedPortPropertiesUsageIsSimilarInAllPorts(ServiceTemplate serviceTemplate, + TypeComputeConsolidationData typeComputeConsolidationData) { + + Collection<ComputeTemplateConsolidationData> computeTemplateConsolidationDataCollection = + typeComputeConsolidationData.getAllComputeTemplateConsolidationData(); + List<String> propertiesThatNeedHaveUsage = getPropertiesThatNeedHaveUsage(); + Map<String, Set<String>> portTypeToIds = UnifiedCompositionUtil + .collectAllPortsFromEachTypesFromComputes(computeTemplateConsolidationDataCollection); + + for (Set<String> portsIds : portTypeToIds.values()) { + if (!areAllPortsFromSameTypeHaveTheSameUsageForProperties( + serviceTemplate, portsIds, propertiesThatNeedHaveUsage)) { + return false; + } + } + + return true; + } + + private boolean checkPortRelations(String serviceTemplateName, + TypeComputeConsolidationData typeComputeConsolidationData, + ConsolidationData consolidationData) { + Collection<ComputeTemplateConsolidationData> computeTemplateConsolidationDataCollection = + typeComputeConsolidationData.getAllComputeTemplateConsolidationData(); + Map<String, Set<String>> portTypeToIds = UnifiedCompositionUtil + .collectAllPortsFromEachTypesFromComputes(computeTemplateConsolidationDataCollection); + + for (Set<String> portIds : portTypeToIds.values()) { + List<PortTemplateConsolidationData> portTemplateConsolidationDataList = + collectAllPortsTemplateConsolidationData( + portIds, serviceTemplateName, consolidationData); + + if (!checkEntityConsolidationDataRelations(portTemplateConsolidationDataList)) { + return false; + } + } + + return true; + } + + private List<PortTemplateConsolidationData> + collectAllPortsTemplateConsolidationData(Set<String> portIds, + String serviceTemplateName, + ConsolidationData consolidationData) { + + FilePortConsolidationData filePortConsolidationData = + consolidationData.getPortConsolidationData() + .getFilePortConsolidationData(serviceTemplateName); + List<PortTemplateConsolidationData> portTemplateConsolidationDataList = new ArrayList<>(); + + for (String portId : portIds) { + PortTemplateConsolidationData portTemplateConsolidationData = filePortConsolidationData + .getPortTemplateConsolidationData(portId); + if (Objects.nonNull(portTemplateConsolidationData)) { + portTemplateConsolidationDataList.add(portTemplateConsolidationData); + } + } + + return portTemplateConsolidationDataList; + } + + private boolean areAllPortsFromSameTypeHaveTheSameUsageForProperties( + ServiceTemplate serviceTemplate, + Set<String> portNodeTemplateIds, + List<String> propertiesThatNeedToHaveUsage) { + Map<String, NodeTemplate> nodeTemplates = + serviceTemplate.getTopology_template().getNode_templates(); + + for (String property : propertiesThatNeedToHaveUsage) { + if (!areAllPortsContainWantedProperty(property, portNodeTemplateIds, nodeTemplates)) { + return false; + } + } + + return true; + } + + private boolean areAllPortsContainWantedProperty( + String propertyToCheck, + Set<String> portNodeTemplateIds, + Map<String, NodeTemplate> nodeTemplates) { + + List<String> portNodeTemplateIdList = new ArrayList(portNodeTemplateIds); + NodeTemplate startingPortNodeTemplate = nodeTemplates.get(portNodeTemplateIdList.get(0)); + + if (Objects.isNull(startingPortNodeTemplate)) { + throw new CoreException((new ErrorCode.ErrorCodeBuilder()) + .withMessage("Resource with id " + + portNodeTemplateIdList.get(0) + " occures more than once in different addOn files") + .build()); + } + + boolean startingUsageCondition = + startingPortNodeTemplate.getProperties().containsKey(propertyToCheck); + + for (int i = 1; i < portNodeTemplateIdList.size(); i++) { + NodeTemplate portNodeTemplate = nodeTemplates.get(portNodeTemplateIdList.get(i)); + + if (Objects.isNull(portNodeTemplate)) { + throw new CoreException((new ErrorCode.ErrorCodeBuilder()) + .withMessage("Resource with id " + + portNodeTemplateIdList.get(i) + " occures more than once in different addOn " + + "files").build()); + } + + Map<String, Object> properties = portNodeTemplate.getProperties(); + if (!(properties.containsKey(propertyToCheck) == startingUsageCondition)) { + return false; + } + } + + return true; + } + + + private boolean arePropertiesSimilarBetweenComputeNodeTemplates( + ServiceTemplate serviceTemplate, + List<String> computeNodeTemplateIds, + List<String> propertiesThatNeedToBeSimilar) { + + Map<String, NodeTemplate> idToNodeTemplate = + serviceTemplate.getTopology_template().getNode_templates(); + + for (String property : propertiesThatNeedToBeSimilar) { + if (!isPropertySimilarBetweenComputeNodeTemplates(property, computeNodeTemplateIds, + idToNodeTemplate)) { + return false; + } + } + return true; + } + + private boolean isPropertySimilarBetweenComputeNodeTemplates( + String propertyToCheck, + List<String> computeNodeTemplateIds, + Map<String, NodeTemplate> idToNodeTemplate) { + Set<Object> propertiesValues = new HashSet<>(); + for (String computeNodeId : computeNodeTemplateIds) { + NodeTemplate currentNodeTemplate = idToNodeTemplate.get(computeNodeId); + if (Objects.isNull(currentNodeTemplate)) { + throw new CoreException((new ErrorCode.ErrorCodeBuilder()) + .withMessage("Resource with id " + + computeNodeId + " occures more than once in different addOn files").build()); + } + propertiesValues + .add(currentNodeTemplate.getProperties().get(propertyToCheck)); + } + + return propertiesValues.size() == 1; + } + + public void substitutionServiceTemplateConsolidation(String substituteNodeTemplateId, + ServiceTemplate mainServiceTemplate, + ServiceTemplate substitutionServiceTemplate, + TranslationContext translationContext) { + + ConsolidationData consolidationData = translationContext.getConsolidationData(); + + FileComputeConsolidationData fileComputeConsolidationData = + translationContext.getConsolidationData().getComputeConsolidationData() + .getFileComputeConsolidationData( + ToscaUtil.getServiceTemplateFileName(substitutionServiceTemplate)); + boolean consolidationRuleResult = + substitutionServiceTemplateConsolidationRule(substitutionServiceTemplate, + fileComputeConsolidationData, translationContext); + + if (consolidationRuleResult) { + List<UnifiedCompositionData> unifiedCompositionDataList = + createSubstitutionUnifiedCompositionDataList(substituteNodeTemplateId, + mainServiceTemplate, consolidationData); + unifiedCompositionService + .createUnifiedComposition(mainServiceTemplate, substitutionServiceTemplate, + unifiedCompositionDataList, UnifiedCompositionMode.NestedSingleCompute, + translationContext); + } else { + //The node template does not qualify for unified composition + //Adding the id in the context for fixing connectivity from/to nested non-unified nodes + translationContext.addUnifiedNestedNodeTemplateId(ToscaUtil + .getServiceTemplateFileName(mainServiceTemplate), + substituteNodeTemplateId, substituteNodeTemplateId); + } + } + + private boolean substitutionServiceTemplateConsolidationRule( + ServiceTemplate nestedServiceTemplate, + FileComputeConsolidationData fileComputeConsolidationData, + TranslationContext context) { + if (Objects.isNull(fileComputeConsolidationData)) { + return false; + } + return isNumberOfComputeTypesLegal(fileComputeConsolidationData) + && isNumberOfComputeConsolidationDataPerTypeLegal( + fileComputeConsolidationData.getAllTypeComputeConsolidationData().iterator().next()) + && !isThereMoreThanOneNestedLevel(nestedServiceTemplate, context.getConsolidationData()); + } + + private boolean isNumberOfComputeTypesLegal( + FileComputeConsolidationData fileComputeConsolidationData) { + return fileComputeConsolidationData.getAllTypeComputeConsolidationData().size() == 1; + } + + private boolean isNumberOfComputeConsolidationDataPerTypeLegal( + TypeComputeConsolidationData typeComputeConsolidationData) { + return typeComputeConsolidationData.getAllComputeTemplateConsolidationData().size() == 1; + } + + private boolean isThereMoreThanOneNestedLevel(ServiceTemplate nestedServiceTemplate, + ConsolidationData consolidationData) { + String nestedServiceTemplateName = ToscaUtil.getServiceTemplateFileName(nestedServiceTemplate); + if (Objects.isNull(nestedServiceTemplateName)) { + return false; + } + + FileNestedConsolidationData fileNestedConsolidationData = + consolidationData.getNestedConsolidationData() == null ? new FileNestedConsolidationData() + : consolidationData.getNestedConsolidationData() + .getFileNestedConsolidationData(nestedServiceTemplateName); + + if (Objects.isNull(fileNestedConsolidationData)) { + return false; + } + + return !CollectionUtils.isEmpty(fileNestedConsolidationData.getAllNestedNodeTemplateIds()); + } + + + private List<UnifiedCompositionData> createUnifiedCompositionDataList( + ServiceTemplate serviceTemplate, + ConsolidationData consolidationData, + TypeComputeConsolidationData typeComputeConsolidationData) { + + List<UnifiedCompositionData> unifiedCompositionDataList = new ArrayList<>(); + + for (ComputeTemplateConsolidationData computeTemplateConsolidationData : typeComputeConsolidationData + .getAllComputeTemplateConsolidationData()) { + + UnifiedCompositionData unifiedCompositionData = new UnifiedCompositionData(); + unifiedCompositionData.setComputeTemplateConsolidationData(computeTemplateConsolidationData); + + Collection<List<String>> portCollection = + computeTemplateConsolidationData.getPorts() == null ? Collections.emptyList() + : computeTemplateConsolidationData.getPorts().values(); + + FilePortConsolidationData filePortConsolidationData = + consolidationData.getPortConsolidationData().getFilePortConsolidationData(ToscaUtil + .getServiceTemplateFileName(serviceTemplate)); + + for (List<String> portList : portCollection) { + for (String portId : portList) { + if (!Objects.isNull(filePortConsolidationData)) { + unifiedCompositionData.addPortTemplateConsolidationData( + (filePortConsolidationData.getPortTemplateConsolidationData(portId))); + } + } + } + unifiedCompositionDataList.add(unifiedCompositionData); + } + + return unifiedCompositionDataList; + } + + private List<UnifiedCompositionData> createSubstitutionUnifiedCompositionDataList( + String substituteNodeTemplateId, + ServiceTemplate serviceTemplate, + ConsolidationData consolidationData) { + List<UnifiedCompositionData> unifiedCompositionDataList = new ArrayList<>(); + FileNestedConsolidationData fileNestedConsolidationData = + consolidationData.getNestedConsolidationData() + .getFileNestedConsolidationData(ToscaUtil.getServiceTemplateFileName(serviceTemplate)); + + if (Objects.nonNull(fileNestedConsolidationData)) { + Collection<NestedTemplateConsolidationData> nestedConsolidationDatas = + fileNestedConsolidationData.getAllNestedConsolidationData(); + + for (NestedTemplateConsolidationData nested : nestedConsolidationDatas) { + if (nested.getNodeTemplateId().equals(substituteNodeTemplateId)) { + UnifiedCompositionData unifiedCompositionData = new UnifiedCompositionData(); + unifiedCompositionData.setNestedTemplateConsolidationData(nested); + unifiedCompositionDataList.add(unifiedCompositionData); + } + } + } + + return unifiedCompositionDataList; + } + + private boolean consolidationPreCondition(ServiceTemplate serviceTemplate, + ConsolidationData consolidationData, + TypeComputeConsolidationData typeComputeConsolidationData) { + + return (isThereMoreThanOneComputeTypeInstance(typeComputeConsolidationData) + && isNumberOfPortsEqualsBetweenComputeNodes(typeComputeConsolidationData) + && isNumberOfPortFromEachTypeLegal(typeComputeConsolidationData) + && isPortTypesEqualsBetweenComputeNodes(typeComputeConsolidationData) + && checkGetAttrBetweenConsolidationDataEntitiesNotFromSameType(serviceTemplate, + typeComputeConsolidationData, consolidationData)); + + } + + private boolean isThereMoreThanOneComputeTypeInstance( + TypeComputeConsolidationData typeComputeConsolidationData) { + return typeComputeConsolidationData.getAllComputeNodeTemplateIds().size() > 1; + } + + private boolean isNumberOfPortsEqualsBetweenComputeNodes( + TypeComputeConsolidationData typeComputeConsolidationData) { + + ArrayList<ComputeTemplateConsolidationData> computeTemplateConsolidationDataList = + new ArrayList(typeComputeConsolidationData.getAllComputeTemplateConsolidationData()); + int startingNumberOfPorts = + getNumberOfPortsPerCompute(computeTemplateConsolidationDataList.get(0)); + + + for (int i = 1; i < computeTemplateConsolidationDataList.size(); i++) { + int currNumberOfPorts = + getNumberOfPortsPerCompute(computeTemplateConsolidationDataList.get(i)); + if (currNumberOfPorts != startingNumberOfPorts) { + return false; + } + } + + return true; + } + + + private boolean isNumberOfPortFromEachTypeLegal( + TypeComputeConsolidationData typeComputeConsolidationData) { + + ArrayList<ComputeTemplateConsolidationData> computeTemplateConsolidationDataList = + new ArrayList(typeComputeConsolidationData.getAllComputeTemplateConsolidationData()); + + for (ComputeTemplateConsolidationData computeTemplate : computeTemplateConsolidationDataList) { + Map<String, List<String>> currPortsMap = computeTemplate.getPorts(); + if (MapUtils.isEmpty(currPortsMap)) { + return true; + } + for (List<String> portList : currPortsMap.values()) { + if (portList.size() > 1) { + return false; + } + } + } + + return true; + } + + private boolean isPortTypesEqualsBetweenComputeNodes( + TypeComputeConsolidationData typeComputeConsolidationData) { + + ArrayList<ComputeTemplateConsolidationData> computeTemplateConsolidationDataList = + new ArrayList(typeComputeConsolidationData.getAllComputeTemplateConsolidationData()); + Set<String> staringPortIds = getPortsIds(computeTemplateConsolidationDataList.get(0)); + + for (int i = 1; i < computeTemplateConsolidationDataList.size(); i++) { + Set<String> currentPortIds = getPortsIds(computeTemplateConsolidationDataList.get(i)); + if (!currentPortIds.equals(staringPortIds)) { + return false; + } + } + + return true; + } + + private int getNumberOfPortsPerCompute( + ComputeTemplateConsolidationData computeTemplateConsolidationData) { + return getPortsIds(computeTemplateConsolidationData) == null ? 0 : + getPortsIds(computeTemplateConsolidationData).size(); + } + + private Set<String> getPortsIds( + ComputeTemplateConsolidationData computeTemplateConsolidationData) { + return computeTemplateConsolidationData.getPorts() == null ? new HashSet<>() + : computeTemplateConsolidationData + .getPorts().keySet(); + } + + List<String> getPropertiesWithIdenticalVal() { + List<String> propertyWithIdenticalValue = new ArrayList<>(); + propertyWithIdenticalValue.add(ToscaConstants.COMPUTE_IMAGE); + propertyWithIdenticalValue.add(ToscaConstants.COMPUTE_FLAVOR); + return propertyWithIdenticalValue; + } + + private List<String> getPropertiesThatNeedHaveUsage() { + List<String> propertiesThatNeedToHaveUsage = new ArrayList<>(); + propertiesThatNeedToHaveUsage.add(ToscaConstants.PORT_FIXED_IPS); + propertiesThatNeedToHaveUsage.add(ToscaConstants.PORT_ALLOWED_ADDRESS_PAIRS); + propertiesThatNeedToHaveUsage.add(ToscaConstants.MAC_ADDRESS); + + return propertiesThatNeedToHaveUsage; + } +} + diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/Constants.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/Constants.java index abd6c27a21..e5d752798b 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/Constants.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/Constants.java @@ -44,6 +44,13 @@ public class Constants { public static final String CONTRAIL_PORT_TEMPLATE_NAME = "ContrailPortGlobalTypes"; public static final String CONTRAIL_ABSTRACT_SUBSTITUTE_TEMPLATE_NAME = "ContrailAbstractSubstituteGlobalTypes"; + public static final String MAIN_TEMPLATE_NAME = "Main"; + public static final String PORT_TEMPLATE_NAME = "PortGlobalTypes"; + public static final String COMPUTE_TEMPLATE_NAME = "ComputeGlobalTypes"; + public static final String NETWORK_TEMPLATE_NAME = "NetworkGlobalTypes"; + public static final String SUB_INTERFACE_TEMPLATE_NAME = "SubInterfaceGlobalTypes"; + public static final String CONTRAILV2_VLAN_SUB_INTERFACE_TEMPLATE_NAME = + "ContrailV2VLANSubInterfaceGlobalType"; //properties public static final String MAX_INSTANCES_PROPERTY_NAME = "max_instances"; public static final String DESCRIPTION_PROPERTY_NAME = "description"; @@ -54,6 +61,12 @@ public class Constants { //General public static final String PROP = "properties"; public static final String ATTR = "attributes"; + public static final String SERVICE_INSTANCE_PORT_PREFIX = "port_"; + public static final String SERVICE_INSTANCE_LINK_PREFIX = "link_"; + //Unified model + public static final String IDENTICAL_VALUE_PROPERTY_PREFIX = "vm_"; + public static final String IDENTICAL_VALUE_PROPERTY_SUFFIX = "_name"; + public static final String ABSTRACT_NODE_TEMPLATE_ID_PREFIX = "abstract_"; private Constants() { } diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/FunctionTranslation.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/FunctionTranslation.java new file mode 100644 index 0000000000..dbbc63ece1 --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/FunctionTranslation.java @@ -0,0 +1,38 @@ +/*- + * ============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.services.heattotosca; + + +import org.openecomp.sdc.heat.datatypes.model.HeatOrchestrationTemplate; +import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; +import org.openecomp.sdc.tosca.datatypes.model.Template; +import org.openecomp.sdc.translator.datatypes.heattotosca.TranslationContext; + + +public interface FunctionTranslation { + + //return the value of the translated function ("get_param", "get_attr" and etc) + Object translateFunction(ServiceTemplate serviceTemplate, + String resourceId, String propertyName, String functionKey, + Object functionValue, String heatFileName, + HeatOrchestrationTemplate heatOrchestrationTemplate, + Template toscaTemplate, TranslationContext context); +} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/FunctionTranslationFactory.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/FunctionTranslationFactory.java new file mode 100644 index 0000000000..07e8fcdad6 --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/FunctionTranslationFactory.java @@ -0,0 +1,70 @@ +/*- + * ============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.services.heattotosca; + + +import org.openecomp.config.api.Configuration; +import org.openecomp.config.api.ConfigurationManager; +import org.openecomp.core.utilities.CommonMethods; +import org.openecomp.sdc.datatypes.configuration.ImplementationConfiguration; + +import java.util.Map; +import java.util.Optional; + + +public class FunctionTranslationFactory { + private static Map<String, ImplementationConfiguration> functionTranslationImplMap; + + static { + Configuration config = ConfigurationManager.lookup(); + functionTranslationImplMap = config.populateMap(ConfigConstants.TRANSLATOR_NAMESPACE, + ConfigConstants.FUNCTION_TRANSLATION_IMPL_KEY, ImplementationConfiguration.class); + functionTranslationImplMap.putAll(config.populateMap(ConfigConstants.MANDATORY_TRANSLATOR_NAMESPACE, + ConfigConstants.FUNCTION_TRANSLATION_IMPL_KEY, ImplementationConfiguration.class)); + + } + + /** + * Gets function translation instance. + * + * @param heatFunctionKey heat function key + * @return the instance + */ + public static Optional<FunctionTranslation> getInstance(String heatFunctionKey) { + if (isSupportedFunction(heatFunctionKey)) { + String functionTranslationImplClassName = + functionTranslationImplMap.get(heatFunctionKey).getImplementationClass(); + return Optional.of(CommonMethods + .newInstance(functionTranslationImplClassName, FunctionTranslation.class)); + } + + return Optional.empty(); + } + + private static boolean isSupportedFunction(String heatFunctionKey) { + if (functionTranslationImplMap.containsKey(heatFunctionKey)) { + return true; + } + return false; + } + +} + diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/HeatToToscaUtil.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/HeatToToscaUtil.java index f245a6dee6..7c67a5af2c 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/HeatToToscaUtil.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/HeatToToscaUtil.java @@ -21,27 +21,74 @@ package org.openecomp.sdc.translator.services.heattotosca; import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.MapUtils; +import org.openecomp.core.translator.api.HeatToToscaTranslator; +import org.openecomp.core.translator.datatypes.TranslatorOutput; +import org.openecomp.core.translator.factory.HeatToToscaTranslatorFactory; +import org.openecomp.core.utilities.CommonMethods; +import org.openecomp.core.utilities.file.FileContentHandler; +import org.openecomp.core.utilities.file.FileUtils; import org.openecomp.core.utilities.yaml.YamlUtil; +import org.openecomp.core.validation.util.MessageContainerUtil; import org.openecomp.sdc.common.errors.CoreException; +import org.openecomp.sdc.common.utils.SdcCommon; +import org.openecomp.sdc.datatypes.error.ErrorLevel; +import org.openecomp.sdc.datatypes.error.ErrorMessage; import org.openecomp.sdc.heat.datatypes.HeatBoolean; import org.openecomp.sdc.heat.datatypes.manifest.FileData; import org.openecomp.sdc.heat.datatypes.model.HeatOrchestrationTemplate; import org.openecomp.sdc.heat.datatypes.model.HeatResourcesTypes; import org.openecomp.sdc.heat.datatypes.model.Resource; +import org.openecomp.sdc.heat.datatypes.structure.HeatStructureTree; +import org.openecomp.sdc.heat.datatypes.structure.ValidationStructureList; import org.openecomp.sdc.heat.services.HeatConstants; +import org.openecomp.sdc.heat.services.tree.HeatTreeManager; +import org.openecomp.sdc.heat.services.tree.HeatTreeManagerUtil; +import org.openecomp.sdc.logging.api.Logger; +import org.openecomp.sdc.logging.api.LoggerFactory; +import org.openecomp.sdc.logging.context.impl.MdcDataDebugMessage; +import org.openecomp.sdc.logging.context.impl.MdcDataErrorMessage; +import org.openecomp.sdc.logging.types.LoggerConstants; +import org.openecomp.sdc.logging.types.LoggerErrorCode; +import org.openecomp.sdc.logging.types.LoggerErrorDescription; +import org.openecomp.sdc.logging.types.LoggerTragetServiceName; +import org.openecomp.sdc.tosca.datatypes.ToscaCapabilityType; +import org.openecomp.sdc.tosca.datatypes.ToscaElementTypes; +import org.openecomp.sdc.tosca.datatypes.ToscaNodeType; +import org.openecomp.sdc.tosca.datatypes.ToscaRelationshipType; import org.openecomp.sdc.tosca.datatypes.ToscaServiceModel; +import org.openecomp.sdc.tosca.datatypes.model.AttributeDefinition; +import org.openecomp.sdc.tosca.datatypes.model.CapabilityDefinition; +import org.openecomp.sdc.tosca.datatypes.model.Import; import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate; +import org.openecomp.sdc.tosca.datatypes.model.NodeType; +import org.openecomp.sdc.tosca.datatypes.model.ParameterDefinition; +import org.openecomp.sdc.tosca.datatypes.model.PropertyDefinition; +import org.openecomp.sdc.tosca.datatypes.model.PropertyType; +import org.openecomp.sdc.tosca.datatypes.model.RequirementAssignment; +import org.openecomp.sdc.tosca.datatypes.model.RequirementDefinition; import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; +import org.openecomp.sdc.tosca.datatypes.model.SubstitutionMapping; +import org.openecomp.sdc.tosca.datatypes.model.Template; +import org.openecomp.sdc.tosca.datatypes.model.TopologyTemplate; +import org.openecomp.sdc.tosca.services.DataModelUtil; +import org.openecomp.sdc.tosca.services.ToscaAnalyzerService; +import org.openecomp.sdc.tosca.services.ToscaConstants; import org.openecomp.sdc.tosca.services.ToscaUtil; +import org.openecomp.sdc.tosca.services.impl.ToscaAnalyzerServiceImpl; +import org.openecomp.sdc.tosca.services.yamlutil.ToscaExtensionYamlUtil; +import org.openecomp.sdc.translator.datatypes.heattotosca.AttachedPropertyVal; import org.openecomp.sdc.translator.datatypes.heattotosca.AttachedResourceId; -import org.openecomp.sdc.translator.datatypes.heattotosca.ResourceReferenceType; +import org.openecomp.sdc.translator.datatypes.heattotosca.ReferenceType; +import org.openecomp.sdc.translator.datatypes.heattotosca.TranslationContext; import org.openecomp.sdc.translator.datatypes.heattotosca.to.FileDataCollection; import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo; import org.openecomp.sdc.translator.services.heattotosca.errors.ResourceNotFoundInHeatFileErrorBuilder; -import org.openecomp.sdc.translator.services.heattotosca.mapping.TranslatorHeatToToscaFunctionConverter; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.openecomp.sdc.translator.services.heattotosca.globaltypes.GlobalTypesGenerator; +import org.openecomp.sdc.translator.services.heattotosca.helper.FunctionTranslationHelper; +import org.openecomp.sdc.translator.services.heattotosca.mapping.TranslatorHeatToToscaPropertyConverter; +import java.io.InputStream; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -53,10 +100,58 @@ import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; +/** + * The type Heat to tosca util. + */ public class HeatToToscaUtil { - protected static Logger logger = LoggerFactory.getLogger(HeatToToscaUtil.class); + protected static Logger logger = (Logger) LoggerFactory.getLogger(HeatToToscaUtil.class); + protected static MdcDataDebugMessage mdcDataDebugMessage = new MdcDataDebugMessage(); + + + /** + * Load and translate template data translator output. + * + * @param fileNameContentMap the file name content map + * @return the translator output + */ + public static TranslatorOutput loadAndTranslateTemplateData( + FileContentHandler fileNameContentMap) { + mdcDataDebugMessage.debugEntryMessage(null, null); + HeatToToscaTranslator heatToToscaTranslator = + HeatToToscaTranslatorFactory.getInstance().createInterface(); + InputStream fileContent = fileNameContentMap.getFileContent(SdcCommon.MANIFEST_NAME); + + heatToToscaTranslator.addManifest(SdcCommon.MANIFEST_NAME, FileUtils.toByteArray(fileContent)); + + fileNameContentMap.getFileList().stream() + .filter(fileName -> !(fileName.equals(SdcCommon.MANIFEST_NAME))).forEach( + fileName -> heatToToscaTranslator + .addFile(fileName, FileUtils.toByteArray + (fileNameContentMap.getFileContent(fileName)))); + + Map<String, List<ErrorMessage>> errors = heatToToscaTranslator.validate(); + if (MapUtils.isNotEmpty(MessageContainerUtil.getMessageByLevel(ErrorLevel.ERROR, errors))) { + TranslatorOutput translatorOutput = new TranslatorOutput(); + translatorOutput.setErrorMessages(errors); + return translatorOutput; + } + + InputStream structureFile = getHeatStructureTreeFile(fileNameContentMap); + heatToToscaTranslator.addExternalArtifacts(SdcCommon.HEAT_META, structureFile); + + mdcDataDebugMessage.debugExitMessage(null, null); + return heatToToscaTranslator.translate(); + } + + private static InputStream getHeatStructureTreeFile(FileContentHandler fileNameContentMap) { + HeatTreeManager heatTreeManager = HeatTreeManagerUtil.initHeatTreeManager(fileNameContentMap); + heatTreeManager.createTree(); + HeatStructureTree tree = heatTreeManager.getTree(); + ValidationStructureList validationStructureList = new ValidationStructureList(tree); + return FileUtils.convertToInputStream(validationStructureList, FileUtils.FileExtension.JSON); + } /** * Build list of files to search optional. @@ -77,6 +172,13 @@ public class HeatToToscaUtil { return Optional.ofNullable(HeatToToscaUtil.getFilteredListOfFileDataByTypes(list, types)); } + /** + * Gets filtered list of file data by types. + * + * @param filesToSearch the files to search + * @param types the types + * @return the filtered list of file data by types + */ public static List<FileData> getFilteredListOfFileDataByTypes(List<FileData> filesToSearch, FileData.Type... types) { return filesToSearch.stream().filter(FileData.buildFileDataPredicateByType(types)) @@ -84,7 +186,7 @@ public class HeatToToscaUtil { } /** - * Gets file data. + * Gets file data from the list according to the input heat file name. * * @param heatFileName the heat file name * @param fileDataList the file data list @@ -100,6 +202,26 @@ public class HeatToToscaUtil { return Optional.empty(); } + /** + * Gets file data which is supported by the translator, from the context according the input heat + * file name. + * + * @param heatFileName the heat file name + * @param context the translation context + * @return the file data + */ + public static FileData getFileData(String heatFileName, TranslationContext context) { + + List<FileData> fileDataList = context.getManifest().getContent().getData(); + for (FileData fileData : fileDataList) { + if (TranslationService.getTypesToProcessByTranslator().contains(fileData.getType()) + && fileData.getFile().equals(heatFileName)) { + return fileData; + } + } + return null; + } + static FileDataCollection getFileCollectionsByFilter(List<FileData> fileDataList, Set<FileData.Type> typeFilter, TranslationContext translationContext) { @@ -118,20 +240,23 @@ public class HeatToToscaUtil { HeatOrchestrationTemplate heatOrchestrationTemplate = new YamlUtil() .yamlToObject(translationContext.getFileContent(fileName), HeatOrchestrationTemplate.class); - for (Resource resource : heatOrchestrationTemplate.getResources().values()) { - if (filenames.contains(resource.getType())) { - handleNestedFile(translationContext, fileDataCollection, filteredFiles, referenced, - resource.getType()); - } else if (resource.getType() - .equals(HeatResourcesTypes.RESOURCE_GROUP_RESOURCE_TYPE.getHeatResource())) { - Object resourceDef = - resource.getProperties().get(HeatConstants.RESOURCE_DEF_PROPERTY_NAME); - Object innerTypeDef = ((Map) resourceDef).get("type"); - if (innerTypeDef instanceof String) { - String internalResourceType = (String) innerTypeDef; - if (filenames.contains(internalResourceType)) { - handleNestedFile(translationContext, fileDataCollection, filteredFiles, referenced, - internalResourceType); + if (!MapUtils.isEmpty(heatOrchestrationTemplate.getResources())) { + for (Resource resource : heatOrchestrationTemplate.getResources().values()) { + if (filenames.contains(resource.getType())) { + handleNestedFile(translationContext, fileDataCollection, filteredFiles, referenced, + resource.getType()); + } else if (resource.getType() + .equals(HeatResourcesTypes.RESOURCE_GROUP_RESOURCE_TYPE.getHeatResource())) { + Object resourceDef = + resource.getProperties().get(HeatConstants.RESOURCE_DEF_PROPERTY_NAME); + Object innerTypeDef = ((Map) resourceDef).get("type"); + if (innerTypeDef instanceof String) { + String internalResourceType = (String) innerTypeDef; + if (filenames.contains(internalResourceType)) { + handleNestedFile(translationContext, fileDataCollection, filteredFiles, + referenced, + internalResourceType); + } } } } @@ -157,9 +282,15 @@ public class HeatToToscaUtil { FileDataCollection fileDataCollection, Map<String, FileData> filteredFiles, Set<String> referenced, String nestedFileName) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + referenced.add(nestedFileName); fileDataCollection.addNestedFiles(filteredFiles.get(nestedFileName)); translationContext.getNestedHeatsFiles().add(nestedFileName); + + mdcDataDebugMessage.debugExitMessage(null, null); } private static Map<String, FileData> filterFileDataListByType(List<FileData> fileDataList, @@ -183,10 +314,16 @@ public class HeatToToscaUtil { */ public static Optional<AttachedResourceId> extractAttachedResourceId(TranslateTo translateTo, String propertyName) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + Object propertyValue = translateTo.getResource().getProperties().get(propertyName); if (propertyValue == null) { return Optional.empty(); } + + mdcDataDebugMessage.debugExitMessage(null, null); return extractAttachedResourceId(translateTo.getHeatFileName(), translateTo.getHeatOrchestrationTemplate(), translateTo.getContext(), propertyValue); } @@ -201,9 +338,9 @@ public class HeatToToscaUtil { * @return the optional */ public static Optional<AttachedResourceId> extractAttachedResourceId(String heatFileName, - HeatOrchestrationTemplate heatOrchestrationTemplate, - TranslationContext context, - Object propertyValue) { + HeatOrchestrationTemplate heatOrchestrationTemplate, + TranslationContext context, + Object propertyValue) { Object entity; Object translatedId; @@ -212,7 +349,7 @@ public class HeatToToscaUtil { return Optional.empty(); } - ResourceReferenceType referenceType = ResourceReferenceType.OTHER; + ReferenceType referenceType = ReferenceType.OTHER; if (propertyValue instanceof Map && !((Map) propertyValue).isEmpty()) { Map<String, Object> propMap = (Map) propertyValue; Map.Entry<String, Object> entry = propMap.entrySet().iterator().next(); @@ -220,21 +357,28 @@ public class HeatToToscaUtil { String key = entry.getKey(); switch (key) { case "get_resource": - referenceType = ResourceReferenceType.GET_RESOURCE; + referenceType = ReferenceType.GET_RESOURCE; break; case "get_param": - referenceType = ResourceReferenceType.GET_PARAM; + referenceType = ReferenceType.GET_PARAM; break; case "get_attr": - referenceType = ResourceReferenceType.GET_ATTR; + referenceType = ReferenceType.GET_ATTR; break; default: + referenceType = ReferenceType.OTHER; + break; + } + + if (!FunctionTranslationFactory.getInstance(entry.getKey()).isPresent()) { + translatedId = null; + } else { + translatedId = FunctionTranslationFactory.getInstance(entry.getKey()).get() + .translateFunction(null, null, null, entry.getKey(), entry.getValue(), heatFileName, + heatOrchestrationTemplate, null, context); } - translatedId = TranslatorHeatToToscaFunctionConverter - .getToscaFunction(entry.getKey(), entry.getValue(), heatFileName, - heatOrchestrationTemplate, null, context); if (translatedId instanceof String - && !TranslatorHeatToToscaFunctionConverter.isResourceSupported((String) translatedId)) { + && !FunctionTranslationHelper.isResourceSupported((String) translatedId)) { translatedId = null; } @@ -254,6 +398,10 @@ public class HeatToToscaUtil { */ public static Optional<String> getContrailAttachedHeatResourceId( AttachedResourceId attachedResource) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + if (attachedResource == null) { return Optional.empty(); } @@ -267,6 +415,7 @@ public class HeatToToscaUtil { return Optional.of((String) ((List) attachedResource.getEntityId()).get(0)); } + mdcDataDebugMessage.debugExitMessage(null, null); return Optional.empty(); } @@ -276,37 +425,40 @@ public class HeatToToscaUtil { * @param propertyValue the property value * @return the optional */ - public static Optional<AttachedResourceId> extractProperty(Object propertyValue) { + public static Optional<AttachedPropertyVal> extractProperty(Object propertyValue) { - Object entity; + mdcDataDebugMessage.debugEntryMessage(null, null); + Object attachedPropertyVal; if (Objects.isNull(propertyValue)) { return Optional.empty(); } - ResourceReferenceType referenceType = ResourceReferenceType.OTHER; + ReferenceType referenceType = ReferenceType.OTHER; if (propertyValue instanceof Map && !((Map) propertyValue).isEmpty()) { Map<String, Object> propMap = (Map) propertyValue; Map.Entry<String, Object> entry = propMap.entrySet().iterator().next(); - entity = entry.getValue(); + attachedPropertyVal = entry.getValue(); String key = entry.getKey(); switch (key) { case "get_resource": - referenceType = ResourceReferenceType.GET_RESOURCE; + referenceType = ReferenceType.GET_RESOURCE; break; case "get_param": - referenceType = ResourceReferenceType.GET_PARAM; + referenceType = ReferenceType.GET_PARAM; break; case "get_attr": - referenceType = ResourceReferenceType.GET_ATTR; + referenceType = ReferenceType.GET_ATTR; break; default: + break; } } else { - entity = propertyValue; + attachedPropertyVal = propertyValue; } - return Optional.of(new AttachedResourceId(null, entity, referenceType)); + mdcDataDebugMessage.debugExitMessage(null, null); + return Optional.of(new AttachedPropertyVal(attachedPropertyVal, referenceType)); } /** @@ -316,10 +468,14 @@ public class HeatToToscaUtil { * @param propertyKey the property key */ public static void mapBoolean(NodeTemplate nodeTemplate, String propertyKey) { + mdcDataDebugMessage.debugEntryMessage(null, null); + Object value = nodeTemplate.getProperties().get(propertyKey); if (value != null && !(value instanceof Map)) { nodeTemplate.getProperties().put(propertyKey, HeatBoolean.eval(value)); } + + mdcDataDebugMessage.debugExitMessage(null, null); } /** @@ -342,6 +498,12 @@ public class HeatToToscaUtil { } + /** + * Is yml file type boolean. + * + * @param filename the filename + * @return the boolean + */ public static boolean isYmlFileType(String filename) { return (filename.indexOf("yaml") > 0 || filename.indexOf("yml") > 0); } @@ -353,10 +515,17 @@ public class HeatToToscaUtil { * @return the boolean */ public static boolean isNestedResource(Resource resource) { + mdcDataDebugMessage.debugEntryMessage(null, null); + String resourceType = resource.getType(); if (resourceType.equals(HeatResourcesTypes.RESOURCE_GROUP_RESOURCE_TYPE.getHeatResource())) { Object resourceDef = resource.getProperties().get(HeatConstants.RESOURCE_DEF_PROPERTY_NAME); + if (!(((Map) resourceDef).get("type") instanceof String)) { + //currently only resource group which is poinitng to nested heat file is supported + //dynamic type is currently not supported + return false; + } String internalResourceType = (String) ((Map) resourceDef).get("type"); if (isYamlFile(internalResourceType)) { return true; @@ -364,16 +533,47 @@ public class HeatToToscaUtil { } else if (isYamlFile(resourceType)) { return true; } + + mdcDataDebugMessage.debugExitMessage(null, null); return false; } /** + * Get nested heat file name in case of nested resource. + * + * @param resource the resource + * @return the nested heat file name + */ + public static Optional<String> getNestedHeatFileName(Resource resource) { + mdcDataDebugMessage.debugEntryMessage(null, null); + + if (!isNestedResource(resource)) { + return Optional.empty(); + } + + String resourceType = resource.getType(); + + if (resourceType.equals(HeatResourcesTypes.RESOURCE_GROUP_RESOURCE_TYPE.getHeatResource())) { + Object resourceDef = resource.getProperties().get(HeatConstants.RESOURCE_DEF_PROPERTY_NAME); + String internalResourceType = (String) ((Map) resourceDef).get("type"); + return Optional.of(internalResourceType); + } + + mdcDataDebugMessage.debugExitMessage(null, null); + return Optional.of(resourceType); + } + + /** * Gets nested file. * * @param resource the resource * @return the nested file */ public static Optional<String> getNestedFile(Resource resource) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + if (!isNestedResource(resource)) { return Optional.empty(); } @@ -381,8 +581,11 @@ public class HeatToToscaUtil { if (resourceType.equals(HeatResourcesTypes.RESOURCE_GROUP_RESOURCE_TYPE.getHeatResource())) { Object resourceDef = resource.getProperties().get(HeatConstants.RESOURCE_DEF_PROPERTY_NAME); String internalResourceType = (String) ((Map) resourceDef).get("type"); + + mdcDataDebugMessage.debugExitMessage(null, null); return Optional.of(internalResourceType); } else { + mdcDataDebugMessage.debugExitMessage(null, null); return Optional.of(resourceType); } } @@ -401,27 +604,69 @@ public class HeatToToscaUtil { */ public static Resource getResource(HeatOrchestrationTemplate heatOrchestrationTemplate, String resourceId, String heatFileName) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + Resource resource = heatOrchestrationTemplate.getResources().get(resourceId); if (resource == null) { + MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB, + LoggerTragetServiceName.GET_RESOURCE, ErrorLevel.ERROR.name(), + LoggerErrorCode.DATA_ERROR.getErrorCode(), LoggerErrorDescription.TRANSLATE_HEAT); throw new CoreException( new ResourceNotFoundInHeatFileErrorBuilder(resourceId, heatFileName).build()); } + + mdcDataDebugMessage.debugExitMessage(null, null); return resource; } + + /** + * Get resource type. + * + * @param resourceId the resource id + * @param heatOrchestrationTemplate heat orchestration template + * @param heatFileName heat file name + * @return resource type + */ + public static String getResourceType(String resourceId, + HeatOrchestrationTemplate heatOrchestrationTemplate, + String heatFileName) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + mdcDataDebugMessage.debugExitMessage(null, null); + return HeatToToscaUtil.getResource(heatOrchestrationTemplate, resourceId, heatFileName) + .getType(); + } + + /** + * Is heat file nested boolean. + * + * @param translateTo the translate to + * @param heatFileName the heat file name + * @return the boolean + */ public static boolean isHeatFileNested(TranslateTo translateTo, String heatFileName) { return translateTo.getContext().getNestedHeatsFiles().contains(heatFileName); } /** - * Extract contrail get resource attached heat resource id string. + * Extract contrail get resource attached heat resource id optional. * * @param propertyValue the property value - * @return the string + * @return the optional */ - public static String extractContrailGetResourceAttachedHeatResourceId(Object propertyValue) { + public static Optional<String> extractContrailGetResourceAttachedHeatResourceId( + Object propertyValue) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + if (propertyValue == null) { - return null; + return Optional.empty(); } Object value; @@ -431,7 +676,7 @@ public class HeatToToscaUtil { if (value instanceof List) { if (((List) value).size() == 2 && ((List) value).get(1).equals("fq_name")) { if (((List) value).get(0) instanceof String) { - return (String) ((List) value).get(0); + return Optional.of((String) ((List) value).get(0)); } else { logger.warn("invalid format of 'get_attr' function - " + propertyValue.toString()); } @@ -440,15 +685,15 @@ public class HeatToToscaUtil { } else if (((Map) propertyValue).containsKey("get_resource")) { value = ((Map) propertyValue).get("get_resource"); if (value instanceof String) { - return (String) value; + return Optional.of((String) value); } else { logger.warn("invalid format of 'get_resource' function - " + propertyValue.toString()); } } else { Collection<Object> valCollection = ((Map) propertyValue).values(); for (Object entryValue : valCollection) { - String ret = extractContrailGetResourceAttachedHeatResourceId(entryValue); - if (ret != null) { + Optional<String> ret = extractContrailGetResourceAttachedHeatResourceId(entryValue); + if (ret.isPresent()) { return ret; } @@ -456,31 +701,54 @@ public class HeatToToscaUtil { } } else if (propertyValue instanceof List) { for (Object prop : (List) propertyValue) { - String ret = extractContrailGetResourceAttachedHeatResourceId(prop); - if (ret != null) { + Optional<String> ret = extractContrailGetResourceAttachedHeatResourceId(prop); + if (ret.isPresent()) { return ret; } } } - return null; + + mdcDataDebugMessage.debugExitMessage(null, null); + return Optional.empty(); + } + + /** + * Gets tosca service model. + * + * @param context translation context + * @return the tosca service model + */ + public static ToscaServiceModel getToscaServiceModel(TranslationContext context) { + mdcDataDebugMessage.debugEntryMessage(null, null); + mdcDataDebugMessage.debugExitMessage(null, null); + + Map<String, String> metadata = new HashMap<>(); + metadata.put(ToscaConstants.ST_METADATA_TEMPLATE_NAME, Constants.MAIN_TEMPLATE_NAME); + return getToscaServiceModel(context, metadata); } /** * Gets tosca service model. * - * @param translateTo the translate to + * @param context translation context + * @param entryDefinitionMetadata template name of the entry definition servie template * @return the tosca service model */ - public static ToscaServiceModel getToscaServiceModel(TranslateTo translateTo) { + public static ToscaServiceModel getToscaServiceModel(TranslationContext context, + Map<String, String> entryDefinitionMetadata) { + mdcDataDebugMessage.debugEntryMessage(null, null); + Map<String, ServiceTemplate> serviceTemplates = - new HashMap<>(translateTo.getContext().getGlobalServiceTemplates()); + new HashMap<>(context.getGlobalServiceTemplates()); Collection<ServiceTemplate> tmpServiceTemplates = - translateTo.getContext().getTranslatedServiceTemplates().values(); + context.getTranslatedServiceTemplates().values(); for (ServiceTemplate serviceTemplate : tmpServiceTemplates) { ToscaUtil.addServiceTemplateToMapWithKeyFileName(serviceTemplates, serviceTemplate); } + + mdcDataDebugMessage.debugExitMessage(null, null); return new ToscaServiceModel(null, serviceTemplates, - ToscaUtil.getServiceTemplateFileName(translateTo.getResource().getType())); + ToscaUtil.getServiceTemplateFileName(entryDefinitionMetadata)); } /** @@ -492,12 +760,929 @@ public class HeatToToscaUtil { */ public static Optional<ServiceTemplate> getServiceTemplateFromContext( String serviceTemplateFileName, TranslationContext context) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + for (ServiceTemplate serviceTemplate : context.getTranslatedServiceTemplates().values()) { if (ToscaUtil.getServiceTemplateFileName(serviceTemplate).equals(serviceTemplateFileName)) { + mdcDataDebugMessage.debugExitMessage(null, null); return Optional.of(serviceTemplate); } } + mdcDataDebugMessage.debugExitMessage(null, null); return Optional.empty(); } + + /** + * Adding binding requerment from port node template to compute node template. + * + * @param computeNodeTemplateId compute node template id + * @param portNodeTemplate port node template + */ + public static void addBindingReqFromPortToCompute(String computeNodeTemplateId, + NodeTemplate portNodeTemplate) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + RequirementAssignment requirementAssignment = new RequirementAssignment(); + requirementAssignment.setCapability(ToscaCapabilityType.NATIVE_NETWORK_BINDABLE); + requirementAssignment.setRelationship(ToscaRelationshipType.NATIVE_NETWORK_BINDS_TO); + requirementAssignment.setNode(computeNodeTemplateId); + DataModelUtil.addRequirementAssignment(portNodeTemplate, ToscaConstants.BINDING_REQUIREMENT_ID, + requirementAssignment); + + mdcDataDebugMessage.debugExitMessage(null, null); + } + + /** + * Adding link requerment from port node template to network node template. + * + * @param portNodeTemplate port node template + * @param networkTranslatedId network node template id + */ + public static RequirementAssignment addLinkReqFromPortToNetwork(NodeTemplate portNodeTemplate, + String networkTranslatedId) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + RequirementAssignment requirement = new RequirementAssignment(); + requirement.setCapability(ToscaCapabilityType.NATIVE_NETWORK_LINKABLE); + requirement.setRelationship(ToscaRelationshipType.NATIVE_NETWORK_LINK_TO); + requirement.setNode(networkTranslatedId); + DataModelUtil.addRequirementAssignment(portNodeTemplate, + ToscaConstants.LINK_REQUIREMENT_ID, requirement); + + mdcDataDebugMessage.debugExitMessage(null, null); + + return requirement; + } + + /** + * Adding binding requerment from sub interface node template to interface (port) node template. + * + * @param subInterfaceNodeTemplate sub interface template + * @param interfaceTranslatedId interface node template id + */ + public static void addBindingReqFromSubInterfaceToInterface( + NodeTemplate subInterfaceNodeTemplate, String interfaceTranslatedId) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + RequirementAssignment requirement = new RequirementAssignment(); + requirement.setCapability(ToscaCapabilityType.NATIVE_NETWORK_BINDABLE); + requirement.setRelationship(ToscaRelationshipType.NATIVE_NETWORK_BINDS_TO); + requirement.setNode(interfaceTranslatedId); + DataModelUtil + .addRequirementAssignment(subInterfaceNodeTemplate, + ToscaConstants.BINDING_REQUIREMENT_ID, requirement); + + mdcDataDebugMessage.debugExitMessage(null, null); + } + + /** + * Get property Parameter Name Value. + * + * @param property property + * @return Parameter name in case the property include "get_param" function + */ + public static Optional<String> getPropertyParameterNameValue(Object property) { + if (Objects.isNull(property)) { + return Optional.empty(); + } + Optional<AttachedPropertyVal> extractedProperty = extractProperty(property); + if (extractedProperty.isPresent()) { + return getParameterName(extractedProperty.get()); + } + return Optional.empty(); + } + + private static Optional<String> getParameterName(AttachedPropertyVal extractedProperty) { + if (!extractedProperty.isGetParam()) { + return Optional.empty(); + } + Object getParamFuncValue = extractedProperty.getPropertyValue(); + if (getParamFuncValue instanceof String) { + return Optional.of((String) getParamFuncValue); + } else { + return Optional.of((String) ((List) getParamFuncValue).get(0)); + } + } + + public static String getToscaPropertyName(TranslationContext context, String heatResourceType, + String heatPropertyName) { + return context.getElementMapping(heatResourceType, Constants.PROP, heatPropertyName); + } + + /** + * Gets tosca property name. + * + * @param translateTo the translate to + * @param heatPropertyName the heat property name + * @return the tosca property name + */ + public static String getToscaPropertyName(TranslateTo translateTo, String heatPropertyName) { + return translateTo.getContext() + .getElementMapping(translateTo.getResource().getType(), Constants.PROP, heatPropertyName); + } + + /** + * Gets tosca attribute name. + * + * @param context the context + * @param heatResourceType the heat resource type + * @param heatAttrName the heat attr name + * @return the tosca attribute name + */ + public static String getToscaAttributeName(TranslationContext context, String heatResourceType, + String heatAttrName) { + return context.getElementMapping(heatResourceType, Constants.ATTR, heatAttrName); + } + + /** + * Gets tosca attribute name. + * + * @param translateTo the translate to + * @param heatAttrName the heat attr name + * @return the tosca attribute name + */ + public static String getToscaAttributeName(TranslateTo translateTo, String heatAttrName) { + return translateTo.getContext() + .getElementMapping(translateTo.getResource().getType(), Constants.ATTR, heatAttrName); + } + + /** + * Create init substitution service template service template. + * + * @param templateName the template name + * @return the service template + */ + public static ServiceTemplate createInitSubstitutionServiceTemplate(String templateName) { + ServiceTemplate nestedSubstitutionServiceTemplate = new ServiceTemplate(); + Map<String, String> templateMetadata = new HashMap<>(); + templateMetadata.put(ToscaConstants.ST_METADATA_TEMPLATE_NAME, templateName); + nestedSubstitutionServiceTemplate.setMetadata(templateMetadata); + nestedSubstitutionServiceTemplate + .setTosca_definitions_version(ToscaConstants.TOSCA_DEFINITIONS_VERSION); + nestedSubstitutionServiceTemplate.setTopology_template(new TopologyTemplate()); + List<Map<String, Import>> globalTypesImportList = + GlobalTypesGenerator.getGlobalTypesImportList(); + globalTypesImportList.addAll( + HeatToToscaUtil.createImportList(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME)); + nestedSubstitutionServiceTemplate.setImports(globalTypesImportList); + return nestedSubstitutionServiceTemplate; + } + + /** + * Create init global substitution service template service template. + * + * @return the service template + */ + public static ServiceTemplate createInitGlobalSubstitutionServiceTemplate() { + ServiceTemplate globalSubstitutionServiceTemplate = new ServiceTemplate(); + Map<String, String> templateMetadata = new HashMap<>(); + templateMetadata.put(ToscaConstants.ST_METADATA_TEMPLATE_NAME, + Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME); + globalSubstitutionServiceTemplate.setMetadata(templateMetadata); + globalSubstitutionServiceTemplate + .setImports(GlobalTypesGenerator.getGlobalTypesImportList()); + globalSubstitutionServiceTemplate + .setTosca_definitions_version(ToscaConstants.TOSCA_DEFINITIONS_VERSION); + return globalSubstitutionServiceTemplate; + } + + /** + * Create substitution node type node type. + * + * @param substitutionServiceTemplate the substitution service template + * @return the node type + */ + public NodeType createSubstitutionNodeType(ServiceTemplate substitutionServiceTemplate) { + NodeType substitutionNodeType = new NodeType(); + substitutionNodeType.setDerived_from(ToscaNodeType.ABSTRACT_SUBSTITUTE); + substitutionNodeType.setDescription(substitutionServiceTemplate.getDescription()); + substitutionNodeType + .setProperties(manageSubstitutionNodeTypeProperties(substitutionServiceTemplate)); + substitutionNodeType + .setAttributes(manageSubstitutionNodeTypeAttributes(substitutionServiceTemplate)); + return substitutionNodeType; + } + + private Map<String, PropertyDefinition> manageSubstitutionNodeTypeProperties( + ServiceTemplate substitutionServiceTemplate) { + mdcDataDebugMessage.debugEntryMessage(null, null); + + Map<String, PropertyDefinition> substitutionNodeTypeProperties = new HashMap<>(); + Map<String, ParameterDefinition> properties = + substitutionServiceTemplate.getTopology_template().getInputs(); + if (properties == null) { + mdcDataDebugMessage.debugExitMessage(null, null); + return null; + } + + PropertyDefinition propertyDefinition; + String toscaPropertyName; + for (Map.Entry<String, ParameterDefinition> entry : properties.entrySet()) { + toscaPropertyName = entry.getKey(); + propertyDefinition = new PropertyDefinition(); + ParameterDefinition parameterDefinition = + substitutionServiceTemplate.getTopology_template().getInputs().get(toscaPropertyName); + propertyDefinition.setType(parameterDefinition.getType()); + propertyDefinition.setDescription(parameterDefinition.getDescription()); + propertyDefinition.setRequired(parameterDefinition.getRequired()); + propertyDefinition.set_default(parameterDefinition.get_default()); + propertyDefinition.setConstraints(parameterDefinition.getConstraints()); + propertyDefinition.setEntry_schema(parameterDefinition.getEntry_schema()); + propertyDefinition.setStatus(parameterDefinition.getStatus()); + substitutionNodeTypeProperties.put(toscaPropertyName, propertyDefinition); + } + + mdcDataDebugMessage.debugExitMessage(null, null); + return substitutionNodeTypeProperties; + } + + private Map<String, AttributeDefinition> manageSubstitutionNodeTypeAttributes( + ServiceTemplate substitutionServiceTemplate) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + Map<String, AttributeDefinition> substitutionNodeTypeAttributes = new HashMap<>(); + Map<String, ParameterDefinition> attributes = + substitutionServiceTemplate.getTopology_template().getOutputs(); + if (attributes == null) { + mdcDataDebugMessage.debugExitMessage(null, null); + return null; + } + AttributeDefinition attributeDefinition; + String toscaAttributeName; + + for (Map.Entry<String, ParameterDefinition> entry : attributes.entrySet()) { + attributeDefinition = new AttributeDefinition(); + toscaAttributeName = entry.getKey(); + ParameterDefinition parameterDefinition = + substitutionServiceTemplate.getTopology_template().getOutputs().get(toscaAttributeName); + if (parameterDefinition.getType() != null && !parameterDefinition.getType().isEmpty()) { + attributeDefinition.setType(parameterDefinition.getType()); + } else { + attributeDefinition.setType(PropertyType.STRING.getDisplayName()); + } + attributeDefinition.setDescription(parameterDefinition.getDescription()); + attributeDefinition.set_default(parameterDefinition.get_default()); + attributeDefinition.setEntry_schema(parameterDefinition.getEntry_schema()); + attributeDefinition.setStatus(parameterDefinition.getStatus()); + substitutionNodeTypeAttributes.put(toscaAttributeName, attributeDefinition); + } + + mdcDataDebugMessage.debugExitMessage(null, null); + return substitutionNodeTypeAttributes; + } + + /** + * . + * Create and add substitution mapping to the nested substitution service template, and update + * the subtitution node type accordingly with the exposed requerments and capabilities + * + * @param context the translation context + * @param substitutionNodeTypeKey the substitution node type key + * @param nestedSubstitutionServiceTemplate the nested substitution service template + * @param substitutionNodeType the substitution node type + */ + public static void handleSubstitutionMapping( + TranslationContext context, + String substitutionNodeTypeKey, + ServiceTemplate nestedSubstitutionServiceTemplate, + NodeType substitutionNodeType) { + Map<String, Map<String, List<String>>> substitutionMapping = + getSubstitutionNodeTypeExposedConnectionPoints(substitutionNodeType, + nestedSubstitutionServiceTemplate, context); + //add substitution mapping after capability and requirement expose calculation + nestedSubstitutionServiceTemplate.getTopology_template().setSubstitution_mappings( + createSubstitutionTemplateSubMapping(substitutionNodeTypeKey, + substitutionNodeType, substitutionMapping)); + } + + /** + * Gets node type with flat hierarchy. + * + * @param nodeTypeId the node type id + * @param serviceTemplate the service template + * @param context the context + * @return the node type with flat hierarchy + */ + public static NodeType getNodeTypeWithFlatHierarchy(String nodeTypeId, + ServiceTemplate serviceTemplate, + TranslationContext context) { + ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl(); + ToscaServiceModel toscaServiceModel = HeatToToscaUtil + .getToscaServiceModel(context, serviceTemplate.getMetadata()); + NodeType flatNodeType = (NodeType) toscaAnalyzerService + .getFlatEntity(ToscaElementTypes.NODE_TYPE, nodeTypeId, serviceTemplate, toscaServiceModel); + return flatNodeType; + } + + /** + * Create substitution node template node template. + * + * @param translateTo the translate to + * @param templateName the template name + * @param substitutionNodeTypeKey the substitution node type key + * @return the node template + */ + public NodeTemplate createSubstitutionNodeTemplate(TranslateTo translateTo, String templateName, + String substitutionNodeTypeKey) { + NodeTemplate substitutionNodeTemplate = new NodeTemplate(); + List<String> directiveList = new ArrayList<>(); + directiveList.add(ToscaConstants.NODE_TEMPLATE_DIRECTIVE_SUBSTITUTABLE); + substitutionNodeTemplate.setDirectives(directiveList); + substitutionNodeTemplate.setType(substitutionNodeTypeKey); + substitutionNodeTemplate.setProperties( + managerSubstitutionNodeTemplateProperties(translateTo, substitutionNodeTemplate, + templateName)); + return substitutionNodeTemplate; + } + + /** + * Create abstract substitution node template. + * + * @param translateTo the translate to + * @param templateName the template name + * @param substitutionNodeTypeKey the substitution node type key + * @return the abstract substitute node template + */ + public static NodeTemplate createAbstractSubstitutionNodeTemplate( + TranslateTo translateTo, + String templateName, + String substitutionNodeTypeKey) { + NodeTemplate substitutionNodeTemplate = new NodeTemplate(); + List<String> directiveList = new ArrayList<>(); + directiveList.add(ToscaConstants.NODE_TEMPLATE_DIRECTIVE_SUBSTITUTABLE); + substitutionNodeTemplate.setDirectives(directiveList); + substitutionNodeTemplate.setType(substitutionNodeTypeKey); + substitutionNodeTemplate.setProperties( + managerSubstitutionNodeTemplateProperties(translateTo, substitutionNodeTemplate, + templateName)); + return substitutionNodeTemplate; + } + + + /** + * Checks if the source and target resource is a valid candidate for adding tosca dependency + * relationship. + * + * @param heatOrchestrationTemplate the heat orchestration template + * @param sourceResource the source resource + * @param targetResource the target resource + * @param dependencyEntity the dependency entity + * @return true if the candidate resources are a valid combination for the dependency relationship + * and false otherwise + */ + public static boolean isValidDependsOnCandidate(HeatOrchestrationTemplate + heatOrchestrationTemplate, + Resource sourceResource, + Resource targetResource, + ConsolidationEntityType dependencyEntity, + TranslationContext context) { + dependencyEntity + .setEntityType(heatOrchestrationTemplate, sourceResource, targetResource, context); + ConsolidationEntityType sourceEntityType = dependencyEntity.getSourceEntityType(); + ConsolidationEntityType targetEntityType = dependencyEntity.getTargetEntityType(); + + //Ignore Compute->Port, Compute->volume, Compute->Compute and Compute->VFC Nested relationships + if (sourceEntityType == ConsolidationEntityType.COMPUTE) { + if (targetEntityType == ConsolidationEntityType.COMPUTE + || targetEntityType == ConsolidationEntityType.VOLUME + || targetEntityType == ConsolidationEntityType.PORT + || targetEntityType == ConsolidationEntityType.VFC_NESTED) { + return false; + } + } + //Ignore Port->Compute, Port->volume, Port->Port and Port->VFC Nested relationships + if (sourceEntityType == ConsolidationEntityType.PORT) { + if (targetEntityType == ConsolidationEntityType.COMPUTE + || targetEntityType == ConsolidationEntityType.VOLUME + || targetEntityType == ConsolidationEntityType.PORT + || targetEntityType == ConsolidationEntityType.VFC_NESTED) { + return false; + } + } + + //Ignore Volume->Compute, Volume->Volume, Volume->Port and Volume->VFC Nested relationships + if (sourceEntityType == ConsolidationEntityType.VOLUME) { + if (targetEntityType == ConsolidationEntityType.COMPUTE + || targetEntityType == ConsolidationEntityType.VOLUME + || targetEntityType == ConsolidationEntityType.PORT + || targetEntityType == ConsolidationEntityType.VFC_NESTED) { + return false; + } + } + + //Ignore VFC Nested->Compute, VFC Nested->Volume, VFC Nested->Port and + // VFC Nested->VFC Nested relationships + if (sourceEntityType == ConsolidationEntityType.VFC_NESTED) { + if (targetEntityType == ConsolidationEntityType.COMPUTE + || targetEntityType == ConsolidationEntityType.VOLUME + || targetEntityType == ConsolidationEntityType.PORT + || targetEntityType == ConsolidationEntityType.VFC_NESTED) { + return false; + } + } + return true; + } + + private static Map<String, Object> managerSubstitutionNodeTemplateProperties( + TranslateTo translateTo, + Template template, + String templateName) { + mdcDataDebugMessage.debugEntryMessage(null, null); + + Map<String, Object> substitutionProperties = new HashMap<>(); + Map<String, Object> heatProperties = translateTo.getResource().getProperties(); + if (Objects.nonNull(heatProperties)) { + for (Map.Entry<String, Object> entry : heatProperties.entrySet()) { + Object property = TranslatorHeatToToscaPropertyConverter + .getToscaPropertyValue(translateTo.getServiceTemplate(), + translateTo.getTranslatedId(), entry.getKey(), + entry.getValue(), null, translateTo.getHeatFileName(), + translateTo.getHeatOrchestrationTemplate(), template, translateTo.getContext()); + substitutionProperties.put(entry.getKey(), property); + } + } + + mdcDataDebugMessage.debugExitMessage(null, null); + return addAbstractSubstitutionProperty(templateName, substitutionProperties); + } + + private static Map<String, Object> addAbstractSubstitutionProperty(String templateName, + Map<String, Object> + substitutionProperties) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + Map<String, Object> innerProps = new HashMap<>(); + innerProps.put(ToscaConstants.SUBSTITUTE_SERVICE_TEMPLATE_PROPERTY_NAME, + ToscaUtil.getServiceTemplateFileName(templateName)); + substitutionProperties.put(ToscaConstants.SERVICE_TEMPLATE_FILTER_PROPERTY_NAME, innerProps); + + mdcDataDebugMessage.debugExitMessage(null, null); + return substitutionProperties; + } + + private static SubstitutionMapping createSubstitutionTemplateSubMapping( + String nodeTypeKey, + NodeType substitutionNodeType, + Map<String, Map<String, List<String>>> mapping) { + mdcDataDebugMessage.debugEntryMessage(null, null); + SubstitutionMapping substitutionMapping = new SubstitutionMapping(); + substitutionMapping.setNode_type(nodeTypeKey); + substitutionMapping.setCapabilities( + manageCapabilityMapping(substitutionNodeType.getCapabilities(), mapping.get("capability"))); + substitutionMapping.setRequirements( + manageRequirementMapping(substitutionNodeType.getRequirements(), + mapping.get("requirement"))); + + mdcDataDebugMessage.debugExitMessage(null, null); + return substitutionMapping; + } + + private static Map<String, List<String>> manageRequirementMapping( + List<Map<String, RequirementDefinition>> requirementList, + Map<String, List<String>> requirementSubstitutionMapping) { + mdcDataDebugMessage.debugEntryMessage(null, null); + + if (requirementList == null) { + return null; + } + Map<String, List<String>> requirementMapping = new HashMap<>(); + String requirementKey; + List<String> requirementMap; + for (Map<String, RequirementDefinition> requirementDefMap : requirementList) { + for (Map.Entry<String, RequirementDefinition> entry : requirementDefMap.entrySet()) { + requirementKey = entry.getKey(); + requirementMap = requirementSubstitutionMapping.get(requirementKey); + requirementMapping.put(requirementKey, requirementMap); + } + } + + mdcDataDebugMessage.debugExitMessage(null, null); + return requirementMapping; + } + + private static Map<String, List<String>> manageCapabilityMapping( + Map<String, CapabilityDefinition> capabilities, + Map<String, List<String>> capabilitySubstitutionMapping) { + mdcDataDebugMessage.debugEntryMessage(null, null); + + if (capabilities == null) { + mdcDataDebugMessage.debugExitMessage(null, null); + return null; + } + + Map<String, List<String>> capabilityMapping = new HashMap<>(); + String capabilityKey; + List<String> capabilityMap; + for (Map.Entry<String, CapabilityDefinition> entry : capabilities.entrySet()) { + capabilityKey = entry.getKey(); + capabilityMap = capabilitySubstitutionMapping.get(capabilityKey); + capabilityMapping.put(capabilityKey, capabilityMap); + } + + mdcDataDebugMessage.debugExitMessage(null, null); + return capabilityMapping; + } + + private static Map<String, Map<String, List<String>>> + getSubstitutionNodeTypeExposedConnectionPoints(NodeType substitutionNodeType, + ServiceTemplate substitutionServiceTemplate, + TranslationContext context) { + mdcDataDebugMessage.debugEntryMessage(null, null); + + Map<String, NodeTemplate> nodeTemplates = + substitutionServiceTemplate.getTopology_template().getNode_templates(); + String nodeTemplateId; + NodeTemplate nodeTemplate; + String nodeType; + Map<String, Map<String, List<String>>> substitutionMapping = new HashMap<>(); + if (nodeTemplates == null) { + return substitutionMapping; + } + + Map<String, List<String>> capabilitySubstitutionMapping = new HashMap<>(); + Map<String, List<String>> requirementSubstitutionMapping = new HashMap<>(); + substitutionMapping.put("capability", capabilitySubstitutionMapping); + substitutionMapping.put("requirement", requirementSubstitutionMapping); + List<Map<String, RequirementDefinition>> nodeTypeRequirementsDefinition; + Map<String, RequirementAssignment> nodeTemplateRequirementsAssignment; + List<Map<String, RequirementDefinition>> exposedRequirementsDefinition; + Map<String, Map<String, RequirementAssignment>> fullFilledRequirementsDefinition = + new HashMap<>(); + Map<String, CapabilityDefinition> nodeTypeCapabilitiesDefinition = new HashMap<>(); + Map<String, CapabilityDefinition> exposedCapabilitiesDefinition; + + for (Map.Entry<String, NodeTemplate> entry : nodeTemplates.entrySet()) { + nodeTemplateId = entry.getKey(); + nodeTemplate = entry.getValue(); + nodeType = nodeTemplate.getType(); + + // get requirements + nodeTypeRequirementsDefinition = + getNodeTypeReqs(nodeType, nodeTemplateId, substitutionServiceTemplate, + requirementSubstitutionMapping, context); + nodeTemplateRequirementsAssignment = DataModelUtil.getNodeTemplateRequirements(nodeTemplate); + fullFilledRequirementsDefinition.put(nodeTemplateId, nodeTemplateRequirementsAssignment); + //set substitution node type requirements + exposedRequirementsDefinition = calculateExposedRequirements(nodeTypeRequirementsDefinition, + nodeTemplateRequirementsAssignment); + addSubstitutionNodeTypeRequirements(substitutionNodeType, exposedRequirementsDefinition, + nodeTemplateId); + + //get capabilities + addNodeTypeCapabilitiesToSubMapping(nodeTypeCapabilitiesDefinition, + capabilitySubstitutionMapping, nodeType, + nodeTemplateId, substitutionServiceTemplate, context); + } + + exposedCapabilitiesDefinition = calculateExposedCapabilities(nodeTypeCapabilitiesDefinition, + fullFilledRequirementsDefinition); + DataModelUtil.addNodeTypeCapabilitiesDef(substitutionNodeType, exposedCapabilitiesDefinition); + + mdcDataDebugMessage.debugExitMessage(null, null); + return substitutionMapping; + } + + private static Map<String, CapabilityDefinition> calculateExposedCapabilities( + Map<String, CapabilityDefinition> nodeTypeCapabilitiesDefinition, + Map<String, Map<String, RequirementAssignment>> fullFilledRequirementsDefinitionMap) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + String capabilityKey; + String capability; + String node; + for (Map.Entry<String, Map<String, RequirementAssignment>> entry : + fullFilledRequirementsDefinitionMap.entrySet()) { + for (Map.Entry<String, RequirementAssignment> fullFilledEntry : entry.getValue().entrySet()) { + + capability = fullFilledEntry.getValue().getCapability(); + fullFilledEntry.getValue().getOccurrences(); + node = fullFilledEntry.getValue().getNode(); + capabilityKey = capability + "_" + node; + CapabilityDefinition capabilityDefinition = nodeTypeCapabilitiesDefinition.get( + capabilityKey); + if (capabilityDefinition != null) { + CapabilityDefinition clonedCapabilityDefinition = capabilityDefinition.clone(); + nodeTypeCapabilitiesDefinition.put(capabilityKey, capabilityDefinition.clone()); + if (evaluateCapabilityFulfillment(clonedCapabilityDefinition)) { + nodeTypeCapabilitiesDefinition.remove(capabilityKey); + } else { + nodeTypeCapabilitiesDefinition.put(capabilityKey, clonedCapabilityDefinition); + } + } + } + } + + Map<String, CapabilityDefinition> exposedCapabilitiesDefinition = new HashMap<>(); + for (Map.Entry<String, CapabilityDefinition> entry : nodeTypeCapabilitiesDefinition + .entrySet()) { + exposedCapabilitiesDefinition.put(entry.getKey(), entry.getValue()); + } + + mdcDataDebugMessage.debugExitMessage(null, null); + return exposedCapabilitiesDefinition; + } + + private static void addNodeTypeCapabilitiesToSubMapping( + Map<String, CapabilityDefinition> nodeTypeCapabilitiesDefinition, + Map<String, List<String>> capabilitySubstitutionMapping, String type, String templateName, + ServiceTemplate serviceTemplate, TranslationContext context) { + mdcDataDebugMessage.debugEntryMessage(null, null); + + NodeType flatNodeType = + getNodeTypeWithFlatHierarchy(type, serviceTemplate, context); + String capabilityKey; + List<String> capabilityMapping; + if (flatNodeType.getCapabilities() != null) { + for (Map.Entry<String, CapabilityDefinition> capabilityNodeEntry : flatNodeType + .getCapabilities() + .entrySet()) { + capabilityKey = capabilityNodeEntry.getKey() + "_" + templateName; + nodeTypeCapabilitiesDefinition.put(capabilityKey, capabilityNodeEntry.getValue().clone()); + capabilityMapping = new ArrayList<>(); + capabilityMapping.add(templateName); + capabilityMapping.add(capabilityNodeEntry.getKey()); + capabilitySubstitutionMapping.put(capabilityKey, capabilityMapping); + } + } + mdcDataDebugMessage.debugExitMessage(null, null); + } + + private static void addSubstitutionNodeTypeRequirements(NodeType substitutionNodeType, + List<Map<String, RequirementDefinition>> + requirementsList, + String templateName) { + mdcDataDebugMessage.debugEntryMessage(null, null); + + if (requirementsList == null || requirementsList.size() == 0) { + return; + } + + if (substitutionNodeType.getRequirements() == null) { + substitutionNodeType.setRequirements(new ArrayList<>()); + } + + for (Map<String, RequirementDefinition> requirementDef : requirementsList) { + for (Map.Entry<String, RequirementDefinition> entry : requirementDef.entrySet()) { + Map<String, RequirementDefinition> requirementMap = new HashMap<>(); + requirementMap.put(entry.getKey() + "_" + templateName, entry.getValue().clone()); + substitutionNodeType.getRequirements().add(requirementMap); + } + } + + mdcDataDebugMessage.debugExitMessage(null, null); + } + + private static List<Map<String, RequirementDefinition>> getNodeTypeReqs( + String type, + String templateName, + ServiceTemplate serviceTemplate, + Map<String, List<String>> requirementSubstitutionMapping, + TranslationContext context) { + mdcDataDebugMessage.debugEntryMessage(null, null); + List<Map<String, RequirementDefinition>> requirementList = new ArrayList<>(); + NodeType flatNodeType = + getNodeTypeWithFlatHierarchy(type, serviceTemplate, context); + List<String> requirementMapping; + + if (flatNodeType.getRequirements() != null) { + for (Map<String, RequirementDefinition> requirementMap : flatNodeType.getRequirements()) { + for (Map.Entry<String, RequirementDefinition> requirementNodeEntry : requirementMap + .entrySet()) { + ToscaExtensionYamlUtil toscaExtensionYamlUtil = new ToscaExtensionYamlUtil(); + RequirementDefinition requirementNodeEntryValue = toscaExtensionYamlUtil + .yamlToObject(toscaExtensionYamlUtil.objectToYaml(requirementNodeEntry.getValue()), + RequirementDefinition.class); + if (requirementNodeEntryValue.getOccurrences() == null) { + requirementNodeEntryValue.setOccurrences(new Object[]{1, 1}); + } + Map<String, RequirementDefinition> requirementDef = new HashMap<>(); + requirementDef.put(requirementNodeEntry.getKey(), requirementNodeEntryValue); + DataModelUtil.addRequirementToList(requirementList, requirementDef); + requirementMapping = new ArrayList<>(); + requirementMapping.add(templateName); + requirementMapping.add(requirementNodeEntry.getKey()); + requirementSubstitutionMapping + .put(requirementNodeEntry.getKey() + "_" + templateName, requirementMapping); + if (requirementNodeEntryValue.getNode() == null) { + requirementNodeEntryValue.setOccurrences(new Object[]{1, 1}); + } + } + } + } + + mdcDataDebugMessage.debugExitMessage(null, null); + return requirementList; + } + + private static List<Map<String, RequirementDefinition>> calculateExposedRequirements( + List<Map<String, RequirementDefinition>> nodeTypeRequirementsDefinitionList, + Map<String, RequirementAssignment> nodeTemplateRequirementsAssignment) { + mdcDataDebugMessage.debugEntryMessage(null, null); + + if (nodeTypeRequirementsDefinitionList == null) { + return null; + } + for (Map.Entry<String, RequirementAssignment> entry : nodeTemplateRequirementsAssignment + .entrySet()) { + if (entry.getValue().getNode() != null) { + Optional<RequirementDefinition> requirementDefinition = + DataModelUtil.getRequirementDefinition(nodeTypeRequirementsDefinitionList, entry + .getKey()); + RequirementDefinition cloneRequirementDefinition; + if (requirementDefinition.isPresent()) { + cloneRequirementDefinition = requirementDefinition.get().clone(); + if (!evaluateRequirementFulfillment(cloneRequirementDefinition)) { + CommonMethods.mergeEntryInList(entry.getKey(), cloneRequirementDefinition, + nodeTypeRequirementsDefinitionList); + } else { + DataModelUtil.removeRequirementsDefinition(nodeTypeRequirementsDefinitionList, entry + .getKey()); + } + } + } else { + for (Map<String, RequirementDefinition> nodeTypeRequirementsMap : + nodeTypeRequirementsDefinitionList) { + Object max = nodeTypeRequirementsMap.get(entry.getKey()).getOccurrences() != null + && nodeTypeRequirementsMap.get(entry.getKey()).getOccurrences().length > 0 + ? nodeTypeRequirementsMap.get(entry.getKey()).getOccurrences()[1] : 1; + Object min = nodeTypeRequirementsMap.get(entry.getKey()).getOccurrences() != null + && nodeTypeRequirementsMap.get(entry.getKey()).getOccurrences().length > 0 + ? nodeTypeRequirementsMap.get(entry.getKey()).getOccurrences()[0] : 1; + nodeTypeRequirementsMap.get(entry.getKey()).setOccurrences(new Object[]{min, max}); + } + } + } + + mdcDataDebugMessage.debugExitMessage(null, null); + return nodeTypeRequirementsDefinitionList; + } + + private static boolean evaluateRequirementFulfillment(RequirementDefinition + requirementDefinition) { + Object[] occurrences = requirementDefinition.getOccurrences(); + if (occurrences == null) { + requirementDefinition.setOccurrences(new Object[]{1, 1}); + return false; + } + if (occurrences[1].equals(ToscaConstants.UNBOUNDED)) { + return false; + } + + if (occurrences[1].equals(1)) { + return true; + } + occurrences[1] = (Integer) occurrences[1] - 1; + return false; + } + + private static boolean evaluateCapabilityFulfillment(CapabilityDefinition capabilityDefinition) { + + Object[] occurrences = capabilityDefinition.getOccurrences(); + if (occurrences == null) { + capabilityDefinition.setOccurrences(new Object[]{1, ToscaConstants.UNBOUNDED}); + return false; + } + if (occurrences[1].equals(ToscaConstants.UNBOUNDED)) { + return false; + } + + if (occurrences[1].equals(1)) { + return true; + } + occurrences[1] = (Integer) occurrences[1] - 1; + return false; + } + + /** + * Fetch global substitution service template service template. + * + * @param serviceTemplate the service template + * @param context the context + * @return the service template + */ + public static ServiceTemplate fetchGlobalSubstitutionServiceTemplate( + ServiceTemplate serviceTemplate, + TranslationContext context) { + ServiceTemplate globalSubstitutionServiceTemplate = + context.getTranslatedServiceTemplates() + .get(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME); + if (globalSubstitutionServiceTemplate == null) { + globalSubstitutionServiceTemplate = + HeatToToscaUtil.createInitGlobalSubstitutionServiceTemplate(); + context.getTranslatedServiceTemplates() + .put(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME, + globalSubstitutionServiceTemplate); + } + boolean isImportAddedToServiceTemplate = + DataModelUtil.isImportAddedToServiceTemplate(serviceTemplate.getImports(), Constants + .GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME); + if (!isImportAddedToServiceTemplate) { + serviceTemplate.getImports() + .addAll( + HeatToToscaUtil.createImportList(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME)); + } + return globalSubstitutionServiceTemplate; + } + + public static List<Map<String, Import>> createImportList(String templateName) { + List<Map<String, Import>> imports = new ArrayList<>(); + Map<String, Import> importsMap = new HashMap<>(); + importsMap.put(templateName, HeatToToscaUtil.createServiceTemplateImport(templateName)); + imports.add(importsMap); + return imports; + } + + /** + * Create service template import import. + * + * @param serviceTemplate the service template + * @return the import + */ + public static Import createServiceTemplateImport(ServiceTemplate serviceTemplate) { + Import serviceTemplateImport = new Import(); + serviceTemplateImport.setFile(ToscaUtil.getServiceTemplateFileName(serviceTemplate)); + return serviceTemplateImport; + } + + /** + * Create service template import import. + * + * @param metadataTemplateName the service template name + * @return the import + */ + public static Import createServiceTemplateImport(String metadataTemplateName) { + Import serviceTemplateImport = new Import(); + serviceTemplateImport.setFile(ToscaUtil.getServiceTemplateFileName(metadataTemplateName)); + return serviceTemplateImport; + } + + public static ToscaServiceModel createToscaServiceModel(ServiceTemplate + entryDefinitionServiceTemplate, + TranslationContext translationContext) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + mdcDataDebugMessage.debugExitMessage(null, null); + return new ToscaServiceModel(getCsarArtifactFiles(translationContext), + getServiceTemplates(translationContext), + ToscaUtil.getServiceTemplateFileName(entryDefinitionServiceTemplate)); + } + + private static FileContentHandler getCsarArtifactFiles(TranslationContext translationContext) { + + mdcDataDebugMessage.debugEntryMessage(null, null); + + FileContentHandler artifactFiles = new FileContentHandler(); + artifactFiles.setFiles(translationContext.getFiles()); + artifactFiles.setFiles(translationContext.getExternalArtifacts()); + + HeatTreeManager heatTreeManager = + HeatTreeManagerUtil.initHeatTreeManager(translationContext.getFiles()); + heatTreeManager.createTree(); + ValidationStructureList validationStructureList = + new ValidationStructureList(heatTreeManager.getTree()); + byte[] validationStructureFile = + FileUtils.convertToBytes(validationStructureList, FileUtils.FileExtension.JSON); + artifactFiles.addFile("HEAT.meta", validationStructureFile); + + mdcDataDebugMessage.debugExitMessage(null, null); + return artifactFiles; + } + + + private static Map<String, ServiceTemplate> getServiceTemplates(TranslationContext + translationContext) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + List<ServiceTemplate> serviceTemplates = new ArrayList<>(); + serviceTemplates.addAll(GlobalTypesGenerator.getGlobalTypesServiceTemplate().values()); + serviceTemplates.addAll(translationContext.getTranslatedServiceTemplates().values()); + Map<String, ServiceTemplate> serviceTemplatesMap = new HashMap<>(); + + for (ServiceTemplate template : serviceTemplates) { + serviceTemplatesMap.put(ToscaUtil.getServiceTemplateFileName(template), template); + } + + mdcDataDebugMessage.debugExitMessage(null, null); + return serviceTemplatesMap; + } + } diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/helper/NameExtractorService.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/NameExtractor.java index ed338e2bf5..fc4c3f8841 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/helper/NameExtractorService.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/NameExtractor.java @@ -18,16 +18,17 @@ * ============LICENSE_END========================================================= */ -package org.openecomp.sdc.translator.services.heattotosca.helper; +package org.openecomp.sdc.translator.services.heattotosca; + +import org.openecomp.sdc.heat.datatypes.model.Resource; +import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo; import java.util.List; import java.util.Map; import java.util.Optional; -public interface NameExtractorService { - Optional<String> extractNodeTypeNameByPropertiesPriority( - Map<String, Object> properties,List<PropertyRegexMatcher> propertiesRegexMatchers); +public interface NameExtractor { + + String extractNodeTypeName(Resource resource, String resourceId, String translatedId); - PropertyRegexMatcher getPropertyRegexMatcher(String propertyName, List<String> regexMatchers, - String propertyValueSearchTerm); } diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/NameExtractorUtil.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/NameExtractorUtil.java new file mode 100644 index 0000000000..8241603fed --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/NameExtractorUtil.java @@ -0,0 +1,77 @@ +/*- + * ============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.services.heattotosca; + +import org.openecomp.sdc.translator.datatypes.heattotosca.AttachedPropertyVal; +import org.openecomp.sdc.translator.datatypes.heattotosca.AttachedResourceId; +import org.openecomp.sdc.translator.datatypes.heattotosca.PropertyRegexMatcher; + +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.regex.Pattern; + +public class NameExtractorUtil { + + /** + * Extract Node Type Name By Properties Priority. + * @param properties properties list + * @param propertiesRegexMatchers Regex expression list + * @return node type name + */ + public static Optional<String> extractNodeTypeNameByPropertiesPriority( + Map<String, Object> properties, + List<PropertyRegexMatcher> propertiesRegexMatchers) { + + for (PropertyRegexMatcher propertyRegexMatcher : propertiesRegexMatchers) { + Optional<String> parameterNameValue = + HeatToToscaUtil.getPropertyParameterNameValue( + properties.get(propertyRegexMatcher.getPropertyName())); + if (parameterNameValue.isPresent()) { + if (isPropertyValueMatchNamingConvention(propertyRegexMatcher, parameterNameValue.get())) { + return Optional.of(parameterNameValue.get().substring(0, parameterNameValue.get() + .lastIndexOf(propertyRegexMatcher.getStringToSearchForPropertyValue()))); + } + } + } + return Optional.empty(); + } + + /** + * Check if property value match the naming convention using Regex expression. + * @param propertyRegexMatcher naming convention using Regex expression + * @param propertyValue property value + * @return true is there is a match, false otherwise + */ + public static boolean isPropertyValueMatchNamingConvention(PropertyRegexMatcher + propertyRegexMatcher, + String propertyValue) { + for (Pattern pattern : propertyRegexMatcher.getRegexPatterns()) { + if (pattern.matcher(propertyValue).matches()) { + return true; + } + } + return false; + } + + +} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/ResourceTranslation.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/ResourceTranslation.java index 231eb42c03..634e703f5e 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/ResourceTranslation.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/ResourceTranslation.java @@ -24,9 +24,11 @@ package org.openecomp.sdc.translator.services.heattotosca; import org.openecomp.sdc.heat.datatypes.model.HeatOrchestrationTemplate; import org.openecomp.sdc.heat.datatypes.model.Resource; import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; +import org.openecomp.sdc.translator.datatypes.heattotosca.TranslationContext; import java.util.Optional; + public interface ResourceTranslation { //return the Id of translated object (NodeTemplate, RelationshipTemplate and etc) diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/ResourceTranslationFactory.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/ResourceTranslationFactory.java index 730c2ddd7a..ab8230d946 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/ResourceTranslationFactory.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/ResourceTranslationFactory.java @@ -21,87 +21,56 @@ package org.openecomp.sdc.translator.services.heattotosca; -import org.openecomp.sdc.heat.datatypes.model.HeatResourcesTypes; +import org.openecomp.config.api.Configuration; +import org.openecomp.config.api.ConfigurationManager; +import org.openecomp.core.utilities.CommonMethods; +import org.openecomp.sdc.datatypes.configuration.ImplementationConfiguration; import org.openecomp.sdc.heat.datatypes.model.Resource; +import org.openecomp.sdc.translator.services.heattotosca.impl.resourcetranslation.ResourceTranslationBase; -import org.openecomp.sdc.translator.services.heattotosca.impl.ResourceTranslationBase; -import org.openecomp.sdc.translator.services.heattotosca.impl.ResourceTranslationCinderVolumeAttachmentImpl; -import org.openecomp.sdc.translator.services.heattotosca.impl.ResourceTranslationCinderVolumeImpl; -import org.openecomp.sdc.translator.services.heattotosca.impl.ResourceTranslationContrailAttachPolicyImpl; -import org.openecomp.sdc.translator.services.heattotosca.impl.ResourceTranslationContrailNetworkPolicyImpl; -import org.openecomp.sdc.translator.services.heattotosca.impl.ResourceTranslationContrailServiceInstanceImpl; -import org.openecomp.sdc.translator.services.heattotosca.impl.ResourceTranslationContrailServiceTemplateImpl; -import org.openecomp.sdc.translator.services.heattotosca.impl.ResourceTranslationContrailV2NetworkPolicyImpl; -import org.openecomp.sdc.translator.services.heattotosca.impl.ResourceTranslationContrailV2VirtualNetworkImpl; -import org.openecomp.sdc.translator.services.heattotosca.impl.ResourceTranslationContrailV2VmInterfaceImpl; -import org.openecomp.sdc.translator.services.heattotosca.impl.ResourceTranslationContrailVirtualNetworkImpl; -import org.openecomp.sdc.translator.services.heattotosca.impl.ResourceTranslationDefaultImpl; -import org.openecomp.sdc.translator.services.heattotosca.impl.ResourceTranslationNestedImpl; -import org.openecomp.sdc.translator.services.heattotosca.impl.ResourceTranslationNeutronNetImpl; -import org.openecomp.sdc.translator.services.heattotosca.impl.ResourceTranslationNeutronPortImpl; -import org.openecomp.sdc.translator.services.heattotosca.impl.ResourceTranslationNeutronSecurityGroupImpl; -import org.openecomp.sdc.translator.services.heattotosca.impl.ResourceTranslationNeutronSubnetImpl; -import org.openecomp.sdc.translator.services.heattotosca.impl.ResourceTranslationNovaServerGroupsImpl; -import org.openecomp.sdc.translator.services.heattotosca.impl.ResourceTranslationNovaServerImpl; -import org.openecomp.sdc.translator.services.heattotosca.impl.ResourceTranslationResourceGroupImpl; +import java.util.Map; -import java.util.Objects; public class ResourceTranslationFactory { + private static Map<String, ImplementationConfiguration> resourceTranslationImplMap; + + static { + Configuration config = ConfigurationManager.lookup(); + resourceTranslationImplMap = config.populateMap(ConfigConstants.TRANSLATOR_NAMESPACE, + ConfigConstants.RESOURCE_TRANSLATION_IMPL_KEY, ImplementationConfiguration.class); + resourceTranslationImplMap.putAll(config.populateMap(ConfigConstants.MANDATORY_TRANSLATOR_NAMESPACE, + ConfigConstants.RESOURCE_TRANSLATION_IMPL_KEY, ImplementationConfiguration.class)); + } /** - * Gets instance. + * Gets resource translation instance. * * @param resource the resource * @return the instance */ public static ResourceTranslationBase getInstance(Resource resource) { - HeatResourcesTypes heatResource = HeatResourcesTypes.findByHeatResource(resource.getType()); - if (Objects.isNull(heatResource)) { - if (HeatToToscaUtil.isYmlFileType(resource.getType())) { - return new ResourceTranslationNestedImpl(); - } - return new ResourceTranslationDefaultImpl(); - } - switch (heatResource) { - case NOVA_SERVER_RESOURCE_TYPE: - return new ResourceTranslationNovaServerImpl(); - case NOVA_SERVER_GROUP_RESOURCE_TYPE: - return new ResourceTranslationNovaServerGroupsImpl(); - case NEUTRON_SECURITY_GROUP_RESOURCE_TYPE: - return new ResourceTranslationNeutronSecurityGroupImpl(); - case NEUTRON_PORT_RESOURCE_TYPE: - return new ResourceTranslationNeutronPortImpl(); - case CONTRAIL_VIRTUAL_NETWORK_RESOURCE_TYPE: - return new ResourceTranslationContrailVirtualNetworkImpl(); - case CONTRAIL_V2_VIRTUAL_NETWORK_RESOURCE_TYPE: - return new ResourceTranslationContrailV2VirtualNetworkImpl(); - case CONTRAIL_V2_VIRTUAL_MACHINE_INTERFACE_RESOURCE_TYPE: - return new ResourceTranslationContrailV2VmInterfaceImpl(); - case CINDER_VOLUME_RESOURCE_TYPE: - return new ResourceTranslationCinderVolumeImpl(); - case CINDER_VOLUME_ATTACHMENT_RESOURCE_TYPE: - return new ResourceTranslationCinderVolumeAttachmentImpl(); - case NEUTRON_NET_RESOURCE_TYPE: - return new ResourceTranslationNeutronNetImpl(); - case NEUTRON_SUBNET_RESOURCE_TYPE: - return new ResourceTranslationNeutronSubnetImpl(); - case CONTRAIL_NETWORK_RULE_RESOURCE_TYPE: - return new ResourceTranslationContrailNetworkPolicyImpl(); - case CONTRAIL_V2_NETWORK_RULE_RESOURCE_TYPE: - return new ResourceTranslationContrailV2NetworkPolicyImpl(); - case CONTRAIL_NETWORK_ATTACH_RULE_RESOURCE_TYPE: - return new ResourceTranslationContrailAttachPolicyImpl(); - case RESOURCE_GROUP_RESOURCE_TYPE: - return new ResourceTranslationResourceGroupImpl(); - case CONTRAIL_SERVICE_TEMPLATE: - return new ResourceTranslationContrailServiceTemplateImpl(); - case CONTRAIL_SERVICE_INSTANCE: - return new ResourceTranslationContrailServiceInstanceImpl(); - default: - return new ResourceTranslationDefaultImpl(); + if (isSupportedResource(resource.getType())) { + return getResourceTranslationImpl(resource.getType()); + } else if (HeatToToscaUtil.isYmlFileType(resource.getType())) { + return getResourceTranslationImpl(ConfigConstants.NESTED_RESOURCE_TRANSLATION_IMPL_KEY); } + return getResourceTranslationImpl(ConfigConstants.DEFAULT_RESOURCE_TRANSLATION_IMPL_KEY); + } + + private static ResourceTranslationBase getResourceTranslationImpl(String resourceImplKey) { + String resourceTranslationImplClassName = resourceTranslationImplMap + .get(resourceImplKey).getImplementationClass(); + return CommonMethods + .newInstance(resourceTranslationImplClassName, ResourceTranslationBase.class); } + private static boolean isSupportedResource(String resourceType) { + if (resourceTranslationImplMap.containsKey(resourceType) + && resourceTranslationImplMap.get(resourceType).isEnable()) { + return true; + } + return false; + } } + diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/TranslationContext.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/TranslationContext.java deleted file mode 100644 index a242eda3f0..0000000000 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/TranslationContext.java +++ /dev/null @@ -1,172 +0,0 @@ -/*- - * ============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.services.heattotosca; - -import org.openecomp.core.utilities.file.FileContentHandler; -import org.openecomp.core.utilities.file.FileUtils; -import org.openecomp.core.utilities.json.JsonUtil; -import org.openecomp.sdc.common.utils.AsdcCommon; -import org.openecomp.sdc.heat.datatypes.manifest.FileData; -import org.openecomp.sdc.heat.datatypes.manifest.ManifestFile; -import org.openecomp.sdc.heat.datatypes.model.Resource; -import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; -import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslatedHeatResource; -import org.openecomp.sdc.translator.services.heattotosca.globaltypes.GlobalTypesGenerator; - -import java.io.InputStream; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - - -public class TranslationContext { - - - private static Map<String, Map<String, Map<String, String>>> translationMapping; - private static Map<String, ServiceTemplate> globalServiceTemplates; - - static { - - String propertyFileName = AsdcCommon.HEAT_TO_TOSCA_MAPPING_CONF; - InputStream is = FileUtils.getFileInputStream(propertyFileName); - translationMapping = JsonUtil.json2Object(is, Map.class); - globalServiceTemplates = GlobalTypesGenerator.getGlobalTypesServiceTemplate(); - } - - private ManifestFile manifest; - - private FileContentHandler files = new FileContentHandler(); - - private Map<String, FileData.Type> manifestFiles = new HashMap<>(); - //Key - file name, value - file type - private Set<String> nestedHeatsFiles = new HashSet<>(); - private FileContentHandler externalArtifacts = new FileContentHandler(); - - private Map<String, Set<String>> translatedResources = new HashMap<>(); - // Key - heat file name,value - set of heat resource ids which were translated - private Map<String, Set<String>> heatStackGroupMembers = new HashMap<>(); - // Key - heat file name, value - translated Node template id - private Map<String, Map<String, String>> translatedIds = new HashMap<>(); - // Key - heat file name, value - Map with Key - heat resource Id, Value - tosca entity template id - private Map<String, ServiceTemplate> translatedServiceTemplates = new HashMap<>(); - // key - service template type, value - translated service templates - private Map<String, TranslatedHeatResource> heatSharedResourcesByParam = new HashMap<>(); - //key - heat param name, value - shared resource data - - public void addManifestFile(String fileName, FileData.Type fileType) { - this.manifestFiles.put(fileName, fileType); - } - - public Set<String> getNestedHeatsFiles() { - return nestedHeatsFiles; - } - - public Map<String, Set<String>> getHeatStackGroupMembers() { - return heatStackGroupMembers; - } - - public FileContentHandler getFiles() { - return files; - } - - public void setFiles(Map<String, byte[]> files) { - this.files.putAll(files); - } - - public InputStream getFileContent(String fileName) { - return files.getFileContent(fileName); - } - - public void addFile(String name, byte[] content) { - files.addFile(name, content); - } - - public ManifestFile getManifest() { - return manifest; - } - - public void setManifest(ManifestFile manifest) { - this.manifest = manifest; - } - - public Map<String, Set<String>> getTranslatedResources() { - return translatedResources; - } - - public Map<String, Map<String, String>> getTranslatedIds() { - return translatedIds; - } - - // get tosca name from mapping configuration file - //element type - parameter/attribute - // element name - heat parameter/attribute name - //return value - tosca parameter/attribute name - public String getElementMapping(String resourceType, String elementType, String elementName) { - return translationMapping.get(resourceType).get(elementType).get(elementName); - } - - public Map<String, String> getElementMapping(String resourceType, String elementType) { - return translationMapping.get(resourceType).get(elementType); - } - - public Set<String> getElementSet(String resourceType, String elementType) { - return translationMapping.get(resourceType).get(elementType).keySet(); - } - - public Map<String, ServiceTemplate> getTranslatedServiceTemplates() { - return translatedServiceTemplates; - } - - public ServiceTemplate getGlobalSubstitutionServiceTemplate() { - return getTranslatedServiceTemplates().get(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME); - } - - public FileContentHandler getExternalArtifacts() { - return externalArtifacts; - } - - public void addExternalArtifacts(String name, byte[] content) { - this.externalArtifacts.addFile(name, content); - } - - - public Map<String, TranslatedHeatResource> getHeatSharedResourcesByParam() { - return heatSharedResourcesByParam; - } - - public void addHeatSharedResourcesByParam(String parameterName, String resourceId, - Resource resource) { - this.addHeatSharedResourcesByParam(parameterName, - new TranslatedHeatResource(resourceId, resource)); - } - - public void addHeatSharedResourcesByParam(String parameterName, - TranslatedHeatResource translatedHeatResource) { - this.heatSharedResourcesByParam.put(parameterName, translatedHeatResource); - } - - public Map<String, ServiceTemplate> getGlobalServiceTemplates() { - return globalServiceTemplates; - } - - -} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/TranslationService.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/TranslationService.java index 1d90d8b2af..ab41d43cc9 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/TranslationService.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/TranslationService.java @@ -20,11 +20,13 @@ package org.openecomp.sdc.translator.services.heattotosca; +import org.apache.commons.collections4.MapUtils; import org.openecomp.core.translator.datatypes.TranslatorOutput; import org.openecomp.core.utilities.file.FileContentHandler; import org.openecomp.core.utilities.file.FileUtils; import org.openecomp.core.utilities.yaml.YamlUtil; import org.openecomp.sdc.common.errors.CoreException; +import org.openecomp.sdc.datatypes.error.ErrorLevel; import org.openecomp.sdc.heat.datatypes.manifest.FileData; import org.openecomp.sdc.heat.datatypes.model.Environment; import org.openecomp.sdc.heat.datatypes.model.HeatOrchestrationTemplate; @@ -33,38 +35,50 @@ import org.openecomp.sdc.heat.datatypes.model.Resource; import org.openecomp.sdc.heat.datatypes.structure.ValidationStructureList; import org.openecomp.sdc.heat.services.tree.HeatTreeManager; import org.openecomp.sdc.heat.services.tree.HeatTreeManagerUtil; +import org.openecomp.sdc.logging.api.Logger; +import org.openecomp.sdc.logging.api.LoggerFactory; +import org.openecomp.sdc.logging.context.impl.MdcDataDebugMessage; +import org.openecomp.sdc.logging.context.impl.MdcDataErrorMessage; +import org.openecomp.sdc.logging.types.LoggerConstants; +import org.openecomp.sdc.logging.types.LoggerErrorCode; +import org.openecomp.sdc.logging.types.LoggerErrorDescription; +import org.openecomp.sdc.logging.types.LoggerTragetServiceName; import org.openecomp.sdc.tosca.datatypes.ToscaGroupType; import org.openecomp.sdc.tosca.datatypes.ToscaServiceModel; import org.openecomp.sdc.tosca.datatypes.model.GroupDefinition; -import org.openecomp.sdc.tosca.datatypes.model.Metadata; +import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate; import org.openecomp.sdc.tosca.datatypes.model.ParameterDefinition; +import org.openecomp.sdc.tosca.datatypes.model.PropertyType; import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; import org.openecomp.sdc.tosca.datatypes.model.TopologyTemplate; +import org.openecomp.sdc.tosca.services.DataModelUtil; import org.openecomp.sdc.tosca.services.ToscaConstants; import org.openecomp.sdc.tosca.services.ToscaFileOutputService; import org.openecomp.sdc.tosca.services.ToscaUtil; import org.openecomp.sdc.tosca.services.impl.ToscaFileOutputServiceCsarImpl; import org.openecomp.sdc.translator.datatypes.heattotosca.AttachedResourceId; +import org.openecomp.sdc.translator.datatypes.heattotosca.TranslationContext; import org.openecomp.sdc.translator.datatypes.heattotosca.to.FileDataCollection; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.EntityConsolidationData; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.GetAttrFuncData; import org.openecomp.sdc.translator.services.heattotosca.errors.ResourceNotFoundInHeatFileErrorBuilder; import org.openecomp.sdc.translator.services.heattotosca.globaltypes.GlobalTypesGenerator; import org.openecomp.sdc.translator.services.heattotosca.mapping.TranslatorHeatToToscaParameterConverter; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.Set; - public class TranslationService { - protected static Logger logger = LoggerFactory.getLogger(TranslationService.class); + protected static Logger logger = (Logger) LoggerFactory.getLogger(TranslationService.class); + protected static MdcDataDebugMessage mdcDataDebugMessage = new MdcDataDebugMessage(); /** * Gets types to process by translator. @@ -85,6 +99,8 @@ public class TranslationService { * @return the translator output */ public TranslatorOutput translateHeatFiles(TranslationContext translationContext) { + mdcDataDebugMessage.debugEntryMessage(null, null); + ServiceTemplate mainServiceTemplate = createMainServiceTemplate(translationContext); List<FileData> fileDataList = translationContext.getManifest().getContent().getData(); FileDataCollection fileDataCollection = HeatToToscaUtil.getFileCollectionsByFilter(fileDataList, @@ -102,59 +118,31 @@ public class TranslationService { } ToscaServiceModel toscaServiceModel = - createToscaServiceModel(mainServiceTemplate, translationContext); + HeatToToscaUtil.createToscaServiceModel(mainServiceTemplate, translationContext); TranslatorOutput translatorOutput = new TranslatorOutput(); translatorOutput.setToscaServiceModel(toscaServiceModel); - return translatorOutput; - } - private ToscaServiceModel createToscaServiceModel(ServiceTemplate entryDefinitionServiceTemplate, - TranslationContext translationContext) { - return new ToscaServiceModel(getCsarArtifactFiles(translationContext), - getServiceTemplates(translationContext), - ToscaUtil.getServiceTemplateFileName(entryDefinitionServiceTemplate)); + mdcDataDebugMessage.debugExitMessage(null, null); + return translatorOutput; } - private Map<String, ServiceTemplate> getServiceTemplates(TranslationContext translationContext) { - List<ServiceTemplate> serviceTemplates = new ArrayList<>(); - serviceTemplates.addAll(GlobalTypesGenerator.getGlobalTypesServiceTemplate().values()); - serviceTemplates.addAll(translationContext.getTranslatedServiceTemplates().values()); - Map<String, ServiceTemplate> serviceTemplatesMap = new HashMap<>(); + private ServiceTemplate createMainServiceTemplate(TranslationContext translationContext) { - for (ServiceTemplate template : serviceTemplates) { - serviceTemplatesMap.put(ToscaUtil.getServiceTemplateFileName(template), template); - } - return serviceTemplatesMap; - } - private FileContentHandler getCsarArtifactFiles(TranslationContext translationContext) { - FileContentHandler artifactFiles = new FileContentHandler(); - artifactFiles.setFiles(translationContext.getFiles()); - artifactFiles.setFiles(translationContext.getExternalArtifacts()); - - HeatTreeManager heatTreeManager = - HeatTreeManagerUtil.initHeatTreeManager(translationContext.getFiles()); - heatTreeManager.createTree(); - ValidationStructureList validationStructureList = - new ValidationStructureList(heatTreeManager.getTree()); - byte[] validationStructureFile = - FileUtils.convertToBytes(validationStructureList, FileUtils.FileExtension.JSON); - artifactFiles.addFile("HEAT.meta", validationStructureFile); - - return artifactFiles; - } + mdcDataDebugMessage.debugEntryMessage(null, null); - private ServiceTemplate createMainServiceTemplate(TranslationContext translationContext) { ServiceTemplate mainServiceTemplate = new ServiceTemplate(); - translationContext.getTranslatedServiceTemplates().put("Main", mainServiceTemplate); - Metadata templateMetadata = new Metadata(); - templateMetadata.setTemplate_name("Main"); + translationContext.getTranslatedServiceTemplates() + .put(Constants.MAIN_TEMPLATE_NAME, mainServiceTemplate); + Map<String, String> templateMetadata = new HashMap<>(); + templateMetadata.put(ToscaConstants.ST_METADATA_TEMPLATE_NAME, Constants.MAIN_TEMPLATE_NAME); mainServiceTemplate.setTosca_definitions_version(ToscaConstants.TOSCA_DEFINITIONS_VERSION); mainServiceTemplate.setMetadata(templateMetadata); mainServiceTemplate.setTopology_template(new TopologyTemplate()); mainServiceTemplate.setImports(GlobalTypesGenerator.getGlobalTypesImportList()); + mdcDataDebugMessage.debugExitMessage(null, null); return mainServiceTemplate; } @@ -167,6 +155,10 @@ public class TranslationService { */ public void translateHeatFile(ServiceTemplate serviceTemplate, FileData heatFileData, TranslationContext context) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + String heatFileName = heatFileData.getFile(); HeatOrchestrationTemplate heatOrchestrationTemplate = new YamlUtil() .yamlToObject(context.getFileContent(heatFileName), HeatOrchestrationTemplate.class); @@ -177,23 +169,47 @@ public class TranslationService { translateOutputParameters(serviceTemplate, heatOrchestrationTemplate, heatFileData, heatFileName, context); createHeatStackGroup(serviceTemplate, heatFileData, heatOrchestrationTemplate, context); + handleHeatPseudoParam(heatFileName, serviceTemplate, context); if (Objects.nonNull(heatFileData.getData())) { heatFileData.getData().stream().filter(data -> data.getType() == FileData.Type.HEAT_VOL) .forEach(data -> translateHeatFile(serviceTemplate, data, context)); } + + mdcDataDebugMessage.debugExitMessage(null, null); + } + + private void handleHeatPseudoParam(String heatFileName, ServiceTemplate serviceTemplate, + TranslationContext context) { + Map<String, String> translatedHeatPseudoParam = + context.getUsedHeatPseudoParams().get(heatFileName); + if (Objects.nonNull(translatedHeatPseudoParam)) { + for (String heatPseudoParam : translatedHeatPseudoParam.keySet()) { + if (!serviceTemplate.getTopology_template().getInputs().containsKey(heatPseudoParam)) { + ParameterDefinition parameterDefinition = new ParameterDefinition(); + parameterDefinition.setType(PropertyType.STRING.getDisplayName()); + parameterDefinition.setRequired(false); + String parameterDefinitionId = translatedHeatPseudoParam.get(heatPseudoParam); + DataModelUtil.addInputParameterToTopologyTemplate(serviceTemplate, parameterDefinitionId, + parameterDefinition); + } + } + } } private void createHeatStackGroup(ServiceTemplate serviceTemplate, FileData heatFileData, HeatOrchestrationTemplate heatOrchestrationTemplate, TranslationContext context) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + ToscaFileOutputService toscaFileOutputService = new ToscaFileOutputServiceCsarImpl(); - String fileName = heatFileData.getFile(); - final String fileNameWoExtension = - FileUtils.getFileWithoutExtention(fileName);//.heatFileData.getFile().split("\\.")[0]; + final String fileName = heatFileData.getFile(); + final String heatStackGroupId = FileUtils.getFileWithoutExtention(fileName) + "_group"; GroupDefinition groupDefinition = new GroupDefinition(); - groupDefinition.setType(ToscaGroupType.HEAT_STACK.getDisplayName()); + groupDefinition.setType(ToscaGroupType.HEAT_STACK); groupDefinition.setProperties(new HashMap<>()); groupDefinition.getProperties() .put("heat_file", "../" + toscaFileOutputService.getArtifactsFolderName() + "/" + fileName); @@ -207,11 +223,10 @@ public class TranslationService { return; //not creating a group when no resources are present in the heat input } groupDefinition.getMembers().addAll(heatStackGroupMembers.get(fileName)); - if (serviceTemplate.getTopology_template().getGroups() == null) { - Map<String, GroupDefinition> groups = new HashMap<>(); - serviceTemplate.getTopology_template().setGroups(groups); - } - serviceTemplate.getTopology_template().getGroups().put(fileNameWoExtension, groupDefinition); + DataModelUtil + .addGroupDefinitionToTopologyTemplate(serviceTemplate, heatStackGroupId, groupDefinition); + + mdcDataDebugMessage.debugExitMessage(null, null); } private void translateInputParameters(ServiceTemplate serviceTemplate, @@ -219,13 +234,16 @@ public class TranslationService { FileData heatFileData, TranslationContext context, String heatFileName) { + + mdcDataDebugMessage.debugEntryMessage(null, null); + if (heatOrchestrationTemplate.getParameters() == null) { return; } Map<String, ParameterDefinition> parameterDefinitionMap = TranslatorHeatToToscaParameterConverter - .parameterConverter(heatOrchestrationTemplate.getParameters(), + .parameterConverter(serviceTemplate,heatOrchestrationTemplate.getParameters(), heatOrchestrationTemplate, heatFileName, context); Environment heatEnvFile = getHeatEnvFile(heatFileData, context); Map<String, Object> parameters = heatEnvFile.getParameters(); @@ -236,7 +254,7 @@ public class TranslationService { parameterValue = parameters.get(paramName); if (parameterValue != null) { entry.getValue().set_default(TranslatorHeatToToscaParameterConverter - .getToscaParameterDefaultValue(parameterValue, entry.getValue().getType(), + .getToscaParameterDefaultValue(null, null, parameterValue, entry.getValue().getType(), heatFileName, heatOrchestrationTemplate, context)); } } @@ -248,18 +266,24 @@ public class TranslationService { } else { inputs.putAll(parameterDefinitionMap); } + + mdcDataDebugMessage.debugExitMessage(null, null); } private void translateOutputParameters(ServiceTemplate serviceTemplate, HeatOrchestrationTemplate heatOrchestrationTemplate, FileData heatFileData, String heatFileName, TranslationContext context) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + if (heatOrchestrationTemplate.getOutputs() == null) { return; } Map<String, ParameterDefinition> parameterDefinitionMap = TranslatorHeatToToscaParameterConverter - .parameterOutputConverter(heatOrchestrationTemplate.getOutputs(), + .parameterOutputConverter(serviceTemplate,heatOrchestrationTemplate.getOutputs(), heatOrchestrationTemplate, heatFileName, context); if (serviceTemplate.getTopology_template().getOutputs() != null) { serviceTemplate.getTopology_template().getOutputs().putAll(parameterDefinitionMap); @@ -271,30 +295,40 @@ public class TranslationService { updateSharedResources(serviceTemplate, heatFileName, heatOrchestrationTemplate, heatOrchestrationTemplate.getOutputs(), context); } + + mdcDataDebugMessage.debugExitMessage(null, null); } private void updateSharedResources(ServiceTemplate serviceTemplate, String heatFileName, HeatOrchestrationTemplate heatOrchestrationTemplate, Map<String, Output> outputs, TranslationContext context) { - for (Map.Entry<String, Output> paramName : outputs.entrySet()) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + for (Map.Entry<String, Output> parameter : outputs.entrySet()) { Optional<AttachedResourceId> attachedSharedResourceId = HeatToToscaUtil .extractAttachedResourceId(heatFileName, heatOrchestrationTemplate, context, - paramName.getValue().getValue()); + parameter.getValue().getValue()); if (attachedSharedResourceId.isPresent() && attachedSharedResourceId.get().isGetResource() && attachedSharedResourceId.get().getTranslatedId() != null) { String sharedTranslatedResourceId = attachedSharedResourceId.get().getTranslatedId().toString(); - updateSharedResource(serviceTemplate, context, paramName, sharedTranslatedResourceId, + updateSharedResource(serviceTemplate, context, parameter, sharedTranslatedResourceId, heatOrchestrationTemplate.getResources() .get(attachedSharedResourceId.get().getEntityId())); } else { - String contrailSharedResourceId = HeatToToscaUtil - .extractContrailGetResourceAttachedHeatResourceId(paramName.getValue().getValue()); - if (contrailSharedResourceId != null - && context.getTranslatedIds().get(heatFileName).get(contrailSharedResourceId) != null) { - updateSharedResource(serviceTemplate, context, paramName, - context.getTranslatedIds().get(heatFileName).get(contrailSharedResourceId), - heatOrchestrationTemplate.getResources().get(contrailSharedResourceId)); + Optional<String> contrailSharedResourceId = HeatToToscaUtil + .extractContrailGetResourceAttachedHeatResourceId(parameter.getValue().getValue()); + if (contrailSharedResourceId.isPresent() + && context.getTranslatedIds().get(heatFileName).get(contrailSharedResourceId.get()) + != null) { + String sharedTranslatedResourceId = context.getTranslatedIds().get(heatFileName).get + (contrailSharedResourceId.get()); + ConsolidationDataUtil.removeSharedResource(serviceTemplate, heatOrchestrationTemplate, + context, parameter.getKey(),contrailSharedResourceId.get(), sharedTranslatedResourceId); + updateSharedResource(serviceTemplate, context, parameter,sharedTranslatedResourceId, + heatOrchestrationTemplate.getResources().get(contrailSharedResourceId.get())); } } } @@ -302,21 +336,40 @@ public class TranslationService { && serviceTemplate.getTopology_template().getOutputs().size() == 0) { serviceTemplate.getTopology_template().setOutputs(null); } + + mdcDataDebugMessage.debugExitMessage(null, null); } private void updateSharedResource(ServiceTemplate serviceTemplate, TranslationContext context, Map.Entry<String, Output> paramName, String sharedTranslatedResourceId, Resource resource) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + context.addHeatSharedResourcesByParam(paramName.getKey(), sharedTranslatedResourceId, resource); serviceTemplate.getTopology_template().getOutputs().remove(paramName.getKey()); + + mdcDataDebugMessage.debugExitMessage(null, null); } private void translateResources(String heatFileName, ServiceTemplate serviceTemplate, HeatOrchestrationTemplate heatOrchestrationTemplate, TranslationContext context) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + if(MapUtils.isEmpty(heatOrchestrationTemplate.getResources())){ + return; + } + for (String resourceId : heatOrchestrationTemplate.getResources().keySet()) { Resource resource = heatOrchestrationTemplate.getResources().get(resourceId); if (resource == null) { + MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB, + LoggerTragetServiceName.TRANSLATE_RESOURCE, ErrorLevel.ERROR.name(), + LoggerErrorCode.DATA_ERROR.getErrorCode(), LoggerErrorDescription.TRANSLATE_HEAT); throw new CoreException( new ResourceNotFoundInHeatFileErrorBuilder(resourceId, heatFileName).build()); } @@ -324,6 +377,8 @@ public class TranslationService { .translateResource(heatFileName, serviceTemplate, heatOrchestrationTemplate, resource, resourceId, context); } + + mdcDataDebugMessage.debugExitMessage(null, null); } private Environment getHeatEnvFile(FileData heatFileData, TranslationContext context) { diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/UnifiedComposition.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/UnifiedComposition.java new file mode 100644 index 0000000000..d72915c843 --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/UnifiedComposition.java @@ -0,0 +1,37 @@ +/*- + * ============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.services.heattotosca; + +import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; +import org.openecomp.sdc.translator.datatypes.heattotosca.TranslationContext; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.UnifiedCompositionData; + +import java.util.List; + +public interface UnifiedComposition { + + void createUnifiedComposition(ServiceTemplate serviceTemplate, + ServiceTemplate nestedServiceTemplate, + List<UnifiedCompositionData> unifiedComposotionDataList, + TranslationContext context); + + +} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/UnifiedCompositionManager.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/UnifiedCompositionManager.java new file mode 100644 index 0000000000..2e67983194 --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/UnifiedCompositionManager.java @@ -0,0 +1,80 @@ +package org.openecomp.sdc.translator.services.heattotosca; + +import org.openecomp.sdc.logging.context.impl.MdcDataDebugMessage; +import org.openecomp.sdc.tosca.datatypes.ToscaServiceModel; +import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate; +import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; +import org.openecomp.sdc.tosca.services.ToscaAnalyzerService; +import org.openecomp.sdc.tosca.services.impl.ToscaAnalyzerServiceImpl; +import org.openecomp.sdc.translator.datatypes.heattotosca.TranslationContext; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.FileNestedConsolidationData; + +import java.util.HashSet; +import java.util.Map; +import java.util.Optional; +import java.util.Set; + +public class UnifiedCompositionManager { + + private MdcDataDebugMessage mdcDataDebugMessage = new MdcDataDebugMessage(); + private ConsolidationService consolidationService; + private TranslationService translationService = new TranslationService(); + private UnifiedCompositionService unifiedCompositionService = new UnifiedCompositionService(); + + public UnifiedCompositionManager(ConsolidationService consolidationService) { + this.consolidationService = consolidationService; + } + + public UnifiedCompositionManager() { + + } + + /** + * Create unified composition. + * + * @param toscaServiceModel the tosca service model + * @param translationContext the translation context + * @return the tosca service model + */ + public ToscaServiceModel createUnifiedComposition(ToscaServiceModel toscaServiceModel, + TranslationContext translationContext) { + + mdcDataDebugMessage.debugEntryMessage(null, null); + Map<String, ServiceTemplate> serviceTemplates = toscaServiceModel.getServiceTemplates(); + ServiceTemplate mainServiceTemplate = + serviceTemplates.get(toscaServiceModel.getEntryDefinitionServiceTemplate()); + consolidationService.mainServiceTemplateConsolidation(mainServiceTemplate, translationContext); + ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl(); + + + FileNestedConsolidationData mainFileNestedConsolidationData = + translationContext.getConsolidationData().getNestedConsolidationData() + .getFileNestedConsolidationData(toscaServiceModel.getEntryDefinitionServiceTemplate()); + Set<String> substituteNodeTemplatesId = + mainFileNestedConsolidationData == null + || mainFileNestedConsolidationData.getAllNestedNodeTemplateIds() == null + ? new HashSet<>() : mainFileNestedConsolidationData.getAllNestedNodeTemplateIds(); + + for (String substituteNodeTemplateId : substituteNodeTemplatesId) { + NodeTemplate subNodeTemplate = mainServiceTemplate.getTopology_template().getNode_templates() + .get(substituteNodeTemplateId); + Optional<String> substituteServiceTemplateName = toscaAnalyzerService + .getSubstituteServiceTemplateName(substituteNodeTemplateId, subNodeTemplate); + if (substituteServiceTemplateName.isPresent()) { + ServiceTemplate substituteServiceTemplate = + serviceTemplates.get(substituteServiceTemplateName.get()); + + consolidationService.substitutionServiceTemplateConsolidation(substituteNodeTemplateId, + mainServiceTemplate, substituteServiceTemplate, translationContext); + } + } + unifiedCompositionService + .updateUnifiedAbstractNodesConnectivity(mainServiceTemplate, translationContext); + ToscaServiceModel unifiedToscaServiceModel = + HeatToToscaUtil.createToscaServiceModel(mainServiceTemplate, translationContext); + + mdcDataDebugMessage.debugExitMessage(null, null); + return unifiedToscaServiceModel; + } +} + diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/UnifiedCompositionService.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/UnifiedCompositionService.java new file mode 100644 index 0000000000..471b1475d6 --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/UnifiedCompositionService.java @@ -0,0 +1,2575 @@ +/* + * ============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.services.heattotosca; + +import org.apache.commons.collections.map.HashedMap; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.MapUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.tuple.ImmutablePair; +import org.apache.commons.lang3.tuple.Pair; +import org.openecomp.config.api.Configuration; +import org.openecomp.config.api.ConfigurationManager; +import org.openecomp.core.utilities.CommonMethods; +import org.openecomp.core.utilities.yaml.YamlUtil; +import org.openecomp.sdc.datatypes.configuration.ImplementationConfiguration; +import org.openecomp.sdc.heat.services.HeatConstants; +import org.openecomp.sdc.logging.api.Logger; +import org.openecomp.sdc.logging.api.LoggerFactory; +import org.openecomp.sdc.logging.context.impl.MdcDataDebugMessage; +import org.openecomp.sdc.tosca.datatypes.ToscaFunctions; +import org.openecomp.sdc.tosca.datatypes.ToscaGroupType; +import org.openecomp.sdc.tosca.datatypes.ToscaNodeType; +import org.openecomp.sdc.tosca.datatypes.ToscaRelationshipType; +import org.openecomp.sdc.tosca.datatypes.model.CapabilityDefinition; +import org.openecomp.sdc.tosca.datatypes.model.Constraint; +import org.openecomp.sdc.tosca.datatypes.model.EntrySchema; +import org.openecomp.sdc.tosca.datatypes.model.GroupDefinition; +import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate; +import org.openecomp.sdc.tosca.datatypes.model.NodeType; +import org.openecomp.sdc.tosca.datatypes.model.ParameterDefinition; +import org.openecomp.sdc.tosca.datatypes.model.PropertyType; +import org.openecomp.sdc.tosca.datatypes.model.RelationshipTemplate; +import org.openecomp.sdc.tosca.datatypes.model.RequirementAssignment; +import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; +import org.openecomp.sdc.tosca.datatypes.model.SubstitutionMapping; +import org.openecomp.sdc.tosca.datatypes.model.heatextend.PropertyTypeExt; +import org.openecomp.sdc.tosca.services.DataModelUtil; +import org.openecomp.sdc.tosca.services.ToscaAnalyzerService; +import org.openecomp.sdc.tosca.services.ToscaConstants; +import org.openecomp.sdc.tosca.services.ToscaUtil; +import org.openecomp.sdc.tosca.services.impl.ToscaAnalyzerServiceImpl; +import org.openecomp.sdc.translator.datatypes.heattotosca.TranslationContext; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.UnifiedCompositionData; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.UnifiedCompositionEntity; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.UnifiedCompositionMode; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.UnifiedSubstitutionData; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.ComputeTemplateConsolidationData; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.ConsolidationData; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.EntityConsolidationData; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.FileComputeConsolidationData; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.GetAttrFuncData; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.NestedTemplateConsolidationData; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.PortTemplateConsolidationData; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.RequirementAssignmentData; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.TypeComputeConsolidationData; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.NotSerializableException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.regex.Pattern; + +import static org.openecomp.sdc.translator.services.heattotosca.Constants.ABSTRACT_NODE_TEMPLATE_ID_PREFIX; +import static org.openecomp.sdc.translator.services.heattotosca.Constants.IDENTICAL_VALUE_PROPERTY_PREFIX; +import static org.openecomp.sdc.translator.services.heattotosca.Constants.IDENTICAL_VALUE_PROPERTY_SUFFIX; + +public class UnifiedCompositionService { + + protected static Logger logger = + (Logger) LoggerFactory.getLogger(UnifiedCompositionService.class); + protected static MdcDataDebugMessage mdcDataDebugMessage = new MdcDataDebugMessage(); + private static Map<String, ImplementationConfiguration> unifiedCompositionImplMap; + + static { + Configuration config = ConfigurationManager.lookup(); + unifiedCompositionImplMap = + config.populateMap(ConfigConstants.MANDATORY_UNIFIED_MODEL_NAMESPACE, + ConfigConstants.UNIFIED_COMPOSITION_IMPL_KEY, ImplementationConfiguration.class); + + } + + private ConsolidationService consolidationService = new ConsolidationService(); + + private static List<EntityConsolidationData> getPortConsolidationDataList( + Set<String> portIds, + List<UnifiedCompositionData> unifiedCompositionDataList) { + List<EntityConsolidationData> portConsolidationDataList = new ArrayList<>(); + for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) { + for (PortTemplateConsolidationData portTemplateConsolidationData : unifiedCompositionData + .getPortTemplateConsolidationDataList()) { + if (portIds.contains(portTemplateConsolidationData.getNodeTemplateId())) { + portConsolidationDataList.add(portTemplateConsolidationData); + } + } + } + return portConsolidationDataList; + } + + /** + * Create unified composition. + * + * @param serviceTemplate the service template + * @param nestedServiceTemplate the nested service template + * @param unifiedCompositionDataList the unified composition data list. In case no consolidation, + * one entry will be in this list, in case of having + * consolidation, all entries in the list are the once which + * need to be consolidated. + * @param mode the mode + * @param context the context + */ + public void createUnifiedComposition(ServiceTemplate serviceTemplate, + ServiceTemplate nestedServiceTemplate, + List<UnifiedCompositionData> unifiedCompositionDataList, + UnifiedCompositionMode mode, TranslationContext context) { + mdcDataDebugMessage.debugEntryMessage(null, null); + Optional<UnifiedComposition> unifiedCompositionInstance = getUnifiedCompositionInstance(mode); + if (!unifiedCompositionInstance.isPresent()) { + return; + } + unifiedCompositionInstance.get() + .createUnifiedComposition(serviceTemplate, nestedServiceTemplate, + unifiedCompositionDataList, context); + mdcDataDebugMessage.debugExitMessage(null, null); + } + + /** + * Create unified substitution service template according to the input service template, based on + * the unified composition data. + * + * @param serviceTemplate the service template + * @param unifiedCompositionDataList the unified composition data list. In case no consolidation, + * one entry will be in this list, in case of having + * consolidation, all entries in the list are the once which + * need to be consolidated. + * @param context the translation context + * @return the substitution service template + */ + public Optional<ServiceTemplate> createUnifiedSubstitutionServiceTemplate( + ServiceTemplate serviceTemplate, List<UnifiedCompositionData> unifiedCompositionDataList, + TranslationContext context, Integer index) { + if (CollectionUtils.isEmpty(unifiedCompositionDataList)) { + return Optional.empty(); + } + UnifiedCompositionData unifiedCompositionData = unifiedCompositionDataList.get(0); + String templateName = + getTemplateName(serviceTemplate, unifiedCompositionData, index); + ServiceTemplate substitutionServiceTemplate = + HeatToToscaUtil.createInitSubstitutionServiceTemplate(templateName); + + createIndexInputParameter(substitutionServiceTemplate); + + String computeNodeType = + handleCompute(serviceTemplate, substitutionServiceTemplate, unifiedCompositionDataList, + context); + handlePorts(serviceTemplate, substitutionServiceTemplate, unifiedCompositionDataList, + computeNodeType, context); + createOutputParameters(serviceTemplate, substitutionServiceTemplate, unifiedCompositionDataList, + computeNodeType); + NodeType substitutionGlobalNodeType = + handleSubstitutionGlobalNodeType(serviceTemplate, substitutionServiceTemplate, + context, unifiedCompositionData, index); + + HeatToToscaUtil.handleSubstitutionMapping(context, + getSubstitutionNodeTypeId(serviceTemplate, unifiedCompositionData, index), + substitutionServiceTemplate, substitutionGlobalNodeType); + + context.getTranslatedServiceTemplates().put(templateName, substitutionServiceTemplate); + return Optional.of(substitutionServiceTemplate); + } + + /** + * Create abstract substitute node template that can be substituted by the input + * substitutionServiceTemplate. + * + * @param serviceTemplate the service template + * @param substitutionServiceTemplate the subtitution service template + * @param unifiedCompositionDataList the unified composition data list. In case no consolidation, + * one entry will be in this list, in case of having + * consolidation, all entries in the list are the once which + * need to be consolidated. + * @param context the translation context + * @return the abstract substitute node template id + */ + public String createAbstractSubstituteNodeTemplate( + ServiceTemplate serviceTemplate, + ServiceTemplate substitutionServiceTemplate, + List<UnifiedCompositionData> unifiedCompositionDataList, + TranslationContext context, + Integer index) { + + NodeTemplate substitutionNodeTemplate = new NodeTemplate(); + List<String> directiveList = new ArrayList<>(); + directiveList.add(ToscaConstants.NODE_TEMPLATE_DIRECTIVE_SUBSTITUTABLE); + substitutionNodeTemplate.setDirectives(directiveList); + String substituteNodeTemplateType = + getSubstitutionNodeTypeId(serviceTemplate, unifiedCompositionDataList.get(0), index); + substitutionNodeTemplate.setType(substituteNodeTemplateType); + Optional<Map<String, Object>> abstractSubstitutionProperties = + createAbstractSubstitutionProperties(serviceTemplate, + substitutionServiceTemplate, unifiedCompositionDataList); + abstractSubstitutionProperties.ifPresent(substitutionNodeTemplate::setProperties); + + //Add substitution filtering property + String substitutionServiceTemplateName = ToscaUtil.getServiceTemplateFileName( + substitutionServiceTemplate); + int count = unifiedCompositionDataList.size(); + addSubstitutionFilteringProperty(substitutionServiceTemplateName, substitutionNodeTemplate, + count); + //Add index_value property + addIndexValueProperty(substitutionNodeTemplate); + String substituteNodeTemplateId = + getSubstituteNodeTemplateId(serviceTemplate, unifiedCompositionDataList.get(0), index); + //Add node template id and related abstract node template id in context + addUnifiedSubstitionData(context, serviceTemplate, unifiedCompositionDataList, + substituteNodeTemplateId); + DataModelUtil + .addNodeTemplate(serviceTemplate, substituteNodeTemplateId, substitutionNodeTemplate); + return substituteNodeTemplateId; + + } + + /** + * Update the connectivity from/to the "moved" nodes from the original service template to the new + * substitution service template. + * + * @param serviceTemplate the service template + * @param unifiedCompositionDataList the unified composition data list. In case no consolidation, + * one entry will be in this list, in case of having + * consolidation, all entries in the list are the once which + * need to be consolidated. + * @param context the translation context + */ + public void updateCompositionConnectivity(ServiceTemplate serviceTemplate, + List<UnifiedCompositionData> unifiedCompositionDataList, + TranslationContext context) { + updOutputParamGetAttrInConnectivity(serviceTemplate, unifiedCompositionDataList, context); + updNodesGetAttrInConnectivity(serviceTemplate, unifiedCompositionDataList, context); + updNodesConnectedOutConnectivity(serviceTemplate, unifiedCompositionDataList, context); + updNodesConnectedInConnectivity(serviceTemplate, unifiedCompositionDataList, context); + updVolumeConnectivity(serviceTemplate, unifiedCompositionDataList, context); + updGroupsConnectivity(serviceTemplate, unifiedCompositionDataList, context); + } + + /** + * Delete the "moved" nodes from the original service template to the new substitution service + * template. + * + * @param serviceTemplate the service template + * @param unifiedCompositionDataList the unified composition data list. In case no consolidation, + * one entry will be in this list, in case of having + * consolidation, all entries in the list are the once which + * need to be consolidated. + * @param context the translation context + */ + public void cleanUnifiedCompositionEntities( + ServiceTemplate serviceTemplate, + List<UnifiedCompositionData> unifiedCompositionDataList, + TranslationContext context) { + for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) { + ComputeTemplateConsolidationData computeTemplateConsolidationData = + unifiedCompositionData.getComputeTemplateConsolidationData(); + cleanServiceTemplate(serviceTemplate, computeTemplateConsolidationData, context); + + List<PortTemplateConsolidationData> portTemplateConsolidationDataList = + getPortTemplateConsolidationDataList(unifiedCompositionData); + for (PortTemplateConsolidationData portTemplateConsolidationData : + portTemplateConsolidationDataList) { + cleanServiceTemplate(serviceTemplate, portTemplateConsolidationData, context); + } + } + + } + + public void cleanNodeTypes(ServiceTemplate serviceTemplate, + List<UnifiedCompositionData> unifiedCompositionDataList, + TranslationContext context) { + for (UnifiedCompositionData unifiedData : unifiedCompositionDataList) { + removeCleanedNodeType( + unifiedData.getComputeTemplateConsolidationData().getNodeTemplateId(), serviceTemplate, + context); + } + + if (MapUtils.isEmpty(serviceTemplate.getNode_types())) { + serviceTemplate.setNode_types(null); + } + } + + /** + * Update unified abstract nodes connectivity. + * + * @param serviceTemplate the service template + * @param context the context + */ + public void updateUnifiedAbstractNodesConnectivity(ServiceTemplate serviceTemplate, + TranslationContext context) { + + + String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate); + UnifiedSubstitutionData unifiedSubstitutionData = context.getUnifiedSubstitutionData() + .get(serviceTemplateFileName); + + if (Objects.nonNull(unifiedSubstitutionData)) { + //Handle get attribute in connectivity for abstarct node to abstract node templates + Set<String> abstractNodeIds = + new HashSet<>(unifiedSubstitutionData.getAllRelatedAbstractNodeIds()); + handleGetAttrInConnectivity(serviceTemplate, abstractNodeIds, context); + //Handle get attribute in connectivity for abstract node templates to nested node template + Set<String> nestedNodeIds = + new HashSet<>(unifiedSubstitutionData.getAllUnifiedNestedNodeTemplateIds()); + handleGetAttrInConnectivity(serviceTemplate, nestedNodeIds, context); + } + } + + public void handleUnifiedNestedDefinition(ServiceTemplate mainServiceTemplate, + ServiceTemplate nestedServiceTemplate, + List<UnifiedCompositionData> unifiedCompositionDataList, + TranslationContext context) { + handleUnifiedNestedNodeType(mainServiceTemplate, nestedServiceTemplate, context); + updateUnifiedNestedTemplates(mainServiceTemplate, nestedServiceTemplate, unifiedCompositionDataList, context); + } + + private void handleGetAttrInConnectivity(ServiceTemplate serviceTemplate, + Set<String> unifiedNodeIds, + TranslationContext context) { + Map<String, NodeTemplate> nodeTemplates = + serviceTemplate.getTopology_template().getNode_templates(); + String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate); + for (String unifiedNodeId : unifiedNodeIds) { + NodeTemplate nodeTemplate = nodeTemplates.get(unifiedNodeId); + handleGetAttrInAbstractNodeTemplate(serviceTemplate, context, serviceTemplateFileName, + nodeTemplate); + } + } + + private void handleUnifiedNestedNodeType(ServiceTemplate mainServiceTemplate, + ServiceTemplate nestedServiceTemplate, + TranslationContext context) { + + + SubstitutionMapping substitutionMappings = + nestedServiceTemplate.getTopology_template().getSubstitution_mappings(); + String nodeTypeId = substitutionMappings.getNode_type(); + + Optional<String> newNestedNodeTypeId = + getNewNestedNodeTypeId(mainServiceTemplate, nestedServiceTemplate, context); + + if (isNestedServiceTemplateWasHandled(mainServiceTemplate, nestedServiceTemplate, context, + newNestedNodeTypeId)) { + context.updateHandledComputeType( + ToscaUtil.getServiceTemplateFileName(mainServiceTemplate), + ToscaUtil.getServiceTemplateFileName(nestedServiceTemplate), + newNestedNodeTypeId.get()); + return; + } + + ServiceTemplate globalSubstitutionServiceTemplate = + context.getGlobalSubstitutionServiceTemplate(); + + newNestedNodeTypeId.ifPresent( + newNestedNodeTypeIdVal -> updateNestedNodeType(nodeTypeId, newNestedNodeTypeIdVal, + nestedServiceTemplate, mainServiceTemplate, globalSubstitutionServiceTemplate, + context)); + + } + + private boolean isNestedServiceTemplateWasHandled(ServiceTemplate mainServiceTemplate, + ServiceTemplate nestedServiceTemplate, + TranslationContext context, + Optional<String> newNestedNodeTypeId) { + return newNestedNodeTypeId.isPresent() + && context.isNestedServiceTemplateWasHandled( + ToscaUtil.getServiceTemplateFileName(mainServiceTemplate), + ToscaUtil.getServiceTemplateFileName(nestedServiceTemplate)); + } + + private void updateNestedNodeType(String nodeTypeId, String newNestedNodeTypeId, + ServiceTemplate nestedServiceTemplate, + ServiceTemplate mainServiceTemplate, + ServiceTemplate globalSubstitutionServiceTemplate, + TranslationContext context) { + context.addNestedFileToUsedNestedComputeType( + ToscaUtil.getServiceTemplateFileName(mainServiceTemplate), + ToscaUtil.getServiceTemplateFileName(nestedServiceTemplate), + newNestedNodeTypeId); + String indexedNodeType = + handleNestedNodeTypeInGlobalSubstitutionTemplate(nodeTypeId, newNestedNodeTypeId, + mainServiceTemplate, globalSubstitutionServiceTemplate, context); + + handleSubstitutionMappingInNestedServiceTemplate(indexedNodeType, nestedServiceTemplate); + + context + .updateHandledComputeType( + ToscaUtil.getServiceTemplateFileName(mainServiceTemplate), + ToscaUtil.getServiceTemplateFileName(nestedServiceTemplate), + newNestedNodeTypeId); + } + + private String handleNestedNodeTypeInGlobalSubstitutionTemplate(String nodeTypeId, + String newNestedNodeTypeId, + ServiceTemplate mainServiceTemplate, + ServiceTemplate globalSubstitutionServiceTemplate, + TranslationContext context) { + String indexedNodeType = + getIndexedGlobalNodeTypeId(newNestedNodeTypeId, mainServiceTemplate, context); + handleNestedNodeTypesInGlobalSubstituteServiceTemplate(nodeTypeId, indexedNodeType, + globalSubstitutionServiceTemplate, context); + return indexedNodeType; + } + + private String getIndexedGlobalNodeTypeId(String newNestedNodeTypeId, + ServiceTemplate mainServiceTemplate, + TranslationContext context) { + int globalNodeTypeIndex = + context.getGlobalNodeTypeIndex(ToscaUtil.getServiceTemplateFileName(mainServiceTemplate), + newNestedNodeTypeId); + return globalNodeTypeIndex > 0 ? + newNestedNodeTypeId + "_" + String.valueOf(globalNodeTypeIndex) : newNestedNodeTypeId; + } + + private void updateUnifiedNestedTemplates(ServiceTemplate mainServiceTemplate, + ServiceTemplate nestedServiceTemplate, + List<UnifiedCompositionData> unifiedCompositionDataList, + TranslationContext context) { + + for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) { + NestedTemplateConsolidationData nestedTemplateConsolidationData = + unifiedCompositionData.getNestedTemplateConsolidationData(); + if (Objects.isNull(nestedTemplateConsolidationData)) { + continue; + } + handleNestedNodeTemplateInMainServiceTemplate(nestedTemplateConsolidationData.getNodeTemplateId(), mainServiceTemplate, nestedServiceTemplate, context); + } + } + + /** + * Update connectivity for unified nested patterns. + * + * @param serviceTemplate the service template + * @param nestedServiceTemplate the nested service template + * @param unifiedCompositionDataList the unified composition data list + * @param context the context + */ + public void updateUnifiedNestedConnectivity(ServiceTemplate serviceTemplate, + ServiceTemplate nestedServiceTemplate, + List<UnifiedCompositionData> + unifiedCompositionDataList, + TranslationContext context) { + + updNestedCompositionNodesConnectedInConnectivity(serviceTemplate, unifiedCompositionDataList, + context); + updNestedCompositionNodesGetAttrInConnectivity(serviceTemplate, unifiedCompositionDataList, + context); + updNestedCompositionOutputParamGetAttrInConnectivity(serviceTemplate, + unifiedCompositionDataList, context); + } + + + /** + * Clean unified nested entities. Update the heat stack group with the new node template ids. + * + * @param serviceTemplate the service template + * @param unifiedCompositionDataList the unified composition data list + * @param context the context + */ + public void cleanUnifiedNestedEntities(ServiceTemplate serviceTemplate, + List<UnifiedCompositionData> unifiedCompositionDataList, + TranslationContext context) { + EntityConsolidationData entityConsolidationData = unifiedCompositionDataList.get(0) + .getNestedTemplateConsolidationData(); + updateHeatStackGroupNestedComposition(serviceTemplate, entityConsolidationData, context); + + } + + protected void updNodesConnectedOutConnectivity(ServiceTemplate serviceTemplate, + List<UnifiedCompositionData> + unifiedCompositionDataList, + TranslationContext context) { + for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) { + ComputeTemplateConsolidationData computeTemplateConsolidationData = unifiedCompositionData + .getComputeTemplateConsolidationData(); + //Add requirements in the abstract node template for nodes connected out for computes + String newComputeNodeTemplateId = getNewComputeNodeTemplateId(serviceTemplate, + computeTemplateConsolidationData.getNodeTemplateId()); + Map<String, List<RequirementAssignmentData>> computeNodesConnectedOut = + computeTemplateConsolidationData.getNodesConnectedOut(); + if (computeNodesConnectedOut != null) { + updateRequirementInAbstractNodeTemplate(serviceTemplate, computeTemplateConsolidationData, + newComputeNodeTemplateId, computeNodesConnectedOut, context); + } + String computeType = getComputeTypeSuffix(serviceTemplate, computeTemplateConsolidationData + .getNodeTemplateId()); + //Add requirements in the abstract node template for nodes connected out for ports + List<PortTemplateConsolidationData> portTemplateConsolidationDataList = + getPortTemplateConsolidationDataList(unifiedCompositionData); + for (PortTemplateConsolidationData portTemplateConsolidationData : + portTemplateConsolidationDataList) { + String newPortNodeTemplateId = getNewPortNodeTemplateId(portTemplateConsolidationData + .getNodeTemplateId(), computeType, computeTemplateConsolidationData); + Map<String, List<RequirementAssignmentData>> portNodesConnectedOut = + portTemplateConsolidationData.getNodesConnectedOut(); + if (portNodesConnectedOut != null) { + updateRequirementInAbstractNodeTemplate(serviceTemplate, portTemplateConsolidationData, + newPortNodeTemplateId, portNodesConnectedOut, context); + } + } + } + } + + protected void updNodesConnectedInConnectivity(ServiceTemplate serviceTemplate, + List<UnifiedCompositionData> + unifiedCompositionDataList, + TranslationContext context) { + for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) { + ComputeTemplateConsolidationData computeTemplateConsolidationData = unifiedCompositionData + .getComputeTemplateConsolidationData(); + //Update requirements in the node template which pointing to the computes + String newComputeNodeTemplateId = getNewComputeNodeTemplateId(serviceTemplate, + computeTemplateConsolidationData.getNodeTemplateId()); + updNodesConnectedInConnectivity(serviceTemplate, computeTemplateConsolidationData, + newComputeNodeTemplateId, context, false); + + String computeType = getComputeTypeSuffix(serviceTemplate, computeTemplateConsolidationData + .getNodeTemplateId()); + //Update requirements in the node template which pointing to the ports + List<PortTemplateConsolidationData> portTemplateConsolidationDataList = + getPortTemplateConsolidationDataList(unifiedCompositionData); + for (PortTemplateConsolidationData portTemplateConsolidationData : + portTemplateConsolidationDataList) { + String newPortNodeTemplateId = getNewPortNodeTemplateId(portTemplateConsolidationData + .getNodeTemplateId(), computeType, computeTemplateConsolidationData); + updNodesConnectedInConnectivity(serviceTemplate, portTemplateConsolidationData, + newPortNodeTemplateId, context, false); + } + } + } + + private void updNodesConnectedInConnectivity(ServiceTemplate serviceTemplate, + EntityConsolidationData entityConsolidationData, + String newNodeTemplateId, + TranslationContext context, + boolean isNested) { + Map<String, List<RequirementAssignmentData>> nodesConnectedIn = + entityConsolidationData.getNodesConnectedIn(); + if (nodesConnectedIn == null) { + //No nodes connected in info + return; + } + for (Map.Entry<String, List<RequirementAssignmentData>> entry : nodesConnectedIn + .entrySet()) { + List<RequirementAssignmentData> requirementAssignmentDataList = entry.getValue(); + for (RequirementAssignmentData requirementAssignmentData : requirementAssignmentDataList) { + RequirementAssignment requirementAssignment = requirementAssignmentData + .getRequirementAssignment(); + if (!requirementAssignment.getNode().equals(entityConsolidationData + .getNodeTemplateId())) { + //The requirement assignment target node should be the one which we are handling in the + //consolidation object + continue; + } + //Update the requirement assignment object in the original node template + if (isNested) { + updateRequirementForNestedCompositionNodesConnectedIn(serviceTemplate, + requirementAssignmentData, entityConsolidationData, newNodeTemplateId, context); + } else { + updateRequirementForNodesConnectedIn(serviceTemplate, requirementAssignmentData, + entityConsolidationData, entry.getKey(), newNodeTemplateId, context); + } + + } + } + } + + protected void updNestedCompositionNodesConnectedInConnectivity(ServiceTemplate serviceTemplate, + List<UnifiedCompositionData> + unifiedCompositionDataList, + TranslationContext context) { + for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) { + NestedTemplateConsolidationData nestedTemplateConsolidationData = unifiedCompositionData + .getNestedTemplateConsolidationData(); + //Update requirements in the node template which pointing to the nested nodes + String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate); + Optional<String> newNestedNodeTemplateId = context.getUnifiedNestedNodeTemplateId( + serviceTemplateFileName, nestedTemplateConsolidationData.getNodeTemplateId()); + newNestedNodeTemplateId.ifPresent( + newNestedNodeTemplateIdVal -> updNodesConnectedInConnectivity(serviceTemplate, + nestedTemplateConsolidationData, + newNestedNodeTemplateIdVal, context, true)); + } + } + + protected void updVolumeConnectivity(ServiceTemplate serviceTemplate, + List<UnifiedCompositionData> + unifiedCompositionDataList, + TranslationContext context) { + for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) { + ComputeTemplateConsolidationData computeTemplateConsolidationData = unifiedCompositionData + .getComputeTemplateConsolidationData(); + //Add requirements in the abstract node template for compute volumes + String newComputeNodeTemplateId = getNewComputeNodeTemplateId(serviceTemplate, + computeTemplateConsolidationData.getNodeTemplateId()); + Map<String, List<RequirementAssignmentData>> computeVolumes = + computeTemplateConsolidationData.getVolumes(); + if (computeVolumes != null) { + updateRequirementInAbstractNodeTemplate(serviceTemplate, computeTemplateConsolidationData, + newComputeNodeTemplateId, computeVolumes, context); + } + } + } + + protected void updGroupsConnectivity(ServiceTemplate serviceTemplate, + List<UnifiedCompositionData> + unifiedCompositionDataList, + TranslationContext context) { + for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) { + ComputeTemplateConsolidationData computeTemplateConsolidationData = unifiedCompositionData + .getComputeTemplateConsolidationData(); + //Add requirements in the abstract node template for nodes connected in for computes + String newComputeNodeTemplateId = getNewComputeNodeTemplateId(serviceTemplate, + computeTemplateConsolidationData.getNodeTemplateId()); + updGroupsConnectivity(serviceTemplate, computeTemplateConsolidationData, context); + + String computeType = getComputeTypeSuffix(serviceTemplate, computeTemplateConsolidationData + .getNodeTemplateId()); + //Add requirements in the abstract node template for nodes connected in for ports + List<PortTemplateConsolidationData> portTemplateConsolidationDataList = + getPortTemplateConsolidationDataList(unifiedCompositionData); + for (PortTemplateConsolidationData portTemplateConsolidationData : + portTemplateConsolidationDataList) { + String newPortNodeTemplateId = getNewPortNodeTemplateId(portTemplateConsolidationData + .getNodeTemplateId(), computeType, computeTemplateConsolidationData); + updGroupsConnectivity(serviceTemplate, portTemplateConsolidationData, context); + } + } + } + + private void updGroupsConnectivity(ServiceTemplate serviceTemplate, EntityConsolidationData + entityConsolidationData, TranslationContext context) { + List<String> groupIds = entityConsolidationData.getGroupIds(); + if (groupIds == null) { + return; + } + String oldNodeTemplateId = entityConsolidationData.getNodeTemplateId(); + String abstractNodeTemplateId = context.getUnifiedAbstractNodeTemplateId( + serviceTemplate, entityConsolidationData.getNodeTemplateId()); + Map<String, GroupDefinition> groups = serviceTemplate.getTopology_template().getGroups(); + if (groups != null) { + for (String groupId : groupIds) { + GroupDefinition groupDefinition = groups.get(groupId); + if (groupDefinition != null) { + List<String> groupMembers = groupDefinition.getMembers(); + if (groupMembers.contains(oldNodeTemplateId)) { + //Replace the old node template id + groupMembers.remove(oldNodeTemplateId); + if (!groupMembers.contains(abstractNodeTemplateId)) { + //Add the abstract node template id if not already present + groupMembers.add(abstractNodeTemplateId); + } + } + } + } + } + } + + protected void updOutputParamGetAttrInConnectivity( + ServiceTemplate serviceTemplate, List<UnifiedCompositionData> unifiedComposotionDataList, + TranslationContext context) { + for (UnifiedCompositionData unifiedCompositionData : unifiedComposotionDataList) { + ComputeTemplateConsolidationData computeTemplateConsolidationData = + unifiedCompositionData.getComputeTemplateConsolidationData(); + String newComputeNodeTemplateId = getNewComputeNodeTemplateId(serviceTemplate, + computeTemplateConsolidationData.getNodeTemplateId()); + + updOutputParamGetAttrInConnectivity(serviceTemplate, computeTemplateConsolidationData, + computeTemplateConsolidationData.getNodeTemplateId(), newComputeNodeTemplateId, + context, false); + + String computeType = + getComputeTypeSuffix(serviceTemplate, + computeTemplateConsolidationData.getNodeTemplateId()); + List<PortTemplateConsolidationData> portTemplateConsolidationDataList = + getPortTemplateConsolidationDataList(unifiedCompositionData); + for (PortTemplateConsolidationData portTemplateConsolidationData : + portTemplateConsolidationDataList) { + String newPortNodeTemplateId = + getNewPortNodeTemplateId(portTemplateConsolidationData.getNodeTemplateId(), computeType, + computeTemplateConsolidationData); + + updOutputParamGetAttrInConnectivity(serviceTemplate, portTemplateConsolidationData, + portTemplateConsolidationData.getNodeTemplateId(), newPortNodeTemplateId, context, + false); + } + } + } + + protected void updNodesGetAttrInConnectivity( + ServiceTemplate serviceTemplate, + List<UnifiedCompositionData> unifiedComposotionDataList, + TranslationContext context) { + Map<String, UnifiedCompositionEntity> consolidationNodeTemplateIdAndType = + getAllConsolidationNodeTemplateIdAndType(unifiedComposotionDataList); + for (UnifiedCompositionData unifiedCompositionData : unifiedComposotionDataList) { + ComputeTemplateConsolidationData computeTemplateConsolidationData = + unifiedCompositionData.getComputeTemplateConsolidationData(); + String newComputeNodeTemplateId = getNewComputeNodeTemplateId(serviceTemplate, + computeTemplateConsolidationData.getNodeTemplateId()); + + updNodeGetAttrInConnectivity(serviceTemplate, computeTemplateConsolidationData, + computeTemplateConsolidationData.getNodeTemplateId(), + newComputeNodeTemplateId, context, consolidationNodeTemplateIdAndType, false); + + String computeType = + getComputeTypeSuffix(serviceTemplate, + computeTemplateConsolidationData.getNodeTemplateId()); + + List<PortTemplateConsolidationData> portTemplateConsolidationDataList = + getPortTemplateConsolidationDataList(unifiedCompositionData); + for (PortTemplateConsolidationData portTemplateConsolidationData : + portTemplateConsolidationDataList) { + String newPotNodeTemplateId = + getNewPortNodeTemplateId(portTemplateConsolidationData.getNodeTemplateId(), computeType, + computeTemplateConsolidationData); + + updNodeGetAttrInConnectivity(serviceTemplate, portTemplateConsolidationData, + portTemplateConsolidationData.getNodeTemplateId(), + newPotNodeTemplateId, context, consolidationNodeTemplateIdAndType, false); + } + } + } + + protected void updNestedCompositionOutputParamGetAttrInConnectivity( + ServiceTemplate serviceTemplate, List<UnifiedCompositionData> unifiedComposotionDataList, + TranslationContext context) { + for (UnifiedCompositionData unifiedCompositionData : unifiedComposotionDataList) { + NestedTemplateConsolidationData nestedTemplateConsolidationData = + unifiedCompositionData.getNestedTemplateConsolidationData(); + if (Objects.isNull(nestedTemplateConsolidationData)) { + continue; + } + String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate); + Optional<String> newNestedNodeTemplateId = context.getUnifiedNestedNodeTemplateId( + serviceTemplateFileName, nestedTemplateConsolidationData.getNodeTemplateId()); + + newNestedNodeTemplateId.ifPresent( + newNestedNodeTemplateIdVal -> updOutputParamGetAttrInConnectivity(serviceTemplate, + nestedTemplateConsolidationData, nestedTemplateConsolidationData.getNodeTemplateId(), + newNestedNodeTemplateIdVal, context, true)); + } + } + + protected void updNestedCompositionNodesGetAttrInConnectivity( + ServiceTemplate serviceTemplate, + List<UnifiedCompositionData> unifiedCompositionDataList, + TranslationContext context) { + for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) { + NestedTemplateConsolidationData nestedTemplateConsolidationData = + unifiedCompositionData.getNestedTemplateConsolidationData(); + if (Objects.isNull(nestedTemplateConsolidationData)) { + continue; + } + String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate); + Optional<String> newNestedNodeTemplateId = context.getUnifiedNestedNodeTemplateId( + serviceTemplateFileName, nestedTemplateConsolidationData.getNodeTemplateId()); + + newNestedNodeTemplateId.ifPresent( + newNestedNodeTemplateIdVal -> updNodeGetAttrInConnectivity(serviceTemplate, + nestedTemplateConsolidationData, nestedTemplateConsolidationData.getNodeTemplateId(), + newNestedNodeTemplateIdVal, context, null, true)); + } + } + + private void updateRequirementForNodesConnectedIn( + ServiceTemplate serviceTemplate, + RequirementAssignmentData requirementAssignmentData, + EntityConsolidationData entityConsolidationData, + String originalNodeTemplateId, + String newNodeTemplateId, + TranslationContext context) { + ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl(); + RequirementAssignment requirementAssignment = requirementAssignmentData + .getRequirementAssignment(); + String newAbstractUnifiedNodeTemplateId = context.getUnifiedAbstractNodeTemplateId( + serviceTemplate, entityConsolidationData.getNodeTemplateId()); + NodeTemplate abstractUnifiedNodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate, + newAbstractUnifiedNodeTemplateId); + Optional<String> newCapabilityId = getNewCapabilityForNodesConnectedIn(serviceTemplate, + abstractUnifiedNodeTemplate, requirementAssignment, newNodeTemplateId, context); + if (newCapabilityId.isPresent()) { + //Creating a copy of the requirement object and checking if it already exists in the + // original node template + RequirementAssignment requirementAssignmentCopy = (RequirementAssignment) getClonedObject( + requirementAssignmentData.getRequirementAssignment(), RequirementAssignment.class); + NodeTemplate originalNodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate, + originalNodeTemplateId); + requirementAssignmentCopy.setCapability(newCapabilityId.get()); + requirementAssignmentCopy.setNode(newAbstractUnifiedNodeTemplateId); + if (!toscaAnalyzerService.isRequirementExistInNodeTemplate(originalNodeTemplate, + requirementAssignmentData.getRequirementId(), requirementAssignmentCopy)) { + //Update the existing requirement + requirementAssignmentData.getRequirementAssignment().setCapability(newCapabilityId + .get()); + requirementAssignmentData.getRequirementAssignment() + .setNode(newAbstractUnifiedNodeTemplateId); + } else { + //The updated requirement already exists in the node template so simply remove the + // current one + DataModelUtil.removeRequirementAssignment(originalNodeTemplate, requirementAssignmentData + .getRequirementId(), requirementAssignmentData.getRequirementAssignment()); + } + } + } + + private void updateRequirementForNestedCompositionNodesConnectedIn( + ServiceTemplate serviceTemplate, + RequirementAssignmentData requirementAssignmentData, + EntityConsolidationData entityConsolidationData, + String newNodeTemplateId, + TranslationContext context) { + ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl(); + String newAbstractUnifiedNodeTemplateId = newNodeTemplateId; + RequirementAssignment requirementAssignment = requirementAssignmentData + .getRequirementAssignment(); + //Creating a copy of the requirement object and checking if it already exists in the + // original node template + RequirementAssignment requirementAssignmentCopy = (RequirementAssignment) getClonedObject( + requirementAssignmentData.getRequirementAssignment(), RequirementAssignment.class); + NodeTemplate unifiedAbstractNestedNodeTemplate = DataModelUtil + .getNodeTemplate(serviceTemplate, newAbstractUnifiedNodeTemplateId); + requirementAssignmentCopy.setCapability(requirementAssignment.getCapability()); + requirementAssignmentCopy.setNode(newAbstractUnifiedNodeTemplateId); + if (!toscaAnalyzerService.isRequirementExistInNodeTemplate(unifiedAbstractNestedNodeTemplate, + requirementAssignmentData.getRequirementId(), requirementAssignmentCopy)) { + //Update the existing requirement + requirementAssignmentData.getRequirementAssignment() + .setNode(newAbstractUnifiedNodeTemplateId); + } else { + //The updated requirement already exists in the node template so simply remove the + // current one + DataModelUtil.removeRequirementAssignment(unifiedAbstractNestedNodeTemplate, + requirementAssignmentData.getRequirementId(), requirementAssignmentData + .getRequirementAssignment()); + } + } + + private Optional<String> getNewCapabilityForNodesConnectedIn(ServiceTemplate serviceTemplate, + NodeTemplate unifiedNodeTemplate, + RequirementAssignment + requirementAssignment, + String newNodeTemplateId, + TranslationContext context) { + ServiceTemplate globalSubstitutionServiceTemplate = + HeatToToscaUtil.fetchGlobalSubstitutionServiceTemplate(serviceTemplate, context); + Map<String, NodeType> nodeTypes = globalSubstitutionServiceTemplate.getNode_types(); + String unifiedNodeTemplateType = unifiedNodeTemplate.getType(); + NodeType unifiedNodeType = nodeTypes.get(unifiedNodeTemplateType); + Map<String, CapabilityDefinition> abstractNodeTypeCapabilities = unifiedNodeType + .getCapabilities(); + for (Map.Entry<String, CapabilityDefinition> entry : abstractNodeTypeCapabilities.entrySet()) { + String capabilityId = entry.getKey(); + CapabilityDefinition capabilityDefinition = entry.getValue(); + String capabilityType = capabilityDefinition.getType(); + if (capabilityType.equals(requirementAssignment.getCapability())) { + //Matching capability type found..Check if the id ends with new node template id + if (capabilityId.endsWith(newNodeTemplateId)) { + return Optional.ofNullable(capabilityId); + } + } + } + return Optional.empty(); + } + + + private void updateRequirementInAbstractNodeTemplate(ServiceTemplate serviceTemplate, + EntityConsolidationData + entityConsolidationData, + String newNodeTemplateId, + Map<String, List<RequirementAssignmentData>> + requirementAssignmentDataMap, + TranslationContext context) { + ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl(); + for (Map.Entry<String, List<RequirementAssignmentData>> entry : requirementAssignmentDataMap + .entrySet()) { + String abstractNodeTemplateId = context.getUnifiedAbstractNodeTemplateId( + serviceTemplate, entityConsolidationData.getNodeTemplateId()); + NodeTemplate abstractNodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate, + abstractNodeTemplateId); + if (abstractNodeTemplate == null) { + //The abstract node template is not found from id in the context + return; + } + List<RequirementAssignmentData> requirementAssignmentDataList = entry.getValue(); + for (RequirementAssignmentData requirementAssignmentData : requirementAssignmentDataList) { + String oldRequirementId = requirementAssignmentData.getRequirementId(); + RequirementAssignment abstractRequirementAssignment = (RequirementAssignment) + getClonedObject(requirementAssignmentData.getRequirementAssignment(), + RequirementAssignment.class); + String newRequirementId = oldRequirementId + "_" + newNodeTemplateId; + //Check if the requirement is not already present in the list of requirements of the + // abstract node template + if (!toscaAnalyzerService.isRequirementExistInNodeTemplate(abstractNodeTemplate, + newRequirementId, abstractRequirementAssignment)) { + DataModelUtil.addRequirementAssignment(abstractNodeTemplate, newRequirementId, + abstractRequirementAssignment); + //Update the volume relationship template if required + updateVolumeRelationshipTemplate(serviceTemplate, abstractRequirementAssignment + .getRelationship(), context); + } + } + } + } + + private NodeTemplate getAbstractNodeTemplate( + ServiceTemplate serviceTemplate, + UnifiedCompositionEntity unifiedCompositionEntity, + ComputeTemplateConsolidationData computeTemplateConsolidationData, + PortTemplateConsolidationData portTemplateConsolidationData, + TranslationContext context) { + String abstractNodeTemplateId = + getAbstractNodeTemplateId(serviceTemplate, unifiedCompositionEntity, + computeTemplateConsolidationData, portTemplateConsolidationData, context); + + return DataModelUtil.getNodeTemplate(serviceTemplate, + abstractNodeTemplateId); + } + + private String getAbstractNodeTemplateId( + ServiceTemplate serviceTemplate, + UnifiedCompositionEntity unifiedCompositionEntity, + ComputeTemplateConsolidationData computeTemplateConsolidationData, + PortTemplateConsolidationData portTemplateConsolidationData, + TranslationContext context) { + switch (unifiedCompositionEntity) { + case Compute: + return context.getUnifiedAbstractNodeTemplateId(serviceTemplate, + computeTemplateConsolidationData.getNodeTemplateId()); + case Port: + return context.getUnifiedAbstractNodeTemplateId(serviceTemplate, + portTemplateConsolidationData.getNodeTemplateId()); + default: + return null; + } + } + + private void updNodeGetAttrInConnectivity( + ServiceTemplate serviceTemplate, + EntityConsolidationData entityConsolidationData, + String oldNodeTemplateId, String newNodeTemplateId, + TranslationContext context, + Map<String, UnifiedCompositionEntity> consolidationNodeTemplateIdAndType, + boolean isNested) { + Map<String, List<GetAttrFuncData>> nodesGetAttrIn = entityConsolidationData.getNodesGetAttrIn(); + if (MapUtils.isEmpty(nodesGetAttrIn)) { + return; + } + + for (String sourceNodeTemplateId : nodesGetAttrIn.keySet()) { + NodeTemplate sourceNodeTemplate = + DataModelUtil.getNodeTemplate(serviceTemplate, sourceNodeTemplateId); + if (!isNested && consolidationNodeTemplateIdAndType.keySet().contains(sourceNodeTemplateId)) { + continue; + } + List<GetAttrFuncData> getAttrFuncDataList = nodesGetAttrIn.get(sourceNodeTemplateId); + for (GetAttrFuncData getAttrFuncData : getAttrFuncDataList) { + Object propertyValue = + DataModelUtil.getPropertyValue(sourceNodeTemplate, getAttrFuncData.getFieldName()); + String newAttrName = null; + String newGetAttrAbstractNodeTemplateId = newNodeTemplateId; + if (!isNested) { + newGetAttrAbstractNodeTemplateId = + context.getUnifiedAbstractNodeTemplateId(serviceTemplate, oldNodeTemplateId); + newAttrName = getNewSubstitutionOutputParameterId(newNodeTemplateId, getAttrFuncData + .getAttributeName()); + } + List<List<Object>> getAttrFuncValueList = extractGetAttrFunction(propertyValue); + updateGetAttrValue(oldNodeTemplateId, getAttrFuncData, newGetAttrAbstractNodeTemplateId, + newAttrName, getAttrFuncValueList, isNested); + } + } + } + + private void updateGetAttrValue(String oldNodeTemplateId, GetAttrFuncData getAttrFuncData, + String newNodeTemplateId, String newAttrName, + List<List<Object>> getAttrFuncValueList, boolean isNested) { + for (List<Object> getAttrFuncValue : getAttrFuncValueList) { + if (oldNodeTemplateId.equals(getAttrFuncValue.get(0)) + && getAttrFuncData.getAttributeName().equals(getAttrFuncValue.get(1))) { + getAttrFuncValue.set(0, newNodeTemplateId); + if (!isNested) { + getAttrFuncValue.set(1, newAttrName); + } + } + } + } + + private String getTemplateName(ServiceTemplate serviceTemplate, + UnifiedCompositionData unifiedCompositionData, + Integer index) { + ComputeTemplateConsolidationData computeTemplateConsolidationData = + unifiedCompositionData.getComputeTemplateConsolidationData(); + String computeType = + getComputeTypeSuffix(serviceTemplate, computeTemplateConsolidationData.getNodeTemplateId()); + String templateName = "Nested_" + computeType; + if (Objects.nonNull(index)) { + templateName = templateName + "_" + index.toString(); + } + return templateName; + } + + private String getComputeTypeSuffix(ServiceTemplate serviceTemplate, + String computeNodeTemplateId) { + NodeTemplate computeNodeTemplate = + DataModelUtil.getNodeTemplate(serviceTemplate, computeNodeTemplateId); + return getComputeTypeSuffix(computeNodeTemplate.getType()); + } + + /** + * Gets compute type. + * + * @param computeType the compute node type abc.def.vFSB + * @return the compute type e.g.:vFSB + */ + private String getComputeTypeSuffix(String computeType) { + return DataModelUtil.getNamespaceSuffix(computeType); + } + + private void updOutputParamGetAttrInConnectivity(ServiceTemplate serviceTemplate, + EntityConsolidationData entityConsolidationData, + String oldNodeTemplateId, + String newNodeTemplateId, + TranslationContext context, + boolean isNested) { + List<GetAttrFuncData> outputParametersGetAttrIn = + entityConsolidationData.getOutputParametersGetAttrIn(); + if (CollectionUtils.isEmpty(outputParametersGetAttrIn)) { + return; + } + for (GetAttrFuncData getAttrFuncData : outputParametersGetAttrIn) { + Object outputParamValue = + DataModelUtil.getOuputParameter(serviceTemplate, getAttrFuncData.getFieldName()) + .getValue(); + String newAttrName = null; + String newGetAttrAbstractNodeTemplateId = newNodeTemplateId; + if (!isNested) { + newGetAttrAbstractNodeTemplateId = + context.getUnifiedAbstractNodeTemplateId(serviceTemplate, oldNodeTemplateId); + newAttrName = getNewSubstitutionOutputParameterId(newNodeTemplateId, getAttrFuncData + .getAttributeName()); + } + List<List<Object>> getAttrFuncValueList = extractGetAttrFunction(outputParamValue); + updateGetAttrValue(oldNodeTemplateId, getAttrFuncData, newGetAttrAbstractNodeTemplateId, + newAttrName, + getAttrFuncValueList, isNested); + } + + } + + private List<List<Object>> extractGetAttrFunction(Object valueObject) { + + List<List<Object>> getAttrValueList = new ArrayList<>(); + + if (valueObject instanceof Map) { + if (((Map) valueObject).containsKey(ToscaFunctions.GET_ATTRIBUTE.getDisplayName())) { + getAttrValueList.add( + (List<Object>) ((Map) valueObject).get(ToscaFunctions.GET_ATTRIBUTE.getDisplayName())); + } + + for (Object key : ((Map) valueObject).keySet()) { + getAttrValueList.addAll(extractGetAttrFunction(((Map) valueObject).get(key))); + } + + + } else if (valueObject instanceof List) { + for (Object valueEntity : (List) valueObject) { + getAttrValueList.addAll(extractGetAttrFunction(valueEntity)); + } + } + return getAttrValueList; + } + + private boolean isIncludeGetInputFunc(Object valueObject) { + if (valueObject instanceof Map) { + if (((Map) valueObject).containsKey(ToscaFunctions.GET_INPUT.getDisplayName())) { + return true; + } + Map.Entry<String, Object> functionMapEntry = + (Map.Entry<String, Object>) ((Map) valueObject).entrySet().iterator().next(); + return isIncludeGetInputFunc(functionMapEntry.getValue()); + + } else if (valueObject instanceof List) { + for (Object valueEntity : (List) valueObject) { + if (isIncludeGetInputFunc(valueEntity) == true) { + return true; + } + } + } + return false; + } + + private void createOutputParameters(ServiceTemplate serviceTemplate, + ServiceTemplate substitutionServiceTemplate, + List<UnifiedCompositionData> unifiedCompositionDataList, + String computeNodeType) { + + createOutputParametersForCompute(serviceTemplate, substitutionServiceTemplate, + unifiedCompositionDataList); + createOutputParameterForPorts(serviceTemplate, substitutionServiceTemplate, + unifiedCompositionDataList, computeNodeType); + } + + private void createOutputParameterForPorts( + ServiceTemplate serviceTemplate, + ServiceTemplate substitutionServiceTemplate, + List<UnifiedCompositionData> unifiedCompositionDataList, + String connectedComputeNodeType) { + for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) { + List<PortTemplateConsolidationData> portTemplateConsolidationDataList = + getPortTemplateConsolidationDataList(unifiedCompositionData); + if (CollectionUtils.isEmpty(portTemplateConsolidationDataList)) { + return; + } + + for (PortTemplateConsolidationData portTemplateConsolidationData : + portTemplateConsolidationDataList) { + String newPortNodeTemplateId = + getNewPortNodeTemplateId(portTemplateConsolidationData.getNodeTemplateId(), + connectedComputeNodeType, + unifiedCompositionData.getComputeTemplateConsolidationData()); + addOutputParameters(portTemplateConsolidationData, newPortNodeTemplateId, + substitutionServiceTemplate, unifiedCompositionDataList); + } + } + } + + //The ID should be <vm_type>_<port_type> or <vm_type>_<portNodeTemplateId> + private String getNewPortNodeTemplateId( + String portNodeTemplateId, + String connectedComputeNodeType, + ComputeTemplateConsolidationData computeTemplateConsolidationData) { + + StringBuilder newPortNodeTemplateId = new StringBuilder(); + String portType = ConsolidationDataUtil.getPortType(portNodeTemplateId); + newPortNodeTemplateId.append(DataModelUtil.getNamespaceSuffix(connectedComputeNodeType)); + if (computeTemplateConsolidationData.getPorts().get(portType).size() > 1) { + //single port + newPortNodeTemplateId.append("_").append(portNodeTemplateId); + } else { + //consolidation port + newPortNodeTemplateId.append("_").append(portType); + } + return newPortNodeTemplateId.toString(); + } + + private void createOutputParametersForCompute( + ServiceTemplate serviceTemplate, + ServiceTemplate substitutionServiceTemplate, + List<UnifiedCompositionData> + unifiedCompositionDataList) { + List<EntityConsolidationData> computeConsolidationDataList = + getComputeConsolidationDataList(unifiedCompositionDataList); + + for (EntityConsolidationData computeTemplateConsolidationData : computeConsolidationDataList) { + String newComputeNodeTemplateId = + getNewComputeNodeTemplateId(serviceTemplate, + computeTemplateConsolidationData.getNodeTemplateId()); + addOutputParameters(computeTemplateConsolidationData, newComputeNodeTemplateId, + substitutionServiceTemplate, unifiedCompositionDataList); + } + } + + private void addOutputParameters(EntityConsolidationData entityConsolidationData, + String newNodeTemplateId, + ServiceTemplate substitutionServiceTemplate, + List<UnifiedCompositionData> unifiedCompositionDataList) { + handleNodesGetAttrIn(entityConsolidationData, newNodeTemplateId, substitutionServiceTemplate, + unifiedCompositionDataList); + + handleOutputParamGetAttrIn(entityConsolidationData, newNodeTemplateId, + substitutionServiceTemplate); + } + + private void handleOutputParamGetAttrIn(EntityConsolidationData entityConsolidationData, + String newNodeTemplateId, + ServiceTemplate substitutionServiceTemplate) { + List<GetAttrFuncData> outputParametersGetAttrIn = + entityConsolidationData.getOutputParametersGetAttrIn(); + if (!CollectionUtils.isEmpty(outputParametersGetAttrIn)) { + for (GetAttrFuncData getAttrFuncData : outputParametersGetAttrIn) { + createAndAddOutputParameter(entityConsolidationData, newNodeTemplateId, + substitutionServiceTemplate, getAttrFuncData); + } + } + } + + private void handleNodesGetAttrIn(EntityConsolidationData entityConsolidationData, + String newNodeTemplateId, + ServiceTemplate substitutionServiceTemplate, + List<UnifiedCompositionData> unifiedCompositionDataList) { + Map<String, List<GetAttrFuncData>> getAttrIn = entityConsolidationData.getNodesGetAttrIn(); + + if (!MapUtils.isEmpty(getAttrIn)) { + Map<String, UnifiedCompositionEntity> consolidationNodeTemplateIdAndType = + getAllConsolidationNodeTemplateIdAndType(unifiedCompositionDataList); + for (String sourceNodeTemplateId : getAttrIn.keySet()) { + if (!consolidationNodeTemplateIdAndType.keySet().contains(sourceNodeTemplateId)) { + List<GetAttrFuncData> getAttrFuncDataList = getAttrIn.get(sourceNodeTemplateId); + for (GetAttrFuncData getAttrFuncData : getAttrFuncDataList) { + createAndAddOutputParameter(entityConsolidationData, newNodeTemplateId, + substitutionServiceTemplate, getAttrFuncData); + } + } + } + } + } + + private void createAndAddOutputParameter(EntityConsolidationData entityConsolidationData, + String newNodeTemplateId, + ServiceTemplate substitutionServiceTemplate, + GetAttrFuncData getAttrFuncData) { + Map<String, List<Object>> parameterValue = new HashMap<>(); + List<Object> valueList = new ArrayList<>(); + valueList.add(newNodeTemplateId); + valueList.add(getAttrFuncData.getAttributeName()); + parameterValue.put(ToscaFunctions.GET_ATTRIBUTE.getDisplayName(), valueList); + ParameterDefinition outputParameter = new ParameterDefinition(); + outputParameter.setValue(parameterValue); + //todo - the type need to be change based on the attribute type in the accordingly node type + // of this node template - XXX, instead of list of string, list of XXXX, + outputParameter.setType(PropertyType.LIST.getDisplayName()); + outputParameter.setEntry_schema( + DataModelUtil.createEntrySchema(PropertyType.STRING.getDisplayName(), null, null)); + DataModelUtil.addOutputParameterToTopologyTemplate(substitutionServiceTemplate, + getNewSubstitutionOutputParameterId(newNodeTemplateId, getAttrFuncData.getAttributeName()), + outputParameter); + } + + private String getNewSubstitutionOutputParameterId(String newNodeTemplateId, + String attributeName) { + return newNodeTemplateId + "_" + attributeName; + } + + private void addUnifiedSubstitionData(TranslationContext context, ServiceTemplate + serviceTemplate, List<UnifiedCompositionData> unifiedCompositionDataList, String + substituteNodeTemplateId) { + String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate); + for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) { + //Add compute node template mapping information + ComputeTemplateConsolidationData computeTemplateConsolidationData = + unifiedCompositionData.getComputeTemplateConsolidationData(); + String computeNodeTemplateId = computeTemplateConsolidationData.getNodeTemplateId(); + context.addUnifiedSubstitutionData(serviceTemplateFileName, computeNodeTemplateId, + substituteNodeTemplateId); + //Add Port template mapping information + List<PortTemplateConsolidationData> portTemplateConsolidationDataList = + getPortTemplateConsolidationDataList(unifiedCompositionData); + + if (CollectionUtils.isNotEmpty(portTemplateConsolidationDataList)) { + for (PortTemplateConsolidationData portTemplateConsolidationData : + portTemplateConsolidationDataList) { + String oldPortNodeTemplateId = portTemplateConsolidationData.getNodeTemplateId(); + context.addUnifiedSubstitutionData(serviceTemplateFileName, oldPortNodeTemplateId, + substituteNodeTemplateId); + } + } + } + } + + private void addSubstitutionFilteringProperty(String templateName, NodeTemplate nodeTemplate, + int count) { + Map<String, Object> serviceTemplateFilterPropertyValue = new HashMap<>(); + Map<String, Object> properties = nodeTemplate.getProperties(); + serviceTemplateFilterPropertyValue.put(ToscaConstants + .SUBSTITUTE_SERVICE_TEMPLATE_PROPERTY_NAME, templateName); + serviceTemplateFilterPropertyValue.put(ToscaConstants.COUNT_PROPERTY_NAME, count); + properties.put(ToscaConstants.SERVICE_TEMPLATE_FILTER_PROPERTY_NAME, + serviceTemplateFilterPropertyValue); + nodeTemplate.setProperties(properties); + } + + private void addIndexValueProperty(NodeTemplate nodeTemplate) { + List<String> indexValueGetPropertyValue = new ArrayList<>(); + indexValueGetPropertyValue.add(ToscaConstants.MODELABLE_ENTITY_NAME_SELF); + indexValueGetPropertyValue.add(ToscaConstants.SERVICE_TEMPLATE_FILTER_PROPERTY_NAME); + indexValueGetPropertyValue.add(ToscaConstants.INDEX_VALUE_PROPERTY_NAME); + + Map<String, Object> indexPropertyValue = new HashMap<>(); + Map<String, Object> properties = nodeTemplate.getProperties(); + indexPropertyValue.put(ToscaFunctions.GET_PROPERTY.getDisplayName(), + indexValueGetPropertyValue); + properties.put(ToscaConstants.INDEX_VALUE_PROPERTY_NAME, + indexPropertyValue); + nodeTemplate.setProperties(properties); + } + + private String getSubstituteNodeTemplateId(ServiceTemplate serviceTemplate, + UnifiedCompositionData unifiedCompositionData, + Integer index) { + String computeNodeTemplateId = + unifiedCompositionData.getComputeTemplateConsolidationData().getNodeTemplateId(); + NodeTemplate computeNodeTemplate = + DataModelUtil.getNodeTemplate(serviceTemplate, computeNodeTemplateId); + String nodeTemplateId = ABSTRACT_NODE_TEMPLATE_ID_PREFIX + DataModelUtil + .getNamespaceSuffix(computeNodeTemplate.getType()); + if (Objects.nonNull(index)) { + nodeTemplateId = nodeTemplateId + "_" + index.toString(); + } + return nodeTemplateId; + } + + private String getSubstitutionNodeTypeId(ServiceTemplate serviceTemplate, + UnifiedCompositionData unifiedCompositionData, + Integer index) { + String computeNodeTemplateId = + unifiedCompositionData.getComputeTemplateConsolidationData().getNodeTemplateId(); + NodeTemplate computeNodeTemplate = + DataModelUtil.getNodeTemplate(serviceTemplate, computeNodeTemplateId); + String nodeTypeId = ToscaNodeType.ABSTRACT_NODE_TYPE_PREFIX + + DataModelUtil.getNamespaceSuffix(computeNodeTemplate.getType()); + if (Objects.nonNull(index)) { + nodeTypeId = nodeTypeId + "_" + index.toString(); + } + return nodeTypeId; + } + + private String getNewComputeNodeTemplateId( + ServiceTemplate serviceTemplate, + String computeNodeTemplateId) { + return getComputeTypeSuffix(serviceTemplate, computeNodeTemplateId); + } + + private NodeType handleSubstitutionGlobalNodeType(ServiceTemplate serviceTemplate, + ServiceTemplate substitutionServiceTemplate, + TranslationContext context, + UnifiedCompositionData unifiedCompositionData, + Integer index) { + String substitutionNodeTypeId = + getSubstitutionNodeTypeId(serviceTemplate, unifiedCompositionData, index); + NodeType substitutionNodeType = new ToscaAnalyzerServiceImpl() + .createInitSubstitutionNodeType(substitutionServiceTemplate, + ToscaNodeType.VFC_ABSTRACT_SUBSTITUTE); + ServiceTemplate globalSubstitutionServiceTemplate = + HeatToToscaUtil.fetchGlobalSubstitutionServiceTemplate(serviceTemplate, context); + DataModelUtil.addNodeType(globalSubstitutionServiceTemplate, substitutionNodeTypeId, + substitutionNodeType); + + return substitutionNodeType; + } + + private void handlePorts(ServiceTemplate serviceTemplate, + ServiceTemplate substitutionServiceTemplate, + List<UnifiedCompositionData> unifiedCompositionDataList, + String connectedComputeNodeType, + TranslationContext context) { + + if (unifiedCompositionDataList.size() > 1) { + handleConsolidationPorts(serviceTemplate, substitutionServiceTemplate, + unifiedCompositionDataList, connectedComputeNodeType, context); + } else { + handleSinglePorts(serviceTemplate, substitutionServiceTemplate, connectedComputeNodeType, + unifiedCompositionDataList, context); + } + } + + private void handleSinglePorts(ServiceTemplate serviceTemplate, + ServiceTemplate substitutionServiceTemplate, + String connectedComputeNodeType, + List<UnifiedCompositionData> unifiedCompositionDataList, + TranslationContext context) { + UnifiedCompositionData unifiedCompositionData = unifiedCompositionDataList.get(0); + List<PortTemplateConsolidationData> portTemplateConsolidationDataList = + getPortTemplateConsolidationDataList(unifiedCompositionData); + if (CollectionUtils.isEmpty(portTemplateConsolidationDataList)) { + return; + } + for (PortTemplateConsolidationData portTemplateConsolidationData : + portTemplateConsolidationDataList) { + List<EntityConsolidationData> portConsolidationDataList = new ArrayList<>(); + portConsolidationDataList.add(portTemplateConsolidationData); + handlePortNodeTemplate(serviceTemplate, substitutionServiceTemplate, + portConsolidationDataList, connectedComputeNodeType, + unifiedCompositionData.getComputeTemplateConsolidationData(), + unifiedCompositionDataList, context); + } + } + + private void handleConsolidationPorts(ServiceTemplate serviceTemplate, + ServiceTemplate substitutionServiceTemplate, + List<UnifiedCompositionData> unifiedCompositionDataList, + String connectedComputeNodeType, + TranslationContext context) { + Collection<ComputeTemplateConsolidationData> computeConsolidationDataList = + (Collection) getComputeConsolidationDataList(unifiedCompositionDataList); + + Map<String, Set<String>> portIdsPerPortType = UnifiedCompositionUtil + .collectAllPortsFromEachTypesFromComputes(computeConsolidationDataList); + + for (String portType : portIdsPerPortType.keySet()) { + List<EntityConsolidationData> portTemplateConsolidationDataList = + getPortConsolidationDataList(portIdsPerPortType.get(portType), + unifiedCompositionDataList); + if (CollectionUtils.isEmpty(portTemplateConsolidationDataList)) { + continue; + } + + handlePortNodeTemplate(serviceTemplate, substitutionServiceTemplate, + portTemplateConsolidationDataList, connectedComputeNodeType, + unifiedCompositionDataList.get(0).getComputeTemplateConsolidationData(), + unifiedCompositionDataList, context); + } + } + + private void handlePortNodeTemplate( + ServiceTemplate serviceTemplate, + ServiceTemplate substitutionServiceTemplate, + List<EntityConsolidationData> portTemplateConsolidationDataList, + String connectedComputeNodeType, + ComputeTemplateConsolidationData computeTemplateConsolidationData, + List<UnifiedCompositionData> unifiedCompositionDataList, + TranslationContext context) { + EntityConsolidationData portTemplateConsolidationData = + portTemplateConsolidationDataList.get(0); + NodeTemplate newPortNodeTemplate = getNodeTemplate( + portTemplateConsolidationData.getNodeTemplateId(), serviceTemplate, context).clone(); + + removeConnectivityOut(portTemplateConsolidationData, newPortNodeTemplate); + handleProperties(serviceTemplate, newPortNodeTemplate, substitutionServiceTemplate, + UnifiedCompositionEntity.Port, portTemplateConsolidationDataList, + computeTemplateConsolidationData, unifiedCompositionDataList, context); + + String newPortNodeTemplateId = + getNewPortNodeTemplateId(portTemplateConsolidationData + .getNodeTemplateId(), connectedComputeNodeType, + computeTemplateConsolidationData); + //Update requirements for relationships between the consolidation entities + handleConsolidationEntitiesRequirementConnectivity(newPortNodeTemplateId, newPortNodeTemplate, + substitutionServiceTemplate, context); + DataModelUtil.addNodeTemplate(substitutionServiceTemplate, newPortNodeTemplateId, + newPortNodeTemplate); + + //Add the node template mapping in the context for handling requirement updation + context.addSubstitutionServiceTemplateUnifiedSubstitutionData(ToscaUtil + .getServiceTemplateFileName(substitutionServiceTemplate), + portTemplateConsolidationData.getNodeTemplateId(), newPortNodeTemplateId); + } + + + private NodeTemplate getNodeTemplate(String nodeTemplateId, ServiceTemplate serviceTemplate, + TranslationContext context) { + + NodeTemplate nodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate, nodeTemplateId); + + if (Objects.isNull(nodeTemplate)) { + nodeTemplate = context + .getCleanedNodeTemplate(ToscaUtil.getServiceTemplateFileName(serviceTemplate), + nodeTemplateId); + + } + return nodeTemplate; + } + + + private String handleCompute(ServiceTemplate serviceTemplate, + ServiceTemplate substitutionServiceTemplate, + List<UnifiedCompositionData> unifiedCompositionDataList, + TranslationContext context) { + ComputeTemplateConsolidationData computeTemplateConsolidationData = + unifiedCompositionDataList.get(0).getComputeTemplateConsolidationData(); + handleComputeNodeTemplate(serviceTemplate, substitutionServiceTemplate, + unifiedCompositionDataList, context); + return handleComputeNodeType(serviceTemplate, substitutionServiceTemplate, + computeTemplateConsolidationData); + } + + private String handleComputeNodeType( + ServiceTemplate serviceTemplate, + ServiceTemplate substitutionServiceTemplate, + ComputeTemplateConsolidationData computeTemplateConsolidationData) { + NodeTemplate computeNodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate, + computeTemplateConsolidationData.getNodeTemplateId()); + NodeType computeNodeType = + DataModelUtil.getNodeType(serviceTemplate, computeNodeTemplate.getType()); + DataModelUtil + .addNodeType(substitutionServiceTemplate, computeNodeTemplate.getType(), computeNodeType); + + return computeNodeTemplate.getType(); + } + + private void handleComputeNodeTemplate(ServiceTemplate serviceTemplate, + ServiceTemplate substitutionServiceTemplate, + List<UnifiedCompositionData> unifiedCompositionDataList, + TranslationContext context) { + ComputeTemplateConsolidationData computeTemplateConsolidationData = + unifiedCompositionDataList.get(0).getComputeTemplateConsolidationData(); + NodeTemplate newComputeNodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate, + computeTemplateConsolidationData.getNodeTemplateId()).clone(); + + removeConnectivityOut(computeTemplateConsolidationData, newComputeNodeTemplate); + removeVolumeConnectivity(computeTemplateConsolidationData, newComputeNodeTemplate); + + List<EntityConsolidationData> computeConsoliadtionDataList = + getComputeConsolidationDataList(unifiedCompositionDataList); + + handleProperties(serviceTemplate, newComputeNodeTemplate, substitutionServiceTemplate, + UnifiedCompositionEntity.Compute, computeConsoliadtionDataList, + computeTemplateConsolidationData, unifiedCompositionDataList, context); + + String newComputeNodeTemplateId = getNewComputeNodeTemplateId(serviceTemplate, + computeTemplateConsolidationData.getNodeTemplateId()); + //Update requirements for relationships between the consolidation entities + handleConsolidationEntitiesRequirementConnectivity(newComputeNodeTemplateId, + newComputeNodeTemplate, + substitutionServiceTemplate, context); + DataModelUtil + .addNodeTemplate(substitutionServiceTemplate, + newComputeNodeTemplateId, newComputeNodeTemplate); + //Add the node template mapping in the context for handling requirement updation + context.addSubstitutionServiceTemplateUnifiedSubstitutionData(ToscaUtil + .getServiceTemplateFileName(substitutionServiceTemplate), + computeTemplateConsolidationData.getNodeTemplateId(), newComputeNodeTemplateId); + + } + + private List<EntityConsolidationData> getComputeConsolidationDataList( + List<UnifiedCompositionData> unifiedCompositionDataList) { + List<EntityConsolidationData> computeConsolidationDataList = new ArrayList<>(); + for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) { + computeConsolidationDataList + .add(unifiedCompositionData.getComputeTemplateConsolidationData()); + } + return computeConsolidationDataList; + } + + + private void handleProperties(ServiceTemplate serviceTemplate, NodeTemplate nodeTemplate, + ServiceTemplate substitutionServiceTemplate, + UnifiedCompositionEntity unifiedCompositionEntity, + List<EntityConsolidationData> entityConsolidationDataList, + ComputeTemplateConsolidationData computeTemplateConsolidationData, + List<UnifiedCompositionData> unifiedCompositionDataList, + TranslationContext context) { + List<String> propertiesWithIdenticalVal = consolidationService.getPropertiesWithIdenticalVal(); + nodeTemplate.setProperties(new HashedMap()); + + for (EntityConsolidationData entityConsolidationData : entityConsolidationDataList) { + String nodeTemplateId = entityConsolidationData.getNodeTemplateId(); + Map<String, Object> properties = + DataModelUtil.getNodeTemplateProperties(serviceTemplate, nodeTemplateId); + if (MapUtils.isEmpty(properties)) { + continue; + } + + for (Map.Entry<String, Object> propertyEntry : properties.entrySet()) { + if (propertiesWithIdenticalVal.contains(propertyEntry.getKey())) { + String parameterId = updateIdenticalProperty(nodeTemplate, propertyEntry.getKey()); + addInputParameter(parameterId, PropertyType.STRING.getDisplayName(), null, + substitutionServiceTemplate); + } else { + Optional<String> parameterId = + updateProperty(serviceTemplate, nodeTemplateId, nodeTemplate, propertyEntry, + unifiedCompositionEntity, computeTemplateConsolidationData, + unifiedCompositionDataList, + context); + + //todo - define list of type which will match the node property type (instead of string) + NodeType nodeTypeWithFlatHierarchy = + HeatToToscaUtil.getNodeTypeWithFlatHierarchy(nodeTemplate.getType(), serviceTemplate, + context); + String propertyType = + nodeTypeWithFlatHierarchy.getProperties().get(propertyEntry.getKey()) + .getType(); + + if (propertyType.equalsIgnoreCase(PropertyType.STRING.getDisplayName()) + || propertyType.equalsIgnoreCase(PropertyType.INTEGER.getDisplayName()) + || propertyType.equalsIgnoreCase(PropertyType.FLOAT.getDisplayName()) + || propertyType.equalsIgnoreCase(PropertyType.BOOLEAN.getDisplayName())) { + parameterId + .ifPresent(parameterIdValue -> addInputParameter(parameterIdValue, + PropertyType.LIST.getDisplayName(), + DataModelUtil + .createEntrySchema(propertyType.toLowerCase(), null, null), + substitutionServiceTemplate)); + } else { + parameterId + .ifPresent(parameterIdValue -> addInputParameter(parameterIdValue, + PropertyType.LIST.getDisplayName(), + DataModelUtil + .createEntrySchema(PropertyTypeExt.JSON.getDisplayName(), null, null), + substitutionServiceTemplate)); + } + } + } + } + } + + private void handleConsolidationEntitiesRequirementConnectivity(String nodeTemplateId, + NodeTemplate nodeTemplate, + ServiceTemplate + substitutionServiceTemplate, + TranslationContext context) { + Map<String, RequirementAssignment> updatedNodeTemplateRequirements = new HashMap<>(); + List<Map<String, RequirementAssignment>> nodeTemplateRequirements = DataModelUtil + .getNodeTemplateRequirementList(nodeTemplate); + if (CollectionUtils.isEmpty(nodeTemplateRequirements)) { + return; + } + + for (Map<String, RequirementAssignment> requirement : nodeTemplateRequirements) { + for (Map.Entry<String, RequirementAssignment> entry : requirement.entrySet()) { + RequirementAssignment requirementAssignment = entry.getValue(); + String requirementNode = requirementAssignment.getNode(); + String unifiedNodeTemplateId = + context.getUnifiedSubstitutionNodeTemplateId(substitutionServiceTemplate, + requirementNode); + if (unifiedNodeTemplateId != null) { + //Update the node id in the requirement + requirementAssignment.setNode(unifiedNodeTemplateId); + } + } + } + nodeTemplate.setRequirements(nodeTemplateRequirements); + } + + /** + * Update the node references in the volume relationship templates. + * + * @param serviceTemplate the service template + * @param context the context + */ + private void updateVolumeRelationshipTemplate(ServiceTemplate serviceTemplate, + String relationshipId, + TranslationContext context) { + Map<String, RelationshipTemplate> relationshipTemplates = DataModelUtil + .getRelationshipTemplates(serviceTemplate); + if (relationshipTemplates != null) { + RelationshipTemplate relationshipTemplate = relationshipTemplates.get(relationshipId); + if (relationshipTemplate != null) { + String relationshipTemplateType = relationshipTemplate.getType(); + if (relationshipTemplateType.equals(ToscaRelationshipType.CINDER_VOLUME_ATTACHES_TO)) { + handleCinderVolumeAttachmentRelationshipTemplate(serviceTemplate, + relationshipTemplate, context); + } + } + } + } + + + private void handleCinderVolumeAttachmentRelationshipTemplate(ServiceTemplate + substitutionServiceTemplate, + RelationshipTemplate + relationshipTemplate, + TranslationContext context) { + Map<String, Object> properties = relationshipTemplate.getProperties(); + properties.computeIfPresent(HeatConstants.INSTANCE_UUID_PROPERTY_NAME, (key, value) -> + context.getUnifiedAbstractNodeTemplateId(substitutionServiceTemplate, + (String) value)); + } + + private String updateIdenticalProperty(NodeTemplate nodeTemplate, String propertyId) { + Map<String, String> propertyVal = new HashMap<>(); + String inputParamId = IDENTICAL_VALUE_PROPERTY_PREFIX + propertyId + + IDENTICAL_VALUE_PROPERTY_SUFFIX; + propertyVal.put(ToscaFunctions.GET_INPUT.getDisplayName(), inputParamId); + nodeTemplate.getProperties().put(propertyId, propertyVal); + return inputParamId; + } + + private void addInputParameter(String parameterId, String parameterType, EntrySchema entrySchema, + ServiceTemplate serviceTemplate) { + + ParameterDefinition parameterDefinition = + DataModelUtil.createParameterDefinition(parameterType, null, null, + true, null, null, entrySchema, null); + DataModelUtil + .addInputParameterToTopologyTemplate(serviceTemplate, parameterId, parameterDefinition); + } + + // Return the input parameter Id which is used in the new property value if there is one + private Optional<String> updateProperty( + ServiceTemplate serviceTemplate, + String nodeTemplateId, NodeTemplate nodeTemplate, + Map.Entry<String, Object> propertyEntry, + UnifiedCompositionEntity compositionEntity, + ComputeTemplateConsolidationData computeTemplateConsolidationData, + List<UnifiedCompositionData> unifiedCompositionDataList, + TranslationContext context) { + + if (handleGetAttrFromConsolidationNodes(serviceTemplate, nodeTemplate, propertyEntry, + unifiedCompositionDataList, context)) { + return Optional.empty(); + } + + Map<String, List<String>> propertyVal = new HashMap<>(); + List<String> getInputFuncParams = new ArrayList<>(); + String inputParamId = + getParameterId(nodeTemplateId, nodeTemplate, propertyEntry.getKey(), compositionEntity, + computeTemplateConsolidationData); + getInputFuncParams.add(inputParamId); + getInputFuncParams.add(ToscaConstants.INDEX_VALUE_PROPERTY_NAME); + propertyVal.put(ToscaFunctions.GET_INPUT.getDisplayName(), getInputFuncParams); + nodeTemplate.getProperties().put(propertyEntry.getKey(), propertyVal); + return Optional.of(inputParamId); + } + + private boolean handleGetAttrFromConsolidationNodes( + ServiceTemplate serviceTemplate, + NodeTemplate nodeTemplate, + Map.Entry<String, Object> propertyEntry, + List<UnifiedCompositionData> unifiedCompositionDataList, + TranslationContext context) { + Map<String, UnifiedCompositionEntity> consolidationNodeTemplateIdAndType = + getAllConsolidationNodeTemplateIdAndType(unifiedCompositionDataList); + + Set<String> consolidationNodeTemplateIds = consolidationNodeTemplateIdAndType.keySet(); + boolean includeGetAttrFromConsolidationNodes = false; + boolean includeGetAttrFromOutsideNodes = false; + List<List<Object>> getAttrFunctionList = extractGetAttrFunction(propertyEntry.getValue()); + for (List<Object> getAttrFunc : getAttrFunctionList) { + if (consolidationNodeTemplateIds.contains(getAttrFunc.get(0))) { + includeGetAttrFromConsolidationNodes = true; + } else { + includeGetAttrFromOutsideNodes = true; + } + } + if ((includeGetAttrFromConsolidationNodes && includeGetAttrFromOutsideNodes) + || + (includeGetAttrFromConsolidationNodes && isIncludeGetInputFunc(propertyEntry.getValue()))) { + //This case is currently not supported - this property will be ignored + return true; + } else if (includeGetAttrFromConsolidationNodes) { + Object clonedPropertyValue = getClonedPropertyValue(propertyEntry); + List<List<Object>> clonedGetAttrFuncList = extractGetAttrFunction(clonedPropertyValue); + for (List<Object> getAttrFunc : clonedGetAttrFuncList) { + String targetNodeTemplateId = (String) getAttrFunc.get(0); + if (consolidationNodeTemplateIds.contains(targetNodeTemplateId)) { + updatePropertyGetAttrFunc(serviceTemplate, unifiedCompositionDataList, context, + consolidationNodeTemplateIdAndType, targetNodeTemplateId, getAttrFunc); + } + } + nodeTemplate.getProperties().put(propertyEntry.getKey(), clonedPropertyValue); + return true; + } + return false; + } + + private void updatePropertyGetAttrFunc( + ServiceTemplate serviceTemplate, + List<UnifiedCompositionData> unifiedCompositionDataList, + TranslationContext context, + Map<String, UnifiedCompositionEntity> consolidationNodeTemplateIdAndType, + String targetNodeTemplateId, + List<Object> getAttrFunc) { + UnifiedCompositionEntity targetCompositionEntity = + consolidationNodeTemplateIdAndType.get(targetNodeTemplateId); + String targetNewNodeTemplateId = + getNewNodeTemplateId(serviceTemplate, unifiedCompositionDataList, targetNodeTemplateId, + targetCompositionEntity); + getAttrFunc.set(0, targetNewNodeTemplateId); + } + + private String getNewNodeTemplateId(ServiceTemplate serviceTemplate, + List<UnifiedCompositionData> unifiedCompositionDataList, + String nodeTemplateId, + UnifiedCompositionEntity compositionEntity) { + switch (compositionEntity) { + case Compute: + return getNewComputeNodeTemplateId(serviceTemplate, nodeTemplateId); + case Port: + ComputeTemplateConsolidationData connectedComputeConsolidationData = + getConnectedComputeConsolidationData(serviceTemplate, + unifiedCompositionDataList, nodeTemplateId); + NodeTemplate connectedComputeNodeTemplate = + DataModelUtil.getNodeTemplate(serviceTemplate, + connectedComputeConsolidationData.getNodeTemplateId()); + return getNewPortNodeTemplateId(nodeTemplateId, connectedComputeNodeTemplate.getType(), + connectedComputeConsolidationData); + default: + return null; + } + } + + private String getNewNodeTemplateId(String origNodeTemplateId, + String serviceTemplateFileName, + ServiceTemplate serviceTemplate, + TranslationContext context) { + ConsolidationData consolidationData = context.getConsolidationData(); + + if (isIdIsOfExpectedType(origNodeTemplateId, UnifiedCompositionEntity.Port, + serviceTemplateFileName, + consolidationData, context)) { + return handleIdOfPort(origNodeTemplateId, serviceTemplateFileName, consolidationData); + } else if (isIdIsOfExpectedType(origNodeTemplateId, UnifiedCompositionEntity.Compute, + serviceTemplateFileName, consolidationData, context)) { + NodeTemplate nodeTemplate = + getComputeNodeTemplate(origNodeTemplateId, serviceTemplate, context); + return getComputeTypeSuffix(nodeTemplate.getType()); + } + + return null; + } + + private ComputeTemplateConsolidationData getConnectedComputeConsolidationData( + ServiceTemplate serviceTemplate, + List<UnifiedCompositionData> unifiedCompositionDataList, + String portNodeTemplateId) { + for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) { + Collection<List<String>> portsCollection = + unifiedCompositionData.getComputeTemplateConsolidationData().getPorts().values(); + for (List<String> portIdList : portsCollection) { + for (String portId : portIdList) { + if (portId.equals(portNodeTemplateId)) { + return unifiedCompositionData.getComputeTemplateConsolidationData(); + } + } + } + } + return null; + } + + private Object getClonedPropertyValue(Map.Entry<String, Object> propertyEntry) { + if (propertyEntry.getValue() instanceof Map) { + return getClonedObject(propertyEntry.getValue(), Map.class); + } else if (propertyEntry.getValue() instanceof List) { + return getClonedObject(propertyEntry.getValue(), List.class); + } + return propertyEntry.getValue(); + } + + + private String getParameterId(String nodeTemplateId, NodeTemplate nodeTemplate, String propertyId, + UnifiedCompositionEntity unifiedCompositionEntity, + ComputeTemplateConsolidationData computeTemplateConsolidationData) { + switch (unifiedCompositionEntity) { + case Compute: + return UnifiedCompositionEntity.Compute.name().toLowerCase() + "_" + + getComputeTypeSuffix(nodeTemplate.getType()) + "_" + propertyId; + case Port: + String portType = ConsolidationDataUtil.getPortType(nodeTemplateId); + if (computeTemplateConsolidationData.getPorts().get(portType).size() > 1) { + return UnifiedCompositionEntity.Port.name().toLowerCase() + "_" + nodeTemplateId + "_" + + propertyId; + } + return UnifiedCompositionEntity.Port.name().toLowerCase() + "_" + portType + "_" + + propertyId; + default: + return propertyId; + } + } + + private void removeConnectivityOut(EntityConsolidationData entityConsolidationData, + NodeTemplate nodeTemplate) { + if (MapUtils.isEmpty(entityConsolidationData.getNodesConnectedOut())) { + return; + } + + for (List<RequirementAssignmentData> requirementAssignmentDataList : entityConsolidationData + .getNodesConnectedOut().values()) { + for (RequirementAssignmentData requirementAssignmentData : requirementAssignmentDataList) { + DataModelUtil.removeRequirementsAssignment(nodeTemplate.getRequirements(), + requirementAssignmentData.getRequirementId()); + } + if (nodeTemplate.getRequirements().isEmpty()) { + nodeTemplate.setRequirements(null); + } + } + } + + private void removeVolumeConnectivity( + ComputeTemplateConsolidationData computeTemplateConsolidationData, + NodeTemplate computeNodeTemplate) { + if (MapUtils.isEmpty(computeTemplateConsolidationData.getVolumes())) { + return; + } + Collection<List<RequirementAssignmentData>> volumeCollection = + computeTemplateConsolidationData.getVolumes().values(); + for (List<RequirementAssignmentData> requirementAssignmentDataList : volumeCollection) { + for (RequirementAssignmentData requirementAssignmentData : requirementAssignmentDataList) { + DataModelUtil.removeRequirementsAssignment(computeNodeTemplate.getRequirements(), + requirementAssignmentData.getRequirementId()); + } + } + if (computeNodeTemplate.getRequirements().isEmpty()) { + computeNodeTemplate.setRequirements(null); + } + } + + private void createIndexInputParameter(ServiceTemplate substitutionServiceTemplate) { + ParameterDefinition indexParameterDefinition = + DataModelUtil.createParameterDefinition(PropertyType.INTEGER.getDisplayName(), + "Index value of this substitution service template runtime instance", null, + false, createIndexValueConstraint(), null, null, 0); + DataModelUtil.addInputParameterToTopologyTemplate(substitutionServiceTemplate, + ToscaConstants.INDEX_VALUE_PROPERTY_NAME, indexParameterDefinition); + } + + + private List<Constraint> createIndexValueConstraint() { + List<Constraint> constraints; + constraints = new ArrayList<>(); + Constraint constraint = new Constraint(); + constraint.setGreater_or_equal(0); + constraints.add(constraint); + return constraints; + } + + private Optional<UnifiedComposition> getUnifiedCompositionInstance(UnifiedCompositionMode mode) { + String unifiedCompositionImplClassName = + unifiedCompositionImplMap.get(mode.name()).getImplementationClass(); + if (StringUtils.isEmpty(unifiedCompositionImplClassName)) { + return Optional.empty(); + } + return Optional + .of(CommonMethods.newInstance(unifiedCompositionImplClassName, UnifiedComposition.class)); + } + + private Optional<Map<String, Object>> createAbstractSubstitutionProperties( + ServiceTemplate serviceTemplate, + ServiceTemplate substitutionServiceTemplate, + List<UnifiedCompositionData> unifiedCompositionDataList) { + Map<String, Object> abstractSubstituteProperties = new LinkedHashMap<>(); + Map<String, ParameterDefinition> substitutionTemplateInputs = DataModelUtil + .getInputParameters(substitutionServiceTemplate); + if (substitutionTemplateInputs == null) { + return Optional.empty(); + } + //Since all the computes have the same type fetching the type from the first entry + NodeTemplate firstComputeNodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate, + unifiedCompositionDataList.get(0) + .getComputeTemplateConsolidationData().getNodeTemplateId()); + String computeType = getComputeTypeSuffix(firstComputeNodeTemplate.getType()); + for (Map.Entry<String, ParameterDefinition> input : substitutionTemplateInputs.entrySet()) { + String substitutionTemplateInputName = input.getKey(); + ParameterDefinition inputParameterDefinition = input.getValue(); + String inputType = inputParameterDefinition.getType(); + if (!inputType.equalsIgnoreCase(PropertyType.LIST.getDisplayName())) { + if (isIdenticalValueProperty(substitutionTemplateInputName)) { + //Handle identical value properties + Object abstractPropertyValue = getPropertyValueFromNodeTemplate( + getIdenticalValuePropertyName(substitutionTemplateInputName), + firstComputeNodeTemplate); + abstractSubstituteProperties.put(substitutionTemplateInputName, abstractPropertyValue); + } + continue; + } + + //Check if the input is of type compute or port + UnifiedCompositionEntity inputUnifiedCompositionEntity = getInputCompositionEntity( + substitutionTemplateInputName); + List<Object> abstractPropertyValue = new ArrayList<>(); + Object propertyValue = null; + switch (inputUnifiedCompositionEntity) { + case Compute: + for (UnifiedCompositionData compositionData : unifiedCompositionDataList) { + ComputeTemplateConsolidationData computeTemplateConsolidationData = + compositionData.getComputeTemplateConsolidationData(); + propertyValue = getComputePropertyValue(substitutionTemplateInputName, + serviceTemplate, computeTemplateConsolidationData); + if (!(propertyValue instanceof Optional)) { + abstractPropertyValue.add(propertyValue); + } + } + break; + case Port: + for (UnifiedCompositionData compositionData : unifiedCompositionDataList) { + ComputeTemplateConsolidationData computeTemplateConsolidationData = compositionData + .getComputeTemplateConsolidationData(); + List<PortTemplateConsolidationData> portTemplateConsolidationDataList = + getPortTemplateConsolidationDataList(compositionData); + //Get the input type for this input whether it is of type + // port_<port_node_template_id>_<property_name> or port_<port_type>_<property_name> + PortInputType portInputType = getPortInputType(substitutionTemplateInputName, + compositionData); + for (PortTemplateConsolidationData portTemplateConsolidationData : + portTemplateConsolidationDataList) { + //Get the port property value + String portNodeTemplateId = portTemplateConsolidationData.getNodeTemplateId(); + propertyValue = getPortPropertyValue(substitutionTemplateInputName, + computeType, portInputType, serviceTemplate, computeTemplateConsolidationData, + portNodeTemplateId); + //If the value object is Optional.empty it implies that the property name was not + // found in the input name + if (!(propertyValue instanceof Optional)) { + abstractPropertyValue.add(propertyValue); + } + } + } + break; + default: + break; + } + abstractSubstituteProperties.put(substitutionTemplateInputName, abstractPropertyValue); + } + return Optional.ofNullable(abstractSubstituteProperties); + } + + private PortInputType getPortInputType(String inputName, + UnifiedCompositionData unifiedCompositionData) { + String portInputPrefix = UnifiedCompositionEntity.Port.name().toLowerCase() + "_"; + ComputeTemplateConsolidationData computeTemplateConsolidationData = unifiedCompositionData + .getComputeTemplateConsolidationData(); + List<PortTemplateConsolidationData> portTemplateConsolidationDataList = + getPortTemplateConsolidationDataList(unifiedCompositionData); + //Scan the available port node template ids to check if the input is of the form + // "port_<port_node_template_id>_<property_name>" + for (PortTemplateConsolidationData portTemplateConsolidationData : + portTemplateConsolidationDataList) { + String portNodeTemplateId = portTemplateConsolidationData.getNodeTemplateId(); + String portNodeTemplateIdPrefix = portInputPrefix + portNodeTemplateId; + if (inputName.startsWith(portNodeTemplateIdPrefix)) { + return PortInputType.NodeTemplateId; + } + } + //Check whether the input is of the form "port_<port_type>_<property_name>" + Set<String> portTypes = computeTemplateConsolidationData.getPorts().keySet(); + for (String portType : portTypes) { + String expectedPortTypeSusbtring = portInputPrefix + portType + "_"; + if (inputName.startsWith(expectedPortTypeSusbtring)) { + return PortInputType.PortType; + } + } + return PortInputType.Other; + } + + private void cleanServiceTemplate(ServiceTemplate serviceTemplate, + EntityConsolidationData entity, + TranslationContext context) { + removeNodeTemplateFromServiceTemplate(serviceTemplate, entity, context); + updateHeatStackGroup(serviceTemplate, entity, context); + } + + private void removeNodeTemplateFromServiceTemplate(ServiceTemplate serviceTemplate, + EntityConsolidationData entity, + TranslationContext context) { + String nodeTemplateIdToRemove = entity.getNodeTemplateId(); + Map<String, NodeTemplate> nodeTemplates = + serviceTemplate.getTopology_template().getNode_templates(); + NodeTemplate nodeTemplateToRemove = + nodeTemplates.get(nodeTemplateIdToRemove); + nodeTemplates.remove(nodeTemplateIdToRemove); + + context.addCleanedNodeTemplate(ToscaUtil.getServiceTemplateFileName(serviceTemplate), + nodeTemplateIdToRemove, + entity.getClass() == ComputeTemplateConsolidationData.class + ? UnifiedCompositionEntity.Compute + : UnifiedCompositionEntity.Port, + nodeTemplateToRemove); + + } + + private void removeCleanedNodeType(String cleanedNodeTemplateId, + ServiceTemplate serviceTemplate, + TranslationContext context) { + NodeTemplate cleanedNodeTemplate = + context + .getCleanedNodeTemplate(ToscaUtil.getServiceTemplateFileName(serviceTemplate), + cleanedNodeTemplateId); + String typeToRemove = cleanedNodeTemplate.getType(); + + if (Objects.nonNull(typeToRemove) + && serviceTemplate.getNode_types().containsKey(typeToRemove)) { + serviceTemplate.getNode_types().remove(typeToRemove); + } + } + + private void updateHeatStackGroup(ServiceTemplate serviceTemplate, + EntityConsolidationData entity, + TranslationContext context) { + Map<String, GroupDefinition> groups = serviceTemplate.getTopology_template() + .getGroups() == null ? new HashMap<>() + : serviceTemplate.getTopology_template().getGroups(); + String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate); + String nodeRelatedAbstractNodeId = + context.getUnifiedAbstractNodeTemplateId(serviceTemplate, entity.getNodeTemplateId()); + + for (Map.Entry<String, GroupDefinition> groupEntry : groups.entrySet()) { + GroupDefinition groupDefinition = groupEntry.getValue(); + if (isHeatStackGroup(groupDefinition.getType())) { + updateGroupMembersWithNewUnifiedNodeTemplateId(entity, nodeRelatedAbstractNodeId, + groupEntry); + } + } + } + + private void updateGroupMembersWithNewUnifiedNodeTemplateId( + EntityConsolidationData entity, + String newNodetemplateId, + Map.Entry<String, GroupDefinition> groupEntry) { + List<String> members = groupEntry.getValue().getMembers(); + if (members.contains(entity.getNodeTemplateId())) { + members.remove(entity.getNodeTemplateId()); + if (!members.contains(newNodetemplateId)) { + members.add(newNodetemplateId); + } + } + groupEntry.getValue().setMembers(members); + } + + private void updateHeatStackGroupNestedComposition(ServiceTemplate serviceTemplate, + EntityConsolidationData entity, + TranslationContext context) { + Map<String, GroupDefinition> groups = serviceTemplate.getTopology_template() + .getGroups() == null ? new HashMap<>() : serviceTemplate.getTopology_template().getGroups(); + String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate); + Optional<String> nestedNodeTemplateId = + context.getUnifiedNestedNodeTemplateId(serviceTemplateFileName, entity.getNodeTemplateId()); + + if (nestedNodeTemplateId.isPresent()) { + for (Map.Entry<String, GroupDefinition> groupEntry : groups.entrySet()) { + GroupDefinition groupDefinition = groupEntry.getValue(); + if (isHeatStackGroup(groupDefinition.getType())) { + updateGroupMembersWithNewUnifiedNodeTemplateId(entity, nestedNodeTemplateId.get(), + groupEntry); + } + } + } + } + + private void handleNestedNodeTemplateInMainServiceTemplate(String nestedNodeTemplateId, + ServiceTemplate mainServiceTemplate, + ServiceTemplate nestedServiceTemplate, + TranslationContext context) { + NodeTemplate nestedNodeTemplate = DataModelUtil.getNodeTemplate(mainServiceTemplate, + nestedNodeTemplateId); + if (Objects.isNull(nestedNodeTemplate)) { + return; + } + + Optional<String> unifiedNestedNodeTypeId = context + .getUnifiedNestedNodeTypeId(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME, + nestedNodeTemplate.getType()); + unifiedNestedNodeTypeId + .ifPresent(unifiedNestedNodeTypeIdVal -> updateNestedNodeTemplate( + unifiedNestedNodeTypeIdVal, nestedNodeTemplateId, nestedNodeTemplate, + mainServiceTemplate, nestedServiceTemplate, context)); + } + + private void handleSubstitutionMappingInNestedServiceTemplate( + String newNestedNodeType, + ServiceTemplate nestedServiceTemplate) { + if (Objects.isNull(newNestedNodeType)) { + return; + } + + SubstitutionMapping substitutionMappings = + nestedServiceTemplate.getTopology_template().getSubstitution_mappings(); + substitutionMappings.setNode_type(newNestedNodeType); + } + + private void updateNestedNodeTemplate(String newNestedNodeTypeId, + String nestedNodeTemplateId, + NodeTemplate nestedNodeTemplate, + ServiceTemplate mainServiceTemplate, + ServiceTemplate nestedServiceTemplate, + TranslationContext context) { + String mainServiceTemplateName = ToscaUtil.getServiceTemplateFileName(mainServiceTemplate); + int index = + context.getHandledNestedComputeNodeTemplateIndex(mainServiceTemplateName, + newNestedNodeTypeId); + String newNodeTemplateId = + Constants.ABSTRACT_NODE_TEMPLATE_ID_PREFIX + getComputeTypeSuffix(newNestedNodeTypeId) + "_" + index; + + nestedNodeTemplate.setType(newNestedNodeTypeId); + mainServiceTemplate.getTopology_template().getNode_templates().remove(nestedNodeTemplateId); + mainServiceTemplate.getTopology_template().getNode_templates() + .put(newNodeTemplateId, nestedNodeTemplate); + + context + .addUnifiedNestedNodeTemplateId(mainServiceTemplateName, + nestedNodeTemplateId, newNodeTemplateId); + } + + private void handleNestedNodeTypesInGlobalSubstituteServiceTemplate( + String origNestedNodeTypeId, + String newNestedNodeTypeId, + ServiceTemplate globalSubstitutionServiceTemplate, + TranslationContext context) { + Map<String, NodeType> nodeTypes = globalSubstitutionServiceTemplate.getNode_types(); + NodeType nested = DataModelUtil.getNodeType(globalSubstitutionServiceTemplate, + origNestedNodeTypeId); + setNewValuesForNestedNodeType(origNestedNodeTypeId, newNestedNodeTypeId, nested, nodeTypes); + context.addUnifiedNestedNodeTypeId(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME, + origNestedNodeTypeId, newNestedNodeTypeId); + } + + private void setNewValuesForNestedNodeType(String origNestedNodeType, + String newNestedNodeTypeId, + NodeType nested, + Map<String, NodeType> nodeTypes) { + if (Objects.nonNull(nested)) { + nested.setDerived_from(ToscaNodeType.VFC_ABSTRACT_SUBSTITUTE); + nodeTypes.remove(origNestedNodeType); + nodeTypes.put(newNestedNodeTypeId, nested); + } + } + + private Optional<String> getNewNestedNodeTypeId(ServiceTemplate mainServiceTemplate, + ServiceTemplate nestedServiceTemplate, + TranslationContext context) { + FileComputeConsolidationData fileComputeConsolidationData = + context.getConsolidationData().getComputeConsolidationData() + .getFileComputeConsolidationData( + ToscaUtil.getServiceTemplateFileName(nestedServiceTemplate)); + + if (Objects.nonNull(fileComputeConsolidationData)) { + String nestedNodeTypePrefix = ToscaNodeType.ABSTRACT_NODE_TYPE_PREFIX + "heat."; + return Optional + .of(nestedNodeTypePrefix + getComputeTypeInNestedFile(fileComputeConsolidationData)); + } + return Optional.empty(); + } + + private String getComputeTypeInNestedFile( + FileComputeConsolidationData fileComputeConsolidationData) { + List<TypeComputeConsolidationData> typeComputeConsolidationDatas = + new ArrayList<>(fileComputeConsolidationData.getAllTypeComputeConsolidationData()); + if (typeComputeConsolidationDatas.size() == 0) { + return null; + } else { + String computeNodeType = fileComputeConsolidationData.getAllComputeTypes().iterator().next(); + return getComputeTypeSuffix(computeNodeType); + } + } + + private void handleGetAttrInAbstractNodeTemplate(ServiceTemplate serviceTemplate, + TranslationContext context, + String serviceTemplateFileName, + NodeTemplate abstractNodeTemplate) { + Map<String, Object> properties = + abstractNodeTemplate == null || abstractNodeTemplate.getProperties() == null + ? new HashMap<>() + : abstractNodeTemplate.getProperties(); + for (Object propertyValue : properties.values()) { + List<List<Object>> getAttrList = extractGetAttrFunction(propertyValue); + for (List<Object> getAttrFuncValue : getAttrList) { + String origNodeTemplateId = (String) getAttrFuncValue.get(0); + Optional<String> nestedNodeTemplateId = context.getUnifiedNestedNodeTemplateId(ToscaUtil + .getServiceTemplateFileName(serviceTemplate), origNodeTemplateId); + if (nestedNodeTemplateId.isPresent()) { + getAttrFuncValue.set(0, nestedNodeTemplateId.get()); + } else { + replaceGetAttrNodeIdAndAttrName(serviceTemplate, context, serviceTemplateFileName, + getAttrFuncValue); + } + } + } + } + + private void replaceGetAttrNodeIdAndAttrName(ServiceTemplate serviceTemplate, + TranslationContext context, + String serviceTemplateFileName, + List<Object> getAttrFuncValue) { + String origNodeTemplateId = (String) getAttrFuncValue.get(0); + String attributeName = (String) getAttrFuncValue.get(1); + + String unifiedAbstractNodeTemplateId = + context.getUnifiedAbstractNodeTemplateId(serviceTemplate, origNodeTemplateId); + + if (Objects.isNull(unifiedAbstractNodeTemplateId)) { + return; + } + + String newNodeTemplateId = + getNewNodeTemplateId(origNodeTemplateId, serviceTemplateFileName, serviceTemplate, context); + + String newSubstitutionOutputParameterId = + getNewSubstitutionOutputParameterId(newNodeTemplateId, attributeName); + + getAttrFuncValue.set(0, unifiedAbstractNodeTemplateId); + getAttrFuncValue.set(1, newSubstitutionOutputParameterId); + } + + private NodeTemplate getComputeNodeTemplate(String origNodeTemplateId, + ServiceTemplate serviceTemplate, + TranslationContext context) { + NodeTemplate computeNodeTemplate = + DataModelUtil.getNodeTemplate(serviceTemplate, origNodeTemplateId); + if (computeNodeTemplate == null) { + computeNodeTemplate = + context.getCleanedNodeTemplate(ToscaUtil.getServiceTemplateFileName(serviceTemplate), + origNodeTemplateId); + } + return computeNodeTemplate; + } + + private String handleIdOfPort(String origNodeTemplateId, String serviceTemplateFileName, + ConsolidationData consolidationData) { + Optional<Pair<String, ComputeTemplateConsolidationData>> + computeTypeAndComputeTemplateByPortId = + getComputeTypeAndComputeTemplateByPortId(origNodeTemplateId, serviceTemplateFileName, + consolidationData); + if (computeTypeAndComputeTemplateByPortId.isPresent()) { + Pair<String, ComputeTemplateConsolidationData> computeIdToComputeData = + computeTypeAndComputeTemplateByPortId.get(); + return getNewPortNodeTemplateId(origNodeTemplateId, computeIdToComputeData.getKey(), + computeIdToComputeData.getValue()); + } + + return null; + } + + private Optional<Pair<String, ComputeTemplateConsolidationData>> + getComputeTypeAndComputeTemplateByPortId(String portId, String serviceTemplateFileName, + ConsolidationData consolidationData) { + FileComputeConsolidationData fileComputeConsolidationData = + consolidationData.getComputeConsolidationData() + .getFileComputeConsolidationData(serviceTemplateFileName); + Set<String> computeTypes = + fileComputeConsolidationData.getAllComputeTypes(); + + for (String computeType : computeTypes) { + Collection<ComputeTemplateConsolidationData> computeTemplateConsolidationDatas = + fileComputeConsolidationData.getTypeComputeConsolidationData(computeType) + .getAllComputeTemplateConsolidationData(); + + for (ComputeTemplateConsolidationData compute : computeTemplateConsolidationDatas) { + if (ConsolidationDataUtil.isComputeReferenceToPortId(compute, portId)) { + return Optional.of(new ImmutablePair<>(computeType, compute)); + } + } + } + + return Optional.empty(); + } + + private boolean isIdIsOfExpectedType(String id, + UnifiedCompositionEntity expectedUnifiedCompositionEntity, + String serviceTemplateFileName, + ConsolidationData consolidationData, + TranslationContext context) { + UnifiedSubstitutionData unifiedSubstitutionData = + context.getUnifiedSubstitutionData().get(serviceTemplateFileName); + if (Objects.isNull(unifiedSubstitutionData)) { + return false; + } + + UnifiedCompositionEntity actualUnifiedCompositionEntity = + unifiedSubstitutionData.getCleanedNodeTemplateCompositionEntity(id); + + return actualUnifiedCompositionEntity == null ? false + : actualUnifiedCompositionEntity.equals(expectedUnifiedCompositionEntity); + } + + private boolean isHeatStackGroup(String groupType) { + return groupType.equals(ToscaGroupType.HEAT_STACK); + } + + private Object getPortPropertyValue(String inputName, + String computeType, + PortInputType portInputType, + ServiceTemplate serviceTemplate, + ComputeTemplateConsolidationData + computeTemplateConsolidationData, + String portNodeTemplateId) { + //Get the input prefix to extract the property name from the input name + String portInputPrefix = getPortInputPrefix(computeTemplateConsolidationData, + portNodeTemplateId, portInputType); + //Get the property name from the input + Optional<String> propertyName = getPropertyNameFromInput(inputName, + UnifiedCompositionEntity.Port, computeType, portInputPrefix); + //Get the property value from the node template + if (propertyName.isPresent()) { + NodeTemplate portNodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate, + portNodeTemplateId); + return getPropertyValueFromNodeTemplate(propertyName.get(), portNodeTemplate); + } + return Optional.empty(); + } + + private Optional<String> getPortTypeFromInput( + String inputName, + String portNodeTemplateId, + ComputeTemplateConsolidationData computeTemplateConsolidationData) { + String portTypeFromInput = null; + String portInputPrefix = UnifiedCompositionEntity.Port.name().toLowerCase() + "_"; + String portNodeTemplateIdPrefix = portInputPrefix + portNodeTemplateId; + if (inputName.startsWith(portNodeTemplateIdPrefix)) { + return Optional.empty(); + } + Set<String> portTypes = computeTemplateConsolidationData.getPorts().keySet(); + for (String portType : portTypes) { + String expectedPortTypeSusbtring = "_" + portType + "_"; + if (inputName.contains(expectedPortTypeSusbtring)) { + portTypeFromInput = portType; + break; + } + } + return Optional.ofNullable(portTypeFromInput); + } + + private Object getComputePropertyValue( + String inputName, + ServiceTemplate serviceTemplate, + ComputeTemplateConsolidationData computeTemplateConsolidationData) { + NodeTemplate nodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate, + computeTemplateConsolidationData.getNodeTemplateId()); + String nodeType = getComputeTypeSuffix(nodeTemplate.getType()); + Optional<String> propertyName = + getPropertyNameFromInput(inputName, UnifiedCompositionEntity.Compute, nodeType, null); + if (propertyName.isPresent()) { + return getPropertyValueFromNodeTemplate(propertyName.get(), nodeTemplate); + } + return Optional.empty(); + } + + private UnifiedCompositionEntity getInputCompositionEntity(String inputName) { + UnifiedCompositionEntity inputCompositionEntity = UnifiedCompositionEntity.Other; + String inputType = inputName.substring(0, inputName.indexOf('_')); + if (inputType.equals(UnifiedCompositionEntity.Compute.name().toLowerCase())) { + inputCompositionEntity = UnifiedCompositionEntity.Compute; + } else if (inputType.equals(UnifiedCompositionEntity.Port.name().toLowerCase())) { + inputCompositionEntity = UnifiedCompositionEntity.Port; + } + return inputCompositionEntity; + } + + private Optional<String> getPropertyNameFromInput( + String inputName, + UnifiedCompositionEntity compositionEntity, + String computeType, String portInputPrefix) { + String propertyName = null; + switch (compositionEntity) { + case Compute: + propertyName = inputName.substring(inputName.lastIndexOf(computeType) + + computeType.length() + 1); + break; + case Port: + if (inputName.startsWith(portInputPrefix)) { + propertyName = inputName.split(portInputPrefix)[1]; + } + break; + default: + break; + } + return Optional.ofNullable(propertyName); + } + + private String getPortInputPrefix( + ComputeTemplateConsolidationData computeTemplateConsolidationData, + String portNodeTemplateId, + PortInputType portInputType) { + String portInputPrefix = UnifiedCompositionEntity.Port.name().toLowerCase() + "_"; + String portType = ConsolidationDataUtil.getPortType(portNodeTemplateId); + if (portInputType == PortInputType.NodeTemplateId) { + portInputPrefix += portNodeTemplateId + "_"; + } else if (portInputType == PortInputType.PortType) { + portInputPrefix += portType + "_"; + } + return portInputPrefix; + } + + private boolean isIdenticalValueProperty(String inputName) { + StringBuilder builder = new StringBuilder(IDENTICAL_VALUE_PROPERTY_PREFIX); + builder.append("[a-z]+"); + builder.append(IDENTICAL_VALUE_PROPERTY_SUFFIX); + boolean isMatchingProperty = Pattern.matches(builder.toString(), inputName); + List<String> identicalValuePropertyList = consolidationService.getPropertiesWithIdenticalVal(); + if (isMatchingProperty + && identicalValuePropertyList.contains(getIdenticalValuePropertyName(inputName))) { + return true; + } + return false; + } + + private String getIdenticalValuePropertyName(String input) { + return input.split("_")[1]; + } + + private Object getPropertyValueFromNodeTemplate(String propertyName, NodeTemplate nodeTemplate) { + Map<String, Object> nodeTemplateProperties = nodeTemplate.getProperties(); + if (nodeTemplateProperties != null) { + Object propertyValue = nodeTemplateProperties.get(propertyName); + propertyValue = getClonedObject(propertyValue); + return propertyValue; + } + return null; + } + + private <T> Object getClonedObject(Object objectValue, Class<T> clazz) { + YamlUtil yamlUtil = new YamlUtil(); + Object clonedObjectValue; + String objectToYaml = yamlUtil.objectToYaml(objectValue); + clonedObjectValue = yamlUtil.yamlToObject(objectToYaml, clazz); + return clonedObjectValue; + } + + private Object getClonedObject(Object objectValue) { + Object clonedObjectValue; + try { + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream); + objectOutputStream.writeObject(objectValue); + + ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream + .toByteArray()); + ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream); + clonedObjectValue = objectInputStream.readObject(); + } catch (NotSerializableException ex) { + return getClonedObject(objectValue, objectValue.getClass()); + } catch (IOException ioe) { + return null; + } catch (ClassNotFoundException cnfe) { + return null; + } + return clonedObjectValue; + } + + private Map<String, UnifiedCompositionEntity> getAllConsolidationNodeTemplateIdAndType( + List<UnifiedCompositionData> unifiedCompositionDataList) { + + Map<String, UnifiedCompositionEntity> consolidationNodeTemplateIdAndType = new HashMap<>(); + for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) { + ComputeTemplateConsolidationData computeTemplateConsolidationData = + unifiedCompositionData.getComputeTemplateConsolidationData(); + if (Objects.nonNull(computeTemplateConsolidationData)) { + consolidationNodeTemplateIdAndType + .put(computeTemplateConsolidationData.getNodeTemplateId(), + UnifiedCompositionEntity.Compute); + } + List<PortTemplateConsolidationData> portTemplateConsolidationDataList = + getPortTemplateConsolidationDataList(unifiedCompositionData); + for (PortTemplateConsolidationData portTemplateConsolidationData : + portTemplateConsolidationDataList) { + consolidationNodeTemplateIdAndType.put(portTemplateConsolidationData.getNodeTemplateId(), + UnifiedCompositionEntity.Port); + } + NestedTemplateConsolidationData nestedTemplateConsolidationData = + unifiedCompositionData.getNestedTemplateConsolidationData(); + if (Objects.nonNull(nestedTemplateConsolidationData)) { + consolidationNodeTemplateIdAndType + .put(nestedTemplateConsolidationData.getNodeTemplateId(), + UnifiedCompositionEntity.Nested); + } + } + return consolidationNodeTemplateIdAndType; + } + + private enum PortInputType { + NodeTemplateId, + PortType, + Other; + } + + private List<PortTemplateConsolidationData> getPortTemplateConsolidationDataList( + UnifiedCompositionData unifiedCompositionData) { + return unifiedCompositionData.getPortTemplateConsolidationDataList() == null ? new + ArrayList<>() : unifiedCompositionData.getPortTemplateConsolidationDataList(); + } +} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/UnifiedCompositionUtil.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/UnifiedCompositionUtil.java new file mode 100644 index 0000000000..4d08176943 --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/UnifiedCompositionUtil.java @@ -0,0 +1,55 @@ +package org.openecomp.sdc.translator.services.heattotosca; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.MapUtils; +import org.openecomp.sdc.logging.api.Logger; +import org.openecomp.sdc.logging.api.LoggerFactory; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.UnifiedCompositionData; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.ComputeTemplateConsolidationData; + +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * Utility class for consolidation data collection helper methods. + */ +public class UnifiedCompositionUtil { + + protected static Logger logger = (Logger) LoggerFactory.getLogger(UnifiedCompositionUtil.class); + + /** + * Gets all ports per port type, which are connected to the computes from the input + * computeTemplateConsolidationDataCollection. + * + * @param computeTemplateConsolidationDataCollection collection of compute template + * consolidation data + * @return set of port ids, per port type + */ + public static Map<String, Set<String>> collectAllPortsFromEachTypesFromComputes( + Collection<ComputeTemplateConsolidationData> computeTemplateConsolidationDataCollection) { + Map<String, Set<String>> portTypeToIds = new HashMap<>(); + + for (ComputeTemplateConsolidationData compute : computeTemplateConsolidationDataCollection) { + Map<String, List<String>> ports = compute.getPorts(); + if (!MapUtils.isEmpty(ports)) { + addPortsToMap(portTypeToIds, ports); + } + } + + return portTypeToIds; + } + + private static void addPortsToMap(Map<String, Set<String>> portTypeToIds, + Map<String, List<String>> ports) { + for (Map.Entry<String, List<String>> portTypeToIdEntry : ports.entrySet()) { + portTypeToIds.putIfAbsent(portTypeToIdEntry.getKey(), new HashSet<>()); + portTypeToIds.get(portTypeToIdEntry.getKey()).addAll(portTypeToIdEntry.getValue()); + } + } + + +} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/errors/IncorrectResourceReferenceErrorBuilder.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/errors/IncorrectResourceReferenceErrorBuilder.java index c713855f60..fddf2a82d8 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/errors/IncorrectResourceReferenceErrorBuilder.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/errors/IncorrectResourceReferenceErrorBuilder.java @@ -23,11 +23,12 @@ package org.openecomp.sdc.translator.services.heattotosca.errors; import org.openecomp.sdc.common.errors.BaseErrorBuilder; import org.openecomp.sdc.common.errors.ErrorCategory; + public class IncorrectResourceReferenceErrorBuilder extends BaseErrorBuilder { private static final String INCORRECT_RESOURCE_REFERENCE_MSG = "resource id '%s' with type '%s' has reference to resource '%s' with" - + " type '%s' in property '%s'. Invalid type, resource type should be type of '%s'."; + + " type '%s' in property '%s'. Invalid type, resource type should be type of '%s'."; /** * Instantiates a new Incorrect resource reference error builder. diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/errors/NotInSyncNumberOfInterfacesErrorBuilder.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/errors/NotInSyncNumberOfInterfacesErrorBuilder.java index 810c09880e..ae903946e4 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/errors/NotInSyncNumberOfInterfacesErrorBuilder.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/errors/NotInSyncNumberOfInterfacesErrorBuilder.java @@ -28,7 +28,7 @@ public class NotInSyncNumberOfInterfacesErrorBuilder extends BaseErrorBuilder { private static final String NOT_IN_SYNC_NUMBER_OF_INTERFACES_MSG = "More than one ServiceInstance pointing to the same " - + "ServiceTemplate '%s', with different number of interfaces."; + + "ServiceTemplate '%s', with different number of interfaces."; /** * Instantiates a new Not in sync number of interfaces error builder. diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/errors/ReferenceToUnsupportedResourceErrorBuilder.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/errors/ReferenceToUnsupportedResourceErrorBuilder.java index 5b48cb2c59..dc41e5d207 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/errors/ReferenceToUnsupportedResourceErrorBuilder.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/errors/ReferenceToUnsupportedResourceErrorBuilder.java @@ -27,8 +27,8 @@ import org.openecomp.sdc.common.errors.ErrorCategory; public class ReferenceToUnsupportedResourceErrorBuilder extends BaseErrorBuilder { private static final String REFERENCE_TO_UNSUPPORTED_RESOURCE_MSG = - "Resource id '%s' with type '%s' has reference to" - + " unsupported resource '%s' with type '%s' in property '%s'"; + "Resource id '%s' with type '%s' has reference " + + "to unsupported resource '%s' with type '%s' in property '%s'"; /** * Instantiates a new Reference to unsupported resource error builder. diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/errors/TranslatorErrorCodes.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/errors/TranslatorErrorCodes.java index f9b873adca..bfcf834ae1 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/errors/TranslatorErrorCodes.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/errors/TranslatorErrorCodes.java @@ -20,6 +20,7 @@ package org.openecomp.sdc.translator.services.heattotosca.errors; + public class TranslatorErrorCodes { public static final String MISSING_MANDATORY_PROPERTY = "MISSING_MANDATORY_PROPERTY"; public static final String HEAT_TO_TOSCA_MAPPING_COLLISION = "HEAT_TO_TOSCA_MAPPING_COLLISION"; diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/AbstractSubstituteGlobalType.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/AbstractSubstituteGlobalType.java deleted file mode 100644 index 221a9e522b..0000000000 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/AbstractSubstituteGlobalType.java +++ /dev/null @@ -1,167 +0,0 @@ -/*- - * ============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.services.heattotosca.globaltypes; - -import org.openecomp.sdc.tosca.datatypes.ToscaDataType; -import org.openecomp.sdc.tosca.datatypes.ToscaNodeType; -import org.openecomp.sdc.tosca.datatypes.model.Constraint; -import org.openecomp.sdc.tosca.datatypes.model.DataType; -import org.openecomp.sdc.tosca.datatypes.model.NodeType; -import org.openecomp.sdc.tosca.datatypes.model.PropertyDefinition; -import org.openecomp.sdc.tosca.datatypes.model.PropertyType; -import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; -import org.openecomp.sdc.tosca.services.DataModelUtil; -import org.openecomp.sdc.tosca.services.ToscaConstants; -import org.openecomp.sdc.translator.services.heattotosca.Constants; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - - -public class AbstractSubstituteGlobalType { - - private AbstractSubstituteGlobalType() { - } - - /** - * Create service template service template. - * - * @return the service template - */ - public static ServiceTemplate createServiceTemplate() { - ServiceTemplate serviceTemplate = new ServiceTemplate(); - serviceTemplate.setTosca_definitions_version(ToscaConstants.TOSCA_DEFINITIONS_VERSION); - serviceTemplate.setMetadata( - DataModelUtil.createMetadata(Constants.ABSTRACT_SUBSTITUTE_TEMPLATE_NAME, "1.0.0", null)); - serviceTemplate.setImports(GlobalTypesUtil.createCommonImportList()); - serviceTemplate.setDescription("Abstract Substitute Global Types"); - serviceTemplate.setData_types(createGlobalDataTypes()); - serviceTemplate.setNode_types(createGlobalNodeTypes()); - return serviceTemplate; - } - - private static Map<String, NodeType> createGlobalNodeTypes() { - Map<String, NodeType> globalNodeTypes = new HashMap<>(); - globalNodeTypes.put(ToscaNodeType.ABSTRACT_SUBSTITUTE.getDisplayName(), - createAbstractSubstituteNodeType()); - return globalNodeTypes; - } - - private static NodeType createAbstractSubstituteNodeType() { - NodeType nodeType = new NodeType(); - nodeType.setDerived_from(ToscaNodeType.ROOT.getDisplayName()); - nodeType.setProperties(createAbstractSubstituteProperties()); - return nodeType; - } - - private static Map<String, PropertyDefinition> createAbstractSubstituteProperties() { - Map<String, PropertyDefinition> props = new HashMap<>(); - props.put(ToscaConstants.SERVICE_TEMPLATE_FILTER_PROPERTY_NAME, DataModelUtil - .createPropertyDefinition(ToscaDataType.SUBSTITUTION_FILTERING.getDisplayName(), - "Substitution Filter", true, null, null, null, null)); - - return props; - } - - - private static Map<String, DataType> createGlobalDataTypes() { - Map<String, DataType> globalDataTypes = new HashMap<>(); - globalDataTypes.put(ToscaDataType.SUBSTITUTION_FILTER.getDisplayName(), - createSubstitutionFilterDataType()); - globalDataTypes.put(ToscaDataType.SUBSTITUTION_FILTERING.getDisplayName(), - createSubstitutionFilteringDataType()); - return globalDataTypes; - } - - private static DataType createSubstitutionFilterDataType() { - DataType dataType = new DataType(); - dataType.setDerived_from(ToscaDataType.ROOT.getDisplayName()); - dataType.setDescription("Substitution Filter"); - Map<String, PropertyDefinition> properties = new HashMap<>(); - properties.put(ToscaConstants.COUNT_PROPERTY_NAME, DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "Count", false, null, null, - null, 1)); - properties.put(ToscaConstants.SCALING_ENABLED_PROPERTY_NAME, DataModelUtil - .createPropertyDefinition(PropertyType.BOOLEAN.getDisplayName(), - "Indicates whether service scaling is enabled", false, null, null, null, true)); - properties.put(ToscaConstants.SUBSTITUTE_SERVICE_TEMPLATE_PROPERTY_NAME, DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "Substitute Service Template", true, null, null, null, null)); - properties.put("mandatory", DataModelUtil - .createPropertyDefinition(PropertyType.BOOLEAN.getDisplayName(), "Mandatory", false, null, - null, null, true)); - properties.put("index_variable", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "Index variable", false, - createMinLengthConstraint(), null, null, "%index%")); - - dataType.setProperties(properties); - return dataType; - } - - private static List<Constraint> createMinLengthConstraint() { - List<Constraint> constraints; - constraints = new ArrayList<>(); - Constraint constraint = new Constraint(); - constraint.setMin_length(3); - constraints.add(constraint); - return constraints; - } - - private static DataType createSubstitutionFilteringDataType() { - DataType dataType = new DataType(); - dataType.setDerived_from(ToscaDataType.ROOT.getDisplayName()); - dataType.setDescription("Substitution Filter"); - Map<String, PropertyDefinition> properties = new HashMap<>(); - properties.put(ToscaConstants.COUNT_PROPERTY_NAME, DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "Count", false, null, null, - null, 1)); - properties.put(ToscaConstants.INDEX_VALUE_PROPERTY_NAME, DataModelUtil - .createPropertyDefinition(PropertyType.INTEGER.getDisplayName(), - "Index value of the substitution service template runtime instance", false, - createIndexValueConstraint(), null, null, 0)); - properties.put(ToscaConstants.SCALING_ENABLED_PROPERTY_NAME, DataModelUtil - .createPropertyDefinition(PropertyType.BOOLEAN.getDisplayName(), - "Indicates whether service scaling is enabled", false, null, null, null, true)); - properties.put(ToscaConstants.SUBSTITUTE_SERVICE_TEMPLATE_PROPERTY_NAME, DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "Substitute Service Template", true, null, null, null, null)); - properties.put("mandatory", DataModelUtil - .createPropertyDefinition(PropertyType.BOOLEAN.getDisplayName(), "Mandatory", false, null, - null, null, true)); - - - dataType.setProperties(properties); - return dataType; - } - - private static List<Constraint> createIndexValueConstraint() { - List<Constraint> constraints; - constraints = new ArrayList<>(); - Constraint constraint = new Constraint(); - constraint.setGreater_or_equal(0); - constraints.add(constraint); - return constraints; - } - - -} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/CinderVolumeGlobalType.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/CinderVolumeGlobalType.java deleted file mode 100644 index 72f3043225..0000000000 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/CinderVolumeGlobalType.java +++ /dev/null @@ -1,242 +0,0 @@ -/*- - * ============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.services.heattotosca.globaltypes; - -import org.openecomp.sdc.tosca.datatypes.ToscaNodeType; -import org.openecomp.sdc.tosca.datatypes.ToscaRelationshipType; -import org.openecomp.sdc.tosca.datatypes.model.AttributeDefinition; -import org.openecomp.sdc.tosca.datatypes.model.Constraint; -import org.openecomp.sdc.tosca.datatypes.model.NodeType; -import org.openecomp.sdc.tosca.datatypes.model.PropertyDefinition; -import org.openecomp.sdc.tosca.datatypes.model.PropertyType; -import org.openecomp.sdc.tosca.datatypes.model.RelationshipType; -import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; -import org.openecomp.sdc.tosca.services.DataModelUtil; -import org.openecomp.sdc.tosca.services.ToscaConstants; -import org.openecomp.sdc.translator.services.heattotosca.Constants; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class CinderVolumeGlobalType { - - /** - * Create service template service template. - * - * @return the service template - */ - public static ServiceTemplate createServiceTemplate() { - ServiceTemplate cinderVolumeServiceTemplate = new ServiceTemplate(); - cinderVolumeServiceTemplate - .setTosca_definitions_version(ToscaConstants.TOSCA_DEFINITIONS_VERSION); - cinderVolumeServiceTemplate.setMetadata( - DataModelUtil.createMetadata(Constants.CINDER_VOLUME_TEMPLATE_NAME, "1.0.0", null)); - cinderVolumeServiceTemplate.setDescription("Cinder Volume TOSCA Global Types"); - cinderVolumeServiceTemplate.setRelationship_types(createGlobalRelationshipTypes()); - cinderVolumeServiceTemplate.setNode_types(createGlobalNodeTypes()); - return cinderVolumeServiceTemplate; - } - - private static Map<String, NodeType> createGlobalNodeTypes() { - Map<String, NodeType> globalNodeTypes = new HashMap<>(); - globalNodeTypes.put(ToscaNodeType.CINDER_VOLUME.getDisplayName(), createCinderVolumeNodeType()); - return globalNodeTypes; - } - - private static NodeType createCinderVolumeNodeType() { - NodeType cinderVolumeNodeType = new NodeType(); - cinderVolumeNodeType.setDerived_from(ToscaNodeType.BLOCK_STORAGE.getDisplayName()); - cinderVolumeNodeType.setProperties(createCinderVolumeProperties()); - cinderVolumeNodeType.setAttributes(createCinderVolumeAttributes()); - return cinderVolumeNodeType; - } - - private static Map<String, RelationshipType> createGlobalRelationshipTypes() { - Map<String, RelationshipType> globalRelationshipTypes = new HashMap<>(); - globalRelationshipTypes.put(ToscaRelationshipType.CINDER_VOLUME_ATTACHES_TO.getDisplayName(), - createCinderVolumeAttachesToRelationshipType()); - return globalRelationshipTypes; - } - - private static RelationshipType createCinderVolumeAttachesToRelationshipType() { - RelationshipType cinderVolumeAttachesToRelationType = new RelationshipType(); - cinderVolumeAttachesToRelationType - .setDerived_from(ToscaRelationshipType.NATIVE_ATTACHES_TO.getDisplayName()); - cinderVolumeAttachesToRelationType - .setDescription("This type represents an attachment relationship for associating volume"); - - Map<String, PropertyDefinition> cinderVolumeAttachesToProps = new HashMap<>(); - cinderVolumeAttachesToProps.put("location", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "The location where the volume is exposed on the instance, mountpoint", false, null, - null, null, null)); //overridden location prop from attachesTo - cinderVolumeAttachesToProps.put("instance_uuid", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "The ID of the server to which the volume attaches", true, null, null, null, null)); - cinderVolumeAttachesToProps.put("volume_id", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "The ID of the volume to be attached", true, null, null, null, null)); - cinderVolumeAttachesToRelationType.setProperties(cinderVolumeAttachesToProps); - - Map<String, AttributeDefinition> cinderVolumeAttachesToAttributes = new HashMap<>(); - cinderVolumeAttachesToAttributes.put("show", DataModelUtil - .createAttributeDefinition(PropertyType.STRING.getDisplayName(), - "Detailed information about resource", null, null, null)); - cinderVolumeAttachesToRelationType.setAttributes(cinderVolumeAttachesToAttributes); - - return cinderVolumeAttachesToRelationType; - } - - private static Map<String, PropertyDefinition> createCinderVolumeProperties() { - Map<String, PropertyDefinition> cinderVolumePropertyDefMap = new HashMap<>(); - cinderVolumePropertyDefMap.put("availability_zone", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "The availability zone in which the volume will be created", false, null, null, null, - null)); - cinderVolumePropertyDefMap.put("backup_id", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "If specified, the backup to create the volume from", false, null, null, null, null)); - cinderVolumePropertyDefMap.put(Constants.DESCRIPTION_PROPERTY_NAME, DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "A description of the volume", false, null, null, null, null)); - cinderVolumePropertyDefMap.put("image", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "If specified, the name or ID of the image to create the volume from", false, null, - null, null, null)); - cinderVolumePropertyDefMap.put("metadata", DataModelUtil - .createPropertyDefinition(PropertyType.MAP.getDisplayName(), - "Key/value pairs to associate with the volume", false, null, null, - DataModelUtil.createEntrySchema(PropertyType.STRING.getDisplayName(), null, null), - null)); - cinderVolumePropertyDefMap.put("multiattach", DataModelUtil - .createPropertyDefinition(PropertyType.BOOLEAN.getDisplayName(), - "Whether allow the volume to be attached more than once", false, null, null, null, - null)); - cinderVolumePropertyDefMap.put(Constants.NAME_PROPERTY_NAME, DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "A name used to distinguish the volume", false, null, null, null, null)); - cinderVolumePropertyDefMap.put("read_only", DataModelUtil - .createPropertyDefinition(PropertyType.BOOLEAN.getDisplayName(), - "Enables or disables read-only access mode of volume", false, null, null, null, null)); - cinderVolumePropertyDefMap.put("scheduler_hints", DataModelUtil - .createPropertyDefinition(PropertyType.MAP.getDisplayName(), - "Arbitrary key-value pairs specified by the client " - + "to help the Cinder scheduler creating a volume", - false, null, null, - DataModelUtil.createEntrySchema(PropertyType.STRING.getDisplayName(), null, null), - null)); - cinderVolumePropertyDefMap.put("size", DataModelUtil - .createPropertyDefinition(PropertyType.SCALAR_UNIT_SIZE.getDisplayName(), - "The requested storage size (default unit is MB)", false, getSizeConstraints(), null, - null, null)); - cinderVolumePropertyDefMap.put("source_volid", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "If specified, the volume to use as source", false, null, null, null, null)); - cinderVolumePropertyDefMap.put("volume_type", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "If specified, the type of volume to use, mapping to a specific backend", false, null, - null, null, null)); - cinderVolumePropertyDefMap.put("delete_on_termination", DataModelUtil - .createPropertyDefinition(PropertyType.BOOLEAN.getDisplayName(), - "Indicate whether the volume should be deleted when the server is terminated", false, - null, null, null, null)); - cinderVolumePropertyDefMap.put("boot_index", DataModelUtil - .createPropertyDefinition(PropertyType.INTEGER.getDisplayName(), - "Integer used for ordering the boot disks", false, null, null, null, null)); - cinderVolumePropertyDefMap.put("device_type", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "Device type", false, - getDeviceTypeConstraints(), null, null, null)); - cinderVolumePropertyDefMap.put("disk_bus", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "Bus of the device: hypervisor driver chooses a suitable default if omitted", false, - getDiskBusConstraints(), null, null, null)); - cinderVolumePropertyDefMap.put("swap_size", DataModelUtil - .createPropertyDefinition(PropertyType.SCALAR_UNIT_SIZE.getDisplayName(), - "The size of the swap, in MB", false, null, null, null, null)); - - return cinderVolumePropertyDefMap; - } - - private static Map<String, AttributeDefinition> createCinderVolumeAttributes() { - Map<String, AttributeDefinition> cinderVolumeAttributesDefMap = new HashMap<>(); - cinderVolumeAttributesDefMap.put("attachments", DataModelUtil - .createAttributeDefinition(PropertyType.STRING.getDisplayName(), - "The list of attachments of the volume", null, - DataModelUtil.createEntrySchema(PropertyType.STRING.getDisplayName(), null, null), - null)); - cinderVolumeAttributesDefMap.put("bootable", DataModelUtil - .createAttributeDefinition(PropertyType.BOOLEAN.getDisplayName(), - "Boolean indicating if the volume can be booted or not", null, null, null)); - cinderVolumeAttributesDefMap.put("created_at", DataModelUtil - .createAttributeDefinition(PropertyType.TIMESTAMP.getDisplayName(), - "The timestamp indicating volume creation", null, null, null)); - cinderVolumeAttributesDefMap.put("display_description", DataModelUtil - .createAttributeDefinition(PropertyType.STRING.getDisplayName(), - "Description of the volume", null, null, null)); - cinderVolumeAttributesDefMap.put("display_name", DataModelUtil - .createAttributeDefinition(PropertyType.STRING.getDisplayName(), "Name of the volume", null, - null, null)); - cinderVolumeAttributesDefMap.put("encrypted", DataModelUtil - .createAttributeDefinition(PropertyType.BOOLEAN.getDisplayName(), - "Boolean indicating if the volume is encrypted or not", null, null, null)); - cinderVolumeAttributesDefMap.put("metadata_values", DataModelUtil - .createAttributeDefinition(PropertyType.MAP.getDisplayName(), - "Key/value pairs associated with the volume in raw dict form", null, - DataModelUtil.createEntrySchema(PropertyType.STRING.getDisplayName(), null, null), - null)); - cinderVolumeAttributesDefMap.put("show", DataModelUtil - .createAttributeDefinition(PropertyType.STRING.getDisplayName(), - "Detailed information about resource", null, null, null)); - cinderVolumeAttributesDefMap.put("status", DataModelUtil - .createAttributeDefinition(PropertyType.STRING.getDisplayName(), - "The current status of the volume", null, null, null)); - return cinderVolumeAttributesDefMap; - } - - private static List<Constraint> getDeviceTypeConstraints() { - Constraint validValues; - List<Constraint> constraints = new ArrayList<>(); - validValues = DataModelUtil.createValidValuesConstraint("cdrom", "disk"); - constraints.add(validValues); - return constraints; - } - - private static List<Constraint> getDiskBusConstraints() { - Constraint validValues; - List<Constraint> constraints = new ArrayList<>(); - validValues = - DataModelUtil.createValidValuesConstraint("ide", "lame_bus", "scsi", "usb", "virtio"); - constraints.add(validValues); - return constraints; - } - - - private static List<Constraint> getSizeConstraints() { - List<Constraint> constraints; - constraints = new ArrayList<>(); - Constraint constraint = new Constraint(); - constraint.setGreater_or_equal("1 GB"); - constraints.add(constraint); - return constraints; - } -} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/CommonGlobalTypes.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/CommonGlobalTypes.java deleted file mode 100644 index 43a4782149..0000000000 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/CommonGlobalTypes.java +++ /dev/null @@ -1,500 +0,0 @@ -/*- - * ============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.services.heattotosca.globaltypes; - - -import org.openecomp.sdc.tosca.datatypes.ToscaCapabilityType; -import org.openecomp.sdc.tosca.datatypes.ToscaDataType; -import org.openecomp.sdc.tosca.datatypes.ToscaGroupType; -import org.openecomp.sdc.tosca.datatypes.ToscaPolicyType; -import org.openecomp.sdc.tosca.datatypes.ToscaRelationshipType; -import org.openecomp.sdc.tosca.datatypes.model.AttributeDefinition; -import org.openecomp.sdc.tosca.datatypes.model.CapabilityType; -import org.openecomp.sdc.tosca.datatypes.model.Constraint; -import org.openecomp.sdc.tosca.datatypes.model.DataType; -import org.openecomp.sdc.tosca.datatypes.model.GroupType; -import org.openecomp.sdc.tosca.datatypes.model.Import; -import org.openecomp.sdc.tosca.datatypes.model.PolicyType; -import org.openecomp.sdc.tosca.datatypes.model.PropertyDefinition; -import org.openecomp.sdc.tosca.datatypes.model.PropertyType; -import org.openecomp.sdc.tosca.datatypes.model.RelationshipType; -import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; -import org.openecomp.sdc.tosca.services.DataModelUtil; -import org.openecomp.sdc.tosca.services.ToscaConstants; -import org.openecomp.sdc.tosca.services.ToscaUtil; -import org.openecomp.sdc.translator.services.heattotosca.Constants; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class CommonGlobalTypes { - - /** - * Create service template service template. - * - * @return the service template - */ - public static ServiceTemplate createServiceTemplate() { - ServiceTemplate serviceTemplate = new ServiceTemplate(); - serviceTemplate.setTosca_definitions_version(ToscaConstants.TOSCA_DEFINITIONS_VERSION); - serviceTemplate.setMetadata( - DataModelUtil.createMetadata(Constants.COMMON_GLOBAL_TEMPLATE_NAME, "1.0.0", null)); - serviceTemplate.setDescription("TOSCA Global Types"); - serviceTemplate.setData_types(createGlobalDataTypes()); - serviceTemplate.setGroup_types(createGroupTypes()); - serviceTemplate.setPolicy_types(createPolicyTypes()); - serviceTemplate.setRelationship_types(createRelationTypes()); - serviceTemplate.setCapability_types(createCapabilityTypes()); - serviceTemplate.setImports(createImportList()); - return serviceTemplate; - } - - private static Map<String, CapabilityType> createCapabilityTypes() { - Map<String, CapabilityType> capabilityMap = new HashMap<>(); - capabilityMap.put(ToscaCapabilityType.METRIC.getDisplayName(), createMetricCapabilityType()); - capabilityMap - .put(ToscaCapabilityType.METRIC_CEILOMETER.getDisplayName(), createMetricCeilometerType()); - capabilityMap.put(ToscaCapabilityType.METRIC_SNMP_TRAP.getDisplayName(), createMetricSnmpType( - "A node type that includes the Metric capability" - + " indicates that it can be monitored using snmp trap.")); - capabilityMap.put(ToscaCapabilityType.METRIC_SNMP_POLLING.getDisplayName(), - createMetricSnmpType( - "A node type that includes the Metric capability indicates" - + " that it can be monitored using snmp polling.")); - return capabilityMap; - } - - - private static CapabilityType createMetricSnmpType(String description) { - CapabilityType capabilityType = new CapabilityType(); - capabilityType.setDerived_from(ToscaCapabilityType.METRIC.getDisplayName()); - capabilityType.setDescription(description); - capabilityType.setProperties(createCapabilityMetricSnmpProperties()); - - return capabilityType; - } - - - private static Map<String, PropertyDefinition> createCapabilityMetricSnmpProperties() { - Map<String, PropertyDefinition> propertyDefinitionMap = new HashMap<>(); - propertyDefinitionMap.put("oid", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "Object Id of the metric", - true, null, null, null, null)); - return propertyDefinitionMap; - } - - private static CapabilityType createMetricCeilometerType() { - CapabilityType capabilityType = new CapabilityType(); - capabilityType.setDerived_from(ToscaCapabilityType.METRIC.getDisplayName()); - capabilityType.setDescription( - "A node type that includes the Metric capability" - + " indicates that it can be monitored using ceilometer."); - capabilityType.setProperties(createCapabilityMetricCeilometerProperties()); - return capabilityType; - } - - - private static Map<String, PropertyDefinition> createCapabilityMetricCeilometerProperties() { - Map<String, PropertyDefinition> propertyDefinitionMap = new HashMap<>(); - propertyDefinitionMap.put(Constants.NAME_PROPERTY_NAME, DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "Ceilometer metric type name to monitor. (The name ceilometer is using)", true, null, - null, null, null)); - return propertyDefinitionMap; - } - - private static Map<String, Import> createImportList() { - Map<String, Import> importsMap = new HashMap<>(); - importsMap.put(ToscaConstants.NATIVE_TYPES_SERVICE_TEMPLATE_NAME, GlobalTypesUtil - .createServiceTemplateImport(ToscaConstants.NATIVE_TYPES_SERVICE_TEMPLATE_NAME)); - return importsMap; - } - - /** - * Create metric capability type capability type. - * - * @return the capability type - */ - public static CapabilityType createMetricCapabilityType() { - CapabilityType capabilityType = new CapabilityType(); - capabilityType.setDerived_from(ToscaCapabilityType.NFV_METRIC.getDisplayName()); - capabilityType.setDescription( - "A node type that includes the Metric capability indicates that it can be monitored."); - capabilityType.setProperties(createCapabilityMetricProperties()); - capabilityType.setAttributes(createCapabilityMetricAttributes()); - return capabilityType; - } - - private static Map<String, AttributeDefinition> createCapabilityMetricAttributes() { - Map<String, AttributeDefinition> attributeDefinitionMap = new HashMap<>(); - - attributeDefinitionMap.put("value", DataModelUtil - .createAttributeDefinition(PropertyType.STRING.getDisplayName(), "Runtime monitored value", - null, null, null)); - return attributeDefinitionMap; - } - - private static Map<String, PropertyDefinition> createCapabilityMetricProperties() { - Map<String, PropertyDefinition> propertyDefinitionMap = new HashMap<>(); - propertyDefinitionMap.put("type", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.", true, - null, null, null, null)); - propertyDefinitionMap.put("unit", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "Unit of the metric value", - true, null, null, null, null)); - propertyDefinitionMap.put("category", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "Category of the metric, for an example, compute, disk, network, storage and etc.", - false, null, null, null, null)); - propertyDefinitionMap.put(Constants.DESCRIPTION_PROPERTY_NAME, DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "Description of the metric", - false, null, null, null, null)); - return propertyDefinitionMap; - } - - private static Map<String, RelationshipType> createRelationTypes() { - Map<String, RelationshipType> globalRelationshipTypes = new HashMap<>(); - globalRelationshipTypes.put(ToscaRelationshipType.ATTACHES_TO.getDisplayName(), - createAttachesToRelationshipType()); - return globalRelationshipTypes; - } - - private static RelationshipType createAttachesToRelationshipType() { - RelationshipType attachesToRelationType = new RelationshipType(); - attachesToRelationType.setDerived_from(ToscaRelationshipType.ROOT.getDisplayName()); - attachesToRelationType.setDescription("This type represents an attachment relationship"); - return attachesToRelationType; - } - - private static Map<String, PolicyType> createPolicyTypes() { - Map<String, PolicyType> globalPolicyTypes = new HashMap<>(); - globalPolicyTypes - .put(ToscaPolicyType.PLACEMENT_ANTILOCATE.getDisplayName(), createAntilocatePolicyType()); - globalPolicyTypes - .put(ToscaPolicyType.PLACEMENT_COLOCATE.getDisplayName(), createColocatePolicyType()); - globalPolicyTypes.put(ToscaPolicyType.PLACEMENT_VALET_AFFINITY.getDisplayName(), - createValetAffinityPolicyType()); - globalPolicyTypes.put(ToscaPolicyType.PLACEMENT_VALET_DIVERSITY.getDisplayName(), - createValetDiversityPolicyType()); - globalPolicyTypes.put(ToscaPolicyType.PLACEMENT_VALET_EXCLUSIVITY.getDisplayName(), - createValetExclusivityPolicyType()); - return globalPolicyTypes; - } - - private static PolicyType createValetDiversityPolicyType() { - PolicyType policyType = new PolicyType(); - policyType.setDerived_from(ToscaPolicyType.PLACEMENT.getDisplayName()); - policyType.setDescription("Valet Diversity"); - policyType.setProperties(new HashMap<>()); - policyType.getProperties().put("level", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "diversity", false, - DataModelUtil.createValidValuesConstraintsList("host", "rack"), null, null, "host")); - - return policyType; - } - - private static PolicyType createValetExclusivityPolicyType() { - PolicyType policyType = new PolicyType(); - policyType.setDerived_from(ToscaPolicyType.PLACEMENT.getDisplayName()); - policyType.setDescription("Valet Exclusivity"); - policyType.setProperties(addNamePropertyToPolicyType()); - policyType.setProperties(new HashMap<>()); - policyType.getProperties().put("level", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "exclusivity", false, - DataModelUtil.createValidValuesConstraintsList("host", "rack"), null, null, "host")); - return policyType; - } - - private static PolicyType createValetAffinityPolicyType() { - PolicyType policyType = new PolicyType(); - policyType.setDerived_from(ToscaPolicyType.PLACEMENT.getDisplayName()); - policyType.setDescription("Valet Affinity"); - policyType.setProperties(new HashMap<>()); - policyType.getProperties().put("level", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "affinity", false, - DataModelUtil.createValidValuesConstraintsList("host", "rack"), null, null, "host")); - - return policyType; - } - - - private static PolicyType createColocatePolicyType() { - PolicyType policyType = new PolicyType(); - policyType.setDerived_from(ToscaPolicyType.PLACEMENT.getDisplayName()); - policyType.setDescription("Keep associated nodes (groups of nodes) based upon affinity value"); - policyType.setProperties(addNamePropertyToPolicyType()); - policyType.getProperties().put("affinity", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "affinity", true, - DataModelUtil.createValidValuesConstraintsList("host", "region", "compute"), null, null, - null)); - - return policyType; - } - - private static PolicyType createAntilocatePolicyType() { - PolicyType policyType = new PolicyType(); - policyType.setDerived_from(ToscaPolicyType.PLACEMENT.getDisplayName()); - policyType.setDescription("My placement policy for separation based upon container type value"); - policyType.setProperties(addNamePropertyToPolicyType()); - policyType.getProperties().put("container_type", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "container type", false, - DataModelUtil.createValidValuesConstraintsList("host", "region", "compute"), null, null, - null)); - return policyType; - } - - private static Map<String, PropertyDefinition> addNamePropertyToPolicyType() { - Map<String, PropertyDefinition> policyTypeProperties = new HashMap<>(); - policyTypeProperties.put(Constants.NAME_PROPERTY_NAME, DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "The name of the policy", - false, null, null, null, null)); - return policyTypeProperties; - } - - private static Map<String, GroupType> createGroupTypes() { - Map<String, GroupType> globalGroupTypes = new HashMap<>(); - globalGroupTypes.put(ToscaGroupType.HEAT_STACK.getDisplayName(), createHeatStackGroupType()); - return globalGroupTypes; - } - - private static GroupType createHeatStackGroupType() { - GroupType heatStackGroupType = new GroupType(); - heatStackGroupType.setDerived_from(ToscaGroupType.ROOT.getDisplayName()); - heatStackGroupType - .setDescription("Grouped all heat resources which are in the same heat stack"); - heatStackGroupType.setProperties(createHeatStackGroupProperties()); - - return heatStackGroupType; - } - - private static Map<String, PropertyDefinition> createHeatStackGroupProperties() { - Map<String, PropertyDefinition> propertiesDef = new HashMap<>(); - propertiesDef.put("heat_file", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "Heat file which associate to this group/heat stack", true, null, null, null, null)); - propertiesDef.put(Constants.DESCRIPTION_PROPERTY_NAME, DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "Heat file description", - false, null, null, null, null)); - return propertiesDef; - } - - - /** - * Create common service template import import. - * - * @return the import - */ - public static Import createCommonServiceTemplateImport() { - Import commonServiceTemplateImport = new Import(); - commonServiceTemplateImport - .setFile(ToscaUtil.getServiceTemplateFileName(Constants.COMMON_GLOBAL_TEMPLATE_NAME)); - return commonServiceTemplateImport; - } - - private static Map<String, DataType> createGlobalDataTypes() { - Map<String, DataType> globalDataTypes = new HashMap<>(); - globalDataTypes.put(ToscaDataType.NETWORK_ALLOCATION_POOL.getDisplayName(), - createAllocationPoolDataType()); - globalDataTypes - .put(ToscaDataType.NETWORK_HOST_ROUTE.getDisplayName(), createHostRouteDataType()); - globalDataTypes.put(ToscaDataType.NEUTRON_SUBNET.getDisplayName(), createSubnetDataType()); - globalDataTypes - .put(ToscaDataType.NETWORK_ADDRESS_PAIR.getDisplayName(), createAddressPairDataType()); - globalDataTypes.put(ToscaDataType.CONTRAIL_STATIC_ROUTE.getDisplayName(), - createContrailStaticRouteDataType()); - globalDataTypes.put(ToscaDataType.CONTRAIL_ADDRESS_PAIR.getDisplayName(), - createContrailAddressPairDataType()); - return globalDataTypes; - } - - private static DataType createContrailStaticRouteDataType() { - DataType dataType = new DataType(); - dataType.setDerived_from(ToscaDataType.ROOT.getDisplayName()); - dataType.setDescription("static route"); - Map<String, PropertyDefinition> prop = new HashMap<>(); - - prop.put("prefix", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "Route prefix", false, null, - null, null, null)); - prop.put("next_hop", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "Next hop", false, null, - null, null, null)); - prop.put("next_hop_type", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "Next hop type", false, - null, null, null, null)); - - dataType.setProperties(prop); - return dataType; - } - - private static DataType createContrailAddressPairDataType() { - DataType dataType = new DataType(); - dataType.setDerived_from(ToscaDataType.ROOT.getDisplayName()); - dataType.setDescription("Address Pair"); - Map<String, PropertyDefinition> prop = new HashMap<>(); - - prop.put("prefix", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "IP address prefix", false, - null, null, null, null)); - prop.put("mac_address", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "Mac address", false, null, - null, null, null)); - prop.put("address_mode", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "Address mode active-active or active-standy", false, - DataModelUtil.createValidValuesConstraintsList("active-active", "active-standby"), null, - null, null)); - - dataType.setProperties(prop); - return dataType; - } - - private static DataType createAddressPairDataType() { - DataType addressPairDataType = new DataType(); - addressPairDataType.setDerived_from(ToscaDataType.ROOT.getDisplayName()); - addressPairDataType.setDescription("MAC/IP address pairs"); - Map<String, PropertyDefinition> addressPairProp = new HashMap<>(); - - addressPairProp.put("ip_address", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "IP address", false, null, - null, null, null)); - addressPairProp.put("mac_address", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "MAC address", false, null, - null, null, null)); - addressPairDataType.setProperties(addressPairProp); - - return addressPairDataType; - } - - private static DataType createHostRouteDataType() { - DataType hostRouteDataType = new DataType(); - hostRouteDataType.setDerived_from(ToscaDataType.ROOT.getDisplayName()); - hostRouteDataType.setDescription("Host route info for the subnet"); - - Map<String, PropertyDefinition> hostRoutePoolProp = new HashMap<>(); - hostRoutePoolProp.put("destination", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "The destination for static route", false, null, null, null, null)); - hostRoutePoolProp.put("nexthop", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "The next hop for the destination", false, null, null, null, null)); - hostRouteDataType.setProperties(hostRoutePoolProp); - - return hostRouteDataType; - } - - private static DataType createAllocationPoolDataType() { - DataType allocationPoolDataType = new DataType(); - allocationPoolDataType.setDerived_from(ToscaDataType.ROOT.getDisplayName()); - allocationPoolDataType.setDescription("The start and end addresses for the allocation pool"); - - Map<String, PropertyDefinition> allocationPoolProp = new HashMap<>(); - allocationPoolProp.put("start", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "Start address for the allocation pool", false, null, null, null, null)); - allocationPoolProp.put("end", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "End address for the allocation pool", false, null, null, null, null)); - allocationPoolDataType.setProperties(allocationPoolProp); - - return allocationPoolDataType; - } - - private static DataType createSubnetDataType() { - DataType subnetDataType = new DataType(); - subnetDataType.setDerived_from(ToscaDataType.ROOT.getDisplayName()); - subnetDataType.setDescription( - "A subnet represents an IP address block that can " - + "be used for assigning IP addresses to virtual instances"); - - Map<String, PropertyDefinition> subnetProp = new HashMap<>(); - subnetProp.put("allocation_pools", DataModelUtil - .createPropertyDefinition(PropertyType.LIST.getDisplayName(), - "The start and end addresses for the allocation pools", false, null, null, DataModelUtil - .createEntrySchema(ToscaDataType.NETWORK_ALLOCATION_POOL.getDisplayName(), null, - null), null)); - subnetProp.put("cidr", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "The CIDR", false, null, - null, null, null)); - subnetProp.put("dns_nameservers", DataModelUtil - .createPropertyDefinition(PropertyType.LIST.getDisplayName(), - "A specified set of DNS name servers to be used", false, null, null, - DataModelUtil.createEntrySchema(PropertyType.STRING.getDisplayName(), null, null), - new ArrayList<String>())); - subnetProp.put("enable_dhcp", DataModelUtil - .createPropertyDefinition(PropertyType.BOOLEAN.getDisplayName(), - "Set to true if DHCP is enabled and false if DHCP is disabled", false, null, null, null, - true)); - subnetProp.put("gateway_ip", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "The gateway IP address", - false, null, null, null, null)); - subnetProp.put("host_routes", DataModelUtil - .createPropertyDefinition(PropertyType.LIST.getDisplayName(), "The gateway IP address", - false, null, null, DataModelUtil - .createEntrySchema(ToscaDataType.NETWORK_HOST_ROUTE.getDisplayName(), null, null), - null)); - subnetProp.put("ip_version", DataModelUtil - .createPropertyDefinition(PropertyType.INTEGER.getDisplayName(), "The gateway IP address", - false, DataModelUtil.createValidValuesConstraintsList("4", "6"), null, null, 4)); - subnetProp.put("ipv6_address_mode", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "IPv6 address mode", false, - DataModelUtil - .createValidValuesConstraintsList("dhcpv6-stateful", "dhcpv6-stateless", "slaac"), - null, null, null)); - subnetProp.put("ipv6_ra_mode", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "IPv6 RA (Router Advertisement) mode", false, DataModelUtil - .createValidValuesConstraintsList("dhcpv6-stateful", "dhcpv6-stateless", "slaac"), - null, null, null)); - subnetProp.put(Constants.NAME_PROPERTY_NAME, DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "The name of the subnet", - false, null, null, null, null)); - subnetProp.put("prefixlen", DataModelUtil - .createPropertyDefinition(PropertyType.INTEGER.getDisplayName(), - "Prefix length for subnet allocation from subnet pool", false, - createPrefixlenConstraint(), null, null, null)); - subnetProp.put("subnetpool", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "The name or ID of the subnet pool", false, null, null, null, null)); - subnetProp.put("tenant_id", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "The ID of the tenant who owns the network", false, null, null, null, null)); - subnetProp.put("value_specs", DataModelUtil - .createPropertyDefinition(PropertyType.MAP.getDisplayName(), - "Extra parameters to include in the request", false, null, null, - DataModelUtil.createEntrySchema(PropertyType.STRING.getDisplayName(), null, null), - new HashMap<>())); - subnetDataType.setProperties(subnetProp); - - return subnetDataType; - } - - private static List<Constraint> createPrefixlenConstraint() { - List<Constraint> constraints = new ArrayList<>(); - Constraint constraint = new Constraint(); - constraint.setGreater_or_equal(0); - constraints.add(constraint); - return constraints; - } -} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/ContrailAbstractSubstituteGlobalType.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/ContrailAbstractSubstituteGlobalType.java deleted file mode 100644 index 7b0b810b61..0000000000 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/ContrailAbstractSubstituteGlobalType.java +++ /dev/null @@ -1,196 +0,0 @@ -/*- - * ============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.services.heattotosca.globaltypes; - -import org.openecomp.sdc.tosca.datatypes.ToscaDataType; -import org.openecomp.sdc.tosca.datatypes.ToscaNodeType; -import org.openecomp.sdc.tosca.datatypes.model.AttributeDefinition; -import org.openecomp.sdc.tosca.datatypes.model.DataType; -import org.openecomp.sdc.tosca.datatypes.model.NodeType; -import org.openecomp.sdc.tosca.datatypes.model.PropertyDefinition; -import org.openecomp.sdc.tosca.datatypes.model.PropertyType; -import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; -import org.openecomp.sdc.tosca.services.DataModelUtil; -import org.openecomp.sdc.tosca.services.ToscaConstants; -import org.openecomp.sdc.translator.services.heattotosca.Constants; - -import java.util.HashMap; -import java.util.Map; - - -public class ContrailAbstractSubstituteGlobalType { - - /** - * Create service template service template. - * - * @return the service template - */ - public static ServiceTemplate createServiceTemplate() { - ServiceTemplate serviceTemplate = new ServiceTemplate(); - serviceTemplate.setTosca_definitions_version(ToscaConstants.TOSCA_DEFINITIONS_VERSION); - serviceTemplate.setMetadata( - DataModelUtil.createMetadata(Constants - .CONTRAIL_ABSTRACT_SUBSTITUTE_TEMPLATE_NAME, "1.0.0", null)); - serviceTemplate.setImports(GlobalTypesUtil.createCommonImportList()); - serviceTemplate.setDescription("Contrail Abstract Substitute Global Types"); - serviceTemplate.setData_types(createGlobalDataTypes()); - serviceTemplate.setNode_types(createGlobalNodeTypes()); - return serviceTemplate; - } - - private static Map<String, NodeType> createGlobalNodeTypes() { - Map<String, NodeType> globalNodeTypes = new HashMap<>(); - globalNodeTypes.put(ToscaNodeType.CONTRAIL_ABSTRACT_SUBSTITUTE.getDisplayName(), - createContrailAbstractSubstituteNodeType()); - return globalNodeTypes; - } - - private static NodeType createContrailAbstractSubstituteNodeType() { - NodeType nodeType = new NodeType(); - nodeType.setDerived_from(ToscaNodeType.ABSTRACT_SUBSTITUTE.getDisplayName()); - nodeType.setProperties(createContrailAbstractSubstituteProperties()); - nodeType.setAttributes(createContrailAbstractSubstituteAttributes()); - - return nodeType; - } - - private static Map<String, AttributeDefinition> createContrailAbstractSubstituteAttributes() { - Map<String, AttributeDefinition> attributesDefMap = new HashMap<>(); - attributesDefMap.put("service_instance_name", DataModelUtil - .createAttributeDefinition(PropertyType.STRING.getDisplayName(), - "The name of the service instance", null, null, null)); - attributesDefMap.put("fq_name", DataModelUtil - .createAttributeDefinition(PropertyType.STRING.getDisplayName(), - "The FQ name of the service instance", null, null, null)); - attributesDefMap.put("status", DataModelUtil - .createAttributeDefinition(PropertyType.STRING.getDisplayName(), - "Status of the service instance", null, null, null)); - attributesDefMap.put("service_template_name", DataModelUtil - .createAttributeDefinition(PropertyType.STRING.getDisplayName(), - "Service Template of the Service Instance", null, null, null)); - attributesDefMap.put("virtual_machines", DataModelUtil - .createAttributeDefinition(PropertyType.STRING.getDisplayName(), - "Service VMs for the Service Instance", null, null, null)); - attributesDefMap.put("active_vms", DataModelUtil - .createAttributeDefinition(PropertyType.STRING.getDisplayName(), - "Number of service VMs active for this Service Instance", null, null, null)); - attributesDefMap.put("tenant_id", DataModelUtil - .createAttributeDefinition(PropertyType.STRING.getDisplayName(), - "Tenant id of the Service Instance", null, null, null)); - attributesDefMap.put("show", DataModelUtil - .createAttributeDefinition(PropertyType.STRING.getDisplayName(), "All attributes", null, - null, null)); - - return attributesDefMap; - } - - private static Map<String, PropertyDefinition> createContrailAbstractSubstituteProperties() { - Map<String, PropertyDefinition> props = new HashMap<>(); - props.put("service_template_name", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "Service template name", - false, null, null, null, null)); - props.put("service_mode", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "Service mode", true, - DataModelUtil - .createValidValuesConstraintsList("transparent", "in-network", "in-network-nat"), - null, null, null)); - props.put("service_type", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "Service type", true, - DataModelUtil.createValidValuesConstraintsList("firewall", "analyzer", "source-nat", - "loadbalancer"), null, null, null)); - props.put("image_name", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "Image name", true, null, - null, null, null)); - props.put("flavor", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "flavor", false, null, null, - null, null)); - props.put("service_interface_type_list", DataModelUtil - .createPropertyDefinition(PropertyType.LIST.getDisplayName(), "List of interface types", - true, null, null, DataModelUtil - .createEntrySchema(PropertyType.STRING.getDisplayName(), null, DataModelUtil - .createValidValuesConstraintsList("management", "left", "right", "other")), - null)); - props.put("shared_ip_list", DataModelUtil - .createPropertyDefinition(PropertyType.LIST.getDisplayName(), "Shared ips enabled", false, - null, null, - DataModelUtil.createEntrySchema(PropertyType.BOOLEAN.getDisplayName(), null, null), - null)); - props.put("static_routes_list", DataModelUtil - .createPropertyDefinition(PropertyType.LIST.getDisplayName(), "Static routes enabled", - false, null, null, - DataModelUtil.createEntrySchema(PropertyType.BOOLEAN.getDisplayName(), null, null), - null)); - props.put("ordered_interfaces", DataModelUtil - .createPropertyDefinition(PropertyType.BOOLEAN.getDisplayName(), - "Indicates if service interface are ordered", false, null, null, null, false)); - props.put("availability_zone_enable", DataModelUtil - .createPropertyDefinition(PropertyType.BOOLEAN.getDisplayName(), - "Indicates availability zone is enabled", false, null, null, null, false)); - props.put("availability_zone", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "Availability zone to create servers in", false, null, null, null, null)); - props.put("service_instance_name", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "Service instance name", - true, null, null, null, null)); - props.put("interface_list", DataModelUtil - .createPropertyDefinition(PropertyType.LIST.getDisplayName(), "List of interfaces", false, - null, null, DataModelUtil - .createEntrySchema(ToscaDataType.CONTRAIL_INTERFACE_DATA.getDisplayName(), null, - null), null)); - return props; - } - - - private static Map<String, DataType> createGlobalDataTypes() { - Map<String, DataType> globalDataTypes = new HashMap<>(); - globalDataTypes - .put(ToscaDataType.CONTRAIL_INTERFACE_DATA.getDisplayName(), createInterfaceDataType()); - return globalDataTypes; - } - - private static DataType createInterfaceDataType() { - DataType dataType = new DataType(); - dataType.setDerived_from(ToscaDataType.ROOT.getDisplayName()); - dataType.setDescription("Interface Data"); - Map<String, PropertyDefinition> propertyDefMap = new HashMap<>(); - propertyDefMap.put("virtual_network", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "Virtual Network for this interface", true, null, null, null, null)); - propertyDefMap.put("ip_address", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "IP for this interface", - false, null, null, null, null)); - propertyDefMap.put("static_routes", DataModelUtil - .createPropertyDefinition(PropertyType.LIST.getDisplayName(), - "An ordered list of static routes to be added to this interface", false, null, null, - DataModelUtil - .createEntrySchema(ToscaDataType.CONTRAIL_STATIC_ROUTE.getDisplayName(), null, - null), null)); - propertyDefMap.put("allowed_address_pairs", DataModelUtil - .createPropertyDefinition(PropertyType.LIST.getDisplayName(), - "List of allowed address pair for this interface", false, null, null, DataModelUtil - .createEntrySchema(ToscaDataType.CONTRAIL_ADDRESS_PAIR.getDisplayName(), null, - null), null)); - dataType.setProperties(propertyDefMap); - return dataType; - } - - -} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/ContrailComputeGlobalType.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/ContrailComputeGlobalType.java deleted file mode 100644 index 50faec0c69..0000000000 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/ContrailComputeGlobalType.java +++ /dev/null @@ -1,128 +0,0 @@ -/*- - * ============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.services.heattotosca.globaltypes; - -import org.openecomp.sdc.tosca.datatypes.ToscaNodeType; -import org.openecomp.sdc.tosca.datatypes.model.AttributeDefinition; -import org.openecomp.sdc.tosca.datatypes.model.NodeType; -import org.openecomp.sdc.tosca.datatypes.model.PropertyDefinition; -import org.openecomp.sdc.tosca.datatypes.model.PropertyType; -import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; -import org.openecomp.sdc.tosca.services.DataModelUtil; -import org.openecomp.sdc.tosca.services.ToscaConstants; -import org.openecomp.sdc.translator.services.heattotosca.Constants; - -import java.util.HashMap; -import java.util.Map; - -public class ContrailComputeGlobalType { - - /** - * Create service template service template. - * - * @return the service template - */ - public static ServiceTemplate createServiceTemplate() { - ServiceTemplate serviceTemplate = new ServiceTemplate(); - serviceTemplate.setTosca_definitions_version(ToscaConstants.TOSCA_DEFINITIONS_VERSION); - serviceTemplate.setMetadata( - DataModelUtil.createMetadata(Constants.CONTRAIL_COMPUTE_TEMPLATE_NAME, "1.0.0", null)); - serviceTemplate.setDescription("Contrail Compute TOSCA Global Types"); - serviceTemplate.setImports(GlobalTypesUtil.createCommonImportList()); - serviceTemplate.setNode_types(createGlobalNodeTypes()); - return serviceTemplate; - } - - - private static Map<String, NodeType> createGlobalNodeTypes() { - Map<String, NodeType> globalNodeTypes = new HashMap<>(); - globalNodeTypes - .put(ToscaNodeType.CONTRAIL_COMPUTE.getDisplayName(), createContrailComputeNodeType()); - return globalNodeTypes; - } - - private static NodeType createContrailComputeNodeType() { - NodeType nodeType = new NodeType(); - nodeType.setDerived_from(ToscaNodeType.COMPUTE.getDisplayName()); - nodeType.setProperties(createContrailComputeProperties()); - nodeType.setAttributes(createContrailComputeAttributes()); - return nodeType; - } - - - private static Map<String, PropertyDefinition> createContrailComputeProperties() { - Map<String, PropertyDefinition> propertyDefMap = new HashMap<>(); - propertyDefMap.put("service_instance_name", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "Service instance name", - true, null, null, null, null)); - propertyDefMap.put("service_template_name", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "Service template name", - false, null, null, null, null)); - propertyDefMap.put("image_name", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "Image name", true, null, - null, null, null)); - propertyDefMap.put("service_mode", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "Service mode", true, - DataModelUtil - .createValidValuesConstraintsList("transparent", "in-network", "in-network-nat"), - null, null, null)); - propertyDefMap.put("service_type", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "Service type", true, - DataModelUtil.createValidValuesConstraintsList("firewall", "analyzer", "source-nat", - "loadbalancer"), null, null, null)); - propertyDefMap.put("image_name", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "Image name", true, null, - null, null, null)); - propertyDefMap.put("flavor", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "flavor", false, null, null, - null, null)); - propertyDefMap.put("availability_zone_enable", DataModelUtil - .createPropertyDefinition(PropertyType.BOOLEAN.getDisplayName(), - "Indicates availability zone is enabled", false, null, null, null, false)); - propertyDefMap.put("availability_zone", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "Availability zone to create servers in", false, null, null, null, null)); - return propertyDefMap; - } - - private static Map<String, AttributeDefinition> createContrailComputeAttributes() { - Map<String, AttributeDefinition> attributesDefMap = new HashMap<>(); - attributesDefMap.put("fq_name", DataModelUtil - .createAttributeDefinition(PropertyType.STRING.getDisplayName(), "fq_name", null, null, - null)); - attributesDefMap.put("status", DataModelUtil - .createAttributeDefinition(PropertyType.STRING.getDisplayName(), "status of the compute", - null, null, null)); - attributesDefMap.put("virtual_machines", DataModelUtil - .createAttributeDefinition(PropertyType.STRING.getDisplayName(), "VMs of this compute", - null, null, null)); - attributesDefMap.put("active_vms", DataModelUtil - .createAttributeDefinition(PropertyType.STRING.getDisplayName(), "Number of active VMs", - null, null, null)); - attributesDefMap.put("tenant_id", DataModelUtil - .createAttributeDefinition(PropertyType.STRING.getDisplayName(), "Tenant id of the VM", - null, null, null)); - attributesDefMap.put("show", DataModelUtil - .createAttributeDefinition(PropertyType.STRING.getDisplayName(), "All attributes", null, - null, null)); - return attributesDefMap; - } -} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/ContrailNetworkRuleGlobalType.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/ContrailNetworkRuleGlobalType.java deleted file mode 100644 index 0081ad5a78..0000000000 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/ContrailNetworkRuleGlobalType.java +++ /dev/null @@ -1,227 +0,0 @@ -/*- - * ============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.services.heattotosca.globaltypes; - -import org.openecomp.sdc.tosca.datatypes.ToscaCapabilityType; -import org.openecomp.sdc.tosca.datatypes.ToscaDataType; -import org.openecomp.sdc.tosca.datatypes.ToscaNodeType; -import org.openecomp.sdc.tosca.datatypes.ToscaRelationshipType; -import org.openecomp.sdc.tosca.datatypes.model.AttributeDefinition; -import org.openecomp.sdc.tosca.datatypes.model.DataType; -import org.openecomp.sdc.tosca.datatypes.model.NodeType; -import org.openecomp.sdc.tosca.datatypes.model.PropertyDefinition; -import org.openecomp.sdc.tosca.datatypes.model.PropertyType; -import org.openecomp.sdc.tosca.datatypes.model.RequirementDefinition; -import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; -import org.openecomp.sdc.tosca.services.DataModelUtil; -import org.openecomp.sdc.tosca.services.ToscaConstants; -import org.openecomp.sdc.translator.services.heattotosca.Constants; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class ContrailNetworkRuleGlobalType { - /** - * Create service template service template. - * - * @return the service template - */ - public static ServiceTemplate createServiceTemplate() { - ServiceTemplate contrailNetworkRuleServiceTemplate = new ServiceTemplate(); - contrailNetworkRuleServiceTemplate - .setTosca_definitions_version(ToscaConstants.TOSCA_DEFINITIONS_VERSION); - contrailNetworkRuleServiceTemplate.setMetadata( - DataModelUtil.createMetadata(Constants.CONTRAIL_NETWORK_RULE_TEMPLATE_NAME, "1.0.0", null)); - contrailNetworkRuleServiceTemplate.setImports(GlobalTypesUtil.createCommonImportList()); - contrailNetworkRuleServiceTemplate.setDescription("Contrail Network Rule Global Types"); - contrailNetworkRuleServiceTemplate.setData_types(createGlobalDataTypes()); - contrailNetworkRuleServiceTemplate.setNode_types(createGlobalNodeTypes()); - return contrailNetworkRuleServiceTemplate; - } - - - private static Map<String, DataType> createGlobalDataTypes() { - Map<String, DataType> globalDataTypes = new HashMap<>(); - globalDataTypes.put(ToscaDataType.CONTRAIL_NETWORK_RULE_PORT_PAIRS.getDisplayName(), - createRulePortPairsDataType()); - globalDataTypes.put(ToscaDataType.CONTRAIL_NETWORK_RULE.getDisplayName(), createRuleDataType()); - globalDataTypes.put(ToscaDataType.CONTRAIL_NETWORK_RULE_VIRTUAL_NETWORK.getDisplayName(), - createRuleVirtualNetworkDataType()); - globalDataTypes.put(ToscaDataType.CONTRAIL_NETWORK_RULE_LIST.getDisplayName(), - createPolicyRulesListDataType()); - return globalDataTypes; - } - - private static DataType createRuleDataType() { - DataType dataType = new DataType(); - dataType.setDerived_from(ToscaDataType.ROOT.getDisplayName()); - dataType.setDescription("policy rule"); - Map<String, PropertyDefinition> properties = new HashMap<>(); - properties.put("direction", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "Direction", false, null, - null, null, null)); - properties.put("protocol", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "Protocol", false, null, - null, null, null)); - properties.put("src_ports", DataModelUtil - .createPropertyDefinition(PropertyType.LIST.getDisplayName(), "Source ports", false, null, - null, DataModelUtil - .createEntrySchema(ToscaDataType.CONTRAIL_NETWORK_RULE_PORT_PAIRS.getDisplayName(), - null, null), null)); - properties.put("dst_ports", DataModelUtil - .createPropertyDefinition(PropertyType.LIST.getDisplayName(), "Destination ports", false, - null, null, DataModelUtil - .createEntrySchema(ToscaDataType.CONTRAIL_NETWORK_RULE_PORT_PAIRS.getDisplayName(), - null, null), null)); - properties.put("dst_addresses", DataModelUtil - .createPropertyDefinition(PropertyType.LIST.getDisplayName(), "Destination addresses", - false, null, null, DataModelUtil.createEntrySchema( - ToscaDataType.CONTRAIL_NETWORK_RULE_VIRTUAL_NETWORK.getDisplayName(), null, null), - null)); - properties.put("apply_service", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "Service to apply", false, - null, null, null, null)); - properties.put("src_addresses", DataModelUtil - .createPropertyDefinition(PropertyType.LIST.getDisplayName(), "Source addresses", false, - null, null, DataModelUtil.createEntrySchema( - ToscaDataType.CONTRAIL_NETWORK_RULE_VIRTUAL_NETWORK.getDisplayName(), null, null), - null)); - - dataType.setProperties(properties); - return dataType; - - } - - - private static DataType createRuleVirtualNetworkDataType() { - DataType dataType = new DataType(); - dataType.setDerived_from(ToscaDataType.ROOT.getDisplayName()); - dataType.setDescription("source and destination addresses"); - Map<String, PropertyDefinition> properties = new HashMap<>(); - - properties.put("virtual_network", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "Virtual network", false, - null, null, null, null)); - - dataType.setProperties(properties); - return dataType; - } - - private static DataType createPolicyRulesListDataType() { - DataType dataType = new DataType(); - dataType.setDerived_from(ToscaDataType.ROOT.getDisplayName()); - dataType.setDescription("list of policy rules"); - Map<String, PropertyDefinition> properties = new HashMap<>(); - - properties.put("policy_rule", DataModelUtil - .createPropertyDefinition(PropertyType.LIST.getDisplayName(), "Contrail network rule", - false, null, null, DataModelUtil - .createEntrySchema(ToscaDataType.CONTRAIL_NETWORK_RULE.getDisplayName(), null, - null), null)); - - dataType.setProperties(properties); - return dataType; - } - - - private static DataType createRulePortPairsDataType() { - DataType dataType = new DataType(); - dataType.setDerived_from(ToscaDataType.ROOT.getDisplayName()); - dataType.setDescription("source and destination port pairs"); - Map<String, PropertyDefinition> properties = new HashMap<>(); - - properties.put("start_port", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "Start port", false, null, - null, null, null)); - properties.put("end_port", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "End port", false, null, - null, null, null)); - - dataType.setProperties(properties); - return dataType; - } - - private static Map<String, NodeType> createGlobalNodeTypes() { - Map<String, NodeType> globalNodeTypes = new HashMap<>(); - globalNodeTypes.put(ToscaNodeType.CONTRAIL_NETWORK_RULE.getDisplayName(), - createContrailNetworkRuleNodeType()); - return globalNodeTypes; - } - - private static NodeType createContrailNetworkRuleNodeType() { - NodeType contrailNetworkRuleNodeType = new NodeType(); - contrailNetworkRuleNodeType.setDerived_from(ToscaNodeType.ROOT.getDisplayName()); - contrailNetworkRuleNodeType.setProperties(createContrailNetworkRuleProperties()); - contrailNetworkRuleNodeType.setAttributes(createContrailNetworkRuleAttributes()); - contrailNetworkRuleNodeType.setRequirements(createContrailNetworkRuleRequirements()); - return contrailNetworkRuleNodeType; - } - - - private static Map<String, PropertyDefinition> createContrailNetworkRuleProperties() { - Map<String, PropertyDefinition> contrailNetworkRulePropertyDefMap = new HashMap<>(); - contrailNetworkRulePropertyDefMap.put(Constants.NAME_PROPERTY_NAME, DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "A symbolic name for this contrail network rule", false, null, null, null, null)); - contrailNetworkRulePropertyDefMap.put("entries", DataModelUtil - .createPropertyDefinition(ToscaDataType.CONTRAIL_NETWORK_RULE_LIST.getDisplayName(), - "A symbolic name for this contrail network rule", false, null, null, null, null)); - - return contrailNetworkRulePropertyDefMap; - } - - - private static Map<String, AttributeDefinition> createContrailNetworkRuleAttributes() { - Map<String, AttributeDefinition> contrailNetworkRuleAttributesDefMap = new HashMap<>(); - contrailNetworkRuleAttributesDefMap.put("fq_name", DataModelUtil - .createAttributeDefinition(PropertyType.STRING.getDisplayName(), "fq_name", null, null, - null)); - contrailNetworkRuleAttributesDefMap.put("tenant_id", DataModelUtil - .createAttributeDefinition(PropertyType.STRING.getDisplayName(), "tenant_id", null, null, - null)); - contrailNetworkRuleAttributesDefMap.put("rules", DataModelUtil - .createAttributeDefinition(PropertyType.LIST.getDisplayName(), "List of rules", null, - DataModelUtil.createEntrySchema(PropertyType.STRING.getDisplayName(), null, null), - null)); - contrailNetworkRuleAttributesDefMap.put("show", DataModelUtil - .createAttributeDefinition(PropertyType.STRING.getDisplayName(), "All attributes.", null, - null, null)); - - return contrailNetworkRuleAttributesDefMap; - } - - private static List<Map<String, RequirementDefinition>> createContrailNetworkRuleRequirements() { - final List<Map<String, RequirementDefinition>> requirements = new ArrayList<>(); - final Map<String, RequirementDefinition> - contrailNetworkRuleRequirementsDefMap = new HashMap<>(); - RequirementDefinition req = new RequirementDefinition(); - req.setCapability(ToscaCapabilityType.ATTACHMENT.getDisplayName()); - req.setOccurrences(new Object[]{0, ToscaConstants.UNBOUNDED}); - req.setNode(ToscaNodeType.NETWORK.getDisplayName()); - req.setRelationship(ToscaRelationshipType.ATTACHES_TO.getDisplayName()); - contrailNetworkRuleRequirementsDefMap.put("network", req); - requirements.add(contrailNetworkRuleRequirementsDefMap); - - return requirements; - } -} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/ContrailPortGlobalType.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/ContrailPortGlobalType.java deleted file mode 100644 index 1590372813..0000000000 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/ContrailPortGlobalType.java +++ /dev/null @@ -1,107 +0,0 @@ -/*- - * ============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.services.heattotosca.globaltypes; - -import org.openecomp.sdc.tosca.datatypes.ToscaDataType; -import org.openecomp.sdc.tosca.datatypes.ToscaNodeType; -import org.openecomp.sdc.tosca.datatypes.model.AttributeDefinition; -import org.openecomp.sdc.tosca.datatypes.model.NodeType; -import org.openecomp.sdc.tosca.datatypes.model.PropertyDefinition; -import org.openecomp.sdc.tosca.datatypes.model.PropertyType; -import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; -import org.openecomp.sdc.tosca.services.DataModelUtil; -import org.openecomp.sdc.tosca.services.ToscaConstants; -import org.openecomp.sdc.translator.services.heattotosca.Constants; - -import java.util.HashMap; -import java.util.Map; - -public class ContrailPortGlobalType { - /** - * Create service template service template. - * - * @return the service template - */ - public static ServiceTemplate createServiceTemplate() { - ServiceTemplate serviceTemplate = new ServiceTemplate(); - serviceTemplate.setTosca_definitions_version(ToscaConstants.TOSCA_DEFINITIONS_VERSION); - serviceTemplate.setMetadata( - DataModelUtil.createMetadata(Constants.CONTRAIL_PORT_TEMPLATE_NAME, "1.0.0", null)); - serviceTemplate.setImports(GlobalTypesUtil.createCommonImportList()); - serviceTemplate.setDescription("Contrail Port TOSCA Global Types"); - serviceTemplate.setNode_types(createGlobalNodeTypes()); - return serviceTemplate; - } - - private static Map<String, NodeType> createGlobalNodeTypes() { - Map<String, NodeType> globalNodeTypes = new HashMap<>(); - globalNodeTypes.put(ToscaNodeType.CONTRAIL_PORT.getDisplayName(), createContrailPortNodeType()); - return globalNodeTypes; - } - - private static NodeType createContrailPortNodeType() { - NodeType nodeType = new NodeType(); - nodeType.setDerived_from(ToscaNodeType.NETWORK_PORT.getDisplayName()); - nodeType.setProperties(createContrailPortProperties()); - nodeType.setAttributes(createContrailPortAttributes()); - return nodeType; - } - - private static Map<String, PropertyDefinition> createContrailPortProperties() { - Map<String, PropertyDefinition> propertyDefMap = new HashMap<>(); - propertyDefMap.put("interface_type", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "Interface type", true, - DataModelUtil.createValidValuesConstraintsList("management", "left", "right", "other"), - null, null, null)); - propertyDefMap.put("shared_ip", DataModelUtil - .createPropertyDefinition(PropertyType.BOOLEAN.getDisplayName(), "Shared ip enabled", false, - null, null, null, false)); - propertyDefMap.put("static_route", DataModelUtil - .createPropertyDefinition(PropertyType.BOOLEAN.getDisplayName(), "Static route enabled", - false, null, null, null, false)); - propertyDefMap.put("virtual_network", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "Virtual Network for this interface", true, null, null, null, null)); - propertyDefMap.put("static_routes", DataModelUtil - .createPropertyDefinition(PropertyType.LIST.getDisplayName(), - "An ordered list of static routes to be added to this interface", false, null, null, - DataModelUtil - .createEntrySchema(ToscaDataType.CONTRAIL_STATIC_ROUTE.getDisplayName(), null, - null), null)); - propertyDefMap.put("allowed_address_pairs", DataModelUtil - .createPropertyDefinition(PropertyType.LIST.getDisplayName(), - "List of allowed address pair for this interface", false, null, null, DataModelUtil - .createEntrySchema(ToscaDataType.CONTRAIL_ADDRESS_PAIR.getDisplayName(), null, - null), null)); - propertyDefMap.put("ip_address", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "IP for this interface", - false, null, null, null, null)); - return propertyDefMap; - } - - private static Map<String, AttributeDefinition> createContrailPortAttributes() { - Map<String, AttributeDefinition> attributesDefMap = new HashMap<>(); - attributesDefMap.put("fq_name", DataModelUtil - .createAttributeDefinition(PropertyType.STRING.getDisplayName(), "fq_name", null, null, - null)); - return attributesDefMap; - } -} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/ContrailV2NetworkRuleGlobalType.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/ContrailV2NetworkRuleGlobalType.java deleted file mode 100644 index 4141aa7f0a..0000000000 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/ContrailV2NetworkRuleGlobalType.java +++ /dev/null @@ -1,274 +0,0 @@ -/*- - * ============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.services.heattotosca.globaltypes; - -import org.openecomp.sdc.tosca.datatypes.ToscaCapabilityType; -import org.openecomp.sdc.tosca.datatypes.ToscaDataType; -import org.openecomp.sdc.tosca.datatypes.ToscaNodeType; -import org.openecomp.sdc.tosca.datatypes.ToscaRelationshipType; -import org.openecomp.sdc.tosca.datatypes.model.AttributeDefinition; -import org.openecomp.sdc.tosca.datatypes.model.DataType; -import org.openecomp.sdc.tosca.datatypes.model.NodeType; -import org.openecomp.sdc.tosca.datatypes.model.PropertyDefinition; -import org.openecomp.sdc.tosca.datatypes.model.PropertyType; -import org.openecomp.sdc.tosca.datatypes.model.RequirementDefinition; -import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; -import org.openecomp.sdc.tosca.services.DataModelUtil; -import org.openecomp.sdc.tosca.services.ToscaConstants; -import org.openecomp.sdc.translator.services.heattotosca.Constants; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class ContrailV2NetworkRuleGlobalType { - /** - * Create service template service template. - * - * @return the service template - */ - public static ServiceTemplate createServiceTemplate() { - ServiceTemplate contrailNetworkRuleServiceTemplate = new ServiceTemplate(); - contrailNetworkRuleServiceTemplate - .setTosca_definitions_version(ToscaConstants.TOSCA_DEFINITIONS_VERSION); - contrailNetworkRuleServiceTemplate.setMetadata( - DataModelUtil.createMetadata(Constants - .CONTRAILV2_NETWORK_RULE_TEMPLATE_NAME, "1.0.0", null)); - contrailNetworkRuleServiceTemplate.setImports(GlobalTypesUtil.createCommonImportList()); - contrailNetworkRuleServiceTemplate.setDescription("Contrail V2 Network Rule Global Types"); - contrailNetworkRuleServiceTemplate.setData_types(createGlobalDataTypes()); - contrailNetworkRuleServiceTemplate.setNode_types(createGlobalNodeTypes()); - return contrailNetworkRuleServiceTemplate; - } - - - private static Map<String, DataType> createGlobalDataTypes() { - Map<String, DataType> globalDataTypes = new HashMap<>(); - globalDataTypes.put(ToscaDataType.CONTRAILV2_NETWORK_RULE_SRC_PORT_PAIRS.getDisplayName(), - createRuleSrcPortPairsDataType()); - globalDataTypes.put(ToscaDataType.CONTRAILV2_NETWORK_RULE_DST_PORT_PAIRS.getDisplayName(), - createRuleDstPortPairsDataType()); - globalDataTypes - .put(ToscaDataType.CONTRAILV2_NETWORK_RULE.getDisplayName(), createRuleDataType()); - globalDataTypes.put(ToscaDataType.CONTRAILV2_NETWORK_RULE_DST_VIRTUAL_NETWORK.getDisplayName(), - createRuleDstVirtualNetworkDataType()); - globalDataTypes.put(ToscaDataType.CONTRAILV2_NETWORK_RULE_SRC_VIRTUAL_NETWORK.getDisplayName(), - createRuleSrcVirtualNetworkDataType()); - globalDataTypes.put(ToscaDataType.CONTRAILV2_NETWORK_RULE_LIST.getDisplayName(), - createPolicyRulesListDataType()); - globalDataTypes.put(ToscaDataType.CONTRAILV2_NETWORK_RULE_ACTION_LIST.getDisplayName(), - createRuleActionListDataType()); - return globalDataTypes; - } - - private static DataType createRuleDataType() { - DataType dataType = new DataType(); - dataType.setDerived_from(ToscaDataType.ROOT.getDisplayName()); - dataType.setDescription("policy rule"); - Map<String, PropertyDefinition> properties = new HashMap<>(); - properties.put("network_policy_entries_policy_rule_direction", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "Direction", false, null, - null, null, null)); - properties.put("network_policy_entries_policy_rule_protocol", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "Protocol", false, null, - null, null, null)); - properties.put("network_policy_entries_policy_rule_src_ports", DataModelUtil - .createPropertyDefinition(PropertyType.LIST.getDisplayName(), "Source ports", false, null, - null, DataModelUtil.createEntrySchema( - ToscaDataType.CONTRAILV2_NETWORK_RULE_SRC_PORT_PAIRS.getDisplayName(), null, null), - null)); - properties.put("network_policy_entries_policy_rule_dst_ports", DataModelUtil - .createPropertyDefinition(PropertyType.LIST.getDisplayName(), "Destination ports", false, - null, null, DataModelUtil.createEntrySchema( - ToscaDataType.CONTRAILV2_NETWORK_RULE_DST_PORT_PAIRS.getDisplayName(), null, null), - null)); - properties.put("network_policy_entries_policy_rule_dst_addresses", DataModelUtil - .createPropertyDefinition(PropertyType.LIST.getDisplayName(), "Destination addresses", - false, null, null, DataModelUtil.createEntrySchema( - ToscaDataType.CONTRAILV2_NETWORK_RULE_DST_VIRTUAL_NETWORK.getDisplayName(), null, - null), null)); - properties.put("network_policy_entries_policy_rule_src_addresses", DataModelUtil - .createPropertyDefinition(PropertyType.LIST.getDisplayName(), "Source addresses", false, - null, null, DataModelUtil.createEntrySchema( - ToscaDataType.CONTRAILV2_NETWORK_RULE_SRC_VIRTUAL_NETWORK.getDisplayName(), null, - null), null)); - properties.put("network_policy_entries_policy_rule_action_list", DataModelUtil - .createPropertyDefinition( - ToscaDataType.CONTRAILV2_NETWORK_RULE_ACTION_LIST.getDisplayName(), "Action list", - false, null, null, null, null)); - - dataType.setProperties(properties); - return dataType; - - } - - - private static DataType createRuleDstVirtualNetworkDataType() { - DataType dataType = new DataType(); - dataType.setDerived_from(ToscaDataType.ROOT.getDisplayName()); - dataType.setDescription("destination addresses"); - Map<String, PropertyDefinition> properties = new HashMap<>(); - - properties.put("network_policy_entries_policy_rule_dst_addresses_virtual_network", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "Destination addresses Virtual network", false, null, null, null, null)); - - dataType.setProperties(properties); - return dataType; - } - - private static DataType createRuleSrcVirtualNetworkDataType() { - DataType dataType = new DataType(); - dataType.setDerived_from(ToscaDataType.ROOT.getDisplayName()); - dataType.setDescription("source addresses"); - Map<String, PropertyDefinition> properties = new HashMap<>(); - - properties.put("network_policy_entries_policy_rule_src_addresses_virtual_network", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "Source addresses Virtual network", false, null, null, null, null)); - - dataType.setProperties(properties); - return dataType; - } - - private static DataType createPolicyRulesListDataType() { - DataType dataType = new DataType(); - dataType.setDerived_from(ToscaDataType.ROOT.getDisplayName()); - dataType.setDescription("list of policy rules"); - Map<String, PropertyDefinition> properties = new HashMap<>(); - - properties.put("network_policy_entries_policy_rule", DataModelUtil - .createPropertyDefinition(PropertyType.LIST.getDisplayName(), "Contrail network rule", - false, null, null, DataModelUtil - .createEntrySchema(ToscaDataType.CONTRAILV2_NETWORK_RULE.getDisplayName(), null, - null), null)); - - dataType.setProperties(properties); - return dataType; - } - - private static DataType createRuleActionListDataType() { - DataType dataType = new DataType(); - dataType.setDerived_from(ToscaDataType.ROOT.getDisplayName()); - dataType.setDescription("Action List"); - Map<String, PropertyDefinition> properties = new HashMap<>(); - - properties.put("network_policy_entries_policy_rule_action_list_simple_action", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "Simple Action", false, - null, null, null, null)); - properties.put("network_policy_entries_policy_rule_action_list_apply_service", DataModelUtil - .createPropertyDefinition(PropertyType.LIST.getDisplayName(), "Apply Service", false, null, - null, DataModelUtil.createEntrySchema(PropertyType.STRING.getDisplayName(), null, null), - null)); - - dataType.setProperties(properties); - return dataType; - } - - private static DataType createRuleDstPortPairsDataType() { - DataType dataType = new DataType(); - dataType.setDerived_from(ToscaDataType.ROOT.getDisplayName()); - dataType.setDescription("destination port pairs"); - Map<String, PropertyDefinition> properties = new HashMap<>(); - - properties.put("network_policy_entries_policy_rule_dst_ports_start_port", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "Start port", false, null, - null, null, null)); - properties.put("network_policy_entries_policy_rule_dst_ports_end_port", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "End port", false, null, - null, null, null)); - - dataType.setProperties(properties); - return dataType; - } - - private static DataType createRuleSrcPortPairsDataType() { - DataType dataType = new DataType(); - dataType.setDerived_from(ToscaDataType.ROOT.getDisplayName()); - dataType.setDescription("source port pairs"); - Map<String, PropertyDefinition> properties = new HashMap<>(); - - properties.put("network_policy_entries_policy_rule_src_ports_start_port", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "Start port", false, null, - null, null, null)); - properties.put("network_policy_entries_policy_rule_src_ports_end_port", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "End port", false, null, - null, null, null)); - - dataType.setProperties(properties); - return dataType; - } - - private static Map<String, NodeType> createGlobalNodeTypes() { - Map<String, NodeType> globalNodeTypes = new HashMap<>(); - globalNodeTypes.put(ToscaNodeType.CONTRAILV2_NETWORK_RULE.getDisplayName(), - createContrailV2NetworkRuleNodeType()); - return globalNodeTypes; - } - - private static NodeType createContrailV2NetworkRuleNodeType() { - NodeType contrailNetworkRuleNodeType = new NodeType(); - contrailNetworkRuleNodeType.setDerived_from(ToscaNodeType.ROOT.getDisplayName()); - contrailNetworkRuleNodeType.setProperties(createContrailNetworkRuleProperties()); - contrailNetworkRuleNodeType.setAttributes(createContrailNetworkRuleAttributes()); - contrailNetworkRuleNodeType.setRequirements(createContrailNetworkRuleRequirements()); - return contrailNetworkRuleNodeType; - } - - - private static Map<String, PropertyDefinition> createContrailNetworkRuleProperties() { - Map<String, PropertyDefinition> contrailNetworkRulePropertyDefMap = new HashMap<>(); - contrailNetworkRulePropertyDefMap.put(Constants.NAME_PROPERTY_NAME, DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "A symbolic name for this contrail v2 network rule", false, null, null, null, null)); - contrailNetworkRulePropertyDefMap.put("network_policy_entries", DataModelUtil - .createPropertyDefinition(ToscaDataType.CONTRAILV2_NETWORK_RULE_LIST.getDisplayName(), - "A symbolic name for this contrail v2 network rule", false, null, null, null, null)); - - return contrailNetworkRulePropertyDefMap; - } - - - private static Map<String, AttributeDefinition> createContrailNetworkRuleAttributes() { - Map<String, AttributeDefinition> contrailNetworkRuleAttributesDefMap = new HashMap<>(); - contrailNetworkRuleAttributesDefMap.put("fq_name", DataModelUtil - .createAttributeDefinition(PropertyType.STRING.getDisplayName(), "fq_name", null, null, - null)); - - return contrailNetworkRuleAttributesDefMap; - } - - private static List<Map<String, RequirementDefinition>> createContrailNetworkRuleRequirements() { - final List<Map<String, RequirementDefinition>> requirements = new ArrayList<>(); - final Map<String, RequirementDefinition> - contrailNetworkRuleRequirementsDefMap = new HashMap<>(); - RequirementDefinition req = new RequirementDefinition(); - req.setCapability(ToscaCapabilityType.ATTACHMENT.getDisplayName()); - req.setOccurrences(new Object[]{0, ToscaConstants.UNBOUNDED}); - req.setNode(ToscaNodeType.NETWORK.getDisplayName()); - req.setRelationship(ToscaRelationshipType.ATTACHES_TO.getDisplayName()); - contrailNetworkRuleRequirementsDefMap.put("network", req); - requirements.add(contrailNetworkRuleRequirementsDefMap); - - return requirements; - } -} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/ContrailV2VirtualMachineInterfaceGlobalType.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/ContrailV2VirtualMachineInterfaceGlobalType.java deleted file mode 100644 index 75501cb8d4..0000000000 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/ContrailV2VirtualMachineInterfaceGlobalType.java +++ /dev/null @@ -1,136 +0,0 @@ -/*- - * ============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.services.heattotosca.globaltypes; - -import org.openecomp.sdc.tosca.datatypes.ToscaDataType; -import org.openecomp.sdc.tosca.datatypes.ToscaNodeType; -import org.openecomp.sdc.tosca.datatypes.model.AttributeDefinition; -import org.openecomp.sdc.tosca.datatypes.model.DataType; -import org.openecomp.sdc.tosca.datatypes.model.NodeType; -import org.openecomp.sdc.tosca.datatypes.model.PropertyDefinition; -import org.openecomp.sdc.tosca.datatypes.model.PropertyType; -import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; -import org.openecomp.sdc.tosca.services.DataModelUtil; -import org.openecomp.sdc.tosca.services.ToscaConstants; -import org.openecomp.sdc.translator.services.heattotosca.Constants; - -import java.util.HashMap; -import java.util.Map; - -class ContrailV2VirtualMachineInterfaceGlobalType { - private ContrailV2VirtualMachineInterfaceGlobalType() { - } - - public static ServiceTemplate createServiceTemplate() { - ServiceTemplate contrailVirtualMachineInterface = new ServiceTemplate(); - contrailVirtualMachineInterface - .setTosca_definitions_version(ToscaConstants.TOSCA_DEFINITIONS_VERSION); - contrailVirtualMachineInterface.setMetadata(DataModelUtil - .createMetadata(Constants.CONTRAILV2_VIRTUAL_MACHINE_INTERFACE_TEMPLATE_NAME, "1.0.0", - null)); - contrailVirtualMachineInterface.setImports(GlobalTypesUtil.createCommonImportList()); - contrailVirtualMachineInterface - .setDescription("Contrail Virtual Machine Interface TOSCA Global Types"); - contrailVirtualMachineInterface.setNode_types(createGlobalNodeTypes()); - contrailVirtualMachineInterface.setData_types(createGlobalDataTypes()); - return contrailVirtualMachineInterface; - } - - private static Map<String, DataType> createGlobalDataTypes() { - Map<String, DataType> globalDataTypes = new HashMap<>(); - globalDataTypes - .put(ToscaDataType.CONTRAILV2_VIRTUAL_MACHINE_INTERFACE_PROPERTIES.getDisplayName(), - createVmiPropertiesDataType()); - return globalDataTypes; - } - - private static DataType createVmiPropertiesDataType() { - DataType dataType = new DataType(); - dataType.setDerived_from(ToscaDataType.ROOT.getDisplayName()); - dataType.setDescription("Virtual Machine Interface Properties."); - Map<String, PropertyDefinition> properties = new HashMap<>(); - - properties.put("virtual_machine_interface_properties_service_interface_type", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "Service Interface Type.", - false, null, null, null, null)); - dataType.setProperties(properties); - return dataType; - } - - private static Map<String, NodeType> createGlobalNodeTypes() { - Map<String, NodeType> globalNodeTypes = new HashMap<>(); - globalNodeTypes.put(ToscaNodeType.CONTRAILV2_VIRTUAL_MACHINE_INTERFACE.getDisplayName(), - createVmiNodeType()); - return globalNodeTypes; - } - - private static NodeType createVmiNodeType() { - NodeType nodeType = new NodeType(); - nodeType.setDerived_from(ToscaNodeType.NETWORK_PORT.getDisplayName()); - nodeType.setProperties(createVmiProperties()); - nodeType.setAttributes(createVmiAttributes()); - return nodeType; - } - - private static Map<String, AttributeDefinition> createVmiAttributes() { - Map<String, AttributeDefinition> vmiAttributesDefMap = new HashMap<>(); - vmiAttributesDefMap.put("fq_name", DataModelUtil - .createAttributeDefinition(PropertyType.STRING.getDisplayName(), - "The FQ name of the Virtual Network.", null, null, null)); - vmiAttributesDefMap.put("show", DataModelUtil - .createAttributeDefinition(PropertyType.STRING.getDisplayName(), "All attributes.", null, - null, null)); - return vmiAttributesDefMap; - } - - private static Map<String, PropertyDefinition> createVmiProperties() { - Map<String, PropertyDefinition> virtualMachineInterfacePropertyDefMap = new HashMap<>(); - virtualMachineInterfacePropertyDefMap.put(Constants.NAME_PROPERTY_NAME, DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "Virtual Machine Interface name", false, null, null, null, null)); - virtualMachineInterfacePropertyDefMap.put("virtual_machine_intefrace_mac_addresses", - DataModelUtil - .createPropertyDefinition(PropertyType.LIST.getDisplayName(), "List of mac addresses.", - false, null, null, - DataModelUtil.createEntrySchema(PropertyType.STRING.getDisplayName(), null, null), - null)); - virtualMachineInterfacePropertyDefMap.put("virtual_network_refs", DataModelUtil - .createPropertyDefinition(PropertyType.LIST.getDisplayName(), "List of virtual networks.", - false, null, null, - DataModelUtil.createEntrySchema(PropertyType.STRING.getDisplayName(), null, null), - null)); - virtualMachineInterfacePropertyDefMap.put("port_tuple_refs", DataModelUtil - .createPropertyDefinition(PropertyType.LIST.getDisplayName(), "List of port tuples.", false, - null, null, - DataModelUtil.createEntrySchema(PropertyType.STRING.getDisplayName(), null, null), - null)); - virtualMachineInterfacePropertyDefMap.put("security_group_refs", DataModelUtil - .createPropertyDefinition(PropertyType.LIST.getDisplayName(), "List of security groups.", - false, null, null, - DataModelUtil.createEntrySchema(PropertyType.STRING.getDisplayName(), null, null), - null)); - virtualMachineInterfacePropertyDefMap.put("virtual_machine_interface_properties", DataModelUtil - .createPropertyDefinition( - ToscaDataType.CONTRAILV2_VIRTUAL_MACHINE_INTERFACE_PROPERTIES.getDisplayName(), - "virtual machine interface properties.", false, null, null, null, null)); - return virtualMachineInterfacePropertyDefMap; - } -} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/ContrailV2VirtualNetworkGlobalType.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/ContrailV2VirtualNetworkGlobalType.java deleted file mode 100644 index 728b9f6149..0000000000 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/ContrailV2VirtualNetworkGlobalType.java +++ /dev/null @@ -1,239 +0,0 @@ -/*- - * ============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.services.heattotosca.globaltypes; - -import org.openecomp.sdc.tosca.datatypes.ToscaDataType; -import org.openecomp.sdc.tosca.datatypes.ToscaNodeType; -import org.openecomp.sdc.tosca.datatypes.model.AttributeDefinition; -import org.openecomp.sdc.tosca.datatypes.model.CapabilityDefinition; -import org.openecomp.sdc.tosca.datatypes.model.DataType; -import org.openecomp.sdc.tosca.datatypes.model.NodeType; -import org.openecomp.sdc.tosca.datatypes.model.PropertyDefinition; -import org.openecomp.sdc.tosca.datatypes.model.PropertyType; -import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; -import org.openecomp.sdc.tosca.services.DataModelUtil; -import org.openecomp.sdc.tosca.services.ToscaConstants; -import org.openecomp.sdc.translator.services.heattotosca.Constants; - -import java.util.HashMap; -import java.util.Map; - -public class ContrailV2VirtualNetworkGlobalType { - - /** - * Create service template service template. - * - * @return the service template - */ - public static ServiceTemplate createServiceTemplate() { - ServiceTemplate contrailVirtualNetworkServiceTemplate = new ServiceTemplate(); - contrailVirtualNetworkServiceTemplate - .setTosca_definitions_version(ToscaConstants.TOSCA_DEFINITIONS_VERSION); - contrailVirtualNetworkServiceTemplate.setMetadata(DataModelUtil - .createMetadata(Constants.CONTRAILV2_VIRTUAL_NETWORK_TEMPLATE_NAME, "1.0.0", null)); - contrailVirtualNetworkServiceTemplate - .setDescription("Contrail V2 Virtual Network Global Types"); - contrailVirtualNetworkServiceTemplate.setImports(GlobalTypesUtil.createCommonImportList()); - contrailVirtualNetworkServiceTemplate.setNode_types(createGlobalNodeTypes()); - contrailVirtualNetworkServiceTemplate.setData_types(createGlobalDataTypes()); - return contrailVirtualNetworkServiceTemplate; - } - - private static Map<String, NodeType> createGlobalNodeTypes() { - Map<String, NodeType> globalNodeTypes = new HashMap<>(); - globalNodeTypes.put(ToscaNodeType.CONTRAILV2_VIRTUAL_NETWORK.getDisplayName(), - createContrailVirtualNetworkNodeType()); - return globalNodeTypes; - } - - private static NodeType createContrailVirtualNetworkNodeType() { - NodeType contrailV2VirtualNetworkNodeType = new NodeType(); - contrailV2VirtualNetworkNodeType.setDerived_from(ToscaNodeType.NETWORK.getDisplayName()); - contrailV2VirtualNetworkNodeType.setProperties(createContrailVirtualNetworkProperties()); - contrailV2VirtualNetworkNodeType.setAttributes(createContrailVirtualNetworkAttributes()); - contrailV2VirtualNetworkNodeType.setCapabilities(createContrailVirtualNetworkCapabilities()); - return contrailV2VirtualNetworkNodeType; - } - - private static Map<String, CapabilityDefinition> createContrailVirtualNetworkCapabilities() { - Map<String, CapabilityDefinition> capabilities = new HashMap<>(); - capabilities.put("attachment", GlobalTypesUtil.createAttachmentCapability()); - return capabilities; - } - - private static Map<String, PropertyDefinition> createContrailVirtualNetworkProperties() { - Map<String, PropertyDefinition> contrailVirtualNetworkPropertyDefMap = new HashMap<>(); - //contrailVirtualNetworkPropertyDefMap.put("name", DataModelUtil. - // createPropertyDefinition(PropertyType.STRING.getDisplayName() - // , "Name", false, null, null, null, null)); - contrailVirtualNetworkPropertyDefMap.put("network_ipam_refs", DataModelUtil - .createPropertyDefinition(PropertyType.LIST.getDisplayName(), "IPAM references", false, - null, null, - DataModelUtil.createEntrySchema(PropertyType.STRING.getDisplayName(), null, null), - null)); - contrailVirtualNetworkPropertyDefMap.put("network_ipam_refs_data", DataModelUtil - .createPropertyDefinition(PropertyType.LIST.getDisplayName(), "IPAM references Data", false, - null, null, DataModelUtil.createEntrySchema( - ToscaDataType.CONTRAILV2_VIRTUAL_NETWORK_IPAM_REF_DATA.getDisplayName(), null, - null), null)); - contrailVirtualNetworkPropertyDefMap.put("network_policy_refs", DataModelUtil - .createPropertyDefinition(PropertyType.LIST.getDisplayName(), "Policy references", false, - null, null, - DataModelUtil.createEntrySchema(PropertyType.STRING.getDisplayName(), null, null), - null)); - contrailVirtualNetworkPropertyDefMap.put("network_policy_refs_data", DataModelUtil - .createPropertyDefinition(PropertyType.LIST.getDisplayName(), "Policy references data", - false, null, null, DataModelUtil.createEntrySchema( - ToscaDataType.CONTRAILV2_VIRTUAL_NETWORK_POLICY_REF_DATA.getDisplayName(), null, - null), null)); - contrailVirtualNetworkPropertyDefMap.put("subnets", DataModelUtil - .createPropertyDefinition(PropertyType.MAP.getDisplayName(), "Network related subnets", - false, null, null, DataModelUtil - .createEntrySchema(ToscaDataType.NEUTRON_SUBNET.getDisplayName(), null, null), - null)); - return contrailVirtualNetworkPropertyDefMap; - } - - private static Map<String, DataType> createGlobalDataTypes() { - Map<String, DataType> globalDataTypes = new HashMap<>(); - globalDataTypes.put(ToscaDataType.CONTRAILV2_VIRTUAL_NETWORK_IPAM_REF_DATA.getDisplayName(), - createVirtualNetworkIpamRefDataDataType()); - globalDataTypes.put( - ToscaDataType.CONTRAILV2_VIRTUAL_NETWORK_IPAM_REF_DATA_IPAM_SUBNET_LIST.getDisplayName(), - createVirtualNetworkIpamRefDataIpanSubnetListDataType()); - globalDataTypes - .put(ToscaDataType.CONTRAILV2_VIRTUAL_NETWORK_IPAM_REF_DATA_IPAM_SUBNET.getDisplayName(), - createVirtualNetworkIpamRefDataIpanSubnetDataType()); - globalDataTypes.put(ToscaDataType.CONTRAILV2_VIRTUAL_NETWORK_POLICY_REF_DATA.getDisplayName(), - createVirtualNetworkPolicyRefDataDataType()); - globalDataTypes - .put(ToscaDataType.CONTRAILV2_VIRTUAL_NETWORK_POLICY_REF_DATA_SEQUENCE.getDisplayName(), - createVirtualNetworkPolicyRefSequenceDataDataType()); - return globalDataTypes; - } - - private static DataType createVirtualNetworkIpamRefDataDataType() { - DataType dataType = new DataType(); - dataType.setDerived_from(ToscaDataType.ROOT.getDisplayName()); - dataType.setDescription("Network Ipam Ref Data"); - Map<String, PropertyDefinition> properties = new HashMap<>(); - - properties.put("network_ipam_refs_data_ipam_subnets", DataModelUtil - .createPropertyDefinition(PropertyType.LIST.getDisplayName(), - "Network ipam refs data ipam subnets", false, null, null, DataModelUtil - .createEntrySchema( - ToscaDataType.CONTRAILV2_VIRTUAL_NETWORK_IPAM_REF_DATA_IPAM_SUBNET_LIST - .getDisplayName(), null, null), null)); - dataType.setProperties(properties); - return dataType; - } - - private static DataType createVirtualNetworkIpamRefDataIpanSubnetListDataType() { - DataType dataType = new DataType(); - dataType.setDerived_from(ToscaDataType.ROOT.getDisplayName()); - dataType.setDescription("Network Ipam Ref Data Subnet List"); - Map<String, PropertyDefinition> properties = new HashMap<>(); - - properties.put("network_ipam_refs_data_ipam_subnets_subnet", DataModelUtil - .createPropertyDefinition( - ToscaDataType.CONTRAILV2_VIRTUAL_NETWORK_IPAM_REF_DATA_IPAM_SUBNET.getDisplayName(), - "Network ipam refs data ipam subnets", false, null, null, null, null)); - properties.put("network_ipam_refs_data_ipam_subnets_addr_from_start", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "Network ipam refs data ipam subnets addr from start", false, null, null, null, null)); - - dataType.setProperties(properties); - return dataType; - } - - private static DataType createVirtualNetworkIpamRefDataIpanSubnetDataType() { - DataType dataType = new DataType(); - dataType.setDerived_from(ToscaDataType.ROOT.getDisplayName()); - dataType.setDescription("Network Ipam Ref Data Subnet"); - Map<String, PropertyDefinition> properties = new HashMap<>(); - - properties.put("network_ipam_refs_data_ipam_subnets_subnet_ip_prefix", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "Network ipam refs data ipam subnets ip prefix", false, null, null, null, null)); - properties.put("network_ipam_refs_data_ipam_subnets_subnet_ip_prefix_len", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "Network ipam refs data ipam subnets ip prefix len", false, null, null, null, null)); - dataType.setProperties(properties); - return dataType; - } - - - private static DataType createVirtualNetworkPolicyRefDataDataType() { - DataType dataType = new DataType(); - dataType.setDerived_from(ToscaDataType.ROOT.getDisplayName()); - dataType.setDescription("network policy refs data"); - Map<String, PropertyDefinition> properties = new HashMap<>(); - - properties.put("network_policy_refs_data_sequence", DataModelUtil.createPropertyDefinition( - ToscaDataType.CONTRAILV2_VIRTUAL_NETWORK_POLICY_REF_DATA_SEQUENCE.getDisplayName(), - "Network Policy ref data sequence", false, null, null, null, null)); - - - dataType.setProperties(properties); - return dataType; - } - - - private static DataType createVirtualNetworkPolicyRefSequenceDataDataType() { - DataType dataType = new DataType(); - dataType.setDerived_from(ToscaDataType.ROOT.getDisplayName()); - dataType.setDescription("network policy refs data sequence"); - Map<String, PropertyDefinition> properties = new HashMap<>(); - - properties.put("network_policy_refs_data_sequence_major", DataModelUtil - .createPropertyDefinition(PropertyType.INTEGER.getDisplayName(), - "Network Policy ref data sequence Major", false, null, null, null, null)); - properties.put("network_policy_refs_data_sequence_minor", DataModelUtil - .createPropertyDefinition(PropertyType.INTEGER.getDisplayName(), - "Network Policy ref data sequence Minor", false, null, null, null, null)); - - dataType.setProperties(properties); - return dataType; - } - - private static Map<String, AttributeDefinition> createContrailVirtualNetworkAttributes() { - Map<String, AttributeDefinition> contrailVirtualNetworkAttributesDefMap = new HashMap<>(); - contrailVirtualNetworkAttributesDefMap.put("subnets_name", DataModelUtil - .createAttributeDefinition(PropertyType.LIST.getDisplayName(), - "Subnets name of this network", null, - DataModelUtil.createEntrySchema(PropertyType.STRING.getDisplayName(), null, null), - null)); - contrailVirtualNetworkAttributesDefMap.put("subnets", DataModelUtil - .createAttributeDefinition(PropertyType.MAP.getDisplayName(), "Network related subnets", - null, DataModelUtil - .createEntrySchema(ToscaDataType.NEUTRON_SUBNET.getDisplayName(), null, null), - null)); - contrailVirtualNetworkAttributesDefMap.put("subnets_show", DataModelUtil - .createAttributeDefinition(PropertyType.MAP.getDisplayName(), - "Detailed information about each subnet", null, - DataModelUtil.createEntrySchema(PropertyType.STRING.getDisplayName(), null, null), - null)); - contrailVirtualNetworkAttributesDefMap.put("fq_name", DataModelUtil - .createAttributeDefinition(PropertyType.STRING.getDisplayName(), "fq_name", null, null, - null)); - return contrailVirtualNetworkAttributesDefMap; - } -} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/ContrailVirtualNetworkGlobalType.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/ContrailVirtualNetworkGlobalType.java deleted file mode 100644 index 1014757a2c..0000000000 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/ContrailVirtualNetworkGlobalType.java +++ /dev/null @@ -1,134 +0,0 @@ -/*- - * ============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.services.heattotosca.globaltypes; - -import org.openecomp.sdc.tosca.datatypes.ToscaDataType; -import org.openecomp.sdc.tosca.datatypes.ToscaNodeType; -import org.openecomp.sdc.tosca.datatypes.model.AttributeDefinition; -import org.openecomp.sdc.tosca.datatypes.model.CapabilityDefinition; -import org.openecomp.sdc.tosca.datatypes.model.NodeType; -import org.openecomp.sdc.tosca.datatypes.model.PropertyDefinition; -import org.openecomp.sdc.tosca.datatypes.model.PropertyType; -import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; -import org.openecomp.sdc.tosca.services.DataModelUtil; -import org.openecomp.sdc.tosca.services.ToscaConstants; -import org.openecomp.sdc.translator.services.heattotosca.Constants; - -import java.util.HashMap; -import java.util.Map; - -public class ContrailVirtualNetworkGlobalType { - - /** - * Create service template service template. - * - * @return the service template - */ - public static ServiceTemplate createServiceTemplate() { - ServiceTemplate contrailVirtualNetworkServiceTemplate = new ServiceTemplate(); - contrailVirtualNetworkServiceTemplate - .setTosca_definitions_version(ToscaConstants.TOSCA_DEFINITIONS_VERSION); - contrailVirtualNetworkServiceTemplate.setMetadata(DataModelUtil - .createMetadata(Constants.CONTRAIL_VIRTUAL_NETWORK_TEMPLATE_NAME, "1.0.0", null)); - contrailVirtualNetworkServiceTemplate.setDescription("Contrail Virtual Network Global Types"); - contrailVirtualNetworkServiceTemplate.setImports(GlobalTypesUtil.createCommonImportList()); - contrailVirtualNetworkServiceTemplate.setNode_types(createGlobalNodeTypes()); - return contrailVirtualNetworkServiceTemplate; - } - - private static Map<String, NodeType> createGlobalNodeTypes() { - Map<String, NodeType> globalNodeTypes = new HashMap<>(); - globalNodeTypes.put(ToscaNodeType.CONTRAIL_VIRTUAL_NETWORK.getDisplayName(), - createContrailVirtualNetworkNodeType()); - return globalNodeTypes; - } - - private static NodeType createContrailVirtualNetworkNodeType() { - NodeType contrailVirtualNetworkNodeType = new NodeType(); - contrailVirtualNetworkNodeType.setDerived_from(ToscaNodeType.NETWORK.getDisplayName()); - contrailVirtualNetworkNodeType.setProperties(createContrailVirtualNetworkProperties()); - contrailVirtualNetworkNodeType.setAttributes(createContrailVirtualNetworkAttributes()); - contrailVirtualNetworkNodeType.setCapabilities(createContrailVirtualNetworkCapabilities()); - return contrailVirtualNetworkNodeType; - } - - private static Map<String, CapabilityDefinition> createContrailVirtualNetworkCapabilities() { - Map<String, CapabilityDefinition> capabilities = new HashMap<>(); - capabilities.put("attachment", GlobalTypesUtil.createAttachmentCapability()); - return capabilities; - } - - private static Map<String, PropertyDefinition> createContrailVirtualNetworkProperties() { - Map<String, PropertyDefinition> contrailVirtualNetworkPropertyDefMap = new HashMap<>(); - contrailVirtualNetworkPropertyDefMap.put("shared", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "Is virtual network shared", - false, null, null, null, null)); - contrailVirtualNetworkPropertyDefMap.put("external", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "Is virtual network external", false, null, null, null, null)); - contrailVirtualNetworkPropertyDefMap.put("allow_transit", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "Whether this network should be transitive.", false, null, null, null, null)); - contrailVirtualNetworkPropertyDefMap.put("route_targets", DataModelUtil - .createPropertyDefinition(PropertyType.LIST.getDisplayName(), - "route targets associated with the virtual network", false, null, null, - DataModelUtil.createEntrySchema(PropertyType.STRING.getDisplayName(), null, null), - null)); - contrailVirtualNetworkPropertyDefMap.put("forwarding_mode", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "forwarding mode of the virtual network", false, null, null, null, null)); - contrailVirtualNetworkPropertyDefMap.put("flood_unknown_unicast", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "flood L2 packets on network", false, null, null, null, null)); - contrailVirtualNetworkPropertyDefMap.put("subnets", DataModelUtil - .createPropertyDefinition(PropertyType.MAP.getDisplayName(), "Network related subnets", - false, null, null, DataModelUtil - .createEntrySchema(ToscaDataType.NEUTRON_SUBNET.getDisplayName(), null, null), - null)); - return contrailVirtualNetworkPropertyDefMap; - } - - private static Map<String, AttributeDefinition> createContrailVirtualNetworkAttributes() { - Map<String, AttributeDefinition> contrailVirtualNetworkAttributesDefMap = new HashMap<>(); - contrailVirtualNetworkAttributesDefMap.put("subnets_name", DataModelUtil - .createAttributeDefinition(PropertyType.LIST.getDisplayName(), - "Subnets name of this network", null, - DataModelUtil.createEntrySchema(PropertyType.STRING.getDisplayName(), null, null), - null)); - contrailVirtualNetworkAttributesDefMap.put("subnets", DataModelUtil - .createAttributeDefinition(PropertyType.MAP.getDisplayName(), "Network related subnets", - null, DataModelUtil - .createEntrySchema(ToscaDataType.NEUTRON_SUBNET.getDisplayName(), null, null), - null)); - contrailVirtualNetworkAttributesDefMap.put("subnets_show", DataModelUtil - .createAttributeDefinition(PropertyType.MAP.getDisplayName(), - "Detailed information about each subnet", null, - DataModelUtil.createEntrySchema(PropertyType.STRING.getDisplayName(), null, null), - null)); - contrailVirtualNetworkAttributesDefMap.put("fq_name", DataModelUtil - .createAttributeDefinition(PropertyType.STRING.getDisplayName(), "fq_name", null, null, - null)); - contrailVirtualNetworkAttributesDefMap.put("show", DataModelUtil - .createAttributeDefinition(PropertyType.STRING.getDisplayName(), "All attributes.", null, - null, null)); - return contrailVirtualNetworkAttributesDefMap; - } -} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/GlobalTypesGenerator.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/GlobalTypesGenerator.java index a4ec764e14..6dada6ab84 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/GlobalTypesGenerator.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/GlobalTypesGenerator.java @@ -22,13 +22,14 @@ package org.openecomp.sdc.translator.services.heattotosca.globaltypes; import org.openecomp.sdc.tosca.datatypes.model.Import; import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; -import org.openecomp.sdc.tosca.services.ToscaNativeTypesServiceTemplate; -import org.openecomp.sdc.tosca.services.ToscaUtil; -import org.openecomp.sdc.translator.services.heattotosca.Constants; +import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; + public class GlobalTypesGenerator { private GlobalTypesGenerator() { @@ -40,51 +41,7 @@ public class GlobalTypesGenerator { * @return the global types service template */ public static Map<String, ServiceTemplate> getGlobalTypesServiceTemplate() { - Map<String, ServiceTemplate> serviceTemplates = new HashMap<>(); - - ToscaUtil.addServiceTemplateToMapWithKeyFileName(serviceTemplates, - CommonGlobalTypes.createServiceTemplate()); - ToscaUtil.addServiceTemplateToMapWithKeyFileName(serviceTemplates, - NovaServerGlobalType.createServiceTemplate()); - ToscaUtil.addServiceTemplateToMapWithKeyFileName(serviceTemplates, - CinderVolumeGlobalType.createServiceTemplate()); - ToscaUtil.addServiceTemplateToMapWithKeyFileName(serviceTemplates, - ContrailVirtualNetworkGlobalType.createServiceTemplate()); - ToscaUtil.addServiceTemplateToMapWithKeyFileName(serviceTemplates, - ContrailV2VirtualNetworkGlobalType.createServiceTemplate()); - ToscaUtil.addServiceTemplateToMapWithKeyFileName(serviceTemplates, - ContrailV2VirtualMachineInterfaceGlobalType.createServiceTemplate()); - ToscaUtil.addServiceTemplateToMapWithKeyFileName(serviceTemplates, - NeutronNetGlobalType.createServiceTemplate()); - ToscaUtil.addServiceTemplateToMapWithKeyFileName(serviceTemplates, - NeutronPortGlobalType.createServiceTemplate()); - ToscaUtil.addServiceTemplateToMapWithKeyFileName(serviceTemplates, - ContrailNetworkRuleGlobalType.createServiceTemplate()); - ToscaUtil.addServiceTemplateToMapWithKeyFileName(serviceTemplates, - ContrailV2NetworkRuleGlobalType.createServiceTemplate()); - ToscaUtil.addServiceTemplateToMapWithKeyFileName(serviceTemplates, - NeutronSecurityRulesGlobalType.createServiceTemplate()); - ToscaUtil.addServiceTemplateToMapWithKeyFileName(serviceTemplates, - AbstractSubstituteGlobalType.createServiceTemplate()); - ToscaUtil.addServiceTemplateToMapWithKeyFileName(serviceTemplates, - ToscaNativeTypesServiceTemplate.createServiceTemplate()); - ToscaUtil.addServiceTemplateToMapWithKeyFileName(serviceTemplates, - ContrailComputeGlobalType.createServiceTemplate()); - ToscaUtil.addServiceTemplateToMapWithKeyFileName(serviceTemplates, - ContrailPortGlobalType.createServiceTemplate()); - ToscaUtil.addServiceTemplateToMapWithKeyFileName(serviceTemplates, - ContrailV2NetworkRuleGlobalType.createServiceTemplate()); - ToscaUtil.addServiceTemplateToMapWithKeyFileName(serviceTemplates, - ContrailV2VirtualNetworkGlobalType.createServiceTemplate()); - ToscaUtil.addServiceTemplateToMapWithKeyFileName(serviceTemplates, - ContrailAbstractSubstituteGlobalType.createServiceTemplate()); - return serviceTemplates; - } - - private static void addGlobalServiceTemplate(Map<String, ServiceTemplate> serviceTemplates, - ServiceTemplate commonServiceTemplate) { - serviceTemplates - .put(ToscaUtil.getServiceTemplateFileName(commonServiceTemplate), commonServiceTemplate); + return GlobalTypesServiceTemplates.getGlobalTypesServiceTemplates(); } /** @@ -92,37 +49,15 @@ public class GlobalTypesGenerator { * * @return the global types import list */ - public static Map<String, Import> getGlobalTypesImportList() { + public static List<Map<String, Import>> getGlobalTypesImportList() { + List<Map<String, Import>> globalImports = new ArrayList<>(); Map<String, Import> globalImportMap = new HashMap<>(); - globalImportMap.put(Constants.COMMON_GLOBAL_TEMPLATE_NAME, - GlobalTypesUtil.createServiceTemplateImport(Constants.COMMON_GLOBAL_TEMPLATE_NAME)); - globalImportMap.put(Constants.NOVA_SERVER_TEMPLATE_NAME, - GlobalTypesUtil.createServiceTemplateImport(Constants.NOVA_SERVER_TEMPLATE_NAME)); - globalImportMap.put(Constants.NEUTRON_PORT_TEMPLATE_NAME, - GlobalTypesUtil.createServiceTemplateImport(Constants.NEUTRON_PORT_TEMPLATE_NAME)); - globalImportMap.put(Constants.NEUTRON_SECURITY_RULES_TEMPLATE_NAME, GlobalTypesUtil - .createServiceTemplateImport(Constants.NEUTRON_SECURITY_RULES_TEMPLATE_NAME)); - globalImportMap.put(Constants.NEUTRON_NET_TEMPLATE_NAME, - GlobalTypesUtil.createServiceTemplateImport(Constants.NEUTRON_NET_TEMPLATE_NAME)); - globalImportMap.put(Constants.CINDER_VOLUME_TEMPLATE_NAME, - GlobalTypesUtil.createServiceTemplateImport(Constants.CINDER_VOLUME_TEMPLATE_NAME)); - globalImportMap.put(Constants.CONTRAIL_VIRTUAL_NETWORK_TEMPLATE_NAME, GlobalTypesUtil - .createServiceTemplateImport(Constants.CONTRAIL_VIRTUAL_NETWORK_TEMPLATE_NAME)); - globalImportMap.put(Constants.CONTRAIL_NETWORK_RULE_TEMPLATE_NAME, - GlobalTypesUtil.createServiceTemplateImport(Constants.CONTRAIL_NETWORK_RULE_TEMPLATE_NAME)); - globalImportMap.put(Constants.ABSTRACT_SUBSTITUTE_TEMPLATE_NAME, - GlobalTypesUtil.createServiceTemplateImport(Constants.ABSTRACT_SUBSTITUTE_TEMPLATE_NAME)); - globalImportMap.put(Constants.CONTRAILV2_VIRTUAL_MACHINE_INTERFACE_TEMPLATE_NAME, - GlobalTypesUtil.createServiceTemplateImport( - Constants.CONTRAILV2_VIRTUAL_MACHINE_INTERFACE_TEMPLATE_NAME)); - globalImportMap.put(Constants.CONTRAIL_COMPUTE_TEMPLATE_NAME, - GlobalTypesUtil.createServiceTemplateImport(Constants.CONTRAIL_COMPUTE_TEMPLATE_NAME)); - globalImportMap.put(Constants.CONTRAIL_PORT_TEMPLATE_NAME, - GlobalTypesUtil.createServiceTemplateImport(Constants.CONTRAIL_PORT_TEMPLATE_NAME)); - globalImportMap.put(Constants.CONTRAIL_ABSTRACT_SUBSTITUTE_TEMPLATE_NAME, GlobalTypesUtil - .createServiceTemplateImport(Constants.CONTRAIL_ABSTRACT_SUBSTITUTE_TEMPLATE_NAME)); - return globalImportMap; + Map<String, ServiceTemplate> globalTypesServiceTemplate = + GlobalTypesGenerator.getGlobalTypesServiceTemplate(); + globalImportMap.put("openecomp_heat_index", + HeatToToscaUtil.createServiceTemplateImport(globalTypesServiceTemplate.get + ("openecomp-heat/_index.yml"))); + globalImports.add(globalImportMap); + return globalImports; } - - } diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/GlobalTypesServiceTemplates.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/GlobalTypesServiceTemplates.java new file mode 100644 index 0000000000..cbc56d7773 --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/GlobalTypesServiceTemplates.java @@ -0,0 +1,61 @@ +package org.openecomp.sdc.translator.services.heattotosca.globaltypes; + +import org.openecomp.sdc.common.errors.CoreException; +import org.openecomp.sdc.common.errors.ErrorCategory; +import org.openecomp.sdc.common.errors.ErrorCode; +import org.openecomp.sdc.logging.types.LoggerErrorDescription; +import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; +import org.openecomp.sdc.tosca.services.ToscaUtil; +import org.openecomp.sdc.tosca.services.yamlutil.ToscaExtensionYamlUtil; +import org.openecomp.sdc.translator.utils.ResourceWalker; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author Avrahamg + * @since April 03, 2017 + */ +public class GlobalTypesServiceTemplates { + private static Map<String, ServiceTemplate> globalTypesServiceTemplates; + + + public static Map<String, ServiceTemplate> getGlobalTypesServiceTemplates() { + if (globalTypesServiceTemplates == null) { + synchronized (GlobalTypesServiceTemplates.class) { + if (globalTypesServiceTemplates == null) { + init(); + } + } + } + return globalTypesServiceTemplates; + } + + private static void init() { + globalTypesServiceTemplates = new HashMap<>(); + Map<String, String> globalTypes = null; + try { + globalTypes = ResourceWalker.readResourcesFromDirectory("globalTypes"); + } catch (CoreException coreException) { + throw coreException; + } catch (Exception exception) { + throw new CoreException((new ErrorCode.ErrorCodeBuilder()) + .withMessage(LoggerErrorDescription.FAILED_TO_GENERATE_GLOBAL_TYPES) + .withId("GlobalTypes Read Error").withCategory(ErrorCategory.APPLICATION).build(), + exception); + } + ToscaExtensionYamlUtil toscaExtensionYamlUtil = new ToscaExtensionYamlUtil(); + for (Map.Entry<String, String> globalTypeContent : globalTypes.entrySet()) { + if (globalTypeContent.getKey().contains("openecomp-inventory")) { // this global types folder + // should not be + // processed to the CSAR + continue; + } + ToscaUtil.addServiceTemplateToMapWithKeyFileName(globalTypesServiceTemplates, + toscaExtensionYamlUtil.yamlToObject(globalTypeContent.getValue(), ServiceTemplate.class)); + } + } + + private GlobalTypesServiceTemplates() { + } +} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/GlobalTypesUtil.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/GlobalTypesUtil.java deleted file mode 100644 index 9566dec581..0000000000 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/GlobalTypesUtil.java +++ /dev/null @@ -1,69 +0,0 @@ -/*- - * ============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.services.heattotosca.globaltypes; - - -import org.openecomp.sdc.tosca.datatypes.ToscaCapabilityType; -import org.openecomp.sdc.tosca.datatypes.model.CapabilityDefinition; -import org.openecomp.sdc.tosca.datatypes.model.Import; -import org.openecomp.sdc.tosca.services.ToscaUtil; - -import java.util.HashMap; -import java.util.Map; - -public class GlobalTypesUtil { - - - /** - * Create common import list map. - * - * @return the map - */ - public static Map<String, Import> createCommonImportList() { - Map<String, Import> importsMap = new HashMap<>(); - importsMap.put("common_definitions", CommonGlobalTypes.createCommonServiceTemplateImport()); - return importsMap; - } - - /** - * Create attachment capability capability definition. - * - * @return the capability definition - */ - public static CapabilityDefinition createAttachmentCapability() { - CapabilityDefinition capability = new CapabilityDefinition(); - capability.setType(ToscaCapabilityType.ATTACHMENT.getDisplayName()); - - return capability; - } - - /** - * Create service template import import. - * - * @param serviceTemplateName the service template name - * @return the import - */ - public static Import createServiceTemplateImport(String serviceTemplateName) { - Import serviceTemplateImport = new Import(); - serviceTemplateImport.setFile(ToscaUtil.getServiceTemplateFileName(serviceTemplateName)); - return serviceTemplateImport; - } -} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/NeutronNetGlobalType.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/NeutronNetGlobalType.java deleted file mode 100644 index 2532f87cf5..0000000000 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/NeutronNetGlobalType.java +++ /dev/null @@ -1,143 +0,0 @@ -/*- - * ============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.services.heattotosca.globaltypes; - -import org.openecomp.sdc.tosca.datatypes.ToscaDataType; -import org.openecomp.sdc.tosca.datatypes.ToscaNodeType; -import org.openecomp.sdc.tosca.datatypes.model.AttributeDefinition; -import org.openecomp.sdc.tosca.datatypes.model.CapabilityDefinition; -import org.openecomp.sdc.tosca.datatypes.model.NodeType; -import org.openecomp.sdc.tosca.datatypes.model.PropertyDefinition; -import org.openecomp.sdc.tosca.datatypes.model.PropertyType; -import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; -import org.openecomp.sdc.tosca.services.DataModelUtil; -import org.openecomp.sdc.tosca.services.ToscaConstants; -import org.openecomp.sdc.translator.services.heattotosca.Constants; - -import java.util.HashMap; -import java.util.Map; - -public class NeutronNetGlobalType { - /** - * Create service template service template. - * - * @return the service template - */ - public static ServiceTemplate createServiceTemplate() { - ServiceTemplate neutronNetServiceTemplate = new ServiceTemplate(); - neutronNetServiceTemplate - .setTosca_definitions_version(ToscaConstants.TOSCA_DEFINITIONS_VERSION); - neutronNetServiceTemplate.setMetadata( - DataModelUtil.createMetadata(Constants.NEUTRON_NET_TEMPLATE_NAME, "1.0.0", null)); - neutronNetServiceTemplate.setDescription("Neutron Network TOSCA Global Types"); - neutronNetServiceTemplate.setImports(GlobalTypesUtil.createCommonImportList()); - neutronNetServiceTemplate.setNode_types(createGlobalNodeTypes()); - return neutronNetServiceTemplate; - } - - - private static Map<String, NodeType> createGlobalNodeTypes() { - Map<String, NodeType> globalNodeTypes = new HashMap<>(); - globalNodeTypes.put(ToscaNodeType.NEUTRON_NET.getDisplayName(), createNeutronNetworkNodeType()); - return globalNodeTypes; - } - - private static NodeType createNeutronNetworkNodeType() { - NodeType neutronNetworkNode = new NodeType(); - neutronNetworkNode.setDerived_from(ToscaNodeType.NETWORK.getDisplayName()); - neutronNetworkNode.setProperties(createNeutronNetworkProperties()); - neutronNetworkNode.setAttributes(createNeutronNetworkAttributes()); - neutronNetworkNode.setCapabilities(createNeutronNetworkCapabilities()); - - return neutronNetworkNode; - } - - private static Map<String, CapabilityDefinition> createNeutronNetworkCapabilities() { - Map<String, CapabilityDefinition> capabilities = new HashMap<>(); - capabilities.put("attachment", GlobalTypesUtil.createAttachmentCapability()); - return capabilities; - } - - private static Map<String, PropertyDefinition> createNeutronNetworkProperties() { - Map<String, PropertyDefinition> neutronNetworkPropertyDefMap = new HashMap<>(); - neutronNetworkPropertyDefMap.put("admin_state_up", DataModelUtil - .createPropertyDefinition(PropertyType.BOOLEAN.getDisplayName(), - "A boolean value specifying the administrative status of the network", false, null, - null, null, true)); - neutronNetworkPropertyDefMap.put("dhcp_agent_ids", DataModelUtil - .createPropertyDefinition(PropertyType.LIST.getDisplayName(), - "The IDs of the DHCP agent to schedule the network", false, null, null, - DataModelUtil.createEntrySchema(PropertyType.STRING.getDisplayName(), null, null), - null)); - neutronNetworkPropertyDefMap.put("port_security_enabled", DataModelUtil - .createPropertyDefinition(PropertyType.BOOLEAN.getDisplayName(), - "Flag to enable/disable port security on the network", false, null, null, null, null)); - neutronNetworkPropertyDefMap.put("qos_policy", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "The name or ID of QoS policy to attach to this network", false, null, null, null, - null)); - neutronNetworkPropertyDefMap.put("shared", DataModelUtil - .createPropertyDefinition(PropertyType.BOOLEAN.getDisplayName(), - "Whether this network should be shared across all tenants", false, null, null, null, - false)); - neutronNetworkPropertyDefMap.put("tenant_id", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "The ID of the tenant which will own the network", false, null, null, null, null)); - neutronNetworkPropertyDefMap.put("value_specs", DataModelUtil - .createPropertyDefinition(PropertyType.MAP.getDisplayName(), - "Extra parameters to include in the request", false, null, null, - DataModelUtil.createEntrySchema(PropertyType.STRING.getDisplayName(), null, null), - new HashMap<String, String>())); - neutronNetworkPropertyDefMap.put("subnets", DataModelUtil - .createPropertyDefinition(PropertyType.MAP.getDisplayName(), "Network related subnets", - false, null, null, DataModelUtil - .createEntrySchema(ToscaDataType.NEUTRON_SUBNET.getDisplayName(), null, null), - null)); - return neutronNetworkPropertyDefMap; - } - - private static Map<String, AttributeDefinition> createNeutronNetworkAttributes() { - Map<String, AttributeDefinition> neutronNetworkAttributesDefMap = new HashMap<>(); - neutronNetworkAttributesDefMap.put("mtu", DataModelUtil - .createAttributeDefinition(PropertyType.SCALAR_UNIT_SIZE.getDisplayName(), - "The maximum transmission unit size(in bytes) for the network", null, null, null)); - neutronNetworkAttributesDefMap.put("qos_policy_id", DataModelUtil - .createAttributeDefinition(PropertyType.STRING.getDisplayName(), - "The QoS policy ID attached to this network", null, null, null)); - neutronNetworkAttributesDefMap.put("show", DataModelUtil - .createAttributeDefinition(PropertyType.STRING.getDisplayName(), - "Detailed information about resource", null, null, null)); - neutronNetworkAttributesDefMap.put("status", DataModelUtil - .createAttributeDefinition(PropertyType.STRING.getDisplayName(), - "The status of the network", null, null, null)); - neutronNetworkAttributesDefMap.put("subnets_name", DataModelUtil - .createAttributeDefinition(PropertyType.LIST.getDisplayName(), - "Subnets name of this network", null, - DataModelUtil.createEntrySchema(PropertyType.STRING.getDisplayName(), null, null), - null)); - neutronNetworkAttributesDefMap.put("subnets", DataModelUtil - .createAttributeDefinition(PropertyType.MAP.getDisplayName(), "Network related subnets", - null, DataModelUtil - .createEntrySchema(ToscaDataType.NEUTRON_SUBNET.getDisplayName(), null, null), - null)); - return neutronNetworkAttributesDefMap; - } -} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/NeutronPortGlobalType.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/NeutronPortGlobalType.java deleted file mode 100644 index 2106b9b3bc..0000000000 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/NeutronPortGlobalType.java +++ /dev/null @@ -1,203 +0,0 @@ -/*- - * ============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.services.heattotosca.globaltypes; - -import org.openecomp.sdc.tosca.datatypes.ToscaDataType; -import org.openecomp.sdc.tosca.datatypes.ToscaNodeType; -import org.openecomp.sdc.tosca.datatypes.model.AttributeDefinition; -import org.openecomp.sdc.tosca.datatypes.model.CapabilityDefinition; -import org.openecomp.sdc.tosca.datatypes.model.Constraint; -import org.openecomp.sdc.tosca.datatypes.model.DataType; -import org.openecomp.sdc.tosca.datatypes.model.NodeType; -import org.openecomp.sdc.tosca.datatypes.model.PropertyDefinition; -import org.openecomp.sdc.tosca.datatypes.model.PropertyType; -import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; -import org.openecomp.sdc.tosca.services.DataModelUtil; -import org.openecomp.sdc.tosca.services.ToscaConstants; -import org.openecomp.sdc.translator.services.heattotosca.Constants; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class NeutronPortGlobalType { - /** - * Create service template service template. - * - * @return the service template - */ - public static ServiceTemplate createServiceTemplate() { - ServiceTemplate neutronPortServiceTemplate = new ServiceTemplate(); - neutronPortServiceTemplate - .setTosca_definitions_version(ToscaConstants.TOSCA_DEFINITIONS_VERSION); - neutronPortServiceTemplate.setMetadata( - DataModelUtil.createMetadata(Constants.NEUTRON_PORT_TEMPLATE_NAME, "1.0.0", null)); - neutronPortServiceTemplate.setImports(GlobalTypesUtil.createCommonImportList()); - neutronPortServiceTemplate.setDescription("Neutron Port TOSCA Global Types"); - neutronPortServiceTemplate.setData_types(createGlobalDataTypes()); - neutronPortServiceTemplate.setNode_types(createGlobalNodeTypes()); - return neutronPortServiceTemplate; - } - - private static Map<String, DataType> createGlobalDataTypes() { - Map<String, DataType> globalDataTypes = new HashMap<>(); - globalDataTypes - .put(ToscaDataType.NEUTRON_PORT_FIXED_IPS.getDisplayName(), createFixedIpsDataType()); - return globalDataTypes; - } - - private static DataType createFixedIpsDataType() { - DataType dataType = new DataType(); - dataType.setDerived_from(ToscaDataType.ROOT.getDisplayName()); - dataType.setDescription("subnet/ip_address"); - Map<String, PropertyDefinition> prop = new HashMap<>(); - - prop.put("subnet", DataModelUtil.createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "Subnet in which to allocate the IP address for this port", false, null, null, null, null)); - prop.put("ip_address", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "IP address desired in the subnet for this port", false, null, null, null, null)); - - dataType.setProperties(prop); - return dataType; - } - - private static Map<String, NodeType> createGlobalNodeTypes() { - Map<String, NodeType> globalNodeTypes = new HashMap<>(); - globalNodeTypes.put(ToscaNodeType.NEUTRON_PORT.getDisplayName(), createNeutronPortNodeType()); - return globalNodeTypes; - } - - private static NodeType createNeutronPortNodeType() { - NodeType nodeType = new NodeType(); - nodeType.setDerived_from(ToscaNodeType.NETWORK_PORT.getDisplayName()); - nodeType.setProperties(createNeutronPortProperties()); - nodeType.setAttributes(createNeutronPortAttributes()); - nodeType.setCapabilities(createNeutronPortCapabilities()); - return nodeType; - } - - private static Map<String, CapabilityDefinition> createNeutronPortCapabilities() { - Map<String, CapabilityDefinition> capabilities = new HashMap<>(); - capabilities.put("attachment", GlobalTypesUtil.createAttachmentCapability()); - return capabilities; - } - - private static Map<String, PropertyDefinition> createNeutronPortProperties() { - Map<String, PropertyDefinition> neutronPortPropertyDefMap = new HashMap<>(); - neutronPortPropertyDefMap.put("admin_state_up", DataModelUtil - .createPropertyDefinition(PropertyType.BOOLEAN.getDisplayName(), - "A boolean value specifying the administrative status of the network", false, null, - null, null, true)); - neutronPortPropertyDefMap.put("allowed_address_pairs", DataModelUtil - .createPropertyDefinition(PropertyType.LIST.getDisplayName(), - "Additional MAC/IP address pairs allowed to pass through the port", false, null, null, - DataModelUtil - .createEntrySchema(ToscaDataType.NETWORK_ADDRESS_PAIR.getDisplayName(), null, null), - null)); - neutronPortPropertyDefMap.put("binding:vnic_type", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "The vnic type to be bound on the neutron port", false, createBindingConstraint(), null, - null, null)); - neutronPortPropertyDefMap.put("device_id", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "Device ID of this port", - false, null, null, null, null)); - neutronPortPropertyDefMap.put("device_owner", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "Name of the network owning the port", false, null, null, null, null)); - neutronPortPropertyDefMap.put("fixed_ips", DataModelUtil - .createPropertyDefinition(PropertyType.LIST.getDisplayName(), "Desired IPs for this port", - false, null, null, DataModelUtil - .createEntrySchema(ToscaDataType.NEUTRON_PORT_FIXED_IPS.getDisplayName(), null, - null), null)); - neutronPortPropertyDefMap.put("mac_address", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "MAC address to give to this port", false, null, null, null, null)); - neutronPortPropertyDefMap.put(Constants.NAME_PROPERTY_NAME, DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "A symbolic name for this port", false, null, null, null, null)); - neutronPortPropertyDefMap.put("port_security_enabled", DataModelUtil - .createPropertyDefinition(PropertyType.BOOLEAN.getDisplayName(), - "Flag to enable/disable port security on the network", false, null, null, null, null)); - neutronPortPropertyDefMap.put("qos_policy", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "The name or ID of QoS policy to attach to this network", false, null, null, null, - null)); - neutronPortPropertyDefMap.put(Constants.SECURITY_GROUPS_PROPERTY_NAME, DataModelUtil - .createPropertyDefinition(PropertyType.LIST.getDisplayName(), - "List of security group names or IDs", false, null, null, - DataModelUtil.createEntrySchema(PropertyType.STRING.getDisplayName(), null, null), - null)); - neutronPortPropertyDefMap.put("value_specs", DataModelUtil - .createPropertyDefinition(PropertyType.MAP.getDisplayName(), - "Extra parameters to include in the request", false, null, null, - DataModelUtil.createEntrySchema(PropertyType.STRING.getDisplayName(), null, null), - new HashMap<String, String>())); - neutronPortPropertyDefMap.put("replacement_policy", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "Policy on how to respond to a stack-update for this resource", false, - createReplacementPolicyConstrain(), null, null, "AUTO")); - neutronPortPropertyDefMap.put("network", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "Network this port belongs to", false, null, null, null, null)); - return neutronPortPropertyDefMap; - } - - private static List<Constraint> createBindingConstraint() { - List<Constraint> constraints = new ArrayList<>(); - Constraint validValues = - DataModelUtil.createValidValuesConstraint("macvtap", "direct", "normal"); - constraints.add(validValues); - return constraints; - } - - private static List<Constraint> createReplacementPolicyConstrain() { - List<Constraint> constraints = new ArrayList<>(); - Constraint validValues = DataModelUtil.createValidValuesConstraint("REPLACE_ALWAYS", "AUTO"); - constraints.add(validValues); - return constraints; - } - - private static Map<String, AttributeDefinition> createNeutronPortAttributes() { - Map<String, AttributeDefinition> neutronPortAttributesDefMap = new HashMap<>(); - neutronPortAttributesDefMap.put("network_id", DataModelUtil - .createAttributeDefinition(PropertyType.STRING.getDisplayName(), - "Unique identifier for the network owning the port", null, null, null)); - neutronPortAttributesDefMap.put("qos_policy_id", DataModelUtil - .createAttributeDefinition(PropertyType.STRING.getDisplayName(), - "The QoS policy ID attached to this network", null, null, null)); - neutronPortAttributesDefMap.put("show", DataModelUtil - .createAttributeDefinition(PropertyType.STRING.getDisplayName(), - "Detailed information about resource", null, null, null)); - neutronPortAttributesDefMap.put("status", DataModelUtil - .createAttributeDefinition(PropertyType.STRING.getDisplayName(), - "The status of the network", null, null, null)); - neutronPortAttributesDefMap.put("subnets", DataModelUtil - .createAttributeDefinition(PropertyType.LIST.getDisplayName(), "Subnets of this network", - null, DataModelUtil.createEntrySchema(PropertyType.STRING.getDisplayName(), null, null), - null)); - neutronPortAttributesDefMap.put("tenant_id", DataModelUtil - .createAttributeDefinition(PropertyType.STRING.getDisplayName(), "Tenant owning the port", - null, null, null)); - return neutronPortAttributesDefMap; - } -} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/NeutronSecurityRulesGlobalType.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/NeutronSecurityRulesGlobalType.java deleted file mode 100644 index 4c5b033e0e..0000000000 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/NeutronSecurityRulesGlobalType.java +++ /dev/null @@ -1,175 +0,0 @@ -/*- - * ============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.services.heattotosca.globaltypes; - -import org.openecomp.sdc.tosca.datatypes.ToscaCapabilityType; -import org.openecomp.sdc.tosca.datatypes.ToscaDataType; -import org.openecomp.sdc.tosca.datatypes.ToscaNodeType; -import org.openecomp.sdc.tosca.datatypes.ToscaRelationshipType; -import org.openecomp.sdc.tosca.datatypes.model.AttributeDefinition; -import org.openecomp.sdc.tosca.datatypes.model.Constraint; -import org.openecomp.sdc.tosca.datatypes.model.DataType; -import org.openecomp.sdc.tosca.datatypes.model.NodeType; -import org.openecomp.sdc.tosca.datatypes.model.PropertyDefinition; -import org.openecomp.sdc.tosca.datatypes.model.PropertyType; -import org.openecomp.sdc.tosca.datatypes.model.RequirementDefinition; -import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; -import org.openecomp.sdc.tosca.services.DataModelUtil; -import org.openecomp.sdc.tosca.services.ToscaConstants; -import org.openecomp.sdc.translator.services.heattotosca.Constants; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class NeutronSecurityRulesGlobalType { - /** - * Create service template service template. - * - * @return the service template - */ - public static ServiceTemplate createServiceTemplate() { - ServiceTemplate neutronSecurityRulesServiceTemplate = new ServiceTemplate(); - neutronSecurityRulesServiceTemplate - .setTosca_definitions_version(ToscaConstants.TOSCA_DEFINITIONS_VERSION); - neutronSecurityRulesServiceTemplate.setMetadata(DataModelUtil - .createMetadata(Constants.NEUTRON_SECURITY_RULES_TEMPLATE_NAME, "1.0.0", null)); - neutronSecurityRulesServiceTemplate.setImports(GlobalTypesUtil.createCommonImportList()); - neutronSecurityRulesServiceTemplate.setDescription("Neutron Security Rules TOSCA Global Types"); - neutronSecurityRulesServiceTemplate.setData_types(createGlobalDataTypes()); - neutronSecurityRulesServiceTemplate.setNode_types(createGlobalNodeTypes()); - return neutronSecurityRulesServiceTemplate; - } - - - private static Map<String, DataType> createGlobalDataTypes() { - Map<String, DataType> globalDataTypes = new HashMap<>(); - globalDataTypes.put(ToscaDataType.NEUTRON_SECURITY_RULES_RULE.getDisplayName(), - createSecurityRulesDataType()); - return globalDataTypes; - } - - private static DataType createSecurityRulesDataType() { - DataType addressPairDataType = new DataType(); - addressPairDataType.setDerived_from(ToscaDataType.ROOT.getDisplayName()); - addressPairDataType.setDescription("Rules Pairs"); - Map<String, PropertyDefinition> addressPairProp = new HashMap<>(); - - addressPairProp.put("direction", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "The direction in which the security group rule is applied", false, - DataModelUtil.createValidValuesConstraintsList("egress", "ingress"), null, null, - "ingress")); - addressPairProp.put("ethertype", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "Ethertype of the traffic", - false, DataModelUtil.createValidValuesConstraintsList("IPv4", "IPv6"), null, null, - "IPv4")); - Constraint portRangeMaxConstraint = new Constraint(); - portRangeMaxConstraint.setIn_range(new Integer[]{0, 65535}); - addressPairProp.put("port_range_max", DataModelUtil - .createPropertyDefinition(PropertyType.INTEGER.getDisplayName(), - "The maximum port number in the range that is matched by the security group rule. ", - false, DataModelUtil.getConstrainList(portRangeMaxConstraint), null, null, null)); - Constraint portRangeMinConstraint = new Constraint(); - portRangeMinConstraint.setIn_range(new Integer[]{0, 65535}); - addressPairProp.put("port_range_min", DataModelUtil - .createPropertyDefinition(PropertyType.INTEGER.getDisplayName(), - "The minimum port number in the range that is matched by the security group rule.", - false, DataModelUtil.getConstrainList(portRangeMinConstraint), null, null, null)); - addressPairProp.put("protocol", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "The protocol that is matched by the security group rule", false, - DataModelUtil.createValidValuesConstraintsList("tcp", "udp", "icmp"), null, null, - null)); - addressPairProp.put("remote_group_id", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "The remote group ID to be associated with this security group rule", false, null, null, - null, null)); - addressPairProp.put("remote_ip_prefix", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "The remote IP prefix (CIDR) to be associated with this security group rule", false, - null, null, null, null)); - addressPairProp.put("remote_mode", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "Whether to specify a remote group or a remote IP prefix", false, - DataModelUtil.createValidValuesConstraintsList("remote_ip_prefix", "remote_group_id"), - null, null, "remote_ip_prefix")); - addressPairDataType.setProperties(addressPairProp); - - return addressPairDataType; - } - - private static Map<String, NodeType> createGlobalNodeTypes() { - Map<String, NodeType> globalNodeTypes = new HashMap<>(); - globalNodeTypes.put(ToscaNodeType.NEUTRON_SECURITY_RULES.getDisplayName(), - createNeutronSecurityRulesNodeType()); - return globalNodeTypes; - } - - private static NodeType createNeutronSecurityRulesNodeType() { - NodeType novaServerNodeType = new NodeType(); - novaServerNodeType.setDerived_from(ToscaNodeType.ROOT.getDisplayName()); - novaServerNodeType.setProperties(createNeutronSecurityRulesProperties()); - novaServerNodeType.setAttributes(createNeutronSecurityRulesAttributes()); - novaServerNodeType.setRequirements(createNeutronSecurityRequirements()); - return novaServerNodeType; - } - - private static List<Map<String, RequirementDefinition>> createNeutronSecurityRequirements() { - final List<Map<String, RequirementDefinition>> requirements = new ArrayList<>(); - final Map<String, RequirementDefinition> portRequirement = new HashMap<>(); - RequirementDefinition requirementDefinition = new RequirementDefinition(); - requirementDefinition.setCapability(ToscaCapabilityType.ATTACHMENT.getDisplayName()); - requirementDefinition.setNode(ToscaNodeType.NEUTRON_PORT.getDisplayName()); - requirementDefinition.setRelationship(ToscaRelationshipType.ATTACHES_TO.getDisplayName()); - requirementDefinition.setOccurrences(new Object[]{0, ToscaConstants.UNBOUNDED}); - portRequirement.put(ToscaConstants.PORT_REQUIREMENT_ID, requirementDefinition); - requirements.add(portRequirement); - - return requirements; - } - - private static Map<String, PropertyDefinition> createNeutronSecurityRulesProperties() { - Map<String, PropertyDefinition> neutronSecurityRulesPropertyDefMap = new HashMap<>(); - neutronSecurityRulesPropertyDefMap.put(Constants.NAME_PROPERTY_NAME, DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "A symbolic name for this security group, which is not required to be unique.", false, - null, null, null, null)); - neutronSecurityRulesPropertyDefMap.put(Constants.DESCRIPTION_PROPERTY_NAME, DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "Description of the security group", false, null, null, null, null)); - neutronSecurityRulesPropertyDefMap.put(Constants.RULES_PROPERTY_NAME, DataModelUtil - .createPropertyDefinition(PropertyType.LIST.getDisplayName(), - "List of security group rules", false, null, null, DataModelUtil - .createEntrySchema(ToscaDataType.NEUTRON_SECURITY_RULES_RULE.getDisplayName(), null, - null), null)); - return neutronSecurityRulesPropertyDefMap; - } - - private static Map<String, AttributeDefinition> createNeutronSecurityRulesAttributes() { - Map<String, AttributeDefinition> neutronSecurityRulesAttributesDefMap = new HashMap<>(); - neutronSecurityRulesAttributesDefMap.put("show", DataModelUtil - .createAttributeDefinition(PropertyType.STRING.getDisplayName(), - "Detailed information about resource", null, null, null)); - return neutronSecurityRulesAttributesDefMap; - } -} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/NovaServerGlobalType.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/NovaServerGlobalType.java deleted file mode 100644 index d38d70a4f7..0000000000 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/NovaServerGlobalType.java +++ /dev/null @@ -1,307 +0,0 @@ -/*- - * ============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.services.heattotosca.globaltypes; - -import org.openecomp.sdc.tosca.datatypes.ToscaDataType; -import org.openecomp.sdc.tosca.datatypes.ToscaNodeType; -import org.openecomp.sdc.tosca.datatypes.model.AttributeDefinition; -import org.openecomp.sdc.tosca.datatypes.model.Constraint; -import org.openecomp.sdc.tosca.datatypes.model.DataType; -import org.openecomp.sdc.tosca.datatypes.model.NodeType; -import org.openecomp.sdc.tosca.datatypes.model.PropertyDefinition; -import org.openecomp.sdc.tosca.datatypes.model.PropertyType; -import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; -import org.openecomp.sdc.tosca.datatypes.model.heatextend.PropertyTypeExt; -import org.openecomp.sdc.tosca.services.DataModelUtil; -import org.openecomp.sdc.tosca.services.ToscaConstants; -import org.openecomp.sdc.translator.services.heattotosca.Constants; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class NovaServerGlobalType { - - /** - * Create service template service template. - * - * @return the service template - */ - public static ServiceTemplate createServiceTemplate() { - ServiceTemplate novaeServerServiceTemplate = new ServiceTemplate(); - novaeServerServiceTemplate - .setTosca_definitions_version(ToscaConstants.TOSCA_DEFINITIONS_VERSION); - novaeServerServiceTemplate.setMetadata( - DataModelUtil.createMetadata(Constants.NOVA_SERVER_TEMPLATE_NAME, "1.0.0", null)); - novaeServerServiceTemplate.setDescription("Nova Server TOSCA Global Types"); - novaeServerServiceTemplate.setImports(GlobalTypesUtil.createCommonImportList()); - novaeServerServiceTemplate.setData_types(createGlobalDataTypes()); - novaeServerServiceTemplate.setNode_types(createGlobalNodeTypes()); - return novaeServerServiceTemplate; - } - - - private static Map<String, NodeType> createGlobalNodeTypes() { - Map<String, NodeType> globalNodeTypes = new HashMap<>(); - globalNodeTypes.put(ToscaNodeType.NOVA_SERVER.getDisplayName(), createNovaServerNodeType()); - return globalNodeTypes; - } - - private static NodeType createNovaServerNodeType() { - NodeType novaServerNodeType = new NodeType(); - novaServerNodeType.setDerived_from(ToscaNodeType.COMPUTE.getDisplayName()); - novaServerNodeType.setProperties(createNovaServerProperties()); - novaServerNodeType.setAttributes(createNovaServerAttributes()); - return novaServerNodeType; - } - - - private static Map<String, PropertyDefinition> createNovaServerProperties() { - Map<String, PropertyDefinition> novaServerPropertyDefMap = new HashMap<>(); - novaServerPropertyDefMap.put("flavor", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "The ID or name of the flavor to boot onto", true, null, null, null, null)); - novaServerPropertyDefMap.put("admin_pass", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "The administrator password for the server", false, null, null, null, null)); - novaServerPropertyDefMap.put("availability_zone", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "Availability zone to create servers in", false, null, null, null, null)); - novaServerPropertyDefMap.put("config_drive", DataModelUtil - .createPropertyDefinition(PropertyType.BOOLEAN.getDisplayName(), - "enable config drive on the server", false, null, null, null, null)); - novaServerPropertyDefMap.put("contrail_service_instance_ind", DataModelUtil - .createPropertyDefinition(PropertyType.BOOLEAN.getDisplayName(), - "Nova server related to service instance indicator", false, null, null, null, false)); - novaServerPropertyDefMap.put("diskConfig", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "Control how the disk is partitioned when the server is created", false, - getDiskConfigConstraints(), null, null, null)); - novaServerPropertyDefMap.put("flavor_update_policy", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "Policy on how to apply a flavor update", false, getFlavorUpdatePolicyConstraints(), - null, null, "RESIZE")); - novaServerPropertyDefMap.put("image", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "The ID or name of the image to boot with", false, null, null, null, null)); - novaServerPropertyDefMap.put("image_update_policy", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "Policy on how to apply an image-id update", false, getImageUpdatePolicyConstraints(), - null, null, "REBUILD")); - novaServerPropertyDefMap.put("key_name", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "Name of keypair to inject into the server", false, null, null, null, null)); - novaServerPropertyDefMap.put("metadata", DataModelUtil - .createPropertyDefinition(PropertyTypeExt.JSON.getDisplayName(), - "Arbitrary JSON metadata to store for this server", false, null, null, null, null)); - novaServerPropertyDefMap.put(Constants.NAME_PROPERTY_NAME, DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "Server name", false, null, - null, null, null)); - novaServerPropertyDefMap.put("personality", DataModelUtil - .createPropertyDefinition(PropertyType.MAP.getDisplayName(), - "A map of files to create/overwrite on the server upon boot", false, null, null, - DataModelUtil.createEntrySchema(PropertyType.STRING.getDisplayName(), null, null), - new HashMap<String, String>())); - novaServerPropertyDefMap.put("reservation_id", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "A UUID for the set of servers being requested", false, null, null, null, null)); - novaServerPropertyDefMap.put("scheduler_hints", DataModelUtil - .createPropertyDefinition(PropertyType.MAP.getDisplayName(), - "Arbitrary key-value pairs specified by the client to help boot a server", false, null, - null, DataModelUtil.createEntrySchema(PropertyType.STRING.getDisplayName(), null, null), - null)); - novaServerPropertyDefMap.put(Constants.SECURITY_GROUPS_PROPERTY_NAME, DataModelUtil - .createPropertyDefinition(PropertyType.LIST.getDisplayName(), - "List of security group names or IDs", false, null, null, - DataModelUtil.createEntrySchema(PropertyType.STRING.getDisplayName(), null, null), - new ArrayList<>())); - novaServerPropertyDefMap.put("software_config_transport", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "How the server should receive the metadata required for software configuration", false, - getSoftwareConfigTransportConstraints(), null, null, "POLL_SERVER_CFN")); - novaServerPropertyDefMap.put("user_data", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "User data script to be executed by cloud-init", false, null, null, null, "")); - novaServerPropertyDefMap.put("user_data_format", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "How the user_data should be formatted for the server", false, - getUserDataFormatConstraint(), null, null, "HEAT_CFNTOOLS")); - novaServerPropertyDefMap.put("user_data_update_policy", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "Policy on how to apply a user_data update", false, - getUserDataUpdatePolicyConstraints(), null, null, "REPLACE")); - return novaServerPropertyDefMap; - } - - private static Map<String, AttributeDefinition> createNovaServerAttributes() { - Map<String, AttributeDefinition> novaServerAttributesDefMap = new HashMap<>(); - novaServerAttributesDefMap.put("accessIPv4", DataModelUtil - .createAttributeDefinition(PropertyType.STRING.getDisplayName(), - "The manually assigned alternative public IPv4 address of the server", null, null, - null)); - novaServerAttributesDefMap.put("accessIPv6", DataModelUtil - .createAttributeDefinition(PropertyType.STRING.getDisplayName(), - "The manually assigned alternative public IPv6 address of the server", null, null, - null)); - novaServerAttributesDefMap.put("addresses", DataModelUtil - .createAttributeDefinition(PropertyType.MAP.getDisplayName(), - "A dict of all network addresses with corresponding port_id", null, DataModelUtil - .createEntrySchema(ToscaDataType.NOVA_SERVER_NETWORK_ADDRESS_INFO.getDisplayName(), - null, null), null)); - novaServerAttributesDefMap.put("console_urls", DataModelUtil - .createAttributeDefinition(PropertyType.STRING.getDisplayName(), "URLs of servers consoles", - null, null, null)); - novaServerAttributesDefMap.put("instance_name", DataModelUtil - .createAttributeDefinition(PropertyType.STRING.getDisplayName(), - "AWS compatible instance name", null, null, null)); - novaServerAttributesDefMap.put(Constants.NAME_PROPERTY_NAME, DataModelUtil - .createAttributeDefinition(PropertyType.STRING.getDisplayName(), "Name of the server", null, - null, null)); - novaServerAttributesDefMap.put("show", DataModelUtil - .createAttributeDefinition(PropertyType.STRING.getDisplayName(), - "Detailed information about resource", null, null, null)); - return novaServerAttributesDefMap; - } - - private static List<Constraint> getUserDataFormatConstraint() { - List<Constraint> constraints; - Constraint validValues; - constraints = new ArrayList<>(); - validValues = - DataModelUtil.createValidValuesConstraint("SOFTWARE_CONFIG", "RAW", "HEAT_CFNTOOLS"); - constraints.add(validValues); - return constraints; - } - - private static List<Constraint> getUserDataUpdatePolicyConstraints() { - List<Constraint> constraints; - Constraint validValues; - constraints = new ArrayList<>(); - validValues = DataModelUtil.createValidValuesConstraint("REPLACE", "IGNORE"); - constraints.add(validValues); - return constraints; - } - - private static List<Constraint> getSoftwareConfigTransportConstraints() { - List<Constraint> constraints; - Constraint validValues; - constraints = new ArrayList<>(); - validValues = DataModelUtil - .createValidValuesConstraint("POLL_SERVER_CFN", "POLL_SERVER_HEAT", "POLL_TEMP_URL", - "ZAQAR_MESSAGE"); - constraints.add(validValues); - return constraints; - } - - private static List<Constraint> getImageUpdatePolicyConstraints() { - List<Constraint> constraints; - Constraint validValues; - constraints = new ArrayList<>(); - validValues = DataModelUtil - .createValidValuesConstraint("REBUILD_PRESERVE_EPHEMERAL", "REPLACE", "REBUILD"); - constraints.add(validValues); - return constraints; - } - - private static List<Constraint> getFlavorUpdatePolicyConstraints() { - Constraint validValues; - List<Constraint> constraints = new ArrayList<>(); - validValues = DataModelUtil.createValidValuesConstraint("RESIZE", "REPLACE"); - constraints.add(validValues); - return constraints; - } - - private static List<Constraint> getDiskConfigConstraints() { - List<Constraint> constraints = new ArrayList<>(); - Constraint validValues = DataModelUtil.createValidValuesConstraint("AUTO", "MANUAL"); - constraints.add(validValues); - return constraints; - } - - private static Map<String, DataType> createGlobalDataTypes() { - Map<String, DataType> globalDataTypes = new HashMap<>(); - globalDataTypes.put(ToscaDataType.NOVA_SERVER_PORT_EXTRA_PROPERTIES.getDisplayName(), - createPortExtraDataDataType()); - globalDataTypes.put(ToscaDataType.NOVA_SERVER_NETWORK_ADDRESS_INFO.getDisplayName(), - createAddressInfoDataType()); - return globalDataTypes; - } - - private static DataType createAddressInfoDataType() { - DataType addressInfoDataType = new DataType(); - addressInfoDataType.setDerived_from(ToscaDataType.NETWORK_NETWORK_INFO.getDisplayName()); - addressInfoDataType.setDescription("Network addresses with corresponding port id"); - - Map<String, PropertyDefinition> addressInfoProp = new HashMap<>(); - addressInfoProp.put("port_id", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), "Port id", false, null, - null, null, null)); - addressInfoDataType.setProperties(addressInfoProp); - - return addressInfoDataType; - } - - - private static DataType createPortExtraDataDataType() { - DataType portExtraDataType = new DataType(); - portExtraDataType.setDerived_from(ToscaDataType.ROOT.getDisplayName()); - portExtraDataType.setDescription("Nova server network expand properties for port"); - Map<String, PropertyDefinition> portExtraPropMap = new HashMap<>(); - - portExtraPropMap.put("admin_state_up", DataModelUtil - .createPropertyDefinition(PropertyType.BOOLEAN.getDisplayName(), - "The administrative state of this port", false, null, null, null, true)); - portExtraPropMap.put("allowed_address_pairs", DataModelUtil - .createPropertyDefinition(PropertyType.LIST.getDisplayName(), - "Additional MAC/IP address pairs allowed to pass through the port", false, null, null, - DataModelUtil - .createEntrySchema(ToscaDataType.NETWORK_ADDRESS_PAIR.getDisplayName(), null, null), - null)); - - List<Constraint> bindingVnicConstraints = new ArrayList<>(); - Constraint validValues = - DataModelUtil.createValidValuesConstraint("macvtap", "direct", "normal"); - bindingVnicConstraints.add(validValues); - portExtraPropMap.put("binding:vnic_type", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "The vnic type to be bound on the neutron port", false, bindingVnicConstraints, null, - null, null)); - - portExtraPropMap.put("mac_address", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "MAC address to give to this port", false, null, null, null, null)); - portExtraPropMap.put("port_security_enabled", DataModelUtil - .createPropertyDefinition(PropertyType.BOOLEAN.getDisplayName(), - "Flag to enable/disable port security on the port", false, null, null, null, null)); - portExtraPropMap.put("qos_policy", DataModelUtil - .createPropertyDefinition(PropertyType.STRING.getDisplayName(), - "The name or ID of QoS policy to attach to this port", false, null, null, null, null)); - portExtraPropMap.put("value_specs", DataModelUtil - .createPropertyDefinition(PropertyType.MAP.getDisplayName(), - "Extra parameters to include in the request", false, null, null, - DataModelUtil.createEntrySchema(PropertyType.STRING.getDisplayName(), null, null), - new HashMap<String, String>())); - portExtraDataType.setProperties(portExtraPropMap); - return portExtraDataType; - } - -} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/helper/ContrailTranslationHelper.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/helper/ContrailTranslationHelper.java index 2e1aa9e372..a86f584bf0 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/helper/ContrailTranslationHelper.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/helper/ContrailTranslationHelper.java @@ -20,46 +20,138 @@ package org.openecomp.sdc.translator.services.heattotosca.helper; +import org.openecomp.core.utilities.file.FileUtils; +import org.openecomp.sdc.common.utils.CommonUtil; +import org.openecomp.sdc.heat.datatypes.HeatBoolean; import org.openecomp.sdc.heat.datatypes.model.Resource; +import org.openecomp.sdc.logging.context.impl.MdcDataDebugMessage; import org.openecomp.sdc.tosca.services.ToscaConstants; -import org.openecomp.sdc.translator.services.heattotosca.helper.impl.NameExtractorServiceImpl; +import org.openecomp.sdc.tosca.datatypes.ToscaFunctions; +import org.openecomp.sdc.translator.datatypes.heattotosca.PropertyRegexMatcher; +import org.openecomp.sdc.translator.services.heattotosca.ConfigConstants; +import org.openecomp.sdc.translator.services.heattotosca.NameExtractor; +import org.openecomp.sdc.translator.datatypes.heattotosca.TranslationContext; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Optional; public class ContrailTranslationHelper { + + private static MdcDataDebugMessage mdcDataDebugMessage = new MdcDataDebugMessage(); /** * Gets compute node type id. * - * @param serviceTemplateTranslatedId the service template translated id - * @param serviceTemplateResource the service template resource + * @param contrailServiceTemplateResource contrail service teamplte resource + * @param contrailServiceTemplateResourceId contrailservice template resource id + * @param contrailServiceTemplateTranslatedId contrail service tempalte resource translated id * @return the compute node type id */ - public String getComputeNodeTypeId(String serviceTemplateTranslatedId, - Resource serviceTemplateResource) { - NameExtractorService nodeTypeNameExtractor = new NameExtractorServiceImpl(); - List<PropertyRegexMatcher> propertyRegexMatchers = - getPropertiesAndRegexMatchers(nodeTypeNameExtractor); - Optional<String> extractedNodeTypeName = nodeTypeNameExtractor - .extractNodeTypeNameByPropertiesPriority(serviceTemplateResource.getProperties(), - propertyRegexMatchers); - - return ToscaConstants.NODES_PREFIX - + (extractedNodeTypeName.isPresent() ? extractedNodeTypeName.get() - : "compute_" + serviceTemplateTranslatedId); + public String getComputeNodeTypeId(Resource contrailServiceTemplateResource, + String contrailServiceTemplateResourceId, + String contrailServiceTemplateTranslatedId, + TranslationContext context) { + mdcDataDebugMessage.debugEntryMessage(null, null); + NameExtractor nodeTypeNameExtractor = + context.getNameExtractorImpl(ConfigConstants.CONTRAIL_COMPUTE_NODE_TYPE_IMPL_KEY); + + mdcDataDebugMessage.debugExitMessage(null, null); + return nodeTypeNameExtractor + .extractNodeTypeName(contrailServiceTemplateResource, contrailServiceTemplateResourceId, + contrailServiceTemplateTranslatedId); } - private List<PropertyRegexMatcher> getPropertiesAndRegexMatchers( - NameExtractorService nodeTypeNameExtractor) { + /** + * Get property Regx matcher list. + * + * @return Regex exprission per contrail service template resource property, while contail compute + * type name is consider when setting the name value + */ + public List<PropertyRegexMatcher> getPropertyRegexMatchersForComputeNodeType() { List<PropertyRegexMatcher> propertyRegexMatchers = new ArrayList<>(); - propertyRegexMatchers.add(nodeTypeNameExtractor - .getPropertyRegexMatcher("image_name", Collections.singletonList(".+_image_name$"), + propertyRegexMatchers + .add(new PropertyRegexMatcher("image_name", Collections.singletonList(".+_image_name$"), "_image_name")); - propertyRegexMatchers.add(nodeTypeNameExtractor - .getPropertyRegexMatcher("flavor", Collections.singletonList(".+_flavor_name$"), + propertyRegexMatchers + .add(new PropertyRegexMatcher("flavor", Collections.singletonList(".+_flavor_name$"), "_flavor_name")); return propertyRegexMatchers; } + + public String getSubstitutionContrailServiceTemplateMetadata(String heatFileName, + String serviceInstanceTranslatedId) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + mdcDataDebugMessage.debugExitMessage(null, null); + return FileUtils.getFileWithoutExtention(heatFileName) + "_" + serviceInstanceTranslatedId; + } + + /** + * Translate fn split function optional. + * + * @param propertyValue the property value + * @param listSize the list size + * @param includeBooleanValue the include boolean value + * @return the optional + */ + public Optional<List<Map<String, List>>> translateFnSplitFunction(Object propertyValue, + int listSize, + boolean + includeBooleanValue) { + List<Map<String, List>> tokenPropertyValueList = new ArrayList<>(); + + if (propertyValue instanceof Map && !((Map) propertyValue).isEmpty()) { + Map<String, Object> propMap = (Map) propertyValue; + Map.Entry<String, Object> entry = propMap.entrySet().iterator().next(); + Object entity = entry.getValue(); + String key = entry.getKey(); + String tokenChar; + + if (key.equals("Fn::Split") && entity instanceof List) { + tokenChar = (String) ((List) entity).get(0); + Object refParameter = ((List) entity).get(1); + + for (int substringIndex = 0; substringIndex < listSize; substringIndex++) { + Map<String, List> tokenPropertyValue = new HashMap<>(); + tokenPropertyValue.put("token", new ArrayList<>()); + + if (refParameter instanceof Map && ((Map) refParameter).get("Ref") != null) { + Map<String, String> stringWithToken = new HashMap<>(); + ((Map) stringWithToken) + .put(ToscaFunctions.GET_INPUT.getDisplayName(), ((Map) refParameter).get("Ref")); + tokenPropertyValue.get("token").add(stringWithToken); + } else if (refParameter instanceof String) { + if (includeBooleanValue) { + StringBuffer booleanBuffer = new StringBuffer(); + String[] booleanValueList = ((String) refParameter).split(tokenChar); + for (int i = 0; i < booleanValueList.length; i++) { + if (i == 0) { + booleanBuffer.append(HeatBoolean.eval(booleanValueList[i])); + } else { + booleanBuffer.append(tokenChar); + booleanBuffer.append(HeatBoolean.eval(booleanValueList[i])); + } + } + tokenPropertyValue.get("token").add(booleanBuffer.toString()); + } else { + tokenPropertyValue.get("token").add(refParameter); + } + } + tokenPropertyValue.get("token").add(tokenChar); + tokenPropertyValue.get("token").add(substringIndex); + tokenPropertyValueList.add(tokenPropertyValue); + } + + return Optional.of(tokenPropertyValueList); + + } + } + + return Optional.empty(); + } } diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/helper/ContrailV2VirtualMachineInterfaceHelper.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/helper/ContrailV2VirtualMachineInterfaceHelper.java new file mode 100644 index 0000000000..402db74a9b --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/helper/ContrailV2VirtualMachineInterfaceHelper.java @@ -0,0 +1,184 @@ +/*- + * ============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.services.heattotosca.helper; + +import org.openecomp.sdc.heat.datatypes.model.HeatResourcesTypes; +import org.openecomp.sdc.heat.datatypes.model.Resource; +import org.openecomp.sdc.heat.services.HeatConstants; +import org.openecomp.sdc.logging.api.Logger; +import org.openecomp.sdc.logging.api.LoggerFactory; +import org.openecomp.sdc.logging.context.impl.MdcDataDebugMessage; +import org.openecomp.sdc.tosca.datatypes.ToscaNodeType; +import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate; +import org.openecomp.sdc.tosca.datatypes.model.RequirementAssignment; +import org.openecomp.sdc.tosca.services.ToscaConstants; +import org.openecomp.sdc.translator.datatypes.heattotosca.AttachedResourceId; +import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo; +import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslatedHeatResource; +import org.openecomp.sdc.translator.services.heattotosca.ConsolidationDataUtil; +import org.openecomp.sdc.translator.services.heattotosca.ConsolidationEntityType; +import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil; +import org.openecomp.sdc.translator.services.heattotosca.impl.resourcetranslation.ResourceTranslationBase; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +public class ContrailV2VirtualMachineInterfaceHelper { + static Logger logger = + (Logger) LoggerFactory.getLogger(ContrailV2VirtualMachineInterfaceHelper.class); + private static MdcDataDebugMessage mdcDataDebugMessage = new MdcDataDebugMessage(); + + /** + * Connect Virtual Machine Interface node template to network node template in TOSCA. + * + * @param resourceTranslationImpl resource translation implemetation + * @param translateTo translated ro object + * @param vmiNodeTemplate Virtual Machine Interface node template + */ + public void connectVmiToNetwork(ResourceTranslationBase resourceTranslationImpl, + TranslateTo translateTo, NodeTemplate vmiNodeTemplate) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + Object virtualNetworkRefs = + translateTo.getResource().getProperties() + .get(HeatConstants.VIRTUAL_NETWORK_REFS_PROPERTY_NAME); + if (Objects.isNull(virtualNetworkRefs) || !(virtualNetworkRefs instanceof List) + || ((List) virtualNetworkRefs).size() == 0) { + return; + } + List<String> acceptableResourceTypes = Arrays + .asList(HeatResourcesTypes.NEUTRON_NET_RESOURCE_TYPE.getHeatResource(), + HeatResourcesTypes.CONTRAIL_V2_VIRTUAL_NETWORK_RESOURCE_TYPE.getHeatResource()); + + if (((List) virtualNetworkRefs).size() > 1) { + logger.warn("Heat resource: '" + translateTo.getResourceId() + "' with type: '" + + translateTo.getResource().getType() + + "' include '" + + HeatConstants.VIRTUAL_NETWORK_REFS_PROPERTY_NAME + + "' property with more than one network values, only " + + "the first network will be connected, " + + "all rest will be ignored in TOSCA translation."); + } + Object virtualNetworkRef = ((List) virtualNetworkRefs).get(0); + + Optional<String> networkResourceId = + HeatToToscaUtil.extractContrailGetResourceAttachedHeatResourceId(virtualNetworkRef); + if (networkResourceId.isPresent()) { // get_resource + Resource networkResource = HeatToToscaUtil + .getResource(translateTo.getHeatOrchestrationTemplate(), networkResourceId.get(), + translateTo.getHeatFileName()); + if (acceptableResourceTypes.contains(networkResource.getType())) { + Optional<String> resourceTranslatedId = + resourceTranslationImpl.getResourceTranslatedId(translateTo.getHeatFileName(), + translateTo.getHeatOrchestrationTemplate(), networkResourceId.get(), + translateTo.getContext()); + + if (resourceTranslatedId.isPresent()) { + RequirementAssignment requirementAssignment = HeatToToscaUtil.addLinkReqFromPortToNetwork( + vmiNodeTemplate, resourceTranslatedId.get()); + + if (ToscaNodeType.CONTRAILV2_VIRTUAL_MACHINE_INTERFACE + .equals(vmiNodeTemplate.getType())) { + ConsolidationDataUtil + .updateNodesConnectedOut(translateTo, resourceTranslatedId.get(), + ConsolidationEntityType.PORT, + ToscaConstants.LINK_REQUIREMENT_ID, requirementAssignment); + } + } + } else { + logger.warn("Heat resource: '" + translateTo.getResourceId() + "' with type: '" + + translateTo.getResource().getType() + + "' include '" + HeatConstants.VIRTUAL_NETWORK_REFS_PROPERTY_NAME + + "' property which is connect to " + + "unsupported/incorrect resource with type '" + + networkResource.getType() + + "', therefore, this connection will be ignored in TOSCA translation."); + } + } else { + Optional<AttachedResourceId> attachedResourceId = HeatToToscaUtil + .extractAttachedResourceId(translateTo.getHeatFileName(), + translateTo.getHeatOrchestrationTemplate(), translateTo.getContext(), + virtualNetworkRef); + if (attachedResourceId.isPresent() && attachedResourceId.get().isGetParam() + && attachedResourceId.get().getEntityId() instanceof String) { + TranslatedHeatResource translatedSharedResourceId = + translateTo.getContext().getHeatSharedResourcesByParam() + .get(attachedResourceId.get().getEntityId()); + if (Objects.nonNull(translatedSharedResourceId) + && !HeatToToscaUtil.isHeatFileNested(translateTo, translateTo.getHeatFileName())) { + RequirementAssignment requirementAssignment = HeatToToscaUtil.addLinkReqFromPortToNetwork( + vmiNodeTemplate, translatedSharedResourceId.getTranslatedId()); + + if (ToscaNodeType.CONTRAILV2_VIRTUAL_MACHINE_INTERFACE + .equals(vmiNodeTemplate.getType())) { + ConsolidationDataUtil.updateNodesConnectedOut(translateTo, translatedSharedResourceId + .getTranslatedId(), ConsolidationEntityType.PORT, + ToscaConstants.LINK_REQUIREMENT_ID, + requirementAssignment); + } + } + } + } + + mdcDataDebugMessage.debugExitMessage(null, null); + } + + /** + * Check if the input heat resource is Vlan sub interface resource + * + * @param resource heat resource to be checked + * @return true - if input resource is valn sub interface resource flase - otherwise. + */ + public boolean isVlanSubInterfaceResource(Resource resource) { + + if (resource.getType().equals(HeatResourcesTypes + .CONTRAIL_V2_VIRTUAL_MACHINE_INTERFACE_RESOURCE_TYPE.getHeatResource()) + && getVlanTagPropertyValue(resource).isPresent()) { + return true; + } + + return false; + } + + private Optional<Object> getVlanTagPropertyValue(Resource resource) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + Object vmiProperties = resource.getProperties() + .get(HeatConstants.VMI_PROPERTIES_PROPERTY_NAME); + if (vmiProperties != null && vmiProperties instanceof Map) { + mdcDataDebugMessage.debugExitMessage(null, null); + return Optional.ofNullable(((Map) vmiProperties) + .get(HeatConstants.VMI_SUB_INTERFACE_VLAN_TAG_PROPERTY_NAME)); + } + + mdcDataDebugMessage.debugExitMessage(null, null); + return Optional.empty(); + } + + +} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/helper/FunctionTranslationHelper.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/helper/FunctionTranslationHelper.java new file mode 100644 index 0000000000..c06892046f --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/helper/FunctionTranslationHelper.java @@ -0,0 +1,47 @@ +/*- + * ============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.services.heattotosca.helper; + +/** + * @author SHIRIA + * @since December 15, 2016. + */ +public class FunctionTranslationHelper { + + private static final String UNSUPPORTED_RESOURCE = "UNSUPPORTED_RESOURCE_"; + private static final String UNSUPPORTED_ATTRIBUTE = "UNSUPPORTED_ATTRIBUTE_"; + + public static boolean isResourceSupported(String translatedResourceId) { + return !translatedResourceId.startsWith(UNSUPPORTED_RESOURCE); + } + + public static boolean isAttributeSupported(String translatedAttName) { + return !translatedAttName.startsWith(UNSUPPORTED_ATTRIBUTE); + } + + public static String getUnsupportedResourcePrefix() { + return UNSUPPORTED_RESOURCE; + } + + public static String getUnsupportedAttributePrefix() { + return UNSUPPORTED_ATTRIBUTE; + } +} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/helper/ResourceTranslationNeutronPortHelper.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/helper/ResourceTranslationNeutronPortHelper.java new file mode 100644 index 0000000000..a99c95c148 --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/helper/ResourceTranslationNeutronPortHelper.java @@ -0,0 +1,202 @@ +package org.openecomp.sdc.translator.services.heattotosca.helper; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +public class ResourceTranslationNeutronPortHelper { + + public static final String IP_COUNT_REQUIRED = "ip_count_required"; + public static final String FLOATING_IP_COUNT_REQUIRED = "floating_ip_count_required"; + public static final String NETWORK = "network"; + public static final String NETWORK_ROLE_TAG = "network_role_tag"; + public static final String FIXED_IPS = "fixed_ips"; + public static final String IP_VERSION = "ip_version"; + public static final String IP_ADDRESS = "ip_address"; + public static final String GET_INPUT = "get_input"; + public static final String ALLOWED_ADDRESS_PAIRS = "allowed_address_pairs"; + public static final String FLOATING_IP = "_floating_ip"; + public static final String FLOATING_V6_IP = "_floating_v6_ip"; + public static final String IPS = "_ips"; + public static final String V6_IPS = "_v6_ips"; + public static final String NET_NAME = "_net_name"; + public static final String NET_ID = "_net_id"; + public static final String NET_FQDN = "_net_fqdn"; + public static final String IPV4_REGEX = "\\w*_ip_\\d+"; + public static final String IPV6_REGEX = "\\w*_v6_ip_\\d+"; + public static final String MAC_COUNT_REQUIRED = "mac_count_required"; + public static final String MAC_ADDRESS = "mac_address"; + public static final String IS_REQUIRED = "is_required"; + public static final String IP_REQUIREMENTS = "ip_requirements"; + public static final String MAC_REQUIREMENTS = "mac_requirements"; + + public void setAdditionalProperties(Map<String, Object> properties) { + setNetworkRoleTag(properties); + Map<String, Object> ipRequirements = new HashMap(); + Map<String, Object> macRequirements = new HashMap(); + Map<String, Object> isRequired = new HashMap(); + Map<String, Object> floatingIsRequired = new HashMap(); + Map<String, Object> macIsRequired = new HashMap(); + + isRequired.put(IS_REQUIRED, Boolean.FALSE); + floatingIsRequired.put(IS_REQUIRED, Boolean.FALSE); + macIsRequired.put(IS_REQUIRED, Boolean.FALSE); + + ipRequirements.put(IP_COUNT_REQUIRED, isRequired); + ipRequirements.put(FLOATING_IP_COUNT_REQUIRED, floatingIsRequired); + ipRequirements.put(IP_VERSION, 4); + macRequirements.put(MAC_COUNT_REQUIRED, macIsRequired); + + List<Map<String, Object>> ipRequirementsList = new ArrayList<>(); + ipRequirementsList.add(ipRequirements); + properties.put(IP_REQUIREMENTS , ipRequirementsList); + + properties.put(MAC_REQUIREMENTS , macRequirements); + + setIpVersion(properties); + setFloatingIpVersion(properties); + + setMacCount(properties); + } + + private void setMacCount(Map<String, Object> properties) { + if(properties.containsKey(MAC_ADDRESS)) { + Map<String, Object> macRequirements = (Map<String, Object>) properties.get(MAC_REQUIREMENTS); + Map<String, Object> macIsRequired = new HashMap(); + macIsRequired.put(IS_REQUIRED, Boolean.TRUE); + macRequirements.put(MAC_COUNT_REQUIRED, macIsRequired); + properties.put(MAC_REQUIREMENTS, macRequirements); + } + } + + private void setFloatingIpVersion(Map<String, Object> properties) { + List<Map<String, Object>> ipRequirementsList = + (List<Map<String, Object>>) properties.get(IP_REQUIREMENTS); + Map<String, Object> ipRequirements = ipRequirementsList.get(0); + Object propertyValue; + Map<String, Object> isRequired = new HashMap(); + isRequired.put(IS_REQUIRED, Boolean.TRUE); + + propertyValue = properties.get(ALLOWED_ADDRESS_PAIRS); + if (propertyValue instanceof Map && !((Map) propertyValue).isEmpty()) { + Map.Entry<String, Object> mapEntry = + (Map.Entry<String, Object>) ((Map) propertyValue).entrySet().iterator().next(); + if (getFloatingIpVersion(mapEntry.getValue()) != null) { + ipRequirements.put(IP_VERSION, getFloatingIpVersion(mapEntry.getValue())); + ipRequirements.put(FLOATING_IP_COUNT_REQUIRED, isRequired); + } + } + else if (propertyValue instanceof List && !((List) propertyValue).isEmpty()) { + for (int i = 0; i < ((List) propertyValue).size(); i++) { + Object ipMap = ((List) propertyValue).get(i); + if(ipMap instanceof Map && !((Map) ipMap).isEmpty()) { + Object ipAddressMap = ((Map) ipMap).get(IP_ADDRESS); + if (ipAddressMap instanceof Map && !((Map) ipAddressMap).isEmpty()) { + Object ipList = ((Map) ipAddressMap).get(GET_INPUT); + if (ipList instanceof String && !((String) ipList).isEmpty()) { + if (getFloatingIpVersion(ipList) != null) { + ipRequirements.put(IP_VERSION, getFloatingIpVersion(ipList)); + ipRequirements.put(FLOATING_IP_COUNT_REQUIRED, isRequired); + } + } + } + } + } + } + } + + private void setIpVersion(Map<String, Object> properties) { + List<Map<String, Object>> ipRequirementsList = + (List<Map<String, Object>>) properties.get(IP_REQUIREMENTS); + Map<String, Object> ipRequirements = ipRequirementsList.get(0); + Object propertyValue; + Map<String, Object> isRequired = new HashMap(); + isRequired.put(IS_REQUIRED, Boolean.TRUE); + + propertyValue = properties.get(FIXED_IPS); + if (propertyValue instanceof Map && !((Map) propertyValue).isEmpty()) { + Map.Entry<String, Object> mapEntry = + (Map.Entry<String, Object>) ((Map) propertyValue).entrySet().iterator().next(); + if (getIpVersion(mapEntry.getValue()) != null) { + ipRequirements.put(IP_VERSION, getIpVersion(mapEntry.getValue())); + ipRequirements.put(IP_COUNT_REQUIRED, isRequired); + } + } + else if (propertyValue instanceof List && !((List) propertyValue).isEmpty()) { + for (int i = 0; i < ((List) propertyValue).size(); i++) { + Object ipMap = ((List) propertyValue).get(i); + if(ipMap instanceof Map && !((Map) ipMap).isEmpty()) { + Object ipAddressMap = ((Map) ipMap).get(IP_ADDRESS); + if (ipAddressMap instanceof Map && !((Map) ipAddressMap).isEmpty()) { + Object ipList = ((Map) ipAddressMap).get(GET_INPUT); + if (ipList instanceof List && !((List) ipList).isEmpty()) { + if (getIpVersion(((List) ipList).get(0)) != null) { + ipRequirements.put(IP_VERSION, getIpVersion(((List) ipList).get(0))); + ipRequirements.put(IP_COUNT_REQUIRED, isRequired); + } + } + else if (ipList instanceof String && !((String) ipList).isEmpty()) { + if (getIpVersion(ipList) != null) { + ipRequirements.put(IP_VERSION, getIpVersion(ipList)); + ipRequirements.put(IP_COUNT_REQUIRED, isRequired); + } + } + } + } + } + } + } + + private void setNetworkRoleTag(Map<String, Object> properties) { + Object propertyValue = properties.get(NETWORK); + if (propertyValue instanceof Map && !((Map) propertyValue).isEmpty()) { + Map.Entry<String, String> mapEntry = + (Map.Entry<String, String>) ((Map) propertyValue).entrySet().iterator().next(); + if (mapEntry.getValue() instanceof String && getNetworkRole(mapEntry.getValue())!=null) { + properties.put(NETWORK_ROLE_TAG, getNetworkRole(mapEntry.getValue())); + } + } + } + + private Object getFloatingIpVersion(Object value) { + Object ipVersion = null; + if(value instanceof String) { + if (((String) value).endsWith(FLOATING_V6_IP)) { + ipVersion = 6; + } + else { + ipVersion = 4; + } + } + return ipVersion; + } + + private Object getIpVersion(Object value) { + Object ipVersion = null; + if(value instanceof String) { + if (((String) value).endsWith(V6_IPS) || ((String) value).matches(IPV6_REGEX)) { + ipVersion = 6; + } + else { + ipVersion = 4; + } + } + return ipVersion; + } + + private Object getNetworkRole(String value) { + Object networkRole = null; + if(value.endsWith(NET_NAME)) { + networkRole = (Object) value.substring(0, value.length() - NET_NAME.length()); + } + else if(value.endsWith(NET_ID)) { + networkRole = (Object) value.substring(0, value.length() - NET_ID.length()); + } + else if(value.endsWith(NET_FQDN)) { + networkRole = (Object) value.substring(0, value.length() - NET_FQDN.length()); + } + return networkRole; + } +} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/helper/VolumeTranslationHelper.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/helper/VolumeTranslationHelper.java index ebd38c89d2..5f4e40a4b2 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/helper/VolumeTranslationHelper.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/helper/VolumeTranslationHelper.java @@ -20,20 +20,23 @@ package org.openecomp.sdc.translator.services.heattotosca.helper; +import static org.openecomp.sdc.heat.datatypes.model.HeatResourcesTypes.CINDER_VOLUME_RESOURCE_TYPE; + import org.apache.commons.collections4.CollectionUtils; +import org.openecomp.sdc.common.utils.CommonUtil; +import org.openecomp.sdc.logging.api.Logger; import org.openecomp.core.utilities.yaml.YamlUtil; import org.openecomp.sdc.heat.datatypes.manifest.FileData; import org.openecomp.sdc.heat.datatypes.model.HeatOrchestrationTemplate; -import org.openecomp.sdc.heat.datatypes.model.HeatResourcesTypes; import org.openecomp.sdc.heat.datatypes.model.Output; import org.openecomp.sdc.heat.datatypes.model.Resource; +import org.openecomp.sdc.logging.context.impl.MdcDataDebugMessage; import org.openecomp.sdc.translator.datatypes.heattotosca.AttachedResourceId; import org.openecomp.sdc.translator.datatypes.heattotosca.to.ResourceFileDataAndIDs; import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo; import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil; -import org.openecomp.sdc.translator.services.heattotosca.TranslationContext; -import org.openecomp.sdc.translator.services.heattotosca.impl.ResourceTranslationBase; -import org.slf4j.Logger; +import org.openecomp.sdc.translator.datatypes.heattotosca.TranslationContext; +import org.openecomp.sdc.translator.services.heattotosca.impl.resourcetranslation.ResourceTranslationBase; import java.util.ArrayList; import java.util.List; @@ -45,6 +48,7 @@ import java.util.stream.Collectors; public class VolumeTranslationHelper { private final Logger logger; + private static MdcDataDebugMessage mdcDataDebugMessage = new MdcDataDebugMessage(); public VolumeTranslationHelper(Logger logger) { this.logger = logger; @@ -63,22 +67,34 @@ public class VolumeTranslationHelper { String resourceId, TranslateTo translateTo, FileData.Type... types) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + if (CollectionUtils.isEmpty(filesToSearch)) { + mdcDataDebugMessage.debugExitMessage(null, null); return Optional.empty(); } - List<FileData> fileDatas = Objects.isNull(types) ? filesToSearch - : HeatToToscaUtil.getFilteredListOfFileDataByTypes(filesToSearch, types); + List<FileData> fileDatas = Objects.isNull(types) ? filesToSearch : HeatToToscaUtil + .getFilteredListOfFileDataByTypes(filesToSearch, types); Optional<ResourceFileDataAndIDs> fileDataAndIDs = getResourceFileDataAndIDsForVolumeConnection(resourceId, translateTo, fileDatas); if (fileDataAndIDs.isPresent()) { + mdcDataDebugMessage.debugExitMessage(null, null); return fileDataAndIDs; } + + mdcDataDebugMessage.debugExitMessage(null, null); return Optional.empty(); } private Optional<ResourceFileDataAndIDs> getResourceFileDataAndIDsForVolumeConnection( String resourceId, TranslateTo translateTo, List<FileData> fileDatas) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + for (FileData data : fileDatas) { HeatOrchestrationTemplate heatOrchestrationTemplate = new YamlUtil() .yamlToObject(translateTo.getContext().getFiles().getFileContent(data.getFile()), @@ -108,13 +124,15 @@ public class VolumeTranslationHelper { } else { logger.warn( "output: '" + resourceId + "' in file '" + data.getFile() + "' is not of type '" - + HeatResourcesTypes.CINDER_VOLUME_RESOURCE_TYPE.getHeatResource() + "'"); + + CINDER_VOLUME_RESOURCE_TYPE.getHeatResource() + "'"); } } } else { logger.warn("output: '" + resourceId + "' in file '" + data.getFile() + "' is not found"); } } + + mdcDataDebugMessage.debugExitMessage(null, null); return Optional.empty(); } @@ -122,14 +140,16 @@ public class VolumeTranslationHelper { HeatOrchestrationTemplate heatOrchestrationTemplate, String translatedId) { return getResourceByTranslatedResourceId(data.getFile(), heatOrchestrationTemplate, - translatedId, translateTo, - HeatResourcesTypes.CINDER_VOLUME_RESOURCE_TYPE.getHeatResource()) - .isPresent(); + translatedId, translateTo, CINDER_VOLUME_RESOURCE_TYPE.getHeatResource()).isPresent(); } private Optional<List<Map.Entry<String, Resource>>> getResourceByTranslatedResourceId( String fileName, HeatOrchestrationTemplate heatOrchestrationTemplate, String translatedResourceId, TranslateTo translateTo, String heatResourceType) { + + + mdcDataDebugMessage.debugEntryMessage("file", fileName); + List<Map.Entry<String, Resource>> list = heatOrchestrationTemplate.getResources().entrySet() .stream() .filter( @@ -139,8 +159,10 @@ public class VolumeTranslationHelper { .allMatch(p -> p.test(entry))) .collect(Collectors.toList()); if (CollectionUtils.isEmpty(list)) { + mdcDataDebugMessage.debugExitMessage("file", fileName); return Optional.empty(); } else { + mdcDataDebugMessage.debugExitMessage("file", fileName); return Optional.of(list); } } @@ -165,7 +187,7 @@ public class VolumeTranslationHelper { return true; } else { logger.warn("output: '" + resourceId + "' in file '" + data.getFile() - + "' is not defined as get_resource and therefor not supported."); + + "' is not defined as get_resource and therefore not supported as shared resource."); return false; } } diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/helper/impl/NameExtractorServiceImpl.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/helper/impl/NameExtractorServiceImpl.java index 9bd3494698..3867dadaeb 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/helper/impl/NameExtractorServiceImpl.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/helper/impl/NameExtractorServiceImpl.java @@ -17,79 +17,3 @@ * limitations under the License. * ============LICENSE_END========================================================= */ - -package org.openecomp.sdc.translator.services.heattotosca.helper.impl; - -import org.openecomp.sdc.translator.datatypes.heattotosca.AttachedResourceId; -import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil; -import org.openecomp.sdc.translator.services.heattotosca.helper.NameExtractorService; -import org.openecomp.sdc.translator.services.heattotosca.helper.PropertyRegexMatcher; - -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.regex.Pattern; - -public class NameExtractorServiceImpl implements NameExtractorService { - - @Override - public Optional<String> extractNodeTypeNameByPropertiesPriority( - Map<String, Object> properties,List<PropertyRegexMatcher> propertiesRegexMatchers) { - for (PropertyRegexMatcher propertyRegexMatcher : propertiesRegexMatchers) { - Optional<String> parameterNameValue = - getPropertyParameterNameValue(properties, propertyRegexMatcher.getPropertyName()); - if (parameterNameValue.isPresent()) { - if (isPropertyValueMatchNamingConvention(propertyRegexMatcher, parameterNameValue.get())) { - return Optional.of(parameterNameValue.get().substring(0, parameterNameValue.get() - .lastIndexOf(propertyRegexMatcher.getStringToSearchForPropertyValue()))); - } - } - } - - return Optional.empty(); - } - - private boolean isPropertyValueMatchNamingConvention(PropertyRegexMatcher propertyRegexMatcher, - String propertyValue) { - for (Pattern pattern : propertyRegexMatcher.getRegexPatterns()) { - if (pattern.matcher(propertyValue).matches()) { - return true; - } - } - return false; - } - - private Optional<String> getPropertyParameterNameValue(Map<String, Object> properties, - String prop) { - Object propObj = properties.get(prop); - Optional<AttachedResourceId> property = HeatToToscaUtil.extractProperty(propObj); - if (property.isPresent()) { - AttachedResourceId extractedProperty = property.get(); - return getParameterName(extractedProperty); - } - return Optional.empty(); - } - - private Optional<String> getParameterName(AttachedResourceId extractedProperty) { - if (!extractedProperty.isGetParam()) { - return Optional.empty(); - } - Object entityId = extractedProperty.getEntityId(); - if (entityId instanceof String) { - return Optional.of((String) entityId); - } else { - return Optional.of((String) ((List) entityId).get(0)); - } - } - - @Override - public PropertyRegexMatcher getPropertyRegexMatcher(String propertyName, - List<String> regexMatchers, - String propertyValueSearchTerm) { - PropertyRegexMatcher propertyRegexMatcher = new PropertyRegexMatcher(); - propertyRegexMatcher.setPropertyName(propertyName); - propertyRegexMatcher.setRegex(regexMatchers); - propertyRegexMatcher.setStringToSearchForPropertyValue(propertyValueSearchTerm); - return propertyRegexMatcher; - } -} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/BaseResourceConnection.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/BaseResourceConnection.java deleted file mode 100644 index d901ae9c98..0000000000 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/BaseResourceConnection.java +++ /dev/null @@ -1,174 +0,0 @@ -/*- - * ============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.services.heattotosca.impl; - -import org.apache.commons.collections4.MapUtils; -import org.openecomp.core.utilities.yaml.YamlUtil; -import org.openecomp.sdc.common.errors.CoreException; -import org.openecomp.sdc.common.errors.ErrorCategory; -import org.openecomp.sdc.common.errors.ErrorCode; -import org.openecomp.sdc.heat.datatypes.manifest.FileData; -import org.openecomp.sdc.heat.datatypes.model.HeatOrchestrationTemplate; -import org.openecomp.sdc.heat.datatypes.model.Resource; -import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate; -import org.openecomp.sdc.tosca.datatypes.model.NodeType; -import org.openecomp.sdc.tosca.datatypes.model.RequirementAssignment; -import org.openecomp.sdc.tosca.datatypes.model.RequirementDefinition; -import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; -import org.openecomp.sdc.tosca.services.DataModelUtil; -import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo; -import org.openecomp.sdc.translator.services.heattotosca.errors.TranslatorErrorCodes; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.function.Predicate; - -abstract class BaseResourceConnection<T> { - protected static Logger logger = - LoggerFactory.getLogger(ResourceTranslationCinderVolumeAttachmentImpl.class); - protected TranslateTo translateTo; - FileData nestedFileData; - NodeTemplate substitutionNodeTemplate; - NodeType nodeType; - ResourceTranslationBase resourceTranslationBase; - - BaseResourceConnection(ResourceTranslationBase resourceTranslationBase, TranslateTo translateTo, - FileData nestedFileData, NodeTemplate substitutionNodeTemplate, - NodeType nodeType) { - this.translateTo = translateTo; - this.nestedFileData = nestedFileData; - this.substitutionNodeTemplate = substitutionNodeTemplate; - this.nodeType = nodeType; - this.resourceTranslationBase = resourceTranslationBase; - } - - abstract boolean isDesiredNodeTemplateType(NodeTemplate nodeTemplate); - - abstract List<Predicate<T>> getPredicatesListForConnectionPoints(); - - abstract Optional<List<String>> getConnectorParamName(String heatResourceId, - Resource heatResource, - HeatOrchestrationTemplate - nestedHeatOrchestrationTemplate); - - abstract String getDesiredResourceType(); - - abstract String getTranslatedResourceIdFromSubstitutionMapping( - ServiceTemplate nestedServiceTemplate, Map.Entry<String, T> entry); - - abstract void addRequirementToConnectResources(Map.Entry<String, T> entry, - List<String> paramNames); - - abstract List<Map<String, T>> getAllConnectionPoints(); - - void connect() { - ServiceTemplate nestedServiceTemplate = translateTo.getContext().getTranslatedServiceTemplates() - .get(translateTo.getResource().getType()); - List<String> paramNames = null; - HeatOrchestrationTemplate nestedHeatOrchestrationTemplate = new YamlUtil() - .yamlToObject(translateTo.getContext().getFileContent(nestedFileData.getFile()), - HeatOrchestrationTemplate.class); - List<Map<String, T>> exposedConnectionPoints = getAllConnectionPoints(); - for (Map<String, T> connectionPointsMap : exposedConnectionPoints) { - for (Map.Entry<String, T> entry : connectionPointsMap.entrySet()) { - String translatedResourceId = - getTranslatedResourceIdFromSubstitutionMapping(nestedServiceTemplate, entry); - NodeTemplate nodeTemplate = nestedServiceTemplate.getTopology_template().getNode_templates() - .get(translatedResourceId); - if (!isDesiredNodeTemplateType(nodeTemplate)) { - continue; - } - paramNames = createResourcesConnection(translatedResourceId, paramNames, - nestedHeatOrchestrationTemplate, entry); - } - } - } - - private List<String> createResourcesConnection(String translatedResourceId, - List<String> paramNames, - HeatOrchestrationTemplate - nestedHeatOrchestrationTemplate, - Map.Entry<String, T> entry) { - List<String> params = paramNames; - Optional<List<Map.Entry<String, Resource>>> heatResources = - getResourceByTranslatedResourceId(translatedResourceId, nestedHeatOrchestrationTemplate); - if (heatResources.isPresent()) { - params = - addRequirementAndGetConnectorParamsFromResourceProperties(nestedHeatOrchestrationTemplate, - entry, params, heatResources.get()); - } - return params; - } - - private List<String> addRequirementAndGetConnectorParamsFromResourceProperties( - HeatOrchestrationTemplate nestedHeatOrchestrationTemplate, Map.Entry<String, T> entry, - List<String> params, List<Map.Entry<String, Resource>> heatResources) { - Resource heatResource; - for (Map.Entry<String, Resource> resourceEntry : heatResources) { - heatResource = resourceEntry.getValue(); - if (!MapUtils.isEmpty(heatResource.getProperties())) { - Optional<List<String>> connectorParamName = - getConnectorParamName(resourceEntry.getKey(), heatResource, - nestedHeatOrchestrationTemplate); - if (!connectorParamName.isPresent()) { - break; - } else { - params = connectorParamName.get(); - } - } - Objects.requireNonNull(params); - addRequirementToConnectResources(entry, params); - } - return params; - } - - protected Optional<List<Map.Entry<String, Resource>>> getResourceByTranslatedResourceId( - String translatedResourceId, HeatOrchestrationTemplate nestedHeatOrchestrationTemplate) { - Optional<List<Map.Entry<String, Resource>>> resourceByTranslatedResourceId = - resourceTranslationBase.getResourceByTranslatedResourceId(nestedFileData.getFile(), - nestedHeatOrchestrationTemplate, translatedResourceId, translateTo, - getDesiredResourceType()); - if (!resourceByTranslatedResourceId.isPresent()) { - throw new CoreException((new ErrorCode.ErrorCodeBuilder()).withMessage( - "Failed to get original resource from heat for translate resource id '" - + translatedResourceId + "'") - .withId(TranslatorErrorCodes.HEAT_TO_TOSCA_MAPPING_COLLISION) - .withCategory(ErrorCategory.APPLICATION).build()); - } - return resourceByTranslatedResourceId; - } - - void createRequirementAssignment(Map.Entry<String, RequirementDefinition> entry, String node, - NodeTemplate nodeTemplate) { - if (Objects.nonNull(node)) { - RequirementAssignment requirementAssignment; - requirementAssignment = new RequirementAssignment(); - requirementAssignment.setRelationship(entry.getValue().getRelationship()); - requirementAssignment.setCapability(entry.getValue().getCapability()); - requirementAssignment.setNode(node); - DataModelUtil.addRequirementAssignment(nodeTemplate, entry.getKey(), requirementAssignment); - } - } -} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/NovaAndPortResourceConnectionHelper.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/NovaAndPortResourceConnectionHelper.java deleted file mode 100644 index bc60a24223..0000000000 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/NovaAndPortResourceConnectionHelper.java +++ /dev/null @@ -1,106 +0,0 @@ -/*- - * ============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.services.heattotosca.impl; - -import org.openecomp.sdc.heat.datatypes.manifest.FileData; -import org.openecomp.sdc.heat.datatypes.model.HeatOrchestrationTemplate; -import org.openecomp.sdc.heat.datatypes.model.Resource; -import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate; -import org.openecomp.sdc.tosca.datatypes.model.NodeType; -import org.openecomp.sdc.tosca.datatypes.model.RequirementDefinition; -import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; -import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.function.Predicate; - -public class NovaAndPortResourceConnectionHelper - extends BaseResourceConnection<RequirementDefinition> { - public NovaAndPortResourceConnectionHelper(ResourceTranslationBase resourceTranslationBase, - TranslateTo translateTo, FileData nestedFileData, - NodeTemplate substitutionNodeTemplate, - NodeType nodeType) { - super(resourceTranslationBase, translateTo, nestedFileData, substitutionNodeTemplate, nodeType); - } - - @Override - boolean isDesiredNodeTemplateType(NodeTemplate nodeTemplate) { - return false; - } - - @Override - List<Predicate<RequirementDefinition>> getPredicatesListForConnectionPoints() { - return null; - } - - @Override - Optional<List<String>> getConnectorParamName(String heatResourceId, - Resource heatResource, - HeatOrchestrationTemplate - nestedHeatOrchestrationTemplate) { - return null; - } - - @Override - String getDesiredResourceType() { - return null; - } - - @Override - String getTranslatedResourceIdFromSubstitutionMapping( - ServiceTemplate nestedServiceTemplate,Map.Entry<String, - RequirementDefinition> entry) { - return null; - } - - @Override - void addRequirementToConnectResources(Map.Entry<String, RequirementDefinition> entry, - List<String> paramNames) { - - } - - @Override - List<Map<String, RequirementDefinition>> getAllConnectionPoints() { - List<Map<String, RequirementDefinition>> exposedRequirementsList = new ArrayList<>(); - List<Predicate<RequirementDefinition>> predicates = getPredicatesListForConnectionPoints(); - List<Map<String, RequirementDefinition>> requirements = this.nodeType.getRequirements(); - if (requirements == null) { - return exposedRequirementsList; - } - requirements.stream() - .map(Map::entrySet) - .forEach(x -> x.stream() - .filter(entry -> predicates - .stream() - .anyMatch(p -> p.test(entry.getValue()))) - .forEach(entry -> { - Map<String, RequirementDefinition> exposedRequirementsMap = new HashMap<>(); - exposedRequirementsMap.put(entry.getKey(), entry.getValue()); - exposedRequirementsList.add(exposedRequirementsMap); - })); - - return exposedRequirementsList; - } -} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/PortToNetResourceConnection.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/PortToNetResourceConnection.java deleted file mode 100644 index 8adfca305e..0000000000 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/PortToNetResourceConnection.java +++ /dev/null @@ -1,200 +0,0 @@ -/*- - * ============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.services.heattotosca.impl; - -import org.openecomp.sdc.heat.datatypes.manifest.FileData; -import org.openecomp.sdc.heat.datatypes.model.HeatOrchestrationTemplate; -import org.openecomp.sdc.heat.datatypes.model.HeatResourcesTypes; -import org.openecomp.sdc.heat.datatypes.model.Resource; -import org.openecomp.sdc.tosca.datatypes.ToscaCapabilityType; -import org.openecomp.sdc.tosca.datatypes.ToscaNodeType; -import org.openecomp.sdc.tosca.datatypes.ToscaRelationshipType; -import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate; -import org.openecomp.sdc.tosca.datatypes.model.NodeType; -import org.openecomp.sdc.tosca.datatypes.model.RequirementDefinition; -import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; -import org.openecomp.sdc.translator.datatypes.heattotosca.AttachedResourceId; -import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo; -import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslatedHeatResource; -import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.function.Predicate; - -public class PortToNetResourceConnection extends NovaAndPortResourceConnectionHelper { - - public PortToNetResourceConnection(ResourceTranslationBase resourceTranslationBase, - TranslateTo translateTo, FileData nestedFileData, - NodeTemplate substitutionNodeTemplate, NodeType nodeType) { - super(resourceTranslationBase, translateTo, nestedFileData, substitutionNodeTemplate, nodeType); - } - - @Override - protected boolean isDesiredNodeTemplateType(NodeTemplate nodeTemplate) { - return nodeTemplate.getType().equals(ToscaNodeType.NEUTRON_PORT.getDisplayName()); - } - - @Override - protected List<Predicate<RequirementDefinition>> getPredicatesListForConnectionPoints() { - ArrayList<Predicate<RequirementDefinition>> predicates = new ArrayList<>(); - predicates.add( - req -> req.getCapability().equals(ToscaCapabilityType.NETWORK_LINKABLE.getDisplayName()) - && req.getNode().equals(ToscaNodeType.ROOT.getDisplayName()) - && req.getRelationship().equals( - ToscaRelationshipType.NETWORK_LINK_TO.getDisplayName())); - return predicates; - } - - @Override - protected Optional<List<String>> getConnectorParamName(String heatResourceId, - Resource heatResource, - HeatOrchestrationTemplate - nestedHeatOrchestrationTemplate) { - Optional<AttachedResourceId> network = HeatToToscaUtil - .extractAttachedResourceId(nestedFileData.getFile(), nestedHeatOrchestrationTemplate, - translateTo.getContext(), heatResource.getProperties().get("network")); - if (network.isPresent() && network.get().isGetParam()) { - return Optional.of(Collections.singletonList((String) network.get().getEntityId())); - } else { - network = HeatToToscaUtil - .extractAttachedResourceId(nestedFileData.getFile(), nestedHeatOrchestrationTemplate, - translateTo.getContext(), heatResource.getProperties().get("network_id")); - if (network.isPresent() && network.get().isGetParam()) { - return Optional.of(Collections.singletonList((String) network.get().getEntityId())); - } else { - return Optional.empty(); - } - } - } - - @Override - protected String getDesiredResourceType() { - return HeatResourcesTypes.NEUTRON_PORT_RESOURCE_TYPE.getHeatResource(); - } - - @Override - protected String getTranslatedResourceIdFromSubstitutionMapping( - ServiceTemplate nestedServiceTemplate, Map.Entry<String, RequirementDefinition> entry) { - List<String> substitutionMapping = - nestedServiceTemplate.getTopology_template().getSubstitution_mappings().getRequirements() - .get(entry.getKey()); - return substitutionMapping.get(0); - } - - @Override - protected void addRequirementToConnectResources(Map.Entry<String, RequirementDefinition> entry, - List<String> paramNames) { - String paramName = paramNames.get( - 0); // port can connect to one network only and - // we are expecting to have only one param(unlike security rules to port) - Object paramValue = translateTo.getResource().getProperties().get(paramName); - if (paramValue == null) { - logger.warn( - "Nested resource '" + translateTo.getResourceId() + "' is not including property '" - + paramName + "' with value for the nested heat file, therefore, '" + entry.getKey() - + "' TOSCA requirement will not be connected."); - return; - } - List<String> supportedNetworkTypes = - Arrays.asList(HeatResourcesTypes.NEUTRON_NET_RESOURCE_TYPE.getHeatResource(), - HeatResourcesTypes.CONTRAIL_VIRTUAL_NETWORK_RESOURCE_TYPE.getHeatResource(), - HeatResourcesTypes.CONTRAIL_V2_VIRTUAL_NETWORK_RESOURCE_TYPE.getHeatResource()); - - Optional<String> targetTranslatedNodeId = - getConnectionTargetNodeUsingGetResourceFunc(entry, paramName, paramValue, - supportedNetworkTypes); - if (targetTranslatedNodeId.isPresent()) { - createRequirementAssignment(entry, targetTranslatedNodeId.get(), substitutionNodeTemplate); - } else { - targetTranslatedNodeId = - getConnectionTargetNodeUsingGetParam(entry, paramName, supportedNetworkTypes); - if (targetTranslatedNodeId.isPresent()) { - createRequirementAssignment(entry, targetTranslatedNodeId.get(), substitutionNodeTemplate); - } - } - } - - private boolean validateResourceTypeSupportedForReqCreation(String sourceResourceId, - final String sourcePropertyName, - String sourceReqId, - Resource targetResource, - List<String> supportedTypes) { - if (!resourceTranslationBase.isResourceTypeSupported(targetResource, supportedTypes)) { - logger.warn("Nested resource '" + sourceResourceId + "' property '" + sourcePropertyName - + "' is pointing to a resource with type '" + targetResource.getType() - + "' which is not supported for requirement '" + sourceReqId - + "' that connect port to network. \nSupported types are: '" + supportedTypes.toString() - + "', therefore, this TOSCA requirement will not be connected."); - return false; - } - return true; - } - - private Optional<String> getConnectionTargetNodeUsingGetParam( - Map.Entry<String, RequirementDefinition> requirementDefinitionEntry, String paramName, - List<String> supportedTargetNodeTypes) { - Optional<AttachedResourceId> attachedResourceId = - HeatToToscaUtil.extractAttachedResourceId(translateTo, paramName); - if (!attachedResourceId.isPresent()) { - return Optional.empty(); - } - AttachedResourceId resourceId = attachedResourceId.get(); - if (resourceId.isGetParam()) { - TranslatedHeatResource shareResource = - translateTo.getContext().getHeatSharedResourcesByParam().get(resourceId.getEntityId()); - if (Objects.nonNull(shareResource) - && !HeatToToscaUtil.isHeatFileNested(translateTo, translateTo.getHeatFileName())) { - if (validateResourceTypeSupportedForReqCreation(translateTo.getResourceId(), paramName, - requirementDefinitionEntry.getKey(), shareResource.getHeatResource(), - supportedTargetNodeTypes)) { - return Optional.of(shareResource.getTranslatedId()); - } - } - } - - return Optional.empty(); - } - - private Optional<String> getConnectionTargetNodeUsingGetResourceFunc( - Map.Entry<String, RequirementDefinition> requirementDefinitionEntry, String paramName, - Object paramValue, List<String> supportedTargetNodeTypes) { - String getResourceAttachedResourceId = - HeatToToscaUtil.extractContrailGetResourceAttachedHeatResourceId(paramValue); - if (getResourceAttachedResourceId != null) { // get resource - Resource resource = translateTo.getHeatOrchestrationTemplate().getResources() - .get(getResourceAttachedResourceId); - if (validateResourceTypeSupportedForReqCreation(translateTo.getResourceId(), paramName, - requirementDefinitionEntry.getKey(), resource, supportedTargetNodeTypes)) { - return ResourceTranslationBase.getResourceTranslatedId(translateTo.getHeatFileName(), - translateTo.getHeatOrchestrationTemplate(), getResourceAttachedResourceId, - translateTo.getContext()); - } - } - - return Optional.empty(); - } -} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/ResourceTranslationBase.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/ResourceTranslationBase.java deleted file mode 100644 index 45e3830f6f..0000000000 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/ResourceTranslationBase.java +++ /dev/null @@ -1,456 +0,0 @@ -/*- - * ============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.services.heattotosca.impl; - -import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.collections4.MapUtils; -import org.apache.commons.lang3.StringUtils; -import org.openecomp.core.utilities.yaml.YamlUtil; -import org.openecomp.sdc.common.errors.CoreException; -import org.openecomp.sdc.heat.datatypes.manifest.FileData; -import org.openecomp.sdc.heat.datatypes.model.HeatOrchestrationTemplate; -import org.openecomp.sdc.heat.datatypes.model.Output; -import org.openecomp.sdc.heat.datatypes.model.Resource; -import org.openecomp.sdc.tosca.datatypes.ToscaCapabilityType; -import org.openecomp.sdc.tosca.datatypes.ToscaRelationshipType; -import org.openecomp.sdc.tosca.datatypes.model.ArtifactDefinition; -import org.openecomp.sdc.tosca.datatypes.model.AttributeDefinition; -import org.openecomp.sdc.tosca.datatypes.model.CapabilityDefinition; -import org.openecomp.sdc.tosca.datatypes.model.Import; -import org.openecomp.sdc.tosca.datatypes.model.InterfaceDefinition; -import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate; -import org.openecomp.sdc.tosca.datatypes.model.NodeType; -import org.openecomp.sdc.tosca.datatypes.model.PropertyDefinition; -import org.openecomp.sdc.tosca.datatypes.model.RequirementAssignment; -import org.openecomp.sdc.tosca.datatypes.model.RequirementDefinition; -import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; -import org.openecomp.sdc.tosca.services.DataModelUtil; -import org.openecomp.sdc.tosca.services.ToscaConstants; -import org.openecomp.sdc.tosca.services.ToscaNativeTypesServiceTemplate; -import org.openecomp.sdc.translator.datatypes.heattotosca.AttachedResourceId; -import org.openecomp.sdc.translator.datatypes.heattotosca.to.ResourceFileDataAndIDs; -import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo; -import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil; -import org.openecomp.sdc.translator.services.heattotosca.ResourceTranslation; -import org.openecomp.sdc.translator.services.heattotosca.ResourceTranslationFactory; -import org.openecomp.sdc.translator.services.heattotosca.TranslationContext; -import org.openecomp.sdc.translator.services.heattotosca.TranslationService; -import org.openecomp.sdc.translator.services.heattotosca.errors.ResourceNotFoundInHeatFileErrorBuilder; -import org.openecomp.sdc.translator.services.heattotosca.globaltypes.GlobalTypesGenerator; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.function.Predicate; -import java.util.stream.Collectors; - -public abstract class ResourceTranslationBase implements ResourceTranslation { - - protected static Logger logger = LoggerFactory.getLogger(ResourceTranslationBase.class); - - static Optional<ResourceFileDataAndIDs> getFileDataContainingResource( - List<FileData> filesToSearch, String resourceId, TranslationContext context, - FileData.Type... types) { - if (CollectionUtils.isEmpty(filesToSearch)) { - return Optional.empty(); - } - - List<FileData> fileDatas = Objects.isNull(types) ? filesToSearch - : HeatToToscaUtil.getFilteredListOfFileDataByTypes(filesToSearch, types); - for (FileData data : fileDatas) { - HeatOrchestrationTemplate heatOrchestrationTemplate = new YamlUtil() - .yamlToObject(context.getFiles().getFileContent(data.getFile()), - HeatOrchestrationTemplate.class); - Map<String, Output> outputs = heatOrchestrationTemplate.getOutputs(); - if (Objects.isNull(outputs)) { - continue; - } - Output output = outputs.get(resourceId); - if (Objects.nonNull(output)) { - Optional<AttachedResourceId> attachedOutputId = HeatToToscaUtil - .extractAttachedResourceId(data.getFile(), heatOrchestrationTemplate, context, - output.getValue()); - if (attachedOutputId.isPresent()) { - AttachedResourceId attachedResourceId = attachedOutputId.get(); - if (!attachedResourceId.isGetResource()) { - logger.warn("output: '" + resourceId + "' in file '" + data.getFile() - + "' is not defined as get_resource and therefor not supported."); - continue; - } - ResourceFileDataAndIDs fileDataAndIDs = - new ResourceFileDataAndIDs((String) attachedResourceId.getEntityId(), - (String) attachedResourceId.getTranslatedId(), - data); - return Optional.of(fileDataAndIDs); - } - } - } - return Optional.empty(); - } - - /** - * Gets resource translated id. - * - * @param heatFileName the heat file name - * @param heatOrchestrationTemplate the heat orchestration template - * @param resourceId the resource id - * @param context the context - * @return the resource translated id - */ - public static Optional<String> getResourceTranslatedId(String heatFileName, - HeatOrchestrationTemplate - heatOrchestrationTemplate, - String resourceId, - TranslationContext context) { - if (!context.getTranslatedIds().containsKey(heatFileName)) { - context.getTranslatedIds().put(heatFileName, new HashMap<>()); - } - - Map<String, String> translatedIdsPerFile = context.getTranslatedIds().get(heatFileName); - String translatedId = translatedIdsPerFile.get(resourceId); - if (translatedId != null) { - return Optional.of(translatedId); - } - - Resource resource = heatOrchestrationTemplate.getResources().get(resourceId); - if (resource == null) { - throw new CoreException( - new ResourceNotFoundInHeatFileErrorBuilder(resourceId, heatFileName).build()); - } - TranslateTo translateTo = - generateTranslationTo(heatFileName, null, heatOrchestrationTemplate, resource, resourceId, - null, context); - translatedId = - ResourceTranslationFactory.getInstance(resource).generateTranslatedId(translateTo); - if (translatedId != null) { - context.getTranslatedIds().get(heatFileName).put(resourceId, translatedId); - } - return Optional.ofNullable(translatedId); - } - - private static TranslateTo generateTranslationTo(String heatFileName, - ServiceTemplate serviceTemplate, - HeatOrchestrationTemplate - heatOrchestrationTemplate, - Resource resource, String resourceId, - String translatedId, - TranslationContext context) { - TranslateTo to = new TranslateTo(); - to.setHeatFileName(heatFileName); - to.setServiceTemplate(serviceTemplate); - to.setHeatOrchestrationTemplate(heatOrchestrationTemplate); - to.setResource(resource); - to.setResourceId(resourceId); - to.setTranslatedId(translatedId); - to.setContext(context); - return to; - } - - protected abstract void translate(TranslateTo translateTo); - - protected String generateTranslatedId(TranslateTo translateTo) { - isEssentialRequirementsValid(translateTo); - return translateTo.getResourceId(); - } - - protected boolean isEssentialRequirementsValid(TranslateTo translateTo) { - return true; - } - - @Override - public Optional<String> translateResource(String heatFileName, ServiceTemplate serviceTemplate, - HeatOrchestrationTemplate heatOrchestrationTemplate, - Resource resource, String resourceId, - TranslationContext context) { - Optional<String> translatedId = - getResourceTranslatedId(heatFileName, heatOrchestrationTemplate, resourceId, context); - context.getTranslatedResources().putIfAbsent(heatFileName, new HashSet<>()); - if (context.getTranslatedResources().get(heatFileName).contains(resourceId)) { - return translatedId; - } - if (!translatedId.isPresent()) { - return Optional.empty(); - } - logger.debug("Translate- file:" + heatFileName + " resource Id:" + resourceId - + " translated resource id:" + translatedId.get()); - translate(new TranslateTo(heatFileName, serviceTemplate, heatOrchestrationTemplate, resource, - resourceId, translatedId.get(), context)); - context.getTranslatedResources().get(heatFileName).add(resourceId); - - if (isNodeTemplate(translatedId.get(), serviceTemplate)) { - if (!context.getHeatStackGroupMembers().containsKey(heatFileName)) { - context.getHeatStackGroupMembers().put(heatFileName, new HashSet<>()); - } - context.getHeatStackGroupMembers().get(heatFileName).add(translatedId.get()); - updateResourceDependency(heatFileName, resource, heatOrchestrationTemplate, - translatedId.get(), serviceTemplate, context); - } - - return translatedId; - } - - private void updateResourceDependency(String heatFileName, Resource resource, - HeatOrchestrationTemplate heatOrchestrationTemplate, - String translatedId, ServiceTemplate serviceTemplate, - TranslationContext context) { - if (resource.getDepends_on() == null) { - return; - } - - if (resource.getDepends_on() instanceof List) { - List<String> dependsOnList = (List<String>) resource.getDepends_on(); - for (String dependsOnResourceId : dependsOnList) { - addDependOnRequirement(dependsOnResourceId, translatedId, serviceTemplate, heatFileName, - heatOrchestrationTemplate, context); - } - } else { - String dependsOnResourceId = (String) resource.getDepends_on(); - addDependOnRequirement(dependsOnResourceId, translatedId, serviceTemplate, heatFileName, - heatOrchestrationTemplate, context); - } - - } - - private void addDependOnRequirement(String dependsOnResourceId, String nodeTemplateId, - ServiceTemplate serviceTemplate, String heatFileName, - HeatOrchestrationTemplate heatOrchestrationTemplate, - TranslationContext context) { - RequirementAssignment requirementAssignment = new RequirementAssignment(); - Optional<String> resourceTranslatedId = - getResourceTranslatedId(heatFileName, heatOrchestrationTemplate, dependsOnResourceId, - context); - - if (resourceTranslatedId.isPresent() - && isNodeTemplate(resourceTranslatedId.get(), serviceTemplate)) { - requirementAssignment.setNode(resourceTranslatedId.get()); - requirementAssignment.setCapability(ToscaCapabilityType.NODE.getDisplayName()); - requirementAssignment.setRelationship(ToscaRelationshipType.DEPENDS_ON.getDisplayName()); - DataModelUtil.addRequirementAssignment( - serviceTemplate.getTopology_template().getNode_templates().get(nodeTemplateId), - ToscaConstants.DEPENDS_ON_REQUIREMENT_ID, requirementAssignment); - } - } - - private boolean isNodeTemplate(String entryId, ServiceTemplate serviceTemplate) { - return serviceTemplate.getTopology_template().getNode_templates() != null - && serviceTemplate.getTopology_template().getNode_templates().get(entryId) != null; - } - - FileData getFileData(String fileName, TranslationContext context) { - - List<FileData> fileDataList = context.getManifest().getContent().getData(); - for (FileData fileData : fileDataList) { - if (TranslationService.getTypesToProcessByTranslator().contains(fileData.getType()) - && fileData.getFile().equals(fileName)) { - return fileData; - } - } - return null; - } - - NodeType getNodeTypeWithFlatHierarchy(String nodeTypeId, ServiceTemplate serviceTemplate, - TranslationContext context) { - NodeType nodeType; - if (serviceTemplate != null && serviceTemplate.getNode_types() != null) { - nodeType = serviceTemplate.getNode_types().get(nodeTypeId); - - if (nodeType != null) { - return enrichNodeType(nodeType, serviceTemplate, context); - } - } - Map<String, Map<String, NodeType>> globalNodeTypesMap = new HashMap<>(); - Collection<ServiceTemplate> globalNodeTypes = - GlobalTypesGenerator.getGlobalTypesServiceTemplate().values(); - ServiceTemplate nativeNodeTypeServiceTemplate = - ToscaNativeTypesServiceTemplate.createServiceTemplate(); - for (ServiceTemplate globalNodeType : globalNodeTypes) { - globalNodeTypesMap - .put(globalNodeType.getMetadata().getTemplate_name(), globalNodeType.getNode_types()); - } - if (Objects.nonNull(serviceTemplate) && MapUtils.isNotEmpty(serviceTemplate.getImports())) { - for (Map.Entry<String, Import> entry : serviceTemplate.getImports().entrySet()) { - if (globalNodeTypesMap.containsKey(entry.getKey())) { - Map<String, NodeType> nodeTypes = globalNodeTypesMap.get(entry.getKey()); - if (nodeTypes != null && nodeTypes.containsKey(nodeTypeId)) { - return enrichNodeType(nodeTypes.get(nodeTypeId), serviceTemplate, context); - } - } - if (context.getGlobalSubstitutionServiceTemplate() != null - && context.getGlobalSubstitutionServiceTemplate().getNode_types() != null - && context.getGlobalSubstitutionServiceTemplate().getNode_types() - .containsKey(nodeTypeId)) { - return enrichNodeType( - context.getGlobalSubstitutionServiceTemplate().getNode_types().get(nodeTypeId), - serviceTemplate, context); - } - if (nativeNodeTypeServiceTemplate.getNode_types().containsKey(nodeTypeId)) { - return enrichNodeType(nativeNodeTypeServiceTemplate.getNode_types().get(nodeTypeId), - serviceTemplate, context); - } - } - } - return new NodeType(); - - } - - private NodeType enrichNodeType(NodeType nodeType, ServiceTemplate serviceTemplate, - TranslationContext context) { - NodeType clonedNodeType; - - if (StringUtils.isEmpty(nodeType.getDerived_from())) { - return nodeType.clone(); - } - - clonedNodeType = enrichNodeType( - getNodeTypeWithFlatHierarchy(nodeType.getDerived_from(), serviceTemplate, context), - serviceTemplate, context); - mergeNodeTypes(clonedNodeType, nodeType); - return clonedNodeType; - - } - - private void mergeNodeTypes(NodeType target, NodeType source) { - target.setDerived_from(source.getDerived_from()); - target.setDescription(source.getDescription()); - target.setVersion(source.getVersion()); - target.setProperties( - mergeMaps(target.getProperties(), source.getProperties(), PropertyDefinition.class)); - target.setInterfaces( - mergeMaps(target.getInterfaces(), source.getInterfaces(), InterfaceDefinition.class)); - target.setArtifacts( - mergeMaps(target.getArtifacts(), source.getArtifacts(), ArtifactDefinition.class)); - target.setAttributes( - mergeMaps(target.getAttributes(), source.getAttributes(), AttributeDefinition.class)); - target.setCapabilities( - mergeMaps(target.getCapabilities(), source.getCapabilities(), CapabilityDefinition.class)); - target.setRequirements(mergeLists(target.getRequirements(), source.getRequirements(), - RequirementDefinition.class)); - } - - private <T, S> List<Map<T, S>> mergeLists(List<Map<T, S>> target, List<Map<T, S>> source, - Class<S> value) { - List<Map<T, S>> retList = new ArrayList<>(); - if (Objects.nonNull(target)) { - retList.addAll(target); - } - - if (Objects.nonNull(source)) { - for (Map<T, S> sourceMap : source) { - for (Map.Entry<T, S> entry : sourceMap.entrySet()) { - mergeEntryInList(entry.getKey(), entry.getValue(), retList); - } - } - } - return retList; - } - - <T, S> void mergeEntryInList(T key, S value, List<Map<T, S>> target) { - boolean found = false; - for (Map<T, S> map : target) { - if (map.containsKey(key)) { - map.put(key, value); - found = true; - } - } - - if (!found) { - Map<T, S> newMap = new HashMap<>(); - newMap.put(key, value); - target.add(newMap); - } - } - - - private <T, S> Map<T, S> mergeMaps(Map<T, S> target, Map<T, S> source, Class<S> value) { - Map<T, S> retMap = new HashMap<>(); - if (MapUtils.isNotEmpty(target)) { - retMap.putAll(target); - } - - if (MapUtils.isNotEmpty(source)) { - retMap.putAll(source); - } - return retMap; - } - - Optional<List<Map.Entry<String, Resource>>> getResourceByTranslatedResourceId( - String fileName, - HeatOrchestrationTemplate heatOrchestrationTemplate, - String translatedResourceId,TranslateTo translateTo,String heatResourceType) { - List<Map.Entry<String, Resource>> list = heatOrchestrationTemplate.getResources().entrySet() - .stream() - .filter( - entry -> getPredicatesForTranslatedIdToResourceId(fileName, heatOrchestrationTemplate, - translatedResourceId, translateTo.getContext(), heatResourceType) - .stream() - .allMatch(p -> p.test(entry))) - .collect(Collectors.toList()); - if (CollectionUtils.isEmpty(list)) { - return Optional.empty(); - } else { - return Optional.of(list); - } - } - - private List<Predicate<Map.Entry<String, Resource>>> getPredicatesForTranslatedIdToResourceId( - String fileName, HeatOrchestrationTemplate heatOrchestrationTemplate, - String translatedResourceId, TranslationContext context, String heatResourceType) { - List<Predicate<Map.Entry<String, Resource>>> list = new ArrayList<>(); - list.add(entry -> - entry.getValue().getType().equals(heatResourceType)); - list.add(entry -> { - Optional<String> resourceTranslatedId = - getResourceTranslatedId(fileName, heatOrchestrationTemplate, entry.getKey(), context); - return resourceTranslatedId.isPresent() - && resourceTranslatedId.get().equals(translatedResourceId); - }); - return list; - } - - void addBindingReqFromPortToCompute(String computeNodeTemplateId, NodeTemplate portNodeTemplate) { - RequirementAssignment requirementAssignment = new RequirementAssignment(); - requirementAssignment.setCapability(ToscaCapabilityType.NETWORK_BINDABLE.getDisplayName()); - requirementAssignment.setRelationship(ToscaRelationshipType.NETWORK_BINDS_TO.getDisplayName()); - requirementAssignment.setNode(computeNodeTemplateId); - DataModelUtil.addRequirementAssignment(portNodeTemplate, ToscaConstants.BINDING_REQUIREMENT_ID, - requirementAssignment); - } - - void addLinkReqFromPortToNetwork(NodeTemplate nodeTemplate, String translatedId) { - RequirementAssignment requirement = new RequirementAssignment(); - requirement.setCapability(ToscaCapabilityType.NETWORK_LINKABLE.getDisplayName()); - requirement.setRelationship(ToscaRelationshipType.NETWORK_LINK_TO.getDisplayName()); - requirement.setNode(translatedId); - DataModelUtil - .addRequirementAssignment(nodeTemplate, ToscaConstants.LINK_REQUIREMENT_ID, requirement); - } - - boolean isResourceTypeSupported(Resource resource, List<String> supportedTypes) { - return Objects.nonNull(resource) && supportedTypes.contains(resource.getType()); - } -} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/ResourceTranslationContrailV2VmInterfaceImpl.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/ResourceTranslationContrailV2VmInterfaceImpl.java deleted file mode 100644 index 14403df002..0000000000 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/ResourceTranslationContrailV2VmInterfaceImpl.java +++ /dev/null @@ -1,126 +0,0 @@ -/*- - * ============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.services.heattotosca.impl; - -import org.openecomp.sdc.heat.datatypes.model.HeatResourcesTypes; -import org.openecomp.sdc.heat.datatypes.model.Resource; -import org.openecomp.sdc.tosca.datatypes.ToscaNodeType; -import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate; -import org.openecomp.sdc.tosca.services.DataModelUtil; -import org.openecomp.sdc.translator.datatypes.heattotosca.AttachedResourceId; -import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo; -import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslatedHeatResource; -import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil; -import org.openecomp.sdc.translator.services.heattotosca.mapping.TranslatorHeatToToscaPropertyConverter; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.Arrays; -import java.util.List; -import java.util.Objects; -import java.util.Optional; - - -public class ResourceTranslationContrailV2VmInterfaceImpl extends ResourceTranslationBase { - protected static Logger logger = - LoggerFactory.getLogger(ResourceTranslationContrailV2VmInterfaceImpl.class); - - @Override - protected void translate(TranslateTo translateTo) { - NodeTemplate nodeTemplate = new NodeTemplate(); - nodeTemplate.setType(ToscaNodeType.CONTRAILV2_VIRTUAL_MACHINE_INTERFACE.getDisplayName()); - - nodeTemplate.setProperties(TranslatorHeatToToscaPropertyConverter - .getToscaPropertiesSimpleConversion(translateTo.getResource().getProperties(), - nodeTemplate.getProperties(), translateTo.getHeatFileName(), - translateTo.getHeatOrchestrationTemplate(), translateTo.getResource().getType(), - nodeTemplate, translateTo.getContext())); - handleNetworkRequirement(translateTo, nodeTemplate); - Optional<String> resourceTranslatedId = getResourceTranslatedId(translateTo.getHeatFileName(), - translateTo.getHeatOrchestrationTemplate(), translateTo.getResourceId(), - translateTo.getContext()); - if (resourceTranslatedId.isPresent()) { - DataModelUtil.addNodeTemplate(translateTo.getServiceTemplate(), resourceTranslatedId.get(), - nodeTemplate); - } - } - - private void handleNetworkRequirement(TranslateTo translateTo, NodeTemplate nodeTemplate) { - Object virtualNetworkRefs = - translateTo.getResource().getProperties().get("virtual_network_refs"); - if (Objects.isNull(virtualNetworkRefs) || !(virtualNetworkRefs instanceof List) - || ((List) virtualNetworkRefs).size() == 0) { - return; - } - List<String> acceptableResourceTypes = Arrays - .asList(HeatResourcesTypes.NEUTRON_NET_RESOURCE_TYPE.getHeatResource(), - HeatResourcesTypes.CONTRAIL_V2_VIRTUAL_NETWORK_RESOURCE_TYPE.getHeatResource()); - List virtualNetworkRefList = (List) virtualNetworkRefs; - if (virtualNetworkRefList.size() > 1) { - logger.warn("Heat resource: '" + translateTo.getResourceId() + "' with type: '" - + translateTo.getResource().getType() - + "' include 'virtual_network_refs' property with more than one network values," - + " only the first network will be translated, " - + "all rest will be ignored in TOSCA translation."); - } - Object virtualNetworkRef = virtualNetworkRefList.get(0); - String networkResourceId = - HeatToToscaUtil.extractContrailGetResourceAttachedHeatResourceId(virtualNetworkRef); - if (Objects.nonNull(networkResourceId)) { // get_resource - Resource networkResource = HeatToToscaUtil - .getResource(translateTo.getHeatOrchestrationTemplate(), networkResourceId, - translateTo.getHeatFileName()); - if (acceptableResourceTypes.contains(networkResource.getType())) { - Optional<String> resourceTranslatedId = - getResourceTranslatedId(translateTo.getHeatFileName(), - translateTo.getHeatOrchestrationTemplate(), networkResourceId, - translateTo.getContext()); - if (resourceTranslatedId.isPresent()) { - addLinkReqFromPortToNetwork(nodeTemplate, resourceTranslatedId.get()); - } - } else { - logger.warn("Heat resource: '" + translateTo.getResourceId() + "' with type: '" - + translateTo.getResource().getType() - + "' include 'virtual_network_refs' property which is connect" - + " to unsupported/incorrect resource with type '" - + networkResource.getType() - + "', therefore, this connection will be ignored in TOSCA translation."); - } - } else { - Optional<AttachedResourceId> attachedResourceId = HeatToToscaUtil - .extractAttachedResourceId(translateTo.getHeatFileName(), - translateTo.getHeatOrchestrationTemplate(), translateTo.getContext(), - virtualNetworkRef); - if (attachedResourceId.isPresent() && attachedResourceId.get().isGetParam()) { - TranslatedHeatResource translatedSharedResourceId = - translateTo.getContext().getHeatSharedResourcesByParam() - .get(attachedResourceId.get().getEntityId()); - if (Objects.nonNull(translatedSharedResourceId) - && !HeatToToscaUtil.isHeatFileNested(translateTo, translateTo.getHeatFileName())) { - addLinkReqFromPortToNetwork(nodeTemplate, translatedSharedResourceId.getTranslatedId()); - } - } - } - - - } - -} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/ResourceTranslationNestedImpl.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/ResourceTranslationNestedImpl.java deleted file mode 100644 index 2573b6849d..0000000000 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/ResourceTranslationNestedImpl.java +++ /dev/null @@ -1,781 +0,0 @@ -/*- - * ============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.services.heattotosca.impl; - -import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.collections4.MapUtils; -import org.openecomp.core.utilities.file.FileUtils; -import org.openecomp.sdc.heat.datatypes.manifest.FileData; -import org.openecomp.sdc.heat.datatypes.model.HeatOrchestrationTemplate; -import org.openecomp.sdc.heat.datatypes.model.HeatResourcesTypes; -import org.openecomp.sdc.heat.datatypes.model.Resource; -import org.openecomp.sdc.heat.services.HeatConstants; -import org.openecomp.sdc.tosca.datatypes.ToscaCapabilityType; -import org.openecomp.sdc.tosca.datatypes.ToscaNodeType; -import org.openecomp.sdc.tosca.datatypes.ToscaRelationshipType; -import org.openecomp.sdc.tosca.datatypes.model.AttributeDefinition; -import org.openecomp.sdc.tosca.datatypes.model.CapabilityDefinition; -import org.openecomp.sdc.tosca.datatypes.model.Metadata; -import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate; -import org.openecomp.sdc.tosca.datatypes.model.NodeType; -import org.openecomp.sdc.tosca.datatypes.model.ParameterDefinition; -import org.openecomp.sdc.tosca.datatypes.model.PropertyDefinition; -import org.openecomp.sdc.tosca.datatypes.model.PropertyType; -import org.openecomp.sdc.tosca.datatypes.model.RequirementAssignment; -import org.openecomp.sdc.tosca.datatypes.model.RequirementDefinition; -import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; -import org.openecomp.sdc.tosca.datatypes.model.SubstitutionMapping; -import org.openecomp.sdc.tosca.datatypes.model.Template; -import org.openecomp.sdc.tosca.datatypes.model.TopologyTemplate; -import org.openecomp.sdc.tosca.services.DataModelUtil; -import org.openecomp.sdc.tosca.services.ToscaConstants; -import org.openecomp.sdc.tosca.services.ToscaUtil; -import org.openecomp.sdc.translator.datatypes.heattotosca.AttachedResourceId; -import org.openecomp.sdc.translator.datatypes.heattotosca.to.ResourceFileDataAndIDs; -import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo; -import org.openecomp.sdc.translator.services.heattotosca.Constants; -import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil; -import org.openecomp.sdc.translator.services.heattotosca.TranslationContext; -import org.openecomp.sdc.translator.services.heattotosca.TranslationService; -import org.openecomp.sdc.translator.services.heattotosca.globaltypes.GlobalTypesGenerator; -import org.openecomp.sdc.translator.services.heattotosca.globaltypes.GlobalTypesUtil; -import org.openecomp.sdc.translator.services.heattotosca.mapping.TranslatorHeatToToscaPropertyConverter; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -public class ResourceTranslationNestedImpl extends ResourceTranslationBase { - - protected static Logger logger = LoggerFactory.getLogger(ResourceTranslationNestedImpl.class); - - @Override - public void translate(TranslateTo translateTo) { - FileData nestedFileData = - getFileData(translateTo.getResource().getType(), translateTo.getContext()); - String templateName = FileUtils.getFileWithoutExtention(translateTo.getResource().getType()); - String substitutionNodeTypeKey = ToscaConstants.NODES_SUBSTITUTION_PREFIX + templateName; - - if (!translateTo.getContext().getTranslatedServiceTemplates() - .containsKey(translateTo.getResource().getType())) { - - //substitution template - ServiceTemplate nestedSubstitutionServiceTemplate = new ServiceTemplate(); - Metadata templateMetadata = new Metadata(); - templateMetadata.setTemplate_name(templateName); - nestedSubstitutionServiceTemplate.setMetadata(templateMetadata); - nestedSubstitutionServiceTemplate - .setTosca_definitions_version(ToscaConstants.TOSCA_DEFINITIONS_VERSION); - nestedSubstitutionServiceTemplate.setTopology_template(new TopologyTemplate()); - nestedSubstitutionServiceTemplate.setImports(GlobalTypesGenerator.getGlobalTypesImportList()); - nestedSubstitutionServiceTemplate.getImports() - .put(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME, GlobalTypesUtil - .createServiceTemplateImport(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME)); - - TranslationService translationService = new TranslationService(); - - translationService.translateHeatFile(nestedSubstitutionServiceTemplate, nestedFileData, - translateTo.getContext()); - - //global substitution template - ServiceTemplate globalSubstitutionServiceTemplate; - globalSubstitutionServiceTemplate = translateTo.getContext().getTranslatedServiceTemplates() - .get(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME); - if (globalSubstitutionServiceTemplate == null) { - globalSubstitutionServiceTemplate = new ServiceTemplate(); - templateMetadata = new Metadata(); - templateMetadata.setTemplate_name(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME); - globalSubstitutionServiceTemplate.setMetadata(templateMetadata); - globalSubstitutionServiceTemplate - .setImports(GlobalTypesGenerator.getGlobalTypesImportList()); - globalSubstitutionServiceTemplate - .setTosca_definitions_version(ToscaConstants.TOSCA_DEFINITIONS_VERSION); - } - translateTo.getServiceTemplate().getImports() - .put(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME, GlobalTypesUtil - .createServiceTemplateImport(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME)); - - - //substitution node type - NodeType substitutionNodeType = new NodeType(); - substitutionNodeType.setDerived_from(ToscaNodeType.ABSTRACT_SUBSTITUTE.getDisplayName()); - substitutionNodeType.setDescription(nestedSubstitutionServiceTemplate.getDescription()); - substitutionNodeType - .setProperties(manageSubstitutionNodeTypeProperties(nestedSubstitutionServiceTemplate)); - substitutionNodeType - .setAttributes(manageSubstitutionNodeTypeAttributes(nestedSubstitutionServiceTemplate)); - DataModelUtil.addNodeType(globalSubstitutionServiceTemplate, substitutionNodeTypeKey, - substitutionNodeType); - Map<String, Map<String, List<String>>> substitutionMapping = - manageSubstitutionNodeTypeCapabilitiesAndRequirements(substitutionNodeType, - nestedSubstitutionServiceTemplate, translateTo); - //calculate substitution mapping after capability and requirement expose calculation - nestedSubstitutionServiceTemplate.getTopology_template().setSubstitution_mappings( - manageSubstitutionTemplateSubstitutionMapping(substitutionNodeTypeKey, - substitutionNodeType, substitutionMapping)); - - //add new service template - translateTo.getContext().getTranslatedServiceTemplates() - .put(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME, - globalSubstitutionServiceTemplate); - translateTo.getContext().getTranslatedServiceTemplates() - .put(translateTo.getResource().getType(), nestedSubstitutionServiceTemplate); - } - - NodeTemplate substitutionNodeTemplate = new NodeTemplate(); - List<String> directiveList = new ArrayList<>(); - directiveList.add(ToscaConstants.NODE_TEMPLATE_DIRECTIVE_SUBSTITUTABLE); - substitutionNodeTemplate.setDirectives(directiveList); - substitutionNodeTemplate.setType(substitutionNodeTypeKey); - substitutionNodeTemplate.setProperties( - managerSubstitutionNodeTemplateProperties(translateTo, substitutionNodeTemplate, - templateName)); - manageSubstitutionNodeTemplateConnectionPoint(translateTo, nestedFileData, - substitutionNodeTemplate); - DataModelUtil.addNodeTemplate(translateTo.getServiceTemplate(), translateTo.getTranslatedId(), - substitutionNodeTemplate); - } - - private void manageSubstitutionNodeTemplateConnectionPoint(TranslateTo translateTo, - FileData nestedFileData, - NodeTemplate substitutionNodeTemplate) { - ServiceTemplate globalSubstitutionTemplate = - translateTo.getContext().getTranslatedServiceTemplates() - .get(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME); - NodeType nodeType = globalSubstitutionTemplate.getNode_types().get( - ToscaConstants.NODES_SUBSTITUTION_PREFIX - + FileUtils.getFileWithoutExtention(translateTo.getResource().getType())); - handlePortToNetConnections(translateTo, nestedFileData, substitutionNodeTemplate, nodeType); - handleSecurityRulesToPortConnections(translateTo, nestedFileData, substitutionNodeTemplate, - nodeType); - handleNovaToVolConnection(translateTo, nestedFileData, substitutionNodeTemplate, nodeType); - handleContrailV2VmInterfaceToNetworkConnection(translateTo, nestedFileData, - substitutionNodeTemplate, nodeType); - } - - private void handleContrailV2VmInterfaceToNetworkConnection(TranslateTo translateTo, - FileData nestedFileData, - NodeTemplate substitutionNodeTemplate, - NodeType nodeType) { - ContrailV2VmInterfaceToNetResourceConnection linker = - new ContrailV2VmInterfaceToNetResourceConnection(this, translateTo, nestedFileData, - substitutionNodeTemplate, nodeType); - linker.connect(); - } - - private void handleNovaToVolConnection(TranslateTo translateTo, FileData nestedFileData, - NodeTemplate substitutionNodeTemplate, NodeType nodeType) { - NovaToVolResourceConnection linker = - new NovaToVolResourceConnection(this, translateTo, nestedFileData, substitutionNodeTemplate, - nodeType); - linker.connect(); - } - - private void handleSecurityRulesToPortConnections(TranslateTo translateTo, - FileData nestedFileData, - NodeTemplate substitutionNodeTemplate, - NodeType nodeType) { - SecurityRulesToPortResourceConnection linker = - new SecurityRulesToPortResourceConnection(this, translateTo, nestedFileData, - substitutionNodeTemplate, nodeType); - linker.connect(); - } - - private void handlePortToNetConnections(TranslateTo translateTo, FileData nestedFileData, - NodeTemplate substitutionNodeTemplate, - NodeType nodeType) { - PortToNetResourceConnection linker = - new PortToNetResourceConnection(this, translateTo, nestedFileData, substitutionNodeTemplate, - nodeType); - linker.connect(); - } - - private List<Map<String, RequirementDefinition>> getVolumeRequirements(NodeType nodeType) { - List<Map<String, RequirementDefinition>> volumeRequirementsList = new ArrayList<>(); - List<Map<String, RequirementDefinition>> requirementsList = nodeType.getRequirements(); - - for (int i = 0; requirementsList != null && i < requirementsList.size(); i++) { - RequirementDefinition req; - for (Map.Entry<String, RequirementDefinition> entry : requirementsList.get(i).entrySet()) { - req = entry.getValue(); - if (isVolumeRequirement(req, ToscaCapabilityType.ATTACHMENT.getDisplayName(), - ToscaNodeType.BLOCK_STORAGE.getDisplayName(), - ToscaRelationshipType.NATIVE_ATTACHES_TO.getDisplayName())) { - Map<String, RequirementDefinition> volumeRequirementsMap = new HashMap<>(); - volumeRequirementsMap.put(entry.getKey(), entry.getValue()); - volumeRequirementsList.add(volumeRequirementsMap); - } - - } - } - return volumeRequirementsList; - } - - private boolean isVolumeRequirement(RequirementDefinition req, String capability, String node, - String relationship) { - return req.getCapability().equals(capability) && req.getRelationship().equals(relationship) - && req.getNode().equals(node); - } - - private String getVolumeIdProperty(HeatOrchestrationTemplate heatOrchestrationTemplate, - String resourceId) { - - String novaResourceId; - String volumeId = null; - for (Resource resource : heatOrchestrationTemplate.getResources().values()) { - if (resource.getType() - .equals(HeatResourcesTypes.CINDER_VOLUME_ATTACHMENT_RESOURCE_TYPE.getHeatResource())) { - Optional<String> optNovaResourceId = - getToscaPropertyValueSource(HeatConstants.INSTANCE_UUID_PROPERTY_NAME, resource, - "get_resource"); - if (optNovaResourceId.isPresent()) { - novaResourceId = optNovaResourceId.get(); - if (novaResourceId.equals(resourceId)) { - Optional<String> optVolumeId = - getToscaPropertyValueSource(HeatConstants.VOLUME_ID_PROPERTY_NAME, resource, - "get_param"); - if (optVolumeId.isPresent()) { - volumeId = optVolumeId.get(); - } - } else { - logger.warn("property:" + HeatConstants.VOLUME_ID_PROPERTY_NAME + " of resource type:" - + resource.getType() + " should contain 'get_param' function"); - } - } - } - } - return volumeId; - } - - private String getTranslatedVolumeIdByVolumeIdProperty(String volumeId, TranslateTo translateTo) { - Optional<AttachedResourceId> volumeIdInfo = - HeatToToscaUtil.extractAttachedResourceId(translateTo, volumeId); - if (volumeIdInfo.isPresent()) { - if (volumeIdInfo.get().isGetResource()) { - return null;//(String) volumeIdInfo.get().getTranslatedId(); - } else if (volumeIdInfo.get().isGetParam()) { - List<FileData> allFilesData = translateTo.getContext().getManifest().getContent().getData(); - Optional<List<FileData>> fileDataList = HeatToToscaUtil - .buildListOfFilesToSearch(translateTo.getHeatFileName(), allFilesData, - FileData.Type.HEAT_VOL); - if (fileDataList.isPresent()) { - Optional<ResourceFileDataAndIDs> resourceFileDataAndIDs = - getFileDataContainingResource(fileDataList.get(), - (String) volumeIdInfo.get().getEntityId(), translateTo.getContext(), - FileData.Type.HEAT_VOL); - if (resourceFileDataAndIDs.isPresent()) { - return resourceFileDataAndIDs.get().getTranslatedResourceId(); - } else { - logger.warn("The attached volume based on volume_id property: " + volumeId + " in " - + translateTo.getResourceId() - + " can't be found, searching for volume resource id - " - + volumeIdInfo.get().getEntityId()); - return null; - } - } else { - return null; - } - } else { - logger.warn("property:" + volumeId + " of resource :" + volumeIdInfo.get().getEntityId() - + " should contain 'get_param' or 'get_resource' function"); - return null; - } - } else { - logger.warn("property:" + volumeId + " of resource :" + translateTo.getResource().toString() - + " is not exist"); - return null; - } - } - - private Optional<String> getToscaPropertyValueSource(String propertyName, Resource resource, - String key) { - Object propertyInstanceUuIdValue; - propertyInstanceUuIdValue = resource.getProperties().get(propertyName); - if (propertyInstanceUuIdValue instanceof Map) { - return Optional.ofNullable((String) ((Map) propertyInstanceUuIdValue).get(key)); - } else { - logger.warn("property:" + propertyName + " of resource type:" + resource.getType() - + " should have a value in key value format"); - - } - return Optional.empty(); - - } - - private Map<String, Map<String, List<String>>> - manageSubstitutionNodeTypeCapabilitiesAndRequirements( - NodeType substitutionNodeType, ServiceTemplate substitutionServiceTemplate, - TranslateTo translateTo) { - - Map<String, NodeTemplate> nodeTemplates = - substitutionServiceTemplate.getTopology_template().getNode_templates(); - String templateName; - NodeTemplate template; - String type; - Map<String, Map<String, List<String>>> substitutionMapping = new HashMap<>(); - if (nodeTemplates == null) { - return substitutionMapping; - } - - Map<String, List<String>> capabilitySubstitutionMapping = new HashMap<>(); - Map<String, List<String>> requirementSubstitutionMapping = new HashMap<>(); - substitutionMapping.put("capability", capabilitySubstitutionMapping); - substitutionMapping.put("requirement", requirementSubstitutionMapping); - List<Map<String, RequirementDefinition>> nodeTypeRequirementsDefinition; - Map<String, RequirementAssignment> nodeTemplateRequirementsAssignment; - List<Map<String, RequirementDefinition>> exposedRequirementsDefinition; - Map<String, Map<String, RequirementAssignment>> fullFilledRequirementsDefinition = - new HashMap<>(); - Map<String, CapabilityDefinition> nodeTypeCapabilitiesDefinition = new HashMap<>(); - Map<String, CapabilityDefinition> exposedCapabilitiesDefinition; - - for (Map.Entry<String, NodeTemplate> entry : nodeTemplates.entrySet()) { - templateName = entry.getKey(); - template = entry.getValue(); - type = template.getType(); - - // get requirements - nodeTypeRequirementsDefinition = - getNodeTypeRequirements(type, templateName, substitutionServiceTemplate, - requirementSubstitutionMapping, translateTo.getContext()); - nodeTemplateRequirementsAssignment = getNodeTemplateRequirements(template); - fullFilledRequirementsDefinition.put(templateName, nodeTemplateRequirementsAssignment); - //set substitution node type requirements - exposedRequirementsDefinition = calculateExposedRequirements(nodeTypeRequirementsDefinition, - nodeTemplateRequirementsAssignment); - addSubstitutionNodeTypeRequirements(substitutionNodeType, exposedRequirementsDefinition, - templateName); - - //get capabilities - getNodeTypeCapabilities(nodeTypeCapabilitiesDefinition, capabilitySubstitutionMapping, type, - templateName, substitutionServiceTemplate, translateTo.getContext()); - - } - - exposedCapabilitiesDefinition = calculateExposedCapabilities(nodeTypeCapabilitiesDefinition, - fullFilledRequirementsDefinition); - addSubstitutionNodeTypeCapabilities(substitutionNodeType, exposedCapabilitiesDefinition); - return substitutionMapping; - } - - private Map<String, CapabilityDefinition> calculateExposedCapabilities( - Map<String, CapabilityDefinition> nodeTypeCapabilitiesDefinition, - Map<String, Map<String, RequirementAssignment>> fullFilledRequirementsDefinitionMap) { - - String capabilityKey; - String capability; - String node; - CapabilityDefinition capabilityDefinition; - CapabilityDefinition clonedCapabilityDefinition; - for (Map.Entry<String, Map<String, RequirementAssignment>> entry - : fullFilledRequirementsDefinitionMap.entrySet()) { - for (Map.Entry<String, RequirementAssignment> fullFilledEntry : entry.getValue().entrySet()) { - - capability = fullFilledEntry.getValue().getCapability(); - fullFilledEntry.getValue().getOccurrences(); - node = fullFilledEntry.getValue().getNode(); - capabilityKey = capability + "_" + node; - capabilityDefinition = nodeTypeCapabilitiesDefinition.get(capabilityKey); - if (capabilityDefinition != null) { - clonedCapabilityDefinition = capabilityDefinition.clone(); - nodeTypeCapabilitiesDefinition.put(capabilityKey, capabilityDefinition.clone()); - if (evaluateCapabilityFullFilament(clonedCapabilityDefinition)) { - nodeTypeCapabilitiesDefinition.remove(capabilityKey); - } else { - nodeTypeCapabilitiesDefinition.put(capabilityKey, clonedCapabilityDefinition); - } - } - } - } - - Map<String, CapabilityDefinition> exposedCapabilitiesDefinition = new HashMap<>(); - for (Map.Entry<String, CapabilityDefinition> entry : nodeTypeCapabilitiesDefinition - .entrySet()) { - exposedCapabilitiesDefinition.put(entry.getKey(), entry.getValue()); - } - return exposedCapabilitiesDefinition; - } - - private boolean evaluateCapabilityFullFilament(CapabilityDefinition capabilityDefinition) { - Object[] occurrences = capabilityDefinition.getOccurrences(); - if (occurrences == null) { - capabilityDefinition.setOccurrences(new Object[]{"0", ToscaConstants.UNBOUNDED}); - return false; - } - if (occurrences[1].equals(ToscaConstants.UNBOUNDED)) { - return false; - } - - if (occurrences[1].equals(1)) { - return true; - } - occurrences[1] = (Integer) occurrences[1] - 1; - return false; - } - - private boolean evaluateRequirementFullFilament(RequirementDefinition requirementDefinition) { - Object[] occurrences = requirementDefinition.getOccurrences(); - if (occurrences == null) { - requirementDefinition.setOccurrences(new Object[]{"0", ToscaConstants.UNBOUNDED}); - return false; - } - if (occurrences[1].equals(ToscaConstants.UNBOUNDED)) { - return false; - } - - if (occurrences[1].equals(1)) { - return true; - } - occurrences[1] = (Integer) occurrences[1] - 1; - return false; - } - - private void getNodeTypeCapabilities( - Map<String, CapabilityDefinition> nodeTypeCapabilitiesDefinition, - Map<String, List<String>> capabilitySubstitutionMapping, String type, String templateName, - ServiceTemplate serviceTemplate, TranslationContext context) { - NodeType nodeType = getNodeTypeWithFlatHierarchy(type, serviceTemplate, context); - String capabilityKey; - List<String> capabilityMapping; - if (nodeType.getCapabilities() != null) { - for (Map.Entry<String, CapabilityDefinition> capabilityNodeEntry : nodeType.getCapabilities() - .entrySet()) { - capabilityKey = capabilityNodeEntry.getKey() + "_" + templateName; - nodeTypeCapabilitiesDefinition.put(capabilityKey, capabilityNodeEntry.getValue().clone()); - capabilityMapping = new ArrayList<>(); - capabilityMapping.add(templateName); - capabilityMapping.add(capabilityNodeEntry.getKey()); - capabilitySubstitutionMapping.put(capabilityKey, capabilityMapping); - } - } - - String derivedFrom = nodeType.getDerived_from(); - if (derivedFrom != null) { - getNodeTypeCapabilities(nodeTypeCapabilitiesDefinition, capabilitySubstitutionMapping, - derivedFrom, templateName, serviceTemplate, context); - } - } - - private List<Map<String, RequirementDefinition>> calculateExposedRequirements( - List<Map<String, RequirementDefinition>> nodeTypeRequirementsDefinitionList, - Map<String, RequirementAssignment> nodeTemplateRequirementsAssignment) { - if (nodeTypeRequirementsDefinitionList == null) { - return null; - } - for (Map.Entry<String, RequirementAssignment> entry : nodeTemplateRequirementsAssignment - .entrySet()) { - if (entry.getValue().getNode() != null) { - RequirementDefinition requirementDefinition = - getRequirementDefinition(nodeTypeRequirementsDefinitionList, entry.getKey()); - RequirementDefinition cloneRequirementDefinition; - if (requirementDefinition != null) { - cloneRequirementDefinition = requirementDefinition.clone(); - if (!evaluateRequirementFullFilament(cloneRequirementDefinition)) { - this.mergeEntryInList(entry.getKey(), cloneRequirementDefinition, - nodeTypeRequirementsDefinitionList); - } else { - removeRequirementsDefinition(nodeTypeRequirementsDefinitionList, entry.getKey()); - } - } - } else { - for (Map<String, RequirementDefinition> nodeTypeRequirementsMap - : nodeTypeRequirementsDefinitionList) { - Object max = nodeTypeRequirementsMap.get(entry.getKey()).getOccurrences() != null - && nodeTypeRequirementsMap.get(entry.getKey()).getOccurrences().length > 0 - ? nodeTypeRequirementsMap.get(entry.getKey()).getOccurrences()[1] : 1; - Object min = nodeTypeRequirementsMap.get(entry.getKey()).getOccurrences() != null - && nodeTypeRequirementsMap.get(entry.getKey()).getOccurrences().length > 0 - ? nodeTypeRequirementsMap.get(entry.getKey()).getOccurrences()[0] : 1; - nodeTypeRequirementsMap.get(entry.getKey()).setOccurrences(new Object[]{min, max}); - } - } - } - return nodeTypeRequirementsDefinitionList; - } - - private void removeRequirementsDefinition( - List<Map<String, RequirementDefinition>> nodeTypeRequirementsDefinitionList, - String requirementKey) { - for (Map<String, RequirementDefinition> reqMap : nodeTypeRequirementsDefinitionList) { - reqMap.remove(requirementKey); - } - } - - private RequirementDefinition getRequirementDefinition( - List<Map<String, RequirementDefinition>> nodeTypeRequirementsDefinitionList, - String requirementKey) { - for (Map<String, RequirementDefinition> requirementMap : nodeTypeRequirementsDefinitionList) { - if (requirementMap.containsKey(requirementKey)) { - return requirementMap.get(requirementKey); - } - } - return null; - } - - private Map<String, RequirementAssignment> getNodeTemplateRequirements(NodeTemplate template) { - List<Map<String, RequirementAssignment>> templateRequirements = template.getRequirements(); - - Map<String, RequirementAssignment> nodeTemplateRequirementsDefinition = new HashMap<>(); - if (CollectionUtils.isEmpty(templateRequirements)) { - return nodeTemplateRequirementsDefinition; - } - for (Map<String, RequirementAssignment> requirementAssignmentMap : templateRequirements) { - for (Map.Entry<String, RequirementAssignment> requirementEntry : requirementAssignmentMap - .entrySet()) { - nodeTemplateRequirementsDefinition - .put(requirementEntry.getKey(), requirementEntry.getValue()); - } - } - return nodeTemplateRequirementsDefinition; - } - - private List<Map<String, RequirementDefinition>> getNodeTypeRequirements(String type, - String templateName, - ServiceTemplate serviceTemplate, - Map<String, List<String>> requirementSubstitutionMapping, - TranslationContext context) { - List<Map<String, RequirementDefinition>> requirementList = null; - NodeType nodeType = getNodeTypeWithFlatHierarchy(type, serviceTemplate, context); - String derivedFrom = nodeType.getDerived_from(); - List<String> requirementMapping; - if (derivedFrom != null) { - requirementList = getNodeTypeRequirements(derivedFrom, templateName, serviceTemplate, - requirementSubstitutionMapping, context); - } - if (requirementList == null) { - requirementList = new ArrayList<>(); - } - - if (nodeType.getRequirements() != null) { - for (Map<String, RequirementDefinition> requirementMap : nodeType.getRequirements()) { - for (Map.Entry<String, RequirementDefinition> requirementNodeEntry : requirementMap - .entrySet()) { - if (requirementNodeEntry.getValue().getOccurrences() == null) { - requirementNodeEntry.getValue().setOccurrences(new Object[]{1, 1}); - } - Map<String, RequirementDefinition> requirementDef = new HashMap<>(); - requirementDef.put(requirementNodeEntry.getKey(), requirementNodeEntry.getValue()); - addRequirementToList(requirementList, requirementDef); - requirementMapping = new ArrayList<>(); - requirementMapping.add(templateName); - requirementMapping.add(requirementNodeEntry.getKey()); - requirementSubstitutionMapping - .put(requirementNodeEntry.getKey() + "_" + templateName, requirementMapping); - if (requirementNodeEntry.getValue().getNode() == null) { - requirementNodeEntry.getValue().setOccurrences(new Object[]{1, 1}); - } - } - } - } - - return requirementList; - } - - private void addRequirementToList(List<Map<String, RequirementDefinition>> requirementList, - Map<String, RequirementDefinition> requirementDef) { - for (Map.Entry<String, RequirementDefinition> entry : requirementDef.entrySet()) { - this.mergeEntryInList(entry.getKey(), entry.getValue(), requirementList); - } - } - - private void addSubstitutionNodeTypeCapabilities(NodeType substitutionNodeType, - Map<String, CapabilityDefinition> capabilities) { - if (capabilities == null || capabilities.entrySet().size() == 0) { - return; - } - - if (MapUtils.isEmpty(substitutionNodeType.getCapabilities())) { - substitutionNodeType.setCapabilities(new HashMap<>()); - } - if (capabilities.size() > 0) { - substitutionNodeType.setCapabilities(new HashMap<>()); - } - for (Map.Entry<String, CapabilityDefinition> entry : capabilities.entrySet()) { - substitutionNodeType.getCapabilities().put(entry.getKey(), entry.getValue()); - } - } - - private void addSubstitutionNodeTypeRequirements(NodeType substitutionNodeType, - List<Map<String, RequirementDefinition>> requirementsList, - String templateName) { - if (requirementsList == null || requirementsList.size() == 0) { - return; - } - - if (substitutionNodeType.getRequirements() == null) { - substitutionNodeType.setRequirements(new ArrayList<>()); - } - - for (Map<String, RequirementDefinition> requirementDef : requirementsList) { - for (Map.Entry<String, RequirementDefinition> entry : requirementDef.entrySet()) { - Map<String, RequirementDefinition> requirementMap = new HashMap<>(); - requirementMap.put(entry.getKey() + "_" + templateName, entry.getValue().clone()); - substitutionNodeType.getRequirements().add(requirementMap); - } - } - } - - - private SubstitutionMapping manageSubstitutionTemplateSubstitutionMapping(String nodeTypeKey, - NodeType substitutionNodeType, - Map<String, Map<String, List<String>>> mapping) { - SubstitutionMapping substitutionMapping = new SubstitutionMapping(); - substitutionMapping.setNode_type(nodeTypeKey); - substitutionMapping.setCapabilities( - manageCapabilityMapping(substitutionNodeType.getCapabilities(), mapping.get("capability"))); - substitutionMapping.setRequirements( - manageRequirementMapping(substitutionNodeType.getRequirements(), - mapping.get("requirement"))); - return substitutionMapping; - } - - private Map<String, List<String>> manageCapabilityMapping( - Map<String, CapabilityDefinition> capabilities, - Map<String, List<String>> capabilitySubstitutionMapping) { - if (capabilities == null) { - return null; - } - - Map<String, List<String>> capabilityMapping = new HashMap<>(); - String capabilityKey; - List<String> capabilityMap; - for (Map.Entry<String, CapabilityDefinition> entry : capabilities.entrySet()) { - capabilityKey = entry.getKey(); - capabilityMap = capabilitySubstitutionMapping.get(capabilityKey); - capabilityMapping.put(capabilityKey, capabilityMap); - } - return capabilityMapping; - } - - private Map<String, List<String>> manageRequirementMapping( - List<Map<String, RequirementDefinition>> requirementList, - Map<String, List<String>> requirementSubstitutionMapping) { - if (requirementList == null) { - return null; - } - Map<String, List<String>> requirementMapping = new HashMap<>(); - String requirementKey; - List<String> requirementMap; - for (Map<String, RequirementDefinition> requirementDefMap : requirementList) { - for (Map.Entry<String, RequirementDefinition> entry : requirementDefMap.entrySet()) { - requirementKey = entry.getKey(); - requirementMap = requirementSubstitutionMapping.get(requirementKey); - requirementMapping.put(requirementKey, requirementMap); - } - } - return requirementMapping; - } - - - private Map<String, AttributeDefinition> manageSubstitutionNodeTypeAttributes( - ServiceTemplate substitutionServiceTemplate) { - - Map<String, AttributeDefinition> substitutionNodeTypeAttributes = new HashMap<>(); - Map<String, ParameterDefinition> attributes = - substitutionServiceTemplate.getTopology_template().getOutputs(); - if (attributes == null) { - return null; - } - AttributeDefinition attributeDefinition; - String toscaAttributeName; - - for (Map.Entry<String, ParameterDefinition> entry : attributes.entrySet()) { - attributeDefinition = new AttributeDefinition(); - toscaAttributeName = entry.getKey(); - ParameterDefinition parameterDefinition = - substitutionServiceTemplate.getTopology_template().getOutputs().get(toscaAttributeName); - if (parameterDefinition.getType() != null && !parameterDefinition.getType().isEmpty()) { - attributeDefinition.setType(parameterDefinition.getType()); - } else { - attributeDefinition.setType(PropertyType.STRING.getDisplayName()); - } - attributeDefinition.setDescription(parameterDefinition.getDescription()); - attributeDefinition.set_default(parameterDefinition.get_default()); - attributeDefinition.setEntry_schema(parameterDefinition.getEntry_schema()); - attributeDefinition.setStatus(parameterDefinition.getStatus()); - substitutionNodeTypeAttributes.put(toscaAttributeName, attributeDefinition); - } - return substitutionNodeTypeAttributes; - } - - private Map<String, PropertyDefinition> manageSubstitutionNodeTypeProperties( - ServiceTemplate substitutionServiceTemplate) { - Map<String, PropertyDefinition> substitutionNodeTypeProperties = new HashMap<>(); - Map<String, ParameterDefinition> properties = - substitutionServiceTemplate.getTopology_template().getInputs(); - if (properties == null) { - return null; - } - - PropertyDefinition propertyDefinition; - String toscaPropertyName; - for (Map.Entry<String, ParameterDefinition> entry : properties.entrySet()) { - toscaPropertyName = entry.getKey(); - propertyDefinition = new PropertyDefinition(); - ParameterDefinition parameterDefinition = - substitutionServiceTemplate.getTopology_template().getInputs().get(toscaPropertyName); - propertyDefinition.setType(parameterDefinition.getType()); - propertyDefinition.setDescription(parameterDefinition.getDescription()); - propertyDefinition.setRequired(parameterDefinition.getRequired()); - propertyDefinition.set_default(parameterDefinition.get_default()); - propertyDefinition.setConstraints(parameterDefinition.getConstraints()); - propertyDefinition.setEntry_schema(parameterDefinition.getEntry_schema()); - propertyDefinition.setStatus(parameterDefinition.getStatus()); - substitutionNodeTypeProperties.put(toscaPropertyName, propertyDefinition); - } - return substitutionNodeTypeProperties; - } - - private Map<String, Object> managerSubstitutionNodeTemplateProperties(TranslateTo translateTo, - Template template, - String templateName) { - Map<String, Object> substitutionProperties = new HashMap<>(); - Map<String, Object> heatProperties = translateTo.getResource().getProperties(); - if (Objects.nonNull(heatProperties)) { - for (Map.Entry<String, Object> entry : heatProperties.entrySet()) { - - Object property = TranslatorHeatToToscaPropertyConverter - .getToscaPropertyValue(entry.getKey(), entry.getValue(), null, - translateTo.getHeatFileName(), translateTo.getHeatOrchestrationTemplate(), template, - translateTo.getContext()); - substitutionProperties.put(entry.getKey(), property); - } - } - - return addAbstractSubstitutionProperty(templateName, substitutionProperties); - } - - private Map<String, Object> addAbstractSubstitutionProperty(String templateName, - Map<String, Object> substitutionProperties) { - Map<String, Object> innerProps = new HashMap<>(); - innerProps.put(ToscaConstants.SUBSTITUTE_SERVICE_TEMPLATE_PROPERTY_NAME, - ToscaUtil.getServiceTemplateFileName(templateName)); - substitutionProperties.put(ToscaConstants.SERVICE_TEMPLATE_FILTER_PROPERTY_NAME, innerProps); - return substitutionProperties; - } - - -} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/ResourceTranslationNovaServerGroupsImpl.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/ResourceTranslationNovaServerGroupsImpl.java deleted file mode 100644 index 7bc0a10957..0000000000 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/ResourceTranslationNovaServerGroupsImpl.java +++ /dev/null @@ -1,119 +0,0 @@ -/*- - * ============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.services.heattotosca.impl; - -import org.apache.commons.collections4.CollectionUtils; -import org.openecomp.sdc.heat.datatypes.model.Resource; -import org.openecomp.sdc.tosca.datatypes.ToscaGroupType; -import org.openecomp.sdc.tosca.datatypes.ToscaPolicyType; -import org.openecomp.sdc.tosca.datatypes.model.GroupDefinition; -import org.openecomp.sdc.tosca.datatypes.model.PolicyDefinition; -import org.openecomp.sdc.tosca.services.DataModelUtil; -import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo; -import org.openecomp.sdc.translator.services.heattotosca.mapping.TranslatorHeatToToscaPropertyConverter; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.Objects; - -public class ResourceTranslationNovaServerGroupsImpl extends ResourceTranslationBase { - private static final String AFFINITY = "affinity"; - private static final String ANTI_AFFINITY = "anti-affinity"; - private static List<String> supportedPolicies = Arrays.asList(AFFINITY, ANTI_AFFINITY); - - @Override - protected void translate(TranslateTo translateTo) { - String resourceId = translateTo.getResourceId(); - List<String> toscaPolicyTypes = getToscaPolicies(translateTo.getResource(), resourceId); - if (!CollectionUtils.isEmpty(toscaPolicyTypes)) { - addGroupToTopology(translateTo, resourceId); - addPoliciesToTopology(translateTo, resourceId, toscaPolicyTypes); - } - } - - private void addPoliciesToTopology(TranslateTo translateTo, String resourceId, - List<String> toscaPolicyTypes) { - logger.info("******** Start creating policies for resource '%s' ********", resourceId); - for (int i = 0; i < toscaPolicyTypes.size(); i++) { - String policy = toscaPolicyTypes.get(i); - logger.info("******** Creating policy '%s' ********", policy); - PolicyDefinition policyDefinition = new PolicyDefinition(); - policyDefinition.setType(policy); - policyDefinition.setTargets(Arrays.asList(resourceId)); - policyDefinition.setProperties(TranslatorHeatToToscaPropertyConverter - .getToscaPropertiesSimpleConversion(translateTo.getResource().getProperties(), - policyDefinition.getProperties(), translateTo.getHeatFileName(), - translateTo.getHeatOrchestrationTemplate(), translateTo.getResource().getType(), - policyDefinition, translateTo.getContext())); - policyDefinition.getProperties().put( - policy.equals(ToscaPolicyType.PLACEMENT_ANTILOCATE.getDisplayName()) ? "container_type" - : AFFINITY, "host"); - String policyId = resourceId + (toscaPolicyTypes.size() > 1 ? i : ""); - DataModelUtil - .addPolicyDefinition(translateTo.getServiceTemplate(), policyId, policyDefinition); - logger.info("******** Policy '%s' created ********", policy); - } - - logger - .info("******** All policies for resource '%s' created successfully ********", resourceId); - } - - private void addGroupToTopology(TranslateTo translateTo, String resourceId) { - logger.info("******** Start creating group for resource '%s' ********", resourceId); - GroupDefinition group = new GroupDefinition(); - group.setMembers(new ArrayList<>()); - group.setType(ToscaGroupType.ROOT.getDisplayName()); - DataModelUtil - .addGroupDefinitionToTopologyTemplate(translateTo.getServiceTemplate(), resourceId, group); - logger.info("******** Creating group '%s' for resource '%s' ********", resourceId, resourceId); - } - - private List<String> getToscaPolicies(Resource resource, String resourceId) { - - Map<String, Object> properties = resource.getProperties(); - if (Objects.isNull(properties) || Objects.isNull(properties.get("policies"))) { - return Arrays.asList(ToscaPolicyType.PLACEMENT_ANTILOCATE.getDisplayName()); - } - - List policies = (List) properties.get("policies"); - List<String> retList = new ArrayList<>(); - policies.forEach(policy -> { - if (!supportedPolicies.contains(policy)) { - logger.warn("Resource '" + resourceId + "'(" + resource.getType() - + ") contains unsupported policy '" + policy.toString() - + "'. This resource is been ignored during the translation"); - } else { - retList.add(getToscaPolicyByHotPolicy((String) policy)); - } - }); - return retList; - } - - private String getToscaPolicyByHotPolicy(String name) { - if (Objects.equals(name, AFFINITY)) { - return ToscaPolicyType.PLACEMENT_COLOCATE.getDisplayName(); - } else { - return ToscaPolicyType.PLACEMENT_ANTILOCATE.getDisplayName(); - } - } -} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/SecurityRulesToPortResourceConnection.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/SecurityRulesToPortResourceConnection.java deleted file mode 100644 index 3c6fef7ffb..0000000000 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/SecurityRulesToPortResourceConnection.java +++ /dev/null @@ -1,203 +0,0 @@ -/*- - * ============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.services.heattotosca.impl; - - -import org.openecomp.sdc.heat.datatypes.manifest.FileData; -import org.openecomp.sdc.heat.datatypes.model.HeatOrchestrationTemplate; -import org.openecomp.sdc.heat.datatypes.model.HeatResourcesTypes; -import org.openecomp.sdc.heat.datatypes.model.Resource; -import org.openecomp.sdc.tosca.datatypes.ToscaCapabilityType; -import org.openecomp.sdc.tosca.datatypes.ToscaNodeType; -import org.openecomp.sdc.tosca.datatypes.ToscaRelationshipType; -import org.openecomp.sdc.tosca.datatypes.model.CapabilityDefinition; -import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate; -import org.openecomp.sdc.tosca.datatypes.model.NodeType; -import org.openecomp.sdc.tosca.datatypes.model.RequirementDefinition; -import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; -import org.openecomp.sdc.tosca.services.DataModelUtil; -import org.openecomp.sdc.tosca.services.ToscaConstants; -import org.openecomp.sdc.translator.datatypes.heattotosca.AttachedResourceId; -import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo; -import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslatedHeatResource; -import org.openecomp.sdc.translator.services.heattotosca.Constants; -import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil; -import org.openecomp.sdc.translator.services.heattotosca.ResourceTranslationFactory; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.function.Predicate; - - -class SecurityRulesToPortResourceConnection extends BaseResourceConnection<CapabilityDefinition> { - SecurityRulesToPortResourceConnection(ResourceTranslationNestedImpl resourceTranslationNested, - TranslateTo translateTo, FileData nestedFileData, - NodeTemplate substitutionNodeTemplate, NodeType nodeType) { - super(resourceTranslationNested, translateTo, nestedFileData, substitutionNodeTemplate, - nodeType); - } - - @Override - protected boolean isDesiredNodeTemplateType(NodeTemplate nodeTemplate) { - return nodeTemplate.getType().equals(ToscaNodeType.NEUTRON_PORT.getDisplayName()); - } - - @Override - protected List<Predicate<CapabilityDefinition>> getPredicatesListForConnectionPoints() { - ArrayList<Predicate<CapabilityDefinition>> predicates = new ArrayList<>(); - predicates.add(cap -> cap.getType().equals(ToscaCapabilityType.ATTACHMENT.getDisplayName())); - return predicates; - } - - @Override - protected Optional<List<String>> getConnectorParamName( - String heatResourceId,Resource heatResource, - HeatOrchestrationTemplate nestedHeatOrchestrationTemplate) { - Object securityGroups = - heatResource.getProperties().get(Constants.SECURITY_GROUPS_PROPERTY_NAME); - List<String> paramsList = new ArrayList<>(); - if (securityGroups instanceof List) { - ((List) securityGroups).forEach(group -> { - Optional<AttachedResourceId> attachedResourceId = HeatToToscaUtil - .extractAttachedResourceId(nestedFileData.getFile(), nestedHeatOrchestrationTemplate, - translateTo.getContext(), group); - if (attachedResourceId.isPresent()) { - paramsList.add((String) attachedResourceId.get().getEntityId()); - } - }); - return Optional.of(paramsList); - } - return Optional.empty(); - } - - @Override - protected String getDesiredResourceType() { - return HeatResourcesTypes.NEUTRON_PORT_RESOURCE_TYPE.getHeatResource(); - } - - @Override - protected List<Map<String, CapabilityDefinition>> getAllConnectionPoints() { - List<Map<String, CapabilityDefinition>> exposedRequirementsList = new ArrayList<>(); - List<Predicate<CapabilityDefinition>> predicates = getPredicatesListForConnectionPoints(); - Map<String, CapabilityDefinition> capabilities = this.nodeType.getCapabilities(); - if (capabilities == null) { - return exposedRequirementsList; - } - capabilities.entrySet() - .stream() - .filter(entry -> predicates - .stream() - .anyMatch(p -> p.test(entry.getValue()))) - .forEach(entry -> { - Map<String, CapabilityDefinition> exposedRequirementsMap = new HashMap<>(); - exposedRequirementsMap.put(entry.getKey(), entry.getValue()); - exposedRequirementsList.add(exposedRequirementsMap); - }); - - return exposedRequirementsList; - } - - @Override - void addRequirementToConnectResources(Map.Entry<String, CapabilityDefinition> entry, - List<String> paramNames) { - paramNames.forEach(p -> { - Optional<AttachedResourceId> attachedResourceId = - HeatToToscaUtil.extractAttachedResourceId(translateTo, p); - String securityRulesNodeId; - if (!attachedResourceId.isPresent()) { - return; - } - Map.Entry<String, RequirementDefinition> requirementDefinition = - createRequirementDefinition(entry.getKey()); - AttachedResourceId securityGroupAttachedId = attachedResourceId.get(); - if (securityGroupAttachedId.isGetResource()) { - String securityGroupResourceId = (String) attachedResourceId.get().getEntityId(); - Resource securityGroupResource = HeatToToscaUtil - .getResource(translateTo.getHeatOrchestrationTemplate(), securityGroupResourceId, - translateTo.getHeatFileName()); - Optional<String> translatedSecurityRuleId = - ResourceTranslationFactory.getInstance(securityGroupResource) - .translateResource(translateTo.getHeatFileName(), translateTo.getServiceTemplate(), - translateTo.getHeatOrchestrationTemplate(), securityGroupResource, - securityGroupResourceId, translateTo.getContext()); - if (translatedSecurityRuleId.isPresent()) { - NodeTemplate securityRuleNodeTemplate = DataModelUtil - .getNodeTemplate(translateTo.getServiceTemplate(), translatedSecurityRuleId.get()); - createRequirementAssignment(requirementDefinition, translateTo.getTranslatedId(), - securityRuleNodeTemplate); - } else { - logger.warn( - securityGroupResource.getType() + "connection to " + securityGroupResource.getType() - + " is not supported/invalid, therefore this connection " - + "will be ignored in the TOSCA translation"); - } - } else if (securityGroupAttachedId.isGetParam()) { - TranslatedHeatResource shareResource = - translateTo.getContext().getHeatSharedResourcesByParam() - .get(securityGroupAttachedId.getEntityId()); - if (Objects.nonNull(shareResource) - && !HeatToToscaUtil.isHeatFileNested(translateTo, translateTo.getHeatFileName())) { - NodeTemplate sharedNodeTemplate = DataModelUtil - .getNodeTemplate(translateTo.getServiceTemplate(), shareResource.getTranslatedId()); - createRequirementAssignment(requirementDefinition, translateTo.getTranslatedId(), - sharedNodeTemplate); - } - } - }); - } - - @Override - protected String getTranslatedResourceIdFromSubstitutionMapping( - ServiceTemplate nestedServiceTemplate, Map.Entry<String, CapabilityDefinition> entry) { - List<String> substitutionMapping = - nestedServiceTemplate.getTopology_template().getSubstitution_mappings().getCapabilities() - .get(entry.getKey()); - return substitutionMapping.get(0); - } - - private Map.Entry<String, RequirementDefinition> createRequirementDefinition(String key) { - RequirementDefinition definition = new RequirementDefinition(); - definition.setCapability(key); - definition.setRelationship(ToscaRelationshipType.ATTACHES_TO.getDisplayName()); - return new Map.Entry<String, RequirementDefinition>() { - @Override - public String getKey() { - return ToscaConstants.PORT_REQUIREMENT_ID; - } - - @Override - public RequirementDefinition getValue() { - return definition; - } - - @Override - public RequirementDefinition setValue(RequirementDefinition value) { - return null; - } - }; - } - - -} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/functiontranslation/FunctionTranslationGetAttrImpl.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/functiontranslation/FunctionTranslationGetAttrImpl.java new file mode 100644 index 0000000000..cc188d71a6 --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/functiontranslation/FunctionTranslationGetAttrImpl.java @@ -0,0 +1,491 @@ +/*- + * ============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.services.heattotosca.impl.functiontranslation; + +import org.openecomp.core.utilities.yaml.YamlUtil; +import org.openecomp.sdc.heat.datatypes.model.HeatOrchestrationTemplate; +import org.openecomp.sdc.heat.datatypes.model.Resource; +import org.openecomp.sdc.heat.services.HeatConstants; +import org.openecomp.sdc.tosca.datatypes.ToscaFunctions; +import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate; +import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; +import org.openecomp.sdc.tosca.datatypes.model.Template; +import org.openecomp.sdc.translator.datatypes.heattotosca.TranslationContext; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.EntityConsolidationData; +import org.openecomp.sdc.translator.services.heattotosca.ConfigConstants; +import org.openecomp.sdc.translator.services.heattotosca.ConsolidationDataUtil; +import org.openecomp.sdc.translator.services.heattotosca.Constants; +import org.openecomp.sdc.translator.services.heattotosca.FunctionTranslation; +import org.openecomp.sdc.translator.services.heattotosca.FunctionTranslationFactory; +import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil; +import org.openecomp.sdc.translator.services.heattotosca.NameExtractor; +import org.openecomp.sdc.translator.services.heattotosca.helper.FunctionTranslationHelper; +import org.openecomp.sdc.translator.services.heattotosca.impl.resourcetranslation.ResourceTranslationBase; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; + +public class FunctionTranslationGetAttrImpl implements FunctionTranslation { + + + @Override + public Object translateFunction(ServiceTemplate serviceTemplate, + String resourceId, String propertyName, String functionKey, + Object functionValue, String heatFileName, + HeatOrchestrationTemplate heatOrchestrationTemplate, + Template toscaTemplate, TranslationContext context) { + Object returnValue = new HashMap<>(); + List<Object> attributeFunctionExpression = + translateGetAttributeFunctionExpression(serviceTemplate, resourceId, functionValue, + propertyName, heatFileName, heatOrchestrationTemplate, (NodeTemplate) toscaTemplate, + context); + if (FunctionTranslationHelper.isResourceSupported(attributeFunctionExpression.get(0).toString()) + && FunctionTranslationHelper.isAttributeSupported(attributeFunctionExpression.get(0) + .toString())) { + ((Map) returnValue) + .put(ToscaFunctions.GET_ATTRIBUTE.getDisplayName(), attributeFunctionExpression); + } else { + returnValue = attributeFunctionExpression; + } + + return returnValue; + } + + private static List<Object> translateGetAttributeFunctionExpression( + ServiceTemplate serviceTemplate, + String resourceId, + Object functionValue, + String propertyName, + String heatFileName, + HeatOrchestrationTemplate heatOrchestrationTemplate, + NodeTemplate nodeTemplate, + TranslationContext context) { + + List<Object> attributeParamList = (List) functionValue; + List<Object> toscaAttributeParamList = new ArrayList<>(); + + Optional<String> targetResourceTranslatedId = Optional.empty(); + String targetResourceId = null; + if( attributeParamList.get(0) instanceof String) { + targetResourceId = (String) attributeParamList.get(0); + targetResourceTranslatedId = + handleResourceName(targetResourceId, heatFileName, heatOrchestrationTemplate, + context); + } + if (!targetResourceTranslatedId.isPresent()) { + //unsupported resource + toscaAttributeParamList + .add( + FunctionTranslationHelper.getUnsupportedResourcePrefix() + attributeParamList.get(0)); + return toscaAttributeParamList; + } else { + toscaAttributeParamList.add(targetResourceTranslatedId.get()); + } + + Optional<List<Object>> toscaAttList = + handleAttributeName(attributeParamList, heatOrchestrationTemplate, propertyName, + heatFileName, serviceTemplate, + context); + if (!toscaAttList.isPresent()) { + //Unsupported attribute + toscaAttributeParamList.clear(); + toscaAttributeParamList + .add(FunctionTranslationHelper.getUnsupportedAttributePrefix() + attributeParamList.get(0) + + "." + attributeParamList.get(1)); + return toscaAttributeParamList; + } else { + toscaAttributeParamList.addAll(toscaAttList.get()); + + handleGetAttrConsolidationData(serviceTemplate, resourceId, propertyName, heatFileName, + heatOrchestrationTemplate, context, targetResourceId, + targetResourceTranslatedId, + toscaAttList.get()); + } + + Optional<List<Object>> toscaIndexOrKey = handleAttributeIndexOrKey(serviceTemplate, + resourceId, propertyName, HeatToToscaUtil + .getResourceType((String) attributeParamList.get(0), heatOrchestrationTemplate, + heatFileName), attributeParamList, context, heatFileName, + heatOrchestrationTemplate); + toscaIndexOrKey.ifPresent(toscaAttributeParamList::addAll); + + return toscaAttributeParamList; + } + + private static void handleGetAttrConsolidationData( + ServiceTemplate serviceTemplate, + String resourceId, String propertyName, + String heatFileName, + HeatOrchestrationTemplate heatOrchestrationTemplate, + TranslationContext context, + String targetResourceId, + Optional<String> targetResourceTranslatedId, + List<Object> toscaAttList) { + + Optional<String> resourceTranslatedId = Optional.empty(); + if (resourceId != null) { + resourceTranslatedId = + handleResourceName(resourceId, heatFileName, heatOrchestrationTemplate, + context); + resourceTranslatedId + .ifPresent(resourceTranslatedIdValue -> handleGetAttrOutConsolidationData(serviceTemplate, + propertyName, + heatOrchestrationTemplate, context, resourceId, targetResourceTranslatedId.get(), + resourceTranslatedIdValue, toscaAttList, heatFileName)); + } + + if (targetResourceTranslatedId.isPresent()) { + handleGetAttrInConsolidationData(serviceTemplate, resourceId, resourceTranslatedId, + propertyName, heatOrchestrationTemplate, context, targetResourceId, + targetResourceTranslatedId.get(), toscaAttList, heatFileName); + } + } + + private static void handleGetAttrOutConsolidationData( + ServiceTemplate serviceTemplate, + String propertyName, + HeatOrchestrationTemplate heatOrchestrationTemplate, + TranslationContext context, + String resourceId, + String targetTranslatedResourceId, + String resourceTranslatedId, + List<Object> toscaAttList, + String heatFileName) { + if (serviceTemplate != null) { + Optional<EntityConsolidationData> entityConsolidationData = + getEntityConsolidationData(serviceTemplate, heatOrchestrationTemplate, context, + resourceId, resourceTranslatedId, heatFileName); + if (entityConsolidationData.isPresent()) { + String attName = (String) toscaAttList.get(0); + handleNodeGetAttrOut(targetTranslatedResourceId, propertyName, heatOrchestrationTemplate, + context, resourceId, entityConsolidationData.get(), attName); + } + } + } + + private static void handleGetAttrInConsolidationData( + ServiceTemplate serviceTemplate, + String resourceId, + Optional<String> resourceTranslatedId, + String propertyName, + HeatOrchestrationTemplate heatOrchestrationTemplate, + TranslationContext context, + String targetResourceId, + String targetResourceTranslatedId, + List<Object> toscaAttList, + String heatFileName) { + + if (serviceTemplate != null) { + Optional<EntityConsolidationData> entityConsolidationData = + getEntityConsolidationData(serviceTemplate, heatOrchestrationTemplate, context, + targetResourceId, targetResourceTranslatedId, heatFileName); + if (entityConsolidationData.isPresent()) { + String attName = (String) toscaAttList.get(0); + if (resourceTranslatedId.isPresent()) { + handleNodeGetAttrIn(resourceTranslatedId.get(), propertyName, heatOrchestrationTemplate, + context, + resourceId, entityConsolidationData.get(), attName); + } else { + ConsolidationDataUtil + .updateOutputGetAttributeInConsolidationData(entityConsolidationData.get(), + propertyName, attName); + } + } + } + } + + private static void handleNodeGetAttrOut(String nodeTemplateId, String propertyName, + HeatOrchestrationTemplate heatOrchestrationTemplate, + TranslationContext context, String resourceId, + EntityConsolidationData entityConsolidationData, + String attName) { + Resource resource = heatOrchestrationTemplate.getResources().get(resourceId); + boolean isNestedResource = HeatToToscaUtil.isNestedResource(resource); + String toscaPropertyName = propertyName; + if (!isNestedResource) { + toscaPropertyName = HeatToToscaUtil.getToscaPropertyName(context, resource + .getType(), propertyName); + } + ConsolidationDataUtil + .updateNodeGetAttributeOut(entityConsolidationData, + nodeTemplateId, toscaPropertyName, attName); + } + + private static void handleNodeGetAttrIn(String nodeTemplateId, String propertyName, + HeatOrchestrationTemplate heatOrchestrationTemplate, + TranslationContext context, String resourceId, + EntityConsolidationData entityConsolidationData, + String attName) { + Resource resource = heatOrchestrationTemplate.getResources().get(resourceId); + boolean isNestedResource = HeatToToscaUtil.isNestedResource(resource); + String toscaPropertyName = propertyName; + if (!isNestedResource) { + toscaPropertyName = HeatToToscaUtil.getToscaPropertyName(context, resource + .getType(), propertyName); + } + ConsolidationDataUtil + .updateNodeGetAttributeIn(entityConsolidationData, + nodeTemplateId, toscaPropertyName, attName); + } + + private static Optional<EntityConsolidationData> getEntityConsolidationData( + ServiceTemplate serviceTemplate, + HeatOrchestrationTemplate heatOrchestrationTemplate, + TranslationContext context, + String resourceId, + String resourceTranslatedId, + String heatFileName) { + Resource resource = heatOrchestrationTemplate.getResources().get(resourceId); + if (ConsolidationDataUtil.isComputeResource(heatOrchestrationTemplate, resourceId)) { + String resourceType = heatOrchestrationTemplate.getResources().get(resourceId).getType(); + NameExtractor nodeTypeNameExtractor = + context.getNameExtractorImpl(resourceType); + String computeType = + nodeTypeNameExtractor.extractNodeTypeName( + resource, resourceId, context.getTranslatedIds().get(heatFileName).get(resourceId)); + + return Optional.of( + ConsolidationDataUtil.getComputeTemplateConsolidationData(context, serviceTemplate, + computeType, resourceId)); + } else if (ConsolidationDataUtil.isPortResource(heatOrchestrationTemplate, resourceId)) { + return Optional.of(ConsolidationDataUtil + .getPortTemplateConsolidationData(context, serviceTemplate, resourceId)); + } else if (HeatToToscaUtil.isNestedResource(resource)) { + return Optional.of(ConsolidationDataUtil + .getNestedTemplateConsolidationData(context, serviceTemplate, resourceId)); + } + return Optional.empty(); + } + + private static Optional<List<Object>> handleAttributeIndexOrKey( + ServiceTemplate serviceTemplate, + String resourceId, String propertyName, + String resourceType, + List<Object> attributeParamList, + TranslationContext context, + String heatFileName, + HeatOrchestrationTemplate heatOrchestrationTemplate) { + + List<Object> attributeIndexOrKey = new ArrayList<>(); + if (attributeParamList.size() < 3) { + return Optional.empty(); + } + + Object attributeName = attributeParamList.get(1); + for (int i = 2; i < attributeParamList.size(); i++) { + + if (isInteger(attributeParamList.get(i))) { + attributeIndexOrKey.add(attributeParamList.get(i)); + } else if (attributeParamList.get(i) instanceof Map) { + attributeIndexOrKey.add(getToscaAttributeValue(serviceTemplate, resourceId, + propertyName, attributeParamList.get(i), resourceType, heatFileName, + heatOrchestrationTemplate, null, context)); + + } else { + Object toscaAttributeName = resourceType == null ? null : context + .getElementMapping(resourceType, Constants.ATTR, + getAttributeFullPath(attributeParamList, i)); + if (toscaAttributeName == null) { + toscaAttributeName = attributeParamList.get(i); + } + attributeIndexOrKey.add(toscaAttributeName); + } + } + + return Optional.of(attributeIndexOrKey); + } + + private static String getAttributeFullPath(List<Object> attributeParamList, int attributeIndex) { + if (attributeParamList.size() < 3) { + return null; + } + StringBuffer attributeFullPath = new StringBuffer(); + attributeFullPath.append(attributeParamList.get(1)); + for (int j = 2; j <= attributeIndex; j++) { + if (isInteger(attributeParamList.get(j))) { + continue; + } + attributeFullPath.append(ConfigConstants.TRANS_MAPPING_DELIMITER_CHAR); + attributeFullPath.append(attributeParamList.get(j)); + } + return attributeFullPath.toString(); + } + + private static boolean isInteger(Object inputNumber) { + if (inputNumber == null) { + return false; + } + + try { + Integer.parseInt(String.valueOf(inputNumber)); + return true; + } catch (NumberFormatException exception) { + return false; + } + } + + private static Optional<String> handleResourceName(String resourceId, String heatFileName, + HeatOrchestrationTemplate + heatOrchestrationTemplate, + TranslationContext context) { + return ResourceTranslationBase + .getResourceTranslatedId(heatFileName, heatOrchestrationTemplate, resourceId, context); + } + + private static Optional<List<Object>> handleAttributeName(List<Object> attributeParamList, + HeatOrchestrationTemplate + heatOrchestrationTemplate, + String propertyName, + String heatFileName, + ServiceTemplate serviceTemplate, + TranslationContext context) { + String resourceId = (String) attributeParamList.get(0); + Resource resource = + HeatToToscaUtil.getResource(heatOrchestrationTemplate, resourceId, heatFileName); + + if (attributeParamList.size() == 1) { + return getResourceTranslatedAttributesList(resource, context); + } + + if(!(attributeParamList.get(1) instanceof String)){ + //todo - once dynamic attr name will be supported the commented line will be support it in + // the first translation phase. +// Object toscaAttributeValue = getToscaAttributeValue(serviceTemplate, resourceId, propertyName, +// attributeParamList.get(1), resource +// .getType(), heatFileName, heatOrchestrationTemplate, null, context); +// List<Object> dynamicAttrValue = new ArrayList<>(); +// dynamicAttrValue.add(toscaAttributeValue); +// return Optional.of(dynamicAttrValue); + return Optional.empty(); + } + + if (HeatToToscaUtil.isNestedResource(resource)) { + return getNestedResourceTranslatedAttribute((String) attributeParamList.get(1)); + } else { + return getResourceTranslatedAttribute(resource, (String) attributeParamList.get(1), context); + } + } + + private static Optional<List<Object>> getNestedResourceTranslatedAttribute(String attributeName) { + List<Object> translatedAttributesList = new ArrayList<>(); + + if (attributeName.startsWith(HeatConstants.GET_ATTR_FROM_RESOURCE_GROUP_PREFIX)) { + String[] attributeSplit = attributeName.split("\\."); + if (attributeSplit.length == 2) { + translatedAttributesList.add(attributeSplit[1]); + } else if (attributeSplit.length == 3) { + translatedAttributesList.add(attributeSplit[2]); + translatedAttributesList.add(Integer.valueOf(attributeSplit[1])); + } else { + return Optional.empty(); + } + } else { + translatedAttributesList.add(attributeName); + } + return Optional.of(translatedAttributesList); + } + + private static Optional<List<Object>> getResourceTranslatedAttributesList(Resource resource, + TranslationContext + context) { + List<Object> translatedAttributes = new ArrayList<>(); + if (HeatToToscaUtil.isNestedResource(resource)) { + Optional<String> nestedFile = HeatToToscaUtil.getNestedFile(resource); + if (!nestedFile.isPresent()) { + return Optional.empty(); + } + HeatOrchestrationTemplate nestedHeatOrchestrationTemplate = new YamlUtil() + .yamlToObject(context.getFiles().getFileContent(nestedFile.get()), + HeatOrchestrationTemplate.class); + translatedAttributes.addAll(nestedHeatOrchestrationTemplate.getOutputs().keySet()); + return Optional.of(translatedAttributes); + + } else { + Map<String, String> resourceMappingAttributes = + context.getElementMapping(resource.getType(), Constants.ATTR); + if (resourceMappingAttributes == null) { + return Optional.empty(); + } + Set<String> mappingAttributes = new HashSet<>(); + mappingAttributes + .addAll(resourceMappingAttributes.values().stream().collect(Collectors.toList())); + translatedAttributes.addAll(mappingAttributes); + return Optional.of(translatedAttributes); + } + } + + private static Optional<List<Object>> getResourceTranslatedAttribute(Resource resource, + String attributeName, + TranslationContext context) { + List<Object> translatedAttributesList = new ArrayList<>(); + String translatedAttribute = + context.getElementMapping(resource.getType(), Constants.ATTR, attributeName); + if (translatedAttribute != null) { + translatedAttributesList.add(translatedAttribute); + return Optional.of(translatedAttributesList); + } else { //unsupported attribute + return Optional.empty(); + } + } + + private static Object getToscaAttributeValue(ServiceTemplate serviceTemplate, + String resourceId, String propertyName, + Object attributeVal, String resourceType, + String heatFileName, + HeatOrchestrationTemplate heatOrchestrationTemplate, + Template template, TranslationContext context) { + if (attributeVal instanceof Map && !((Map) attributeVal).isEmpty()) { + Map.Entry<String, Object> functionMapEntry = + (Map.Entry<String, Object>) ((Map) attributeVal).entrySet().iterator().next(); + if (FunctionTranslationFactory.getInstance(functionMapEntry.getKey()).isPresent()) { + return FunctionTranslationFactory.getInstance(functionMapEntry.getKey()).get() + .translateFunction(serviceTemplate, resourceId, propertyName, + functionMapEntry.getKey(), functionMapEntry + .getValue(), heatFileName, heatOrchestrationTemplate, template, context); + } + Map<String, Object> attrValueMap = new HashMap<>(); + for (Map.Entry<String, Object> entry : ((Map<String, Object>) attributeVal).entrySet()) { + attrValueMap.put(entry.getKey(), + getToscaAttributeValue(serviceTemplate, resourceId, propertyName, entry.getValue(), + resourceType, heatFileName, heatOrchestrationTemplate, template, context)); + } + return attrValueMap; + } else if (attributeVal instanceof List && !((List) attributeVal).isEmpty()) { + List propertyValueArray = new ArrayList<>(); + for (int i = 0; i < ((List) attributeVal).size(); i++) { + propertyValueArray.add( + getToscaAttributeValue(serviceTemplate, resourceId, propertyName, + ((List) attributeVal).get(i), resourceType, heatFileName, + heatOrchestrationTemplate, template, context)); + } + return propertyValueArray; + } + return attributeVal; + } + + +} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/functiontranslation/FunctionTranslationGetFileImpl.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/functiontranslation/FunctionTranslationGetFileImpl.java new file mode 100644 index 0000000000..bc0926c9d0 --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/functiontranslation/FunctionTranslationGetFileImpl.java @@ -0,0 +1,87 @@ +/*- + * ============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.services.heattotosca.impl.functiontranslation; + +import org.openecomp.sdc.heat.datatypes.model.HeatOrchestrationTemplate; +import org.openecomp.sdc.tosca.datatypes.ToscaArtifactType; +import org.openecomp.sdc.tosca.datatypes.ToscaFunctions; +import org.openecomp.sdc.tosca.datatypes.model.ArtifactDefinition; +import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate; +import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; +import org.openecomp.sdc.tosca.datatypes.model.Template; +import org.openecomp.sdc.tosca.services.ToscaConstants; +import org.openecomp.sdc.tosca.services.ToscaFileOutputService; +import org.openecomp.sdc.tosca.services.impl.ToscaFileOutputServiceCsarImpl; +import org.openecomp.sdc.translator.services.heattotosca.FunctionTranslation; +import org.openecomp.sdc.translator.datatypes.heattotosca.TranslationContext; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author SHIRIA + * @since December 15, 2016. + */ +public class FunctionTranslationGetFileImpl implements FunctionTranslation { + @Override + public Object translateFunction(ServiceTemplate serviceTemplate, + String resourceId, String propertyName, String functionKey, + Object functionValue, String heatFileName, + HeatOrchestrationTemplate heatOrchestrationTemplate, + Template toscaTemplate, TranslationContext context) { + String file = ((String) functionValue).replace("file:///", ""); + Object returnValue; + final String artifactId = file.split("\\.")[0]; + + returnValue = new HashMap<>(); + List artifactParameters = new ArrayList(); + artifactParameters.add(0, ToscaConstants.MODELABLE_ENTITY_NAME_SELF); + ((Map) returnValue).put(ToscaFunctions.GET_ARTIFACT.getDisplayName(), artifactParameters); + artifactParameters.add(1, artifactId); + + ToscaFileOutputService toscaFileOutputService = new ToscaFileOutputServiceCsarImpl(); + if (toscaTemplate != null) { + if (toscaTemplate instanceof NodeTemplate) { + NodeTemplate nodeTemplate = (NodeTemplate) toscaTemplate; + ArtifactDefinition artifactDefinition = + createArtifactDefinition(file, toscaFileOutputService); + if (nodeTemplate.getArtifacts() == null) { + nodeTemplate.setArtifacts(new HashMap<>()); + } + nodeTemplate.getArtifacts().put(artifactId, artifactDefinition); + } + } + return returnValue; + } + + private static ArtifactDefinition createArtifactDefinition(Object function, + ToscaFileOutputService + toscaFileOutputService) { + ArtifactDefinition artifactDefinition = new ArtifactDefinition(); + artifactDefinition.setType(ToscaArtifactType.NATIVE_DEPLOYMENT); + artifactDefinition + .setFile("../" + toscaFileOutputService.getArtifactsFolderName() + "/" + function); + return artifactDefinition; + } + +} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/functiontranslation/FunctionTranslationGetParamImpl.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/functiontranslation/FunctionTranslationGetParamImpl.java new file mode 100644 index 0000000000..877659ee10 --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/functiontranslation/FunctionTranslationGetParamImpl.java @@ -0,0 +1,128 @@ +/*- + * ============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.services.heattotosca.impl.functiontranslation; + +import org.openecomp.sdc.heat.datatypes.model.HeatOrchestrationTemplate; +import org.openecomp.sdc.heat.datatypes.model.HeatPseudoParameters; +import org.openecomp.sdc.tosca.datatypes.ToscaFunctions; +import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; +import org.openecomp.sdc.tosca.datatypes.model.Template; +import org.openecomp.sdc.translator.services.heattotosca.FunctionTranslation; +import org.openecomp.sdc.translator.services.heattotosca.FunctionTranslationFactory; +import org.openecomp.sdc.translator.datatypes.heattotosca.TranslationContext; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author SHIRIA + * @since December 15, 2016. + */ +public class FunctionTranslationGetParamImpl implements FunctionTranslation { + @Override + public Object translateFunction(ServiceTemplate serviceTemplate, String resourceId, + String propertyName, String functionKey, + Object functionValue, String heatFileName, + HeatOrchestrationTemplate heatOrchestrationTemplate, + Template toscaTemplate, TranslationContext context) { + Map returnValue = new HashMap<>(); + returnValue.put(ToscaFunctions.GET_INPUT.getDisplayName(), + translateGetParamFunctionExpression(serviceTemplate, resourceId, propertyName, + functionValue, heatFileName, heatOrchestrationTemplate, context)); + return returnValue; + } + + private static Object translateGetParamFunctionExpression(ServiceTemplate serviceTemplate, + String resourceId, + String propertyName,Object functionValue, + String heatFileName, + HeatOrchestrationTemplate + heatOrchestrationTemplate, + TranslationContext context) { + Object returnValue = null; + if (functionValue instanceof String) { + returnValue = functionValue; + if (HeatPseudoParameters.getPseudoParameterNames().contains(functionValue)) { + context + .addUsedHeatPseudoParams(heatFileName, (String) functionValue, (String) functionValue); + } + } else if (functionValue instanceof List) { + returnValue = new ArrayList<>(); + for (int i = 0; i < ((List) functionValue).size(); i++) { + Object paramValue = ((List) functionValue).get(i); + if ((paramValue instanceof Map && !((Map) paramValue).isEmpty())) { + Map<String, Object> paramMap = (Map) paramValue; + ((List) returnValue).add(translatedInnerMap(serviceTemplate, resourceId, + propertyName, paramMap, heatFileName, heatOrchestrationTemplate, context)); + } else { + ((List) returnValue).add(paramValue); + } + } + } + + return returnValue; + } + + private static Object translatedInnerMap(ServiceTemplate serviceTemplate, String resourceId, + String propertyName, Map<String, Object> paramMap, + String heatFileName,HeatOrchestrationTemplate + heatOrchestrationTemplate, + TranslationContext context) { + + Map<String, Object> translatedInnerMapValue = new HashMap<>(); + for (Map.Entry<String, Object> entry : paramMap.entrySet()) { + if (FunctionTranslationFactory.getInstance(entry.getKey()).isPresent()) { + return FunctionTranslationFactory.getInstance(entry.getKey()).get() + .translateFunction(serviceTemplate, resourceId, propertyName, entry.getKey(), + entry.getValue(), heatFileName, heatOrchestrationTemplate, null, context); + } else { + translatedInnerMapValue.put(entry.getKey(), + translatedInnerValue(serviceTemplate, resourceId, propertyName,entry.getValue(), + heatFileName, heatOrchestrationTemplate, context)); + + } + } + return translatedInnerMapValue; + } + + private static Object translatedInnerValue(ServiceTemplate serviceTemplate, String resourceId, + String propertyName,Object value, String heatFileName, + HeatOrchestrationTemplate heatOrchestrationTemplate, + TranslationContext context) { + if (value instanceof String) { + return value; + } else if (value instanceof Map) { + return translatedInnerMap(serviceTemplate, resourceId, propertyName,(Map<String, Object>) + value, heatFileName, heatOrchestrationTemplate, context); + } else if (value instanceof List) { + List returnedList = new ArrayList(); + for (int i = 0; i < ((List) value).size(); i++) { + returnedList.add(translatedInnerValue(serviceTemplate, resourceId, propertyName, + ((List) value).get(i), heatFileName, heatOrchestrationTemplate, context)); + } + return returnedList; + } + + return value; + } +} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/functiontranslation/FunctionTranslationGetResourceImpl.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/functiontranslation/FunctionTranslationGetResourceImpl.java new file mode 100644 index 0000000000..b2d11e3804 --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/functiontranslation/FunctionTranslationGetResourceImpl.java @@ -0,0 +1,52 @@ +/*- + * ============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.services.heattotosca.impl.functiontranslation; + +import org.openecomp.sdc.heat.datatypes.model.HeatOrchestrationTemplate; +import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; +import org.openecomp.sdc.tosca.datatypes.model.Template; +import org.openecomp.sdc.translator.services.heattotosca.FunctionTranslation; +import org.openecomp.sdc.translator.datatypes.heattotosca.TranslationContext; +import org.openecomp.sdc.translator.services.heattotosca.helper.FunctionTranslationHelper; +import org.openecomp.sdc.translator.services.heattotosca.impl.resourcetranslation.ResourceTranslationBase; + +import java.util.Optional; + +/** + * @author SHIRIA + * @since December 15, 2016. + */ +public class FunctionTranslationGetResourceImpl implements FunctionTranslation { + @Override + public Object translateFunction(ServiceTemplate serviceTemplate, String resourceId, + String propertyName, String functionKey, + Object functionValue, String heatFileName, + HeatOrchestrationTemplate heatOrchestrationTemplate, + Template toscaTemplate, TranslationContext context) { + Object returnValue; + Optional<String> resourceTranslatedId = ResourceTranslationBase + .getResourceTranslatedId(heatFileName, heatOrchestrationTemplate, (String) functionValue, + context); + returnValue = resourceTranslatedId + .orElseGet(() -> FunctionTranslationHelper.getUnsupportedResourcePrefix() + functionValue); + return returnValue; + } +} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/nameextractor/NameExtractorContrailComputeImpl.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/nameextractor/NameExtractorContrailComputeImpl.java new file mode 100644 index 0000000000..637aff9406 --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/nameextractor/NameExtractorContrailComputeImpl.java @@ -0,0 +1,49 @@ +/*- + * ============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.services.heattotosca.impl.nameextractor; + +import org.openecomp.sdc.heat.datatypes.model.Resource; +import org.openecomp.sdc.tosca.datatypes.ToscaNodeType; +import org.openecomp.sdc.translator.datatypes.heattotosca.PropertyRegexMatcher; +import org.openecomp.sdc.translator.services.heattotosca.NameExtractor; +import org.openecomp.sdc.translator.services.heattotosca.NameExtractorUtil; +import org.openecomp.sdc.translator.services.heattotosca.helper.ContrailTranslationHelper; + +import java.util.List; +import java.util.Optional; + +public class NameExtractorContrailComputeImpl implements NameExtractor { + + @Override + public String extractNodeTypeName(Resource resource, String resourceId, String translatedId) { + ContrailTranslationHelper contrailTranslationHelper = new ContrailTranslationHelper(); + List<PropertyRegexMatcher> propertyRegexMatchers = + contrailTranslationHelper.getPropertyRegexMatchersForComputeNodeType(); + Optional<String> extractedNodeTypeName = + NameExtractorUtil.extractNodeTypeNameByPropertiesPriority(resource.getProperties(), + propertyRegexMatchers); + + return ToscaNodeType.VFC_NODE_TYPE_PREFIX + "heat." + + (extractedNodeTypeName.isPresent() ? extractedNodeTypeName.get() + : "compute_" + translatedId); + } + +} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/nameextractor/NameExtractorNovaServerImpl.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/nameextractor/NameExtractorNovaServerImpl.java new file mode 100644 index 0000000000..52ceafa454 --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/nameextractor/NameExtractorNovaServerImpl.java @@ -0,0 +1,50 @@ +/*- + * ============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.services.heattotosca.impl.nameextractor; + +import org.openecomp.sdc.heat.datatypes.model.Resource; +import org.openecomp.sdc.tosca.datatypes.ToscaNodeType; +import org.openecomp.sdc.translator.datatypes.heattotosca.PropertyRegexMatcher; +import org.openecomp.sdc.translator.services.heattotosca.NameExtractor; +import org.openecomp.sdc.translator.services.heattotosca.NameExtractorUtil; +import org.openecomp.sdc.translator.services.heattotosca.impl.resourcetranslation.ResourceTranslationNovaServerImpl; + +import java.util.List; +import java.util.Optional; + +public class NameExtractorNovaServerImpl implements NameExtractor { + + @Override + public String extractNodeTypeName(Resource resource, String resourceId, String translatedId) { + ResourceTranslationNovaServerImpl novaServerTranslator = + new ResourceTranslationNovaServerImpl(); + List<PropertyRegexMatcher> propertyRegexMatchers = + novaServerTranslator.getPropertyRegexMatchersForNovaNodeType(); + + Optional<String> extractedNodeTypeName = NameExtractorUtil + .extractNodeTypeNameByPropertiesPriority(resource.getProperties(), propertyRegexMatchers); + + return ToscaNodeType.VFC_NODE_TYPE_PREFIX + "heat." + + (extractedNodeTypeName.isPresent() ? extractedNodeTypeName.get() + : translatedId.replace(".", "_")); + } + +} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/BaseResourceConnection.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/BaseResourceConnection.java new file mode 100644 index 0000000000..b9fed89133 --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/BaseResourceConnection.java @@ -0,0 +1,338 @@ +/*- + * ============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.services.heattotosca.impl.resourcetranslation; + +import org.apache.commons.collections4.MapUtils; +import org.openecomp.core.utilities.yaml.YamlUtil; +import org.openecomp.sdc.common.errors.CoreException; +import org.openecomp.sdc.common.errors.ErrorCategory; +import org.openecomp.sdc.common.errors.ErrorCode; +import org.openecomp.sdc.datatypes.error.ErrorLevel; +import org.openecomp.sdc.heat.datatypes.manifest.FileData; +import org.openecomp.sdc.heat.datatypes.model.HeatOrchestrationTemplate; +import org.openecomp.sdc.heat.datatypes.model.Resource; +import org.openecomp.sdc.logging.api.Logger; +import org.openecomp.sdc.logging.api.LoggerFactory; +import org.openecomp.sdc.logging.context.impl.MdcDataDebugMessage; +import org.openecomp.sdc.logging.context.impl.MdcDataErrorMessage; +import org.openecomp.sdc.logging.types.LoggerConstants; +import org.openecomp.sdc.logging.types.LoggerErrorCode; +import org.openecomp.sdc.logging.types.LoggerErrorDescription; +import org.openecomp.sdc.logging.types.LoggerTragetServiceName; +import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate; +import org.openecomp.sdc.tosca.datatypes.model.NodeType; +import org.openecomp.sdc.tosca.datatypes.model.RequirementAssignment; +import org.openecomp.sdc.tosca.datatypes.model.RequirementDefinition; +import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; +import org.openecomp.sdc.tosca.services.DataModelUtil; +import org.openecomp.sdc.tosca.services.ToscaAnalyzerService; +import org.openecomp.sdc.tosca.services.impl.ToscaAnalyzerServiceImpl; +import org.openecomp.sdc.translator.datatypes.heattotosca.AttachedResourceId; +import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo; +import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslatedHeatResource; +import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil; +import org.openecomp.sdc.translator.services.heattotosca.errors.TranslatorErrorCodes; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.function.Predicate; + +abstract class BaseResourceConnection<T> { + protected static Logger logger = (Logger) LoggerFactory.getLogger(BaseResourceConnection.class); + protected static MdcDataDebugMessage mdcDataDebugMessage = new MdcDataDebugMessage(); + protected TranslateTo translateTo; + FileData nestedFileData; + NodeTemplate substitutionNodeTemplate; + NodeType nodeType; + ResourceTranslationBase resourceTranslationBase; + + BaseResourceConnection(ResourceTranslationBase resourceTranslationBase, TranslateTo translateTo, + FileData nestedFileData, NodeTemplate substitutionNodeTemplate, + NodeType nodeType) { + this.translateTo = translateTo; + this.nestedFileData = nestedFileData; + this.substitutionNodeTemplate = substitutionNodeTemplate; + this.nodeType = nodeType; + this.resourceTranslationBase = resourceTranslationBase; + } + + abstract boolean isDesiredNodeTemplateType(NodeTemplate nodeTemplate); + + abstract List<Predicate<T>> getPredicatesListForConnectionPoints(); + + abstract Optional<List<String>> getConnectorPropertyParamName(String heatResourceId, + Resource heatResource, + HeatOrchestrationTemplate + nestedHeatOrchestrationTemplate, + String nestedHeatFileName); + + abstract String getDesiredResourceType(); + + abstract String getMappedNodeTranslatedResourceId(ServiceTemplate nestedServiceTemplate, + Map.Entry<String, T> connectionPointEntry); + + abstract Map.Entry<String, T> getMappedConnectionPointEntry(ServiceTemplate nestedServiceTemplate, + Map.Entry<String, T> + connectionPointEntry); + + abstract void addRequirementToConnectResources(Map.Entry<String, T> connectionPointEntry, + List<String> paramNames); + + abstract List<Map<String, T>> getAllConnectionPoints(); + + abstract boolean validateResourceTypeSupportedForReqCreation(String nestedResourceId, + final String nestedPropertyName, + String connectionPointId, + Resource connectedResource, + List<String> supportedTypes); + + void connect() { + ServiceTemplate nestedServiceTemplate = translateTo.getContext().getTranslatedServiceTemplates() + .get(translateTo.getResource().getType()); + List<String> paramNames; + HeatOrchestrationTemplate nestedHeatOrchestrationTemplate = new YamlUtil() + .yamlToObject(translateTo.getContext().getFileContent(nestedFileData.getFile()), + HeatOrchestrationTemplate.class); + List<Map<String, T>> exposedConnectionPoints = getAllConnectionPoints(); + for (Map<String, T> connectionPointsMap : exposedConnectionPoints) { + for (Map.Entry<String, T> connectionPointEntry : connectionPointsMap.entrySet()) { + paramNames = + getConnectionParameterName(nestedServiceTemplate, nestedHeatOrchestrationTemplate, + nestedFileData.getFile(), connectionPointEntry); + if (paramNames != null && !paramNames.isEmpty()) { + addRequirementToConnectResources(connectionPointEntry, paramNames); + } + } + } + } + + private List<String> getConnectionParameterName(ServiceTemplate nestedServiceTemplate, + HeatOrchestrationTemplate + nestedHeatOrchestrationTemplate, + String nestedHeatFileName, + Map.Entry<String, T> connectionPointEntry) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + List<String> connectionParameterNameList = new ArrayList<>(); + String mappedTranslatedResourceId = + getMappedNodeTranslatedResourceId(nestedServiceTemplate, connectionPointEntry); + NodeTemplate mappedNodeTemplate = + nestedServiceTemplate.getTopology_template().getNode_templates() + .get(mappedTranslatedResourceId); + if (isDesiredNodeTemplateType(mappedNodeTemplate)) { + return getResourcesConnectionParameterName(mappedTranslatedResourceId, + nestedHeatOrchestrationTemplate, nestedHeatFileName); + } + + ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl(); + if (toscaAnalyzerService.isSubstitutableNodeTemplate(mappedNodeTemplate)) { + Optional<String> mappedSubstituteServiceTemplateName = toscaAnalyzerService + .getSubstituteServiceTemplateName(mappedTranslatedResourceId, mappedNodeTemplate); + if (mappedSubstituteServiceTemplateName.isPresent()) { + String mappedNestedHeatFileName = translateTo.getContext().getNestedHeatFileName() + .get(mappedSubstituteServiceTemplateName.get()); + if (Objects.isNull(mappedNestedHeatFileName)) { + return null; + } + HeatOrchestrationTemplate mappedNestedHeatOrchestrationTemplate = new YamlUtil() + .yamlToObject(translateTo.getContext().getFileContent(mappedNestedHeatFileName), + HeatOrchestrationTemplate.class); + ServiceTemplate mappedNestedServiceTemplate = + translateTo.getContext().getTranslatedServiceTemplates().get(mappedNestedHeatFileName); + List<String> nestedPropertyNames = getConnectionParameterName(mappedNestedServiceTemplate, + mappedNestedHeatOrchestrationTemplate, mappedNestedHeatFileName, + getMappedConnectionPointEntry(nestedServiceTemplate, connectionPointEntry)); + + if (nestedPropertyNames != null && !nestedPropertyNames.isEmpty()) { + for (String propertyName : nestedPropertyNames) { + Object propertyValue = mappedNodeTemplate.getProperties().get(propertyName); + if (propertyValue instanceof Map && ((Map) propertyValue).containsKey("get_input")) { + Object paramName = ((Map) propertyValue).get("get_input"); + if (paramName instanceof String) { + connectionParameterNameList.add((String) paramName); + } + } + } + } + + mdcDataDebugMessage.debugExitMessage(null, null); + return connectionParameterNameList; + } + } + + mdcDataDebugMessage.debugExitMessage(null, null); + return null; + } + + private List<String> getResourcesConnectionParameterName(String translatedResourceId, + HeatOrchestrationTemplate + nestedHeatOrchestrationTemplate, + String nestedHeatFileName) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + List<String> params = new ArrayList<>(); + Optional<List<Map.Entry<String, Resource>>> heatResources = + getResourceByTranslatedResourceId(translatedResourceId, nestedHeatOrchestrationTemplate); + if (heatResources.isPresent()) { + for (Map.Entry<String, Resource> resourceEntry : heatResources.get()) { + Resource heatResource = resourceEntry.getValue(); + if (!MapUtils.isEmpty(heatResource.getProperties())) { + Optional<List<String>> connectorParamName = + getConnectorPropertyParamName(resourceEntry.getKey(), heatResource, + nestedHeatOrchestrationTemplate, nestedHeatFileName); + connectorParamName.ifPresent(params::addAll); + } + } + } + + mdcDataDebugMessage.debugExitMessage(null, null); + return params; + } + + protected Optional<List<Map.Entry<String, Resource>>> getResourceByTranslatedResourceId( + String translatedResourceId, HeatOrchestrationTemplate nestedHeatOrchestrationTemplate) { + Optional<List<Map.Entry<String, Resource>>> resourceByTranslatedResourceId = + resourceTranslationBase.getResourceByTranslatedResourceId(nestedFileData.getFile(), + nestedHeatOrchestrationTemplate, translatedResourceId, translateTo, + getDesiredResourceType()); + if (!resourceByTranslatedResourceId.isPresent()) { + MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB, + LoggerTragetServiceName.GET_RESOURCE, ErrorLevel.ERROR.name(), + LoggerErrorCode.DATA_ERROR.getErrorCode(), LoggerErrorDescription.TRANSLATE_HEAT); + throw new CoreException((new ErrorCode.ErrorCodeBuilder()).withMessage( + "Failed to get original resource from heat for translate resource id '" + + translatedResourceId + "'") + .withId(TranslatorErrorCodes.HEAT_TO_TOSCA_MAPPING_COLLISION) + .withCategory(ErrorCategory.APPLICATION).build()); + } + return resourceByTranslatedResourceId; + } + + RequirementAssignment createRequirementAssignment(Map.Entry<String, RequirementDefinition> + requirementEntry, String node, + NodeTemplate nodeTemplate) { + + mdcDataDebugMessage.debugEntryMessage(null, null); + RequirementAssignment requirementAssignment = null; + if (Objects.nonNull(node)) { + requirementAssignment = new RequirementAssignment(); + requirementAssignment.setRelationship(requirementEntry.getValue().getRelationship()); + requirementAssignment.setCapability(requirementEntry.getValue().getCapability()); + requirementAssignment.setNode(node); + DataModelUtil + .addRequirementAssignment(nodeTemplate, requirementEntry.getKey(), requirementAssignment); + } + mdcDataDebugMessage.debugExitMessage(null, null); + return requirementAssignment; + } + + + Optional<String> getConnectionTranslatedNodeUsingGetParamFunc( + Map.Entry<String, T> connectionPointEntry, String paramName, + List<String> supportedNodeTypes) { + + Optional<AttachedResourceId> attachedResourceId = + HeatToToscaUtil.extractAttachedResourceId(translateTo, paramName); + if (!attachedResourceId.isPresent()) { + return Optional.empty(); + } + AttachedResourceId resourceId = attachedResourceId.get(); + if (resourceId.isGetParam() && resourceId.getEntityId() instanceof String) { + TranslatedHeatResource shareResource = + translateTo.getContext().getHeatSharedResourcesByParam().get(resourceId.getEntityId()); + if (Objects.nonNull(shareResource) + && !HeatToToscaUtil.isHeatFileNested(translateTo, translateTo.getHeatFileName())) { + if (validateResourceTypeSupportedForReqCreation(translateTo.getResourceId(), paramName, + connectionPointEntry.getKey(), shareResource.getHeatResource(), supportedNodeTypes)) { + return Optional.of(shareResource.getTranslatedId()); + } + } + } + return Optional.empty(); + } + + Optional<TranslatedHeatResource> getConnectionTranslatedHeatResourceUsingGetParamFunc( + Map.Entry<String, T> connectionPointEntry, String paramName, + List<String> supportedNodeTypes) { + + Optional<AttachedResourceId> attachedResourceId = + HeatToToscaUtil.extractAttachedResourceId(translateTo, paramName); + if (!attachedResourceId.isPresent()) { + return Optional.empty(); + } + AttachedResourceId resourceId = attachedResourceId.get(); + if (resourceId.isGetParam() && resourceId.getEntityId() instanceof String) { + TranslatedHeatResource shareResource = + translateTo.getContext().getHeatSharedResourcesByParam().get(resourceId.getEntityId()); + if (Objects.nonNull(shareResource) + && !HeatToToscaUtil.isHeatFileNested(translateTo, translateTo.getHeatFileName())) { + if (validateResourceTypeSupportedForReqCreation(translateTo.getResourceId(), paramName, + connectionPointEntry.getKey(), shareResource.getHeatResource(), supportedNodeTypes)) { + return Optional.of(shareResource); + } + } + } + return Optional.empty(); + } + + + Optional<String> getConnectionTranslatedNodeUsingGetResourceFunc( + Map.Entry<String, T> connectionPointEntry, String paramName, Object paramValue, + List<String> supportedNodeTypes) { + Optional<String> getResourceAttachedResourceId = + HeatToToscaUtil.extractContrailGetResourceAttachedHeatResourceId(paramValue); + if (getResourceAttachedResourceId.isPresent()) { // get resource + Resource resource = translateTo.getHeatOrchestrationTemplate().getResources() + .get(getResourceAttachedResourceId.get()); + if (validateResourceTypeSupportedForReqCreation(translateTo.getResourceId(), paramName, + connectionPointEntry.getKey(), resource, supportedNodeTypes)) { + return ResourceTranslationBase.getResourceTranslatedId(translateTo.getHeatFileName(), + translateTo.getHeatOrchestrationTemplate(), getResourceAttachedResourceId.get(), + translateTo.getContext()); + } + } + + return Optional.empty(); + } + + Optional<String> getConnectionResourceUsingGetResourceFunc( + Map.Entry<String, T> connectionPointEntry, String paramName, Object paramValue, + List<String> supportedNodeTypes) { + Optional<String> getResourceAttachedResourceId = + HeatToToscaUtil.extractContrailGetResourceAttachedHeatResourceId(paramValue); + if (getResourceAttachedResourceId.isPresent()) { // get resource + Resource resource = translateTo.getHeatOrchestrationTemplate().getResources() + .get(getResourceAttachedResourceId.get()); + if (validateResourceTypeSupportedForReqCreation(translateTo.getResourceId(), paramName, + connectionPointEntry.getKey(), resource, supportedNodeTypes)) { + return getResourceAttachedResourceId; + } + } + return Optional.empty(); + } +} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ContrailPortToNetResourceConnection.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ContrailPortToNetResourceConnection.java new file mode 100644 index 0000000000..efa0ddd8a9 --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ContrailPortToNetResourceConnection.java @@ -0,0 +1,191 @@ +/*- + * ============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.services.heattotosca.impl.resourcetranslation; + + +import org.openecomp.sdc.common.utils.CommonUtil; +import org.openecomp.sdc.heat.datatypes.manifest.FileData; +import org.openecomp.sdc.heat.datatypes.model.HeatOrchestrationTemplate; +import org.openecomp.sdc.heat.datatypes.model.HeatResourcesTypes; +import org.openecomp.sdc.heat.datatypes.model.Resource; +import org.openecomp.sdc.heat.services.HeatConstants; +import org.openecomp.sdc.logging.context.impl.MdcDataDebugMessage; +import org.openecomp.sdc.tosca.datatypes.ToscaCapabilityType; +import org.openecomp.sdc.tosca.datatypes.ToscaNodeType; +import org.openecomp.sdc.tosca.datatypes.ToscaRelationshipType; +import org.openecomp.sdc.tosca.datatypes.ToscaServiceModel; +import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate; +import org.openecomp.sdc.tosca.datatypes.model.NodeType; +import org.openecomp.sdc.tosca.datatypes.model.RequirementDefinition; +import org.openecomp.sdc.tosca.services.ToscaAnalyzerService; +import org.openecomp.sdc.tosca.services.impl.ToscaAnalyzerServiceImpl; +import org.openecomp.sdc.translator.datatypes.heattotosca.AttachedResourceId; +import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo; +import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.function.Predicate; + +public class ContrailPortToNetResourceConnection extends ResourceConnectionUsingRequirementHelper { + private MdcDataDebugMessage mdcDataDebugMessage = new MdcDataDebugMessage(); + + public ContrailPortToNetResourceConnection(ResourceTranslationBase resourceTranslationBase, + TranslateTo translateTo, FileData nestedFileData, + NodeTemplate substitutionNodeTemplate, + NodeType nodeType) { + super(resourceTranslationBase, translateTo, nestedFileData, substitutionNodeTemplate, nodeType); + } + + @Override + protected boolean isDesiredNodeTemplateType(NodeTemplate nodeTemplate) { + ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl(); + ToscaServiceModel toscaServiceModel = + HeatToToscaUtil.getToscaServiceModel(translateTo.getContext()); + return toscaAnalyzerService + .isTypeOf(nodeTemplate, ToscaNodeType.CONTRAIL_ABSTRACT_SUBSTITUTE, + translateTo.getContext().getTranslatedServiceTemplates() + .get(translateTo.getResource().getType()), toscaServiceModel); + } + + @Override + protected List<Predicate<RequirementDefinition>> getPredicatesListForConnectionPoints() { + ArrayList<Predicate<RequirementDefinition>> predicates = new ArrayList<>(); + predicates.add( + req -> req.getCapability().equals(ToscaCapabilityType.NATIVE_NETWORK_LINKABLE) + && (req.getNode() == null || req.getNode().equals(ToscaNodeType.NATIVE_ROOT)) + && req.getRelationship() + .equals(ToscaRelationshipType.NATIVE_NETWORK_LINK_TO)); + return predicates; + } + + @Override + protected Optional<List<String>> getConnectorPropertyParamName(String heatResourceId, + Resource heatResource, + HeatOrchestrationTemplate + nestedHeatOrchestrationTemplate, + String nestedHeatFileName) { + + mdcDataDebugMessage.debugEntryMessage(null, null); + + Object interfaceListProperty = + heatResource.getProperties().get(HeatConstants.INTERFACE_LIST_PROPERTY_NAME); + if (interfaceListProperty == null) { + return Optional.empty(); + } + List<String> paramsList = new ArrayList<>(); + if (interfaceListProperty instanceof List) { + for (int index = 0; index < ((List) interfaceListProperty).size(); index++) { + Object interfaceEntry = ((List) interfaceListProperty).get(index); + if (interfaceEntry instanceof Map) { + Optional<AttachedResourceId> attachedVirtualNetwork = HeatToToscaUtil + .extractAttachedResourceId(nestedHeatFileName, nestedHeatOrchestrationTemplate, + translateTo.getContext(), + ((Map) interfaceEntry).get(HeatConstants.VIRTUAL_NETWORK_PROPERTY_NAME)); + if (attachedVirtualNetwork.isPresent() && attachedVirtualNetwork.get().isGetParam() + && attachedVirtualNetwork.get().getEntityId() instanceof String) { + paramsList.add((String) attachedVirtualNetwork.get().getEntityId()); + } + } + } + + mdcDataDebugMessage.debugExitMessage(null, null); + return Optional.of(paramsList); + } else if (interfaceListProperty instanceof Map) { + Optional<AttachedResourceId> attachedVirtualNetwork = HeatToToscaUtil + .extractAttachedResourceId(nestedHeatFileName, nestedHeatOrchestrationTemplate, + translateTo.getContext(), + ((Map) interfaceListProperty).get(HeatConstants.VIRTUAL_NETWORK_PROPERTY_NAME)); + if (attachedVirtualNetwork.isPresent() && attachedVirtualNetwork.get().isGetParam() + && attachedVirtualNetwork.get().getEntityId() instanceof String) { + paramsList.add((String) attachedVirtualNetwork.get().getEntityId()); + return Optional.of(paramsList); + } + } + + mdcDataDebugMessage.debugExitMessage(null, null); + return Optional.empty(); + } + + @Override + protected String getDesiredResourceType() { + return HeatResourcesTypes.CONTRAIL_SERVICE_INSTANCE.getHeatResource(); + } + + @Override + protected void addRequirementToConnectResources( + Map.Entry<String, RequirementDefinition> requirementDefinitionEntry, + List<String> paramNames) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + if (paramNames == null || paramNames.isEmpty()) { + return; + } + Integer index = Integer.valueOf( + requirementDefinitionEntry.getKey().substring("link_port_".length()).substring(0, 1)); + + String paramName = paramNames.get( + index); // port can connect to one network only and we are + // expecting to get only one param(unlike security rules to port) + Object paramValue = translateTo.getResource().getProperties().get(paramName); + List<String> supportedNetworkTypes = + Arrays.asList(HeatResourcesTypes.NEUTRON_NET_RESOURCE_TYPE.getHeatResource(), + HeatResourcesTypes.CONTRAIL_VIRTUAL_NETWORK_RESOURCE_TYPE.getHeatResource()); + + addRequirementToConnectResource(requirementDefinitionEntry, paramName, paramValue, + supportedNetworkTypes); + + mdcDataDebugMessage.debugExitMessage(null, null); + } + + @Override + boolean validateResourceTypeSupportedForReqCreation(String nestedResourceId, + final String nestedPropertyName, + String connectionPointId, + Resource connectedResource, + List<String> supportedTypes) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + if (!resourceTranslationBase.isResourceTypeSupported(connectedResource, supportedTypes)) { + logger.warn("Nested resource '" + nestedResourceId + "' property '" + nestedPropertyName + + "' is pointing to a resource with type '" + connectedResource.getType() + + "' which is not supported for requirement '" + connectionPointId + + "' that connect contrail port to network. Supported types are: '" + + supportedTypes.toString() + + "', therefore, this TOSCA requirement will not be connected."); + + mdcDataDebugMessage.debugExitMessage(null, null); + return false; + } + + mdcDataDebugMessage.debugExitMessage(null, null); + return true; + } + + +} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ContrailV2VlanToInterfaceResourceConnection.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ContrailV2VlanToInterfaceResourceConnection.java new file mode 100644 index 0000000000..a757730cb1 --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ContrailV2VlanToInterfaceResourceConnection.java @@ -0,0 +1,172 @@ +/*- + * ============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.services.heattotosca.impl.resourcetranslation; + +import org.openecomp.sdc.common.utils.CommonUtil; +import org.openecomp.sdc.heat.datatypes.manifest.FileData; +import org.openecomp.sdc.heat.datatypes.model.HeatOrchestrationTemplate; +import org.openecomp.sdc.heat.datatypes.model.HeatResourcesTypes; +import org.openecomp.sdc.heat.datatypes.model.Resource; +import org.openecomp.sdc.heat.services.HeatConstants; +import org.openecomp.sdc.tosca.datatypes.ToscaCapabilityType; +import org.openecomp.sdc.tosca.datatypes.ToscaNodeType; +import org.openecomp.sdc.tosca.datatypes.ToscaRelationshipType; +import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate; +import org.openecomp.sdc.tosca.datatypes.model.NodeType; +import org.openecomp.sdc.tosca.datatypes.model.RequirementDefinition; +import org.openecomp.sdc.translator.datatypes.heattotosca.AttachedResourceId; +import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo; +import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil; +import org.openecomp.sdc.translator.services.heattotosca.helper.ContrailV2VirtualMachineInterfaceHelper; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.function.Predicate; + +public class ContrailV2VlanToInterfaceResourceConnection + extends ResourceConnectionUsingRequirementHelper { + + public ContrailV2VlanToInterfaceResourceConnection( + ResourceTranslationBase resourceTranslationBase, TranslateTo translateTo, + FileData nestedFileData, NodeTemplate substitutionNodeTemplate, NodeType nodeType) { + super(resourceTranslationBase, translateTo, nestedFileData, substitutionNodeTemplate, nodeType); + } + + @Override + protected boolean isDesiredNodeTemplateType(NodeTemplate nodeTemplate) { + return nodeTemplate.getType() + .equals(ToscaNodeType.CONTRAILV2_VLAN_SUB_INTERFACE); + } + + @Override + protected List<Predicate<RequirementDefinition>> getPredicatesListForConnectionPoints() { + ArrayList<Predicate<RequirementDefinition>> predicates = new ArrayList<>(); + predicates.add( + req -> req.getCapability().equals(ToscaCapabilityType.NATIVE_NETWORK_BINDABLE) + && (req.getNode() == null || req.getNode().equals(ToscaNodeType.NETWORK_PORT)) + && req.getRelationship() + .equals(ToscaRelationshipType.NATIVE_NETWORK_BINDS_TO)); + return predicates; + } + + @Override + protected Optional<List<String>> getConnectorPropertyParamName(String heatResourceId, + Resource heatResource, + HeatOrchestrationTemplate + nestedHeatOrchestrationTemplate, + String nestedHeatFileName) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + List<String> interfaces = new ArrayList<>(); + Object interfaceRefs = heatResource.getProperties().get(HeatConstants.VMI_REFS_PROPERTY_NAME); + if (Objects.isNull(interfaceRefs) || !(interfaceRefs instanceof List) + || ((List) interfaceRefs).size() == 0) { + return Optional.empty(); + } + if (((List) interfaceRefs).size() > 1) { + logger.warn("Heat resource: '" + translateTo.getResourceId() + "' with nested heat file: '" + + translateTo.getResource().getType() + + "' has resource '" + heatResourceId + "' with type '" + + HeatResourcesTypes.CONTRAIL_V2_VIRTUAL_MACHINE_INTERFACE_RESOURCE_TYPE.getHeatResource() + + "' which include '" + HeatConstants.VMI_REFS_PROPERTY_NAME + + "' property with more than one interface values, " + + "only the first interface will be connected, all rest will be ignored in TOSCA " + + "translation."); + } + Object interfaceRef = ((List) interfaceRefs).get(0); + Optional<AttachedResourceId> attachedInterfaceResource = HeatToToscaUtil + .extractAttachedResourceId(nestedFileData.getFile(), nestedHeatOrchestrationTemplate, + translateTo.getContext(), interfaceRef); + if (attachedInterfaceResource.isPresent() && attachedInterfaceResource.get().isGetParam() + && attachedInterfaceResource.get().getEntityId() instanceof String) { + interfaces.add((String) attachedInterfaceResource.get().getEntityId()); + } + + mdcDataDebugMessage.debugExitMessage(null, null); + return Optional.of(interfaces); + } + + @Override + protected String getDesiredResourceType() { + return HeatResourcesTypes.CONTRAIL_V2_VIRTUAL_MACHINE_INTERFACE_RESOURCE_TYPE.getHeatResource(); + } + + @Override + protected void addRequirementToConnectResources( + Map.Entry<String, RequirementDefinition> requirementDefinitionEntry, + List<String> paramNames) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + if (paramNames == null || paramNames.isEmpty()) { + return; + } + for (String paramName : paramNames) { + Object paramValue = translateTo.getResource().getProperties().get(paramName); + List<String> supportedInterfaceTypes = + Arrays.asList(HeatResourcesTypes.NEUTRON_PORT_RESOURCE_TYPE.getHeatResource(), + HeatResourcesTypes.CONTRAIL_V2_VIRTUAL_MACHINE_INTERFACE_RESOURCE_TYPE + .getHeatResource()); + + addRequirementToConnectResource(requirementDefinitionEntry, paramName, paramValue, + supportedInterfaceTypes); + } + + mdcDataDebugMessage.debugExitMessage(null, null); + } + + @Override + boolean validateResourceTypeSupportedForReqCreation(String nestedResourceId, + final String nestedPropertyName, + String connectionPointId, + Resource connectedResource, + List<String> supportedTypes) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + if (!resourceTranslationBase.isResourceTypeSupported(connectedResource, supportedTypes) + || (new ContrailV2VirtualMachineInterfaceHelper() + .isVlanSubInterfaceResource(connectedResource))) { + logger.warn("Nested resource '" + nestedResourceId + "' property '" + nestedPropertyName + + "' is pointing to a " + (true == (new ContrailV2VirtualMachineInterfaceHelper() + .isVlanSubInterfaceResource(connectedResource)) ? "Vlan Sub interface " : "") + + "resource with type '" + connectedResource.getType() + "' which" + + " is not supported for requirement '" + connectionPointId + + "' that connect vmi vlan sub interface to interface. Supported types are: '" + + supportedTypes.toString() + "' (excluding Vlan), therefore, this TOSCA requirement will" + + " not be connected."); + + mdcDataDebugMessage.debugExitMessage(null, null); + return false; + } + + mdcDataDebugMessage.debugExitMessage(null, null); + return true; + } +} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/ContrailV2VmInterfaceToNetResourceConnection.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ContrailV2VmInterfaceToNetResourceConnection.java index 890d2a76af..944afb0fc3 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/ContrailV2VmInterfaceToNetResourceConnection.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ContrailV2VmInterfaceToNetResourceConnection.java @@ -18,8 +18,9 @@ * ============LICENSE_END========================================================= */ -package org.openecomp.sdc.translator.services.heattotosca.impl; +package org.openecomp.sdc.translator.services.heattotosca.impl.resourcetranslation; +import org.openecomp.sdc.common.utils.CommonUtil; import org.openecomp.sdc.heat.datatypes.manifest.FileData; import org.openecomp.sdc.heat.datatypes.model.HeatOrchestrationTemplate; import org.openecomp.sdc.heat.datatypes.model.HeatResourcesTypes; @@ -32,17 +33,18 @@ import org.openecomp.sdc.tosca.datatypes.model.NodeType; import org.openecomp.sdc.tosca.datatypes.model.RequirementDefinition; import org.openecomp.sdc.translator.datatypes.heattotosca.AttachedResourceId; import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo; -import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslatedHeatResource; import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.function.Predicate; -public class ContrailV2VmInterfaceToNetResourceConnection extends PortToNetResourceConnection { +public class ContrailV2VmInterfaceToNetResourceConnection + extends ResourceConnectionUsingRequirementHelper { public ContrailV2VmInterfaceToNetResourceConnection( ResourceTranslationBase resourceTranslationBase, TranslateTo translateTo, @@ -52,14 +54,33 @@ public class ContrailV2VmInterfaceToNetResourceConnection extends PortToNetResou @Override protected boolean isDesiredNodeTemplateType(NodeTemplate nodeTemplate) { - return nodeTemplate.getType() - .equals(ToscaNodeType.CONTRAILV2_VIRTUAL_MACHINE_INTERFACE.getDisplayName()); + return (nodeTemplate.getType() + .equals(ToscaNodeType.CONTRAILV2_VIRTUAL_MACHINE_INTERFACE) + || nodeTemplate.getType() + .equals(ToscaNodeType.CONTRAILV2_VLAN_SUB_INTERFACE)); } @Override - protected Optional<List<String>> getConnectorParamName(String heatResourceId, - Resource heatResource, - HeatOrchestrationTemplate nestedHeatOrchestrationTemplate) { + protected List<Predicate<RequirementDefinition>> getPredicatesListForConnectionPoints() { + ArrayList<Predicate<RequirementDefinition>> predicates = new ArrayList<>(); + predicates.add( + req -> req.getCapability().equals(ToscaCapabilityType.NATIVE_NETWORK_LINKABLE) + && (req.getNode() == null || req.getNode().equals(ToscaNodeType.NATIVE_ROOT)) + && req.getRelationship() + .equals(ToscaRelationshipType.NATIVE_NETWORK_LINK_TO)); + return predicates; + } + + @Override + protected Optional<List<String>> getConnectorPropertyParamName(String heatResourceId, + Resource heatResource, + HeatOrchestrationTemplate + nestedHeatOrchestrationTemplate, + String nestedHeatFileName) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + List<String> networks = new ArrayList<>(); Object virtualNetworkRefs = heatResource.getProperties().get("virtual_network_refs"); if (Objects.isNull(virtualNetworkRefs) || !(virtualNetworkRefs instanceof List) @@ -79,9 +100,12 @@ public class ContrailV2VmInterfaceToNetResourceConnection extends PortToNetResou Optional<AttachedResourceId> network = HeatToToscaUtil .extractAttachedResourceId(nestedFileData.getFile(), nestedHeatOrchestrationTemplate, translateTo.getContext(), virtualNetworkRef); - if (network.isPresent() && network.get().isGetParam()) { + if (network.isPresent() && network.get().isGetParam() + && network.get().getEntityId() instanceof String) { networks.add((String) network.get().getEntityId()); } + + mdcDataDebugMessage.debugExitMessage(null, null); return Optional.of(networks); } @@ -91,49 +115,52 @@ public class ContrailV2VmInterfaceToNetResourceConnection extends PortToNetResou } @Override - protected void addRequirementToConnectResources(Map.Entry<String, RequirementDefinition> entry, - List<String> paramNames) { + protected void addRequirementToConnectResources( + Map.Entry<String, RequirementDefinition> requirementDefinitionEntry, + List<String> paramNames) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + if (paramNames == null || paramNames.isEmpty()) { + return; + } for (String paramName : paramNames) { Object paramValue = translateTo.getResource().getProperties().get(paramName); - String contrailAttachedResourceId = - HeatToToscaUtil.extractContrailGetResourceAttachedHeatResourceId(paramValue); - Optional<String> node; - if (contrailAttachedResourceId != null) { // contrail get resource - node = ResourceTranslationBase.getResourceTranslatedId(translateTo.getHeatFileName(), - translateTo.getHeatOrchestrationTemplate(), contrailAttachedResourceId, - translateTo.getContext()); - if (node.isPresent()) { - createRequirementAssignment(entry, node.get(), substitutionNodeTemplate); - } - } else { - Optional<AttachedResourceId> attachedResourceId = - HeatToToscaUtil.extractAttachedResourceId(translateTo, paramName); - if (!attachedResourceId.isPresent()) { - return; - } - AttachedResourceId resourceId = attachedResourceId.get(); - if (resourceId.isGetParam()) { - TranslatedHeatResource shareResource = - translateTo.getContext().getHeatSharedResourcesByParam() - .get(resourceId.getEntityId()); - if (Objects.nonNull(shareResource) - && !HeatToToscaUtil.isHeatFileNested(translateTo, translateTo.getHeatFileName())) { - createRequirementAssignment(entry, shareResource.getTranslatedId(), - substitutionNodeTemplate); - } - } - } + List<String> supportedNetworkTypes = + Arrays.asList(HeatResourcesTypes.NEUTRON_NET_RESOURCE_TYPE.getHeatResource(), + HeatResourcesTypes.CONTRAIL_V2_VIRTUAL_NETWORK_RESOURCE_TYPE.getHeatResource()); + + addRequirementToConnectResource(requirementDefinitionEntry, paramName, paramValue, + supportedNetworkTypes); } + + mdcDataDebugMessage.debugExitMessage(null, null); } @Override - protected List<Predicate<RequirementDefinition>> getPredicatesListForConnectionPoints() { - ArrayList<Predicate<RequirementDefinition>> predicates = new ArrayList<>(); - predicates.add( - req -> req.getCapability().equals(ToscaCapabilityType.NETWORK_LINKABLE.getDisplayName()) - && req.getNode().equals(ToscaNodeType.ROOT.getDisplayName()) - && req.getRelationship().equals(ToscaRelationshipType.NETWORK_LINK_TO.getDisplayName()) - ); - return predicates; + boolean validateResourceTypeSupportedForReqCreation(String nestedResourceId, + final String nestedPropertyName, + String connectionPointId, + Resource connectedResource, + List<String> supportedTypes) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + if (!resourceTranslationBase.isResourceTypeSupported(connectedResource, supportedTypes)) { + logger.warn("Nested resource '" + nestedResourceId + "' property '" + nestedPropertyName + + "' is pointing to a resource with type '" + connectedResource.getType() + + "' which is not supported for requirement '" + connectionPointId + + "' that connect virtual machine interface to network. Supported types are: '" + + supportedTypes.toString() + + "', therefore, this TOSCA requirement will not be connected."); + + mdcDataDebugMessage.debugExitMessage(null, null); + return false; + } + + mdcDataDebugMessage.debugExitMessage(null, null); + return true; } } diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/NovaToVolResourceConnection.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/NovaToVolResourceConnection.java index 8bab0dbc50..496341e11f 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/NovaToVolResourceConnection.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/NovaToVolResourceConnection.java @@ -18,15 +18,20 @@ * ============LICENSE_END========================================================= */ -package org.openecomp.sdc.translator.services.heattotosca.impl; +package org.openecomp.sdc.translator.services.heattotosca.impl.resourcetranslation; import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang3.StringUtils; import org.openecomp.sdc.common.errors.CoreException; +import org.openecomp.sdc.datatypes.error.ErrorLevel; import org.openecomp.sdc.heat.datatypes.manifest.FileData; import org.openecomp.sdc.heat.datatypes.model.HeatOrchestrationTemplate; import org.openecomp.sdc.heat.datatypes.model.HeatResourcesTypes; import org.openecomp.sdc.heat.datatypes.model.Resource; +import org.openecomp.sdc.logging.context.impl.MdcDataErrorMessage; +import org.openecomp.sdc.logging.types.LoggerConstants; +import org.openecomp.sdc.logging.types.LoggerErrorCode; +import org.openecomp.sdc.logging.types.LoggerErrorDescription; +import org.openecomp.sdc.logging.types.LoggerTragetServiceName; import org.openecomp.sdc.tosca.datatypes.ToscaCapabilityType; import org.openecomp.sdc.tosca.datatypes.ToscaNodeType; import org.openecomp.sdc.tosca.datatypes.ToscaRelationshipType; @@ -34,15 +39,14 @@ import org.openecomp.sdc.tosca.datatypes.ToscaServiceModel; import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate; import org.openecomp.sdc.tosca.datatypes.model.NodeType; import org.openecomp.sdc.tosca.datatypes.model.RequirementDefinition; -import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; import org.openecomp.sdc.tosca.services.ToscaAnalyzerService; import org.openecomp.sdc.tosca.services.impl.ToscaAnalyzerServiceImpl; import org.openecomp.sdc.translator.datatypes.heattotosca.AttachedResourceId; +import org.openecomp.sdc.translator.datatypes.heattotosca.TranslationContext; import org.openecomp.sdc.translator.datatypes.heattotosca.to.ResourceFileDataAndIDs; import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo; import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslatedHeatResource; import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil; -import org.openecomp.sdc.translator.services.heattotosca.TranslationContext; import org.openecomp.sdc.translator.services.heattotosca.errors.MissingMandatoryPropertyErrorBuilder; import org.openecomp.sdc.translator.services.heattotosca.helper.VolumeTranslationHelper; @@ -55,7 +59,7 @@ import java.util.Optional; import java.util.function.Predicate; import java.util.stream.Collectors; -class NovaToVolResourceConnection extends NovaAndPortResourceConnectionHelper { +class NovaToVolResourceConnection extends ResourceConnectionUsingRequirementHelper { public NovaToVolResourceConnection(ResourceTranslationBase resourceTranslationBase, TranslateTo translateTo, FileData nestedFileData, @@ -66,8 +70,9 @@ class NovaToVolResourceConnection extends NovaAndPortResourceConnectionHelper { @Override boolean isDesiredNodeTemplateType(NodeTemplate nodeTemplate) { ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl(); - ToscaServiceModel toscaServiceModel = HeatToToscaUtil.getToscaServiceModel(translateTo); - return toscaAnalyzerService.isTypeOf(nodeTemplate, ToscaNodeType.NOVA_SERVER.getDisplayName(), + ToscaServiceModel toscaServiceModel = + HeatToToscaUtil.getToscaServiceModel(translateTo.getContext()); + return toscaAnalyzerService.isTypeOf(nodeTemplate, ToscaNodeType.NOVA_SERVER, translateTo.getContext().getTranslatedServiceTemplates() .get(translateTo.getResource().getType()), toscaServiceModel); } @@ -76,23 +81,31 @@ class NovaToVolResourceConnection extends NovaAndPortResourceConnectionHelper { List<Predicate<RequirementDefinition>> getPredicatesListForConnectionPoints() { ArrayList<Predicate<RequirementDefinition>> predicates = new ArrayList<>(); predicates - .add(req -> req.getCapability().equals(ToscaCapabilityType.ATTACHMENT.getDisplayName()) - && req.getNode().equals(ToscaNodeType.BLOCK_STORAGE.getDisplayName()) + .add(req -> req.getCapability().equals(ToscaCapabilityType.NATIVE_ATTACHMENT) + && req.getNode().equals(ToscaNodeType.NATIVE_BLOCK_STORAGE) && req.getRelationship() - .equals(ToscaRelationshipType.NATIVE_ATTACHES_TO.getDisplayName())); + .equals(ToscaRelationshipType.NATIVE_ATTACHES_TO)); return predicates; } @Override - Optional<List<String>> getConnectorParamName( - String heatResourceId, Resource heatResource, - HeatOrchestrationTemplate nestedHeatOrchestrationTemplate) { + Optional<List<String>> getConnectorPropertyParamName(String heatResourceId, Resource heatResource, + HeatOrchestrationTemplate + nestedHeatOrchestrationTemplate, + String nestedHeatFileName) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + Optional<AttachedResourceId> volumeId = HeatToToscaUtil .extractAttachedResourceId(nestedFileData.getFile(), nestedHeatOrchestrationTemplate, translateTo.getContext(), heatResource.getProperties().get("volume_id")); - if (volumeId.isPresent() && volumeId.get().isGetParam()) { + if (volumeId.isPresent() && volumeId.get().isGetParam() + && volumeId.get().getEntityId() instanceof String) { + mdcDataDebugMessage.debugExitMessage(null, null); return Optional.of(Collections.singletonList((String) volumeId.get().getEntityId())); } else { + mdcDataDebugMessage.debugExitMessage(null, null); return Optional.empty(); } } @@ -103,9 +116,62 @@ class NovaToVolResourceConnection extends NovaAndPortResourceConnectionHelper { } @Override + void addRequirementToConnectResources( + Map.Entry<String, RequirementDefinition> requirementDefinitionEntry, + List<String> paramNames) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + if (paramNames == null || paramNames.isEmpty()) { + return; + } + + List<String> supportedVolumeTypes = + Collections.singletonList(HeatResourcesTypes.CINDER_VOLUME_RESOURCE_TYPE.getHeatResource()); + + for (String paramName : paramNames) { + Object paramValue = translateTo.getResource().getProperties().get(paramName); + addRequirementToConnectResource(requirementDefinitionEntry, paramName, paramValue, + supportedVolumeTypes); + } + + mdcDataDebugMessage.debugExitMessage(null, null); + } + + @Override + boolean validateResourceTypeSupportedForReqCreation(String nestedResourceId, + String nestedPropertyName, + String connectionPointId, + Resource connectedResource, + List<String> supportedTypes) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + if (!resourceTranslationBase.isResourceTypeSupported(connectedResource, supportedTypes)) { + logger.warn("Nested resource '" + nestedResourceId + "' property '" + nestedPropertyName + + "' is pointing to a resource with type '" + connectedResource.getType() + + "' which is not supported for requirement '" + connectionPointId + + "' that connect VolumeAttachment to Volume. Supported types are: '" + + supportedTypes.toString() + + "', therefore, this TOSCA requirement will not be connected."); + + mdcDataDebugMessage.debugExitMessage(null, null); + return false; + } + + mdcDataDebugMessage.debugExitMessage(null, null); + return true; + } + + @Override protected Optional<List<Map.Entry<String, Resource>>> getResourceByTranslatedResourceId( String translatedResourceId, HeatOrchestrationTemplate nestedHeatOrchestrationTemplate) { + + mdcDataDebugMessage.debugEntryMessage(null, null); + List<Predicate<Map.Entry<String, Resource>>> predicates = buildPredicates(nestedFileData.getFile(), nestedHeatOrchestrationTemplate, translatedResourceId); @@ -117,17 +183,64 @@ class NovaToVolResourceConnection extends NovaAndPortResourceConnectionHelper { .allMatch(p -> p.test(entry))) .collect(Collectors.toList()); if (CollectionUtils.isEmpty(list)) { + mdcDataDebugMessage.debugExitMessage(null, null); return Optional.empty(); } else { + mdcDataDebugMessage.debugExitMessage(null, null); return Optional.of(list); } } - private List<Predicate<Map.Entry<String, Resource>>> buildPredicates(String fileName, - HeatOrchestrationTemplate - heatOrchestrationTemplate, - String - novaTranslatedResourceId) { + @Override + Optional<String> getConnectionTranslatedNodeUsingGetParamFunc( + Map.Entry<String, RequirementDefinition> requirementDefinitionEntry, String paramName, + List<String> supportedTargetNodeTypes) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + Optional<String> targetTranslatedNodeId = super + .getConnectionTranslatedNodeUsingGetParamFunc(requirementDefinitionEntry, paramName, + supportedTargetNodeTypes); + if (targetTranslatedNodeId.isPresent()) { + return targetTranslatedNodeId; + } else { + Optional<AttachedResourceId> attachedResourceId = + HeatToToscaUtil.extractAttachedResourceId(translateTo, paramName); + if (!attachedResourceId.isPresent()) { + return Optional.empty(); + } + AttachedResourceId resourceId = attachedResourceId.get(); + if (resourceId.isGetParam() && resourceId.getEntityId() instanceof String) { + TranslatedHeatResource shareResource = + translateTo.getContext().getHeatSharedResourcesByParam().get(resourceId.getEntityId()); + if (Objects.isNull(shareResource)) { + List<FileData> allFilesData = + translateTo.getContext().getManifest().getContent().getData(); + Optional<FileData> fileData = + HeatToToscaUtil.getFileData(translateTo.getHeatFileName(), allFilesData); + if (fileData.isPresent()) { + Optional<ResourceFileDataAndIDs> fileDataContainingResource = + new VolumeTranslationHelper(logger) + .getFileDataContainingVolume(fileData.get().getData(), + (String) resourceId.getEntityId(), translateTo, FileData.Type.HEAT_VOL); + if (fileDataContainingResource.isPresent()) { + mdcDataDebugMessage.debugExitMessage(null, null); + return Optional.of(fileDataContainingResource.get().getTranslatedResourceId()); + } + } + } + } + + mdcDataDebugMessage.debugExitMessage(null, null); + return Optional.empty(); + } + } + + private List<Predicate<Map.Entry<String, Resource>>> buildPredicates( + String fileName, + HeatOrchestrationTemplate heatOrchestrationTemplate, + String novaTranslatedResourceId) { List<Predicate<Map.Entry<String, Resource>>> list = new ArrayList<>(); list.add(entry -> entry.getValue().getType().equals(getDesiredResourceType())); list.add(entry -> { @@ -137,92 +250,20 @@ class NovaToVolResourceConnection extends NovaAndPortResourceConnectionHelper { .extractAttachedResourceId(fileName, heatOrchestrationTemplate, context, instanceUuidProp); if (instanceUuid.isPresent()) { - Optional<String> resourceTranslatedId = ResourceTranslationBase - .getResourceTranslatedId(fileName, heatOrchestrationTemplate, + Optional<String> resourceTranslatedId = + ResourceTranslationBase.getResourceTranslatedId(fileName, heatOrchestrationTemplate, (String) instanceUuid.get().getTranslatedId(), context); return resourceTranslatedId.isPresent() && resourceTranslatedId.get().equals(novaTranslatedResourceId); } else { + MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB, + LoggerTragetServiceName.GET_RESOURCE, ErrorLevel.ERROR.name(), + LoggerErrorCode.DATA_ERROR.getErrorCode(), + LoggerErrorDescription.MISSING_MANDATORY_PROPERTY); throw new CoreException(new MissingMandatoryPropertyErrorBuilder("instance_uuid").build()); } }); return list; } - - @Override - String getTranslatedResourceIdFromSubstitutionMapping(ServiceTemplate nestedServiceTemplate, - Map.Entry<String, - RequirementDefinition> entry) { - List<String> substitutionMapping = - nestedServiceTemplate.getTopology_template().getSubstitution_mappings().getRequirements() - .get(entry.getKey()); - return substitutionMapping.get(0); - } - - @Override - void addRequirementToConnectResources(Map.Entry<String, RequirementDefinition> entry, - List<String> paramNames) { - String paramName = paramNames.get(0); - Optional<AttachedResourceId> attachedResourceId = - HeatToToscaUtil.extractAttachedResourceId(translateTo, paramName); - String node; - if (!attachedResourceId.isPresent()) { - return; - } - AttachedResourceId attachedResource = attachedResourceId.get(); - if (attachedResource.isGetResource()) { - String volTranslatedId = (String) attachedResource.getTranslatedId(); - Resource volServerResource = HeatToToscaUtil - .getResource(translateTo.getHeatOrchestrationTemplate(), volTranslatedId, - translateTo.getHeatFileName()); - if (!StringUtils.equals(HeatResourcesTypes.CINDER_VOLUME_RESOURCE_TYPE.getHeatResource(), - volServerResource.getType())) { - logger.warn("Volume attachment used from nested resource " + translateTo.getResourceId() - + " is pointing to incorrect resource type(" + volServerResource.getType() - + ") for relation through the parameter '" + paramName + "." - + " The connection to the volume is ignored. " - + "Supported types are: " - + HeatResourcesTypes.CINDER_VOLUME_RESOURCE_TYPE.getHeatResource()); - return; - } - node = volTranslatedId; - createRequirementAssignment(entry, node, substitutionNodeTemplate); - } else if (attachedResource.isGetParam()) { - TranslatedHeatResource shareResource = - translateTo.getContext().getHeatSharedResourcesByParam() - .get(attachedResource.getEntityId()); - if (Objects.nonNull(shareResource) - && !HeatToToscaUtil.isHeatFileNested(translateTo, translateTo.getHeatFileName())) { - if (!StringUtils.equals(HeatResourcesTypes.CINDER_VOLUME_RESOURCE_TYPE.getHeatResource(), - shareResource.getHeatResource().getType())) { - logger.warn("Volume attachment used from nested resource " + translateTo.getResourceId() - + " is pointing to incorrect resource type(" - + shareResource.getHeatResource().getType() + ") for relation through the parameter '" - + paramName + "." - + " The connection to the volume is ignored. " - + "Supported types are: " - + HeatResourcesTypes.CINDER_VOLUME_RESOURCE_TYPE.getHeatResource()); - return; - } - node = shareResource.getTranslatedId(); - createRequirementAssignment(entry, node, substitutionNodeTemplate); - } else if (Objects.isNull(shareResource)) { - List<FileData> allFilesData = translateTo.getContext().getManifest().getContent().getData(); - Optional<FileData> fileData = - HeatToToscaUtil.getFileData(translateTo.getHeatFileName(), allFilesData); - if (fileData.isPresent()) { - Optional<ResourceFileDataAndIDs> fileDataContainingResource = - new VolumeTranslationHelper(logger) - .getFileDataContainingVolume(fileData.get().getData(), - (String) attachedResource.getEntityId(), translateTo, FileData.Type.HEAT_VOL); - if (fileDataContainingResource.isPresent()) { - createRequirementAssignment(entry, - fileDataContainingResource.get().getTranslatedResourceId(), - substitutionNodeTemplate); - } - } - } - } - } } diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/PortToNetResourceConnection.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/PortToNetResourceConnection.java new file mode 100644 index 0000000000..d3e8676ca1 --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/PortToNetResourceConnection.java @@ -0,0 +1,159 @@ +/*- + * ============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.services.heattotosca.impl.resourcetranslation; + +import org.openecomp.sdc.common.utils.CommonUtil; +import org.openecomp.sdc.heat.datatypes.manifest.FileData; +import org.openecomp.sdc.heat.datatypes.model.HeatOrchestrationTemplate; +import org.openecomp.sdc.heat.datatypes.model.HeatResourcesTypes; +import org.openecomp.sdc.heat.datatypes.model.Resource; +import org.openecomp.sdc.tosca.datatypes.ToscaCapabilityType; +import org.openecomp.sdc.tosca.datatypes.ToscaNodeType; +import org.openecomp.sdc.tosca.datatypes.ToscaRelationshipType; +import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate; +import org.openecomp.sdc.tosca.datatypes.model.NodeType; +import org.openecomp.sdc.tosca.datatypes.model.RequirementDefinition; +import org.openecomp.sdc.translator.datatypes.heattotosca.AttachedResourceId; +import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo; +import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.function.Predicate; + +public class PortToNetResourceConnection extends ResourceConnectionUsingRequirementHelper { + + public PortToNetResourceConnection(ResourceTranslationBase resourceTranslationBase, + TranslateTo translateTo, FileData nestedFileData, + NodeTemplate substitutionNodeTemplate, NodeType nodeType) { + super(resourceTranslationBase, translateTo, nestedFileData, substitutionNodeTemplate, nodeType); + } + + @Override + protected boolean isDesiredNodeTemplateType(NodeTemplate nodeTemplate) { + return nodeTemplate.getType().equals(ToscaNodeType.NEUTRON_PORT); + } + + @Override + protected List<Predicate<RequirementDefinition>> getPredicatesListForConnectionPoints() { + ArrayList<Predicate<RequirementDefinition>> predicates = new ArrayList<>(); + predicates.add( + req -> req.getCapability().equals(ToscaCapabilityType.NATIVE_NETWORK_LINKABLE) + && (req.getNode() == null || req.getNode().equals(ToscaNodeType.NATIVE_ROOT)) + && req.getRelationship().equals( + ToscaRelationshipType.NATIVE_NETWORK_LINK_TO)); + return predicates; + } + + @Override + protected Optional<List<String>> getConnectorPropertyParamName(String heatResourceId, + Resource heatResource, + HeatOrchestrationTemplate + nestedHeatOrchestrationTemplate, + String nestedHeatFileName) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + Optional<AttachedResourceId> network = HeatToToscaUtil + .extractAttachedResourceId(nestedHeatFileName, nestedHeatOrchestrationTemplate, + translateTo.getContext(), heatResource.getProperties().get("network")); + if (network.isPresent() && network.get().isGetParam() + && network.get().getEntityId() instanceof String) { + return Optional.of(Collections.singletonList((String) network.get().getEntityId())); + } else { + network = HeatToToscaUtil + .extractAttachedResourceId(nestedHeatFileName, nestedHeatOrchestrationTemplate, + translateTo.getContext(), heatResource.getProperties().get("network_id")); + if (network.isPresent() + && network.get().isGetParam() + && network.get().getEntityId() instanceof String) { + mdcDataDebugMessage.debugExitMessage(null, null); + return Optional.of(Collections.singletonList((String) network.get().getEntityId())); + } else { + mdcDataDebugMessage.debugExitMessage(null, null); + return Optional.empty(); + } + } + } + + @Override + protected String getDesiredResourceType() { + return HeatResourcesTypes.NEUTRON_PORT_RESOURCE_TYPE.getHeatResource(); + } + + @Override + protected void addRequirementToConnectResources( + Map.Entry<String, RequirementDefinition> requirementDefinitionEntry, + List<String> paramNames) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + if (paramNames == null || paramNames.isEmpty()) { + return; + } + String paramName = paramNames.get( + 0); // port can connect to one network only and we are + // expecting to have only one param(unlike security rules to port) + Object paramValue = translateTo.getResource().getProperties().get(paramName); + List<String> supportedNetworkTypes = + Arrays.asList(HeatResourcesTypes.NEUTRON_NET_RESOURCE_TYPE.getHeatResource(), + HeatResourcesTypes.CONTRAIL_VIRTUAL_NETWORK_RESOURCE_TYPE.getHeatResource(), + HeatResourcesTypes.CONTRAIL_V2_VIRTUAL_NETWORK_RESOURCE_TYPE.getHeatResource()); + + addRequirementToConnectResource(requirementDefinitionEntry, paramName, paramValue, + supportedNetworkTypes); + + mdcDataDebugMessage.debugExitMessage(null, null); + } + + @Override + boolean validateResourceTypeSupportedForReqCreation(String nestedResourceId, + final String nestedPropertyName, + String connectionPointId, + Resource connectedResource, + List<String> supportedTypes) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + if (!resourceTranslationBase.isResourceTypeSupported(connectedResource, supportedTypes)) { + logger.warn("Nested resource '" + nestedResourceId + "' property '" + nestedPropertyName + + "' is pointing to a resource with type '" + connectedResource.getType() + + "' which is not supported for requirement '" + connectionPointId + + "' that connect port to network. Supported types are: '" + supportedTypes.toString() + + "', therefore, this TOSCA requirement will not be connected."); + + mdcDataDebugMessage.debugExitMessage(null, null); + return false; + } + + mdcDataDebugMessage.debugExitMessage(null, null); + return true; + } + + +} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceConnectionUsingCapabilityHelper.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceConnectionUsingCapabilityHelper.java new file mode 100644 index 0000000000..231190a16f --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceConnectionUsingCapabilityHelper.java @@ -0,0 +1,210 @@ +/*- + * ============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.services.heattotosca.impl.resourcetranslation; + +import org.openecomp.sdc.common.utils.CommonUtil; +import org.openecomp.sdc.heat.datatypes.manifest.FileData; +import org.openecomp.sdc.heat.datatypes.model.Resource; +import org.openecomp.sdc.tosca.datatypes.model.CapabilityDefinition; +import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate; +import org.openecomp.sdc.tosca.datatypes.model.NodeType; +import org.openecomp.sdc.tosca.datatypes.model.RequirementAssignment; +import org.openecomp.sdc.tosca.datatypes.model.RequirementDefinition; +import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; +import org.openecomp.sdc.tosca.services.DataModelUtil; +import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo; +import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslatedHeatResource; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.ConsolidationData; +import org.openecomp.sdc.translator.services.heattotosca.ConsolidationDataUtil; +import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil; +import org.openecomp.sdc.translator.services.heattotosca.ResourceTranslationFactory; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.function.Predicate; + +public abstract class ResourceConnectionUsingCapabilityHelper + extends BaseResourceConnection<CapabilityDefinition> { + public ResourceConnectionUsingCapabilityHelper(ResourceTranslationBase resourceTranslationBase, + TranslateTo translateTo, FileData nestedFileData, + NodeTemplate substitutionNodeTemplate, + NodeType nodeType) { + super(resourceTranslationBase, translateTo, nestedFileData, substitutionNodeTemplate, nodeType); + } + + abstract Map.Entry<String, RequirementDefinition> createRequirementDefinition( + String capabilityKey); + + @Override + String getMappedNodeTranslatedResourceId(ServiceTemplate nestedServiceTemplate, + Map.Entry<String, + CapabilityDefinition> connectionPointEntry) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + List<String> substitutionMapping = + nestedServiceTemplate.getTopology_template().getSubstitution_mappings().getCapabilities() + .get(connectionPointEntry.getKey()); + + mdcDataDebugMessage.debugExitMessage(null, null); + return substitutionMapping.get(0); + } + + @Override + Map.Entry<String, CapabilityDefinition> getMappedConnectionPointEntry( + ServiceTemplate nestedServiceTemplate, + Map.Entry<String, CapabilityDefinition> connectionPointEntry) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + List<String> substitutionMapping = + nestedServiceTemplate.getTopology_template().getSubstitution_mappings().getCapabilities() + .get(connectionPointEntry.getKey()); + String mappedNodeTranslatedId = substitutionMapping.get(0); + String mappedCapabilityId = substitutionMapping.get(1); + NodeTemplate mappedNodeTemplate = + nestedServiceTemplate.getTopology_template().getNode_templates() + .get(mappedNodeTranslatedId); + NodeType substituteNodeType = + translateTo.getContext().getGlobalSubstitutionServiceTemplate().getNode_types() + .get(mappedNodeTemplate.getType()); + Optional<CapabilityDefinition> capabilityDefinition = + DataModelUtil.getCapabilityDefinition(substituteNodeType, mappedCapabilityId); + + mdcDataDebugMessage.debugExitMessage(null, null); + return new Map.Entry<String, CapabilityDefinition>() { + @Override + public String getKey() { + return mappedCapabilityId; + } + + @Override + public CapabilityDefinition getValue() { + return capabilityDefinition.get(); + } + + @Override + public CapabilityDefinition setValue(CapabilityDefinition value) { + return null; + } + }; + } + + @Override + protected List<Map<String, CapabilityDefinition>> getAllConnectionPoints() { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + List<Map<String, CapabilityDefinition>> exposedRequirementsList = new ArrayList<>(); + List<Predicate<CapabilityDefinition>> predicates = getPredicatesListForConnectionPoints(); + Map<String, CapabilityDefinition> capabilities = this.nodeType.getCapabilities(); + if (capabilities == null) { + return exposedRequirementsList; + } + capabilities.entrySet() + .stream() + .filter(entry -> predicates + .stream() + .anyMatch(p -> p.test(entry.getValue()))) + .forEach(entry -> { + Map<String, CapabilityDefinition> exposedRequirementsMap = new HashMap<>(); + exposedRequirementsMap.put(entry.getKey(), entry.getValue()); + exposedRequirementsList.add(exposedRequirementsMap); + }); + + mdcDataDebugMessage.debugExitMessage(null, null); + return exposedRequirementsList; + } + + void addRequirementToConnectResource(Map.Entry<String, CapabilityDefinition> connectionPointEntry, + List<String> supportedSourceNodeTypes, String paramName) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + Object paramValue = translateTo.getResource().getProperties().get(paramName); + if (paramValue == null) { + logger.warn("'" + paramName + "' property is not define in nested resource '" + + translateTo.getResourceId() + "' for the nested heat file, therefore, '" + + connectionPointEntry.getKey() + "' TOSCA capability will not be connected."); + mdcDataDebugMessage.debugExitMessage(null, null); + return; + } + + Map.Entry<String, RequirementDefinition> requirementDefinition = + createRequirementDefinition(connectionPointEntry.getKey()); + + Optional<String> sourceResourceId = + getConnectionResourceUsingGetResourceFunc(connectionPointEntry, paramName, paramValue, + supportedSourceNodeTypes); + if (sourceResourceId.isPresent()) { + Resource sourceResource = HeatToToscaUtil + .getResource(translateTo.getHeatOrchestrationTemplate(), sourceResourceId.get(), + translateTo.getHeatFileName()); + Optional<String> translatedSourceNodeId = + ResourceTranslationFactory.getInstance(sourceResource) + .translateResource(translateTo.getHeatFileName(), translateTo.getServiceTemplate(), + translateTo.getHeatOrchestrationTemplate(), sourceResource, + sourceResourceId.get(), translateTo.getContext()); + if (translatedSourceNodeId.isPresent()) { + NodeTemplate sourceNodeTemplate = DataModelUtil + .getNodeTemplate(translateTo.getServiceTemplate(), translatedSourceNodeId.get()); + RequirementAssignment requirementAssignment = createRequirementAssignment( + requirementDefinition, translateTo.getTranslatedId(), sourceNodeTemplate); + ConsolidationDataUtil.updateNodesConnectedData(translateTo, translateTo.getResourceId(), + translateTo.getResource(), sourceResource, translatedSourceNodeId.get(), + requirementDefinition.getKey(), requirementAssignment); + } else { + logger.warn( + "'" + sourceResource.getType() + "' connection to '" + connectionPointEntry.getKey() + + "' capability of type '" + connectionPointEntry.getValue().getType() + + "' is not supported/invalid, therefore this connection will be ignored in the " + + "TOSCA translation"); + } + } else { + Optional<TranslatedHeatResource> sharedSourceTranslatedHeatResource = + getConnectionTranslatedHeatResourceUsingGetParamFunc(connectionPointEntry, paramName, + supportedSourceNodeTypes); + if (sharedSourceTranslatedHeatResource.isPresent()) { + NodeTemplate sharedSourceNodeTemplate = DataModelUtil + .getNodeTemplate(translateTo.getServiceTemplate(), + sharedSourceTranslatedHeatResource.get().getTranslatedId()); + RequirementAssignment requirementAssignment = createRequirementAssignment( + requirementDefinition, translateTo.getTranslatedId(), sharedSourceNodeTemplate); + + ConsolidationDataUtil.updateNodesConnectedData(translateTo, translateTo.getResourceId(), + translateTo.getResource(), sharedSourceTranslatedHeatResource.get().getHeatResource(), + sharedSourceTranslatedHeatResource.get().getTranslatedId(), + requirementDefinition.getKey(), + requirementAssignment); + } + } + + mdcDataDebugMessage.debugExitMessage(null, null); + } + +} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceConnectionUsingRequirementHelper.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceConnectionUsingRequirementHelper.java new file mode 100644 index 0000000000..6ddd0c7334 --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceConnectionUsingRequirementHelper.java @@ -0,0 +1,163 @@ +/*- + * ============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.services.heattotosca.impl.resourcetranslation; + +import org.openecomp.sdc.common.utils.CommonUtil; +import org.openecomp.sdc.heat.datatypes.manifest.FileData; +import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate; +import org.openecomp.sdc.tosca.datatypes.model.NodeType; +import org.openecomp.sdc.tosca.datatypes.model.RequirementDefinition; +import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; +import org.openecomp.sdc.tosca.services.DataModelUtil; +import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.function.Predicate; + +public abstract class ResourceConnectionUsingRequirementHelper + extends BaseResourceConnection<RequirementDefinition> { + public ResourceConnectionUsingRequirementHelper(ResourceTranslationBase resourceTranslationBase, + TranslateTo translateTo, FileData nestedFileData, + NodeTemplate substitutionNodeTemplate, + NodeType nodeType) { + super(resourceTranslationBase, translateTo, nestedFileData, substitutionNodeTemplate, nodeType); + } + + @Override + String getMappedNodeTranslatedResourceId(ServiceTemplate nestedServiceTemplate, + Map.Entry<String, + RequirementDefinition> connectionPointEntry) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + List<String> substitutionMapping = + nestedServiceTemplate.getTopology_template().getSubstitution_mappings().getRequirements() + .get(connectionPointEntry.getKey()); + + mdcDataDebugMessage.debugExitMessage(null, null); + return substitutionMapping.get(0); + } + + @Override + Map.Entry<String, RequirementDefinition> getMappedConnectionPointEntry( + ServiceTemplate nestedServiceTemplate, + Map.Entry<String, RequirementDefinition> connectionPointEntry) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + List<String> substitutionMapping = + nestedServiceTemplate.getTopology_template().getSubstitution_mappings().getRequirements() + .get(connectionPointEntry.getKey()); + String mappedNodeTranslatedId = substitutionMapping.get(0); + String mappedReqId = substitutionMapping.get(1); + NodeTemplate mappedNodeTemplate = + nestedServiceTemplate.getTopology_template().getNode_templates() + .get(mappedNodeTranslatedId); + NodeType substituteNodeType = + translateTo.getContext().getGlobalSubstitutionServiceTemplate().getNode_types() + .get(mappedNodeTemplate.getType()); + Optional<RequirementDefinition> requirementDefinition = + DataModelUtil.getRequirementDefinition(substituteNodeType, mappedReqId); + + mdcDataDebugMessage.debugExitMessage(null, null); + return new Map.Entry<String, RequirementDefinition>() { + @Override + public String getKey() { + return mappedReqId; + } + + @Override + public RequirementDefinition getValue() { + return requirementDefinition.get(); + } + + @Override + public RequirementDefinition setValue(RequirementDefinition value) { + return null; + } + }; + } + + @Override + List<Map<String, RequirementDefinition>> getAllConnectionPoints() { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + List<Map<String, RequirementDefinition>> exposedRequirementsList = new ArrayList<>(); + List<Predicate<RequirementDefinition>> predicates = getPredicatesListForConnectionPoints(); + List<Map<String, RequirementDefinition>> requirements = this.nodeType.getRequirements(); + if (requirements == null) { + return exposedRequirementsList; + } + requirements.stream() + .map(Map::entrySet) + .forEach(x -> x.stream() + .filter(entry -> predicates + .stream() + .anyMatch(p -> p.test(entry.getValue()))) + .forEach(entry -> { + Map<String, RequirementDefinition> exposedRequirementsMap = new HashMap<>(); + exposedRequirementsMap.put(entry.getKey(), entry.getValue()); + exposedRequirementsList.add(exposedRequirementsMap); + })); + + mdcDataDebugMessage.debugExitMessage(null, null); + return exposedRequirementsList; + } + + void addRequirementToConnectResource( + Map.Entry<String, RequirementDefinition> requirementDefinitionEntry, String paramName, + Object paramValue, List<String> supportedNetworkTypes) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + if (paramValue == null) { + logger.warn("'" + paramName + "' property is not define in nested resource '" + + translateTo.getResourceId() + "' for the nested heat file, therefore, '" + + requirementDefinitionEntry.getKey() + "' TOSCA requirement will not be connected."); + return; + } + Optional<String> targetTranslatedNodeId = + getConnectionTranslatedNodeUsingGetResourceFunc(requirementDefinitionEntry, paramName, + paramValue, supportedNetworkTypes); + if (targetTranslatedNodeId.isPresent()) { + createRequirementAssignment(requirementDefinitionEntry, targetTranslatedNodeId.get(), + substitutionNodeTemplate); + } else { + targetTranslatedNodeId = + getConnectionTranslatedNodeUsingGetParamFunc(requirementDefinitionEntry, paramName, + supportedNetworkTypes); + targetTranslatedNodeId + .ifPresent(targetTranslatedId -> createRequirementAssignment(requirementDefinitionEntry, + targetTranslatedId, substitutionNodeTemplate)); + } + + mdcDataDebugMessage.debugExitMessage(null, null); + } +} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationBase.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationBase.java new file mode 100644 index 0000000000..385a0fb0f5 --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationBase.java @@ -0,0 +1,354 @@ +/*- + * ============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.services.heattotosca.impl.resourcetranslation; + +import org.apache.commons.collections4.CollectionUtils; +import org.openecomp.sdc.common.errors.CoreException; +import org.openecomp.sdc.datatypes.error.ErrorLevel; +import org.openecomp.sdc.heat.datatypes.model.HeatOrchestrationTemplate; +import org.openecomp.sdc.heat.datatypes.model.Resource; +import org.openecomp.sdc.logging.context.impl.MdcDataDebugMessage; +import org.openecomp.sdc.logging.context.impl.MdcDataErrorMessage; +import org.openecomp.sdc.logging.types.LoggerConstants; +import org.openecomp.sdc.logging.types.LoggerErrorCode; +import org.openecomp.sdc.logging.types.LoggerErrorDescription; +import org.openecomp.sdc.logging.types.LoggerTragetServiceName; +import org.openecomp.sdc.tosca.datatypes.ToscaCapabilityType; +import org.openecomp.sdc.tosca.datatypes.ToscaRelationshipType; +import org.openecomp.sdc.tosca.datatypes.ToscaTopologyTemplateElements; +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.ToscaConstants; +import org.openecomp.sdc.translator.datatypes.heattotosca.TranslationContext; +import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo; +import org.openecomp.sdc.translator.services.heattotosca.ConsolidationDataUtil; +import org.openecomp.sdc.translator.services.heattotosca.ConsolidationEntityType; +import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil; +import org.openecomp.sdc.translator.services.heattotosca.ResourceTranslationFactory; +import org.openecomp.sdc.translator.services.heattotosca.errors.ResourceNotFoundInHeatFileErrorBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +public abstract class ResourceTranslationBase { + + protected static Logger logger = (Logger) LoggerFactory.getLogger(ResourceTranslationBase.class); + protected static MdcDataDebugMessage mdcDataDebugMessage = new MdcDataDebugMessage(); + + protected abstract void translate(TranslateTo translateTo); + + /** + * Translate resource. + * + * @param heatFileName the heat file name + * @param serviceTemplate the service template + * @param heatOrchestrationTemplate the heat orchestration template + * @param resource the resource + * @param resourceId the resource id + * @param context the context + * @return the translated id if this resource is supported, or empty value if not supported + */ + public Optional<String> translateResource(String heatFileName, ServiceTemplate serviceTemplate, + HeatOrchestrationTemplate heatOrchestrationTemplate, + Resource resource, String resourceId, + TranslationContext context) { + + mdcDataDebugMessage.debugEntryMessage("file, resource", heatFileName, resourceId); + Optional<String> translatedId = + getResourceTranslatedId(heatFileName, heatOrchestrationTemplate, resourceId, context); + context.getTranslatedResources().putIfAbsent(heatFileName, new HashSet<>()); + if (context.getTranslatedResources().get(heatFileName).contains(resourceId)) { + return translatedId; + } + if (!translatedId.isPresent()) { + return Optional.empty(); + } + logger.debug("Translate- file:" + heatFileName + " resource Id:" + resourceId + + " translated resource id:" + translatedId.get()); + TranslateTo translateTo = new TranslateTo(heatFileName, serviceTemplate, + heatOrchestrationTemplate, resource, resourceId, translatedId.get(), context); + translate(translateTo); + context.getTranslatedResources().get(heatFileName).add(resourceId); + + if (DataModelUtil.isNodeTemplate(translatedId.get(), serviceTemplate)) { + if (!context.getHeatStackGroupMembers().containsKey(heatFileName)) { + context.getHeatStackGroupMembers().put(heatFileName, new HashSet<>()); + } + context.getHeatStackGroupMembers().get(heatFileName).add(translatedId.get()); + updateResourceDependency(translateTo); + } + + mdcDataDebugMessage.debugExitMessage("file, resource", heatFileName, resourceId); + return translatedId; + } + + /** + * Gets resource translated id. + * + * @param heatFileName the heat file name + * @param heatOrchestrationTemplate the heat orchestration template + * @param resourceId the resource id + * @param context the context + * @return the resource translated id + */ + public static Optional<String> getResourceTranslatedId(String heatFileName, + HeatOrchestrationTemplate + heatOrchestrationTemplate, + String resourceId, + TranslationContext context) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + if (!context.getTranslatedIds().containsKey(heatFileName)) { + context.getTranslatedIds().put(heatFileName, new HashMap<>()); + } + + Map<String, String> translatedIdsPerFile = context.getTranslatedIds().get(heatFileName); + String translatedId = translatedIdsPerFile.get(resourceId); + if (translatedId != null) { + return Optional.of(translatedId); + } + + Resource resource = heatOrchestrationTemplate.getResources().get(resourceId); + if (resource == null) { + MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB, + LoggerTragetServiceName.GET_RESOURCE, ErrorLevel.ERROR.name(), + LoggerErrorCode.DATA_ERROR.getErrorCode(), LoggerErrorDescription.TRANSLATE_HEAT); + throw new CoreException( + new ResourceNotFoundInHeatFileErrorBuilder(resourceId, heatFileName).build()); + } + TranslateTo translateTo = + generateTranslationTo(heatFileName, null, heatOrchestrationTemplate, resource, resourceId, + null, context); + translatedId = + ResourceTranslationFactory.getInstance(resource).generateTranslatedId(translateTo); + if (translatedId != null) { + context.getTranslatedIds().get(heatFileName).put(resourceId, translatedId); + } + + mdcDataDebugMessage.debugExitMessage(null, null); + return Optional.ofNullable(translatedId); + } + + + /** + * Gets resource translated element template. + * + * @param heatFileName the heat file name + * @param heatOrchestrationTemplate the heat orchestration template + * @param resourceId the resource id + * @param context the context + * @return the resource translated element template + */ + public static Optional<ToscaTopologyTemplateElements> getResourceTranslatedElementTemplate( + String heatFileName, + HeatOrchestrationTemplate heatOrchestrationTemplate, + String resourceId, TranslationContext context) { + + mdcDataDebugMessage.debugEntryMessage(null, null); + + Resource resource = heatOrchestrationTemplate.getResources().get(resourceId); + if (resource == null) { + MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB, + LoggerTragetServiceName.GET_RESOURCE, ErrorLevel.ERROR.name(), + LoggerErrorCode.DATA_ERROR.getErrorCode(), LoggerErrorDescription.TRANSLATE_HEAT); + throw new CoreException( + new ResourceNotFoundInHeatFileErrorBuilder(resourceId, heatFileName).build()); + } + TranslateTo translateTo = + generateTranslationTo(heatFileName, null, heatOrchestrationTemplate, resource, resourceId, + null, context); + + Optional<ToscaTopologyTemplateElements> translatedElementTemplate = + ResourceTranslationFactory.getInstance(resource) + .getTranslatedToscaTopologyElement(translateTo); + + mdcDataDebugMessage.debugExitMessage(null, null); + return translatedElementTemplate; + } + + protected String generateTranslatedId(TranslateTo translateTo) { + if (isEssentialRequirementsValid(translateTo)) { + return translateTo.getResourceId(); + } else { + return null; + } + + } + + protected Optional<ToscaTopologyTemplateElements> getTranslatedToscaTopologyElement( + TranslateTo translateTo) { + if (isEssentialRequirementsValid(translateTo)) { + return Optional.of(ToscaTopologyTemplateElements.NODE_TEMPLATE); + } else { + return Optional.empty(); + } + } + + protected boolean isEssentialRequirementsValid(TranslateTo translateTo) { + return true; + } + + private static TranslateTo generateTranslationTo(String heatFileName, + ServiceTemplate serviceTemplate, + HeatOrchestrationTemplate + heatOrchestrationTemplate, + Resource resource, String resourceId, + String translatedId, + TranslationContext context) { + TranslateTo to = new TranslateTo(); + to.setHeatFileName(heatFileName); + to.setServiceTemplate(serviceTemplate); + to.setHeatOrchestrationTemplate(heatOrchestrationTemplate); + to.setResource(resource); + to.setResourceId(resourceId); + to.setTranslatedId(translatedId); + to.setContext(context); + return to; + } + + private void updateResourceDependency(TranslateTo translateTo) { + + String heatFileName = translateTo.getHeatFileName(); + mdcDataDebugMessage.debugEntryMessage("file", heatFileName); + + Resource resource = translateTo.getResource(); + HeatOrchestrationTemplate heatOrchestrationTemplate = translateTo + .getHeatOrchestrationTemplate(); + String translatedId = translateTo.getTranslatedId(); + ServiceTemplate serviceTemplate = translateTo.getServiceTemplate(); + TranslationContext context = translateTo.getContext(); + if (resource.getDepends_on() == null) { + return; + } + + if (resource.getDepends_on() instanceof List) { + List<String> dependsOnList = (List<String>) resource.getDepends_on(); + for (String dependsOnResourceId : dependsOnList) { + addDependOnRequirement(dependsOnResourceId, translateTo); + } + } else { + String dependsOnResourceId = (String) resource.getDepends_on(); + addDependOnRequirement(dependsOnResourceId, translateTo); + } + + mdcDataDebugMessage.debugExitMessage("file", heatFileName); + } + + private void addDependOnRequirement(String dependsOnResourceId, TranslateTo translateTo) { + + mdcDataDebugMessage.debugEntryMessage(null, null); + String nodeTemplateId = translateTo.getTranslatedId(); + ServiceTemplate serviceTemplate = translateTo.getServiceTemplate(); + String heatFileName = translateTo.getHeatFileName(); + HeatOrchestrationTemplate heatOrchestrationTemplate = translateTo + .getHeatOrchestrationTemplate(); + TranslationContext context = translateTo.getContext(); + RequirementAssignment requirementAssignment = new RequirementAssignment(); + Optional<String> resourceTranslatedId = + getResourceTranslatedId(heatFileName, heatOrchestrationTemplate, dependsOnResourceId, + context); + + Optional<ToscaTopologyTemplateElements> resourceTranslatedElementTemplate = + getResourceTranslatedElementTemplate(heatFileName, heatOrchestrationTemplate, + dependsOnResourceId, context); + + if (resourceTranslatedId.isPresent() + && (resourceTranslatedElementTemplate.isPresent() && resourceTranslatedElementTemplate + .get() == ToscaTopologyTemplateElements.NODE_TEMPLATE)) { + Resource sourceResource = translateTo.getResource(); + Resource targetResource = HeatToToscaUtil + .getResource(heatOrchestrationTemplate, dependsOnResourceId, + translateTo.getHeatFileName()); + if (HeatToToscaUtil + .isValidDependsOnCandidate(heatOrchestrationTemplate, sourceResource, targetResource, + ConsolidationEntityType.OTHER, translateTo.getContext())) { + requirementAssignment.setNode(resourceTranslatedId.get()); + requirementAssignment.setCapability(ToscaCapabilityType.NATIVE_NODE); + requirementAssignment.setRelationship(ToscaRelationshipType.NATIVE_DEPENDS_ON); + DataModelUtil.addRequirementAssignment( + serviceTemplate.getTopology_template().getNode_templates().get(nodeTemplateId), + ToscaConstants.DEPENDS_ON_REQUIREMENT_ID, requirementAssignment); + Resource dependsOnResource = targetResource; + ConsolidationDataUtil + .updateNodesConnectedData(translateTo, dependsOnResourceId, dependsOnResource, + sourceResource, nodeTemplateId, ToscaConstants.DEPENDS_ON_REQUIREMENT_ID, + requirementAssignment); + } + } + mdcDataDebugMessage.debugExitMessage(null, null); + } + + Optional<List<Map.Entry<String, Resource>>> getResourceByTranslatedResourceId( + String heatFileName, + HeatOrchestrationTemplate heatOrchestrationTemplate, + String translatedResourceId, + TranslateTo translateTo, + String heatResourceType) { + mdcDataDebugMessage.debugEntryMessage(null, null); + List<Map.Entry<String, Resource>> list = heatOrchestrationTemplate.getResources().entrySet() + .stream() + .filter(entry -> getPredicatesForTranslatedIdToResourceId(heatFileName, + heatOrchestrationTemplate, translatedResourceId, translateTo.getContext(), + heatResourceType) + .stream() + .allMatch(p -> p.test(entry))) + .collect(Collectors.toList()); + if (CollectionUtils.isEmpty(list)) { + mdcDataDebugMessage.debugExitMessage(null, null); + return Optional.empty(); + } else { + mdcDataDebugMessage.debugExitMessage(null, null); + return Optional.of(list); + } + } + + private List<Predicate<Map.Entry<String, Resource>>> getPredicatesForTranslatedIdToResourceId( + String heatFileName, HeatOrchestrationTemplate heatOrchestrationTemplate, + String translatedResourceId, TranslationContext context, String heatResourceType) { + List<Predicate<Map.Entry<String, Resource>>> list = new ArrayList<>(); + list.add(entry -> + entry.getValue().getType().equals(heatResourceType)); + list.add(entry -> { + Optional<String> resourceTranslatedId = + getResourceTranslatedId(heatFileName, heatOrchestrationTemplate, entry.getKey(), context); + return resourceTranslatedId.isPresent() + && resourceTranslatedId.get().equals(translatedResourceId); + }); + return list; + } + + boolean isResourceTypeSupported(Resource resource, List<String> supporteTypes) { + return Objects.nonNull(resource) && supporteTypes.contains(resource.getType()); + } + +} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/ResourceTranslationCinderVolumeAttachmentImpl.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationCinderVolumeAttachmentImpl.java index cbad52a95d..4cf817bcae 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/ResourceTranslationCinderVolumeAttachmentImpl.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationCinderVolumeAttachmentImpl.java @@ -18,53 +18,69 @@ * ============LICENSE_END========================================================= */ -package org.openecomp.sdc.translator.services.heattotosca.impl; +package org.openecomp.sdc.translator.services.heattotosca.impl.resourcetranslation; import static org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil.getResource; import org.apache.commons.lang3.StringUtils; import org.openecomp.sdc.common.errors.CoreException; +import org.openecomp.sdc.datatypes.error.ErrorLevel; import org.openecomp.sdc.heat.datatypes.manifest.FileData; import org.openecomp.sdc.heat.datatypes.model.HeatResourcesTypes; import org.openecomp.sdc.heat.datatypes.model.Resource; +import org.openecomp.sdc.heat.services.HeatConstants; +import org.openecomp.sdc.logging.api.Logger; +import org.openecomp.sdc.logging.api.LoggerFactory; +import org.openecomp.sdc.logging.context.impl.MdcDataErrorMessage; +import org.openecomp.sdc.logging.types.LoggerConstants; +import org.openecomp.sdc.logging.types.LoggerErrorCode; +import org.openecomp.sdc.logging.types.LoggerErrorDescription; +import org.openecomp.sdc.logging.types.LoggerTragetServiceName; import org.openecomp.sdc.tosca.datatypes.ToscaRelationshipType; +import org.openecomp.sdc.tosca.datatypes.ToscaTopologyTemplateElements; import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate; import org.openecomp.sdc.tosca.datatypes.model.RelationshipTemplate; import org.openecomp.sdc.tosca.datatypes.model.RequirementAssignment; import org.openecomp.sdc.tosca.services.DataModelUtil; +import org.openecomp.sdc.tosca.services.ToscaConstants; import org.openecomp.sdc.translator.datatypes.heattotosca.AttachedResourceId; import org.openecomp.sdc.translator.datatypes.heattotosca.to.ResourceFileDataAndIDs; import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo; +import org.openecomp.sdc.translator.services.heattotosca.ConsolidationDataUtil; import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil; import org.openecomp.sdc.translator.services.heattotosca.ResourceTranslationFactory; import org.openecomp.sdc.translator.services.heattotosca.errors.MissingMandatoryPropertyErrorBuilder; import org.openecomp.sdc.translator.services.heattotosca.helper.VolumeTranslationHelper; import org.openecomp.sdc.translator.services.heattotosca.mapping.TranslatorHeatToToscaPropertyConverter; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.util.List; import java.util.Optional; public class ResourceTranslationCinderVolumeAttachmentImpl extends ResourceTranslationBase { protected static Logger logger = - LoggerFactory.getLogger(ResourceTranslationCinderVolumeAttachmentImpl.class); + (Logger) LoggerFactory.getLogger(ResourceTranslationCinderVolumeAttachmentImpl.class); + private String volumeIdPropertyName = "volume_id"; + private String toscaCapabilityAttachment = "tosca.capabilities.Attachment"; @Override protected void translate(TranslateTo translateTo) { - String volumeIdPropertyName = "volume_id"; + + + mdcDataDebugMessage.debugEntryMessage(null, null); + RelationshipTemplate relationTemplate = new RelationshipTemplate(); - relationTemplate.setType(ToscaRelationshipType.CINDER_VOLUME_ATTACHES_TO.getDisplayName()); + relationTemplate.setType(ToscaRelationshipType.CINDER_VOLUME_ATTACHES_TO); String relationshipTemplateId = translateTo.getTranslatedId(); String heatFileName = translateTo.getHeatFileName(); relationTemplate.setProperties(TranslatorHeatToToscaPropertyConverter - .getToscaPropertiesSimpleConversion(translateTo.getResource().getProperties(), + .getToscaPropertiesSimpleConversion(translateTo.getServiceTemplate(),translateTo + .getResourceId(),translateTo.getResource().getProperties(), relationTemplate.getProperties(), heatFileName, translateTo.getHeatOrchestrationTemplate(), translateTo.getResource().getType(), relationTemplate, translateTo.getContext())); AttachedResourceId attachedVolumeId = getAttachedResourceId(translateTo, volumeIdPropertyName); - String instanceUuid = "instance_uuid"; + String instanceUuid = HeatConstants.INSTANCE_UUID_PROPERTY_NAME; AttachedResourceId attachedNovaServerId = getAttachedResourceId(translateTo, instanceUuid); if (attachedNovaServerId.isGetResource()) { @@ -76,22 +92,46 @@ public class ResourceTranslationCinderVolumeAttachmentImpl extends ResourceTrans + "' include 'instance_uuid' property without 'get_resource' function, therefore this " + "resource will be ignored in TOSCA translation."); } + + mdcDataDebugMessage.debugExitMessage(null, null); + } + + @Override + protected Optional<ToscaTopologyTemplateElements> getTranslatedToscaTopologyElement( + TranslateTo translateTo) { + if (isEssentialRequirementsValid(translateTo)) { + return Optional.of(ToscaTopologyTemplateElements.RELATIONSHIP_TEMPLATE); + } else { + return Optional.empty(); + } } private AttachedResourceId getAttachedResourceId(TranslateTo translateTo, String propertyName) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + Optional<AttachedResourceId> attachedResourceId = HeatToToscaUtil.extractAttachedResourceId(translateTo, propertyName); if (!attachedResourceId.isPresent()) { + MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB, + LoggerTragetServiceName.GET_RESOURCE, ErrorLevel.ERROR.name(), + LoggerErrorCode.DATA_ERROR.getErrorCode(), + LoggerErrorDescription.MISSING_MANDATORY_PROPERTY); throw new CoreException(new MissingMandatoryPropertyErrorBuilder(propertyName).build()); } + mdcDataDebugMessage.debugExitMessage(null, null); return attachedResourceId.get(); } private void handleNovaGetResource(TranslateTo translateTo, RelationshipTemplate relationTemplate, String relationshipTemplateId, String heatFileName, AttachedResourceId volResourceId, String novaResourceId) { - String toscaCapabilityAttachment = "tosca.capabilities.Attachment"; + + + mdcDataDebugMessage.debugEntryMessage(null, null); + RequirementAssignment requirement = new RequirementAssignment(); requirement.setCapability(toscaCapabilityAttachment); if (volResourceId.isGetResource()) { @@ -105,6 +145,8 @@ public class ResourceTranslationCinderVolumeAttachmentImpl extends ResourceTrans + " The connection to the volume is ignored. " + "Supported types are: " + HeatResourcesTypes.CINDER_VOLUME_RESOURCE_TYPE.getHeatResource()); + + mdcDataDebugMessage.debugExitMessage(null, null); return; } requirement.setNode((String) volResourceId.getTranslatedId()); @@ -112,7 +154,7 @@ public class ResourceTranslationCinderVolumeAttachmentImpl extends ResourceTrans DataModelUtil .addRelationshipTemplate(translateTo.getServiceTemplate(), relationshipTemplateId, relationTemplate); - } else if (volResourceId.isGetParam()) { + } else if (volResourceId.isGetParam() && volResourceId.getEntityId() instanceof String) { String volumeResourceIdParamName = (String) volResourceId.getEntityId(); if (translateTo.getContext().getHeatSharedResourcesByParam() .containsKey(volumeResourceIdParamName) && !isHeatFileNested(translateTo, heatFileName)) { @@ -127,6 +169,8 @@ public class ResourceTranslationCinderVolumeAttachmentImpl extends ResourceTrans + " The connection to the volume is ignored. " + "Supported types are: " + HeatResourcesTypes.CINDER_VOLUME_RESOURCE_TYPE.getHeatResource()); + + mdcDataDebugMessage.debugExitMessage(null, null); return; } requirement.setNode( @@ -149,8 +193,10 @@ public class ResourceTranslationCinderVolumeAttachmentImpl extends ResourceTrans + "' is pointing to unsupported resource type(" + novaServerResource.getType() + ") through the property 'instance_uuid'." + " The connection to the nova server is ignored. " - + "Supported types are: " + HeatResourcesTypes.NOVA_SERVER_RESOURCE_TYPE - .getHeatResource()); + + "Supported types are: " + + HeatResourcesTypes.NOVA_SERVER_RESOURCE_TYPE.getHeatResource()); + + mdcDataDebugMessage.debugExitMessage(null, null); return; } Optional<String> translatedNovaServerId = @@ -162,13 +208,24 @@ public class ResourceTranslationCinderVolumeAttachmentImpl extends ResourceTrans if (translatedNovaServerId.isPresent() && StringUtils.isNotEmpty(requirement.getNode())) { NodeTemplate novaServerNodeTemplate = DataModelUtil .getNodeTemplate(translateTo.getServiceTemplate(), translatedNovaServerId.get()); - DataModelUtil.addRequirementAssignment(novaServerNodeTemplate, "local_storage", requirement); + DataModelUtil.addRequirementAssignment(novaServerNodeTemplate, ToscaConstants + .LOCAL_STORAGE_REQUIREMENT_ID, requirement); + //Add volume information to consolidation data + ConsolidationDataUtil.updateComputeConsolidationDataVolumes(translateTo, + novaServerNodeTemplate.getType(), translatedNovaServerId.get(), ToscaConstants + .LOCAL_STORAGE_REQUIREMENT_ID, requirement); } + + mdcDataDebugMessage.debugExitMessage(null, null); } private void handleUnsharedVolume(TranslateTo translateTo, RelationshipTemplate relationTemplate, String relationshipTemplateId, String heatFileName, RequirementAssignment requirement, String volumeResourceId) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + List<FileData> allFilesData = translateTo.getContext().getManifest().getContent().getData(); Optional<FileData> fileData = HeatToToscaUtil.getFileData(heatFileName, allFilesData); if (fileData.isPresent()) { @@ -176,11 +233,12 @@ public class ResourceTranslationCinderVolumeAttachmentImpl extends ResourceTrans new VolumeTranslationHelper(logger) .getFileDataContainingVolume(fileData.get().getData(), volumeResourceId, translateTo, FileData.Type.HEAT_VOL); - if (fileDataContainingResource.isPresent()) { - addRelationshipToServiceTemplate(translateTo, relationTemplate, relationshipTemplateId, - requirement, fileDataContainingResource.get()); - } + fileDataContainingResource.ifPresent( + resourceFileDataAndIDs -> addRelationshipToServiceTemplate(translateTo, relationTemplate, + relationshipTemplateId, requirement, resourceFileDataAndIDs)); } + + mdcDataDebugMessage.debugExitMessage(null, null); } private boolean isHeatFileNested(TranslateTo translateTo, String heatFileName) { @@ -192,11 +250,19 @@ public class ResourceTranslationCinderVolumeAttachmentImpl extends ResourceTrans String relationshipTemplateId, RequirementAssignment requirement, ResourceFileDataAndIDs resourceFileDataAndIDs) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + String translatedId = resourceFileDataAndIDs.getTranslatedResourceId(); - relationTemplate.getProperties().put("volume_id", translatedId); + String toscaVolIdPropName = + HeatToToscaUtil.getToscaPropertyName(translateTo, HeatConstants.VOL_ID_PROPERTY_NAME); + relationTemplate.getProperties().put(toscaVolIdPropName, translatedId); requirement.setNode(translatedId); requirement.setRelationship(relationshipTemplateId); DataModelUtil.addRelationshipTemplate(translateTo.getServiceTemplate(), relationshipTemplateId, relationTemplate); + + mdcDataDebugMessage.debugExitMessage(null, null); } } diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/ResourceTranslationCinderVolumeImpl.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationCinderVolumeImpl.java index c1e5fe3900..04e71cc2c7 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/ResourceTranslationCinderVolumeImpl.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationCinderVolumeImpl.java @@ -18,45 +18,57 @@ * ============LICENSE_END========================================================= */ -package org.openecomp.sdc.translator.services.heattotosca.impl; +package org.openecomp.sdc.translator.services.heattotosca.impl.resourcetranslation; +import org.openecomp.sdc.common.utils.CommonUtil; import org.openecomp.sdc.heat.datatypes.HeatBoolean; +import org.openecomp.sdc.heat.services.HeatConstants; import org.openecomp.sdc.tosca.datatypes.ToscaNodeType; import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate; import org.openecomp.sdc.tosca.services.DataModelUtil; import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo; +import org.openecomp.sdc.translator.services.heattotosca.Constants; +import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil; import org.openecomp.sdc.translator.services.heattotosca.mapping.TranslatorHeatToToscaPropertyConverter; import java.util.Map; -import java.util.Optional; + public class ResourceTranslationCinderVolumeImpl extends ResourceTranslationBase { @Override public void translate(TranslateTo translateTo) { - NodeTemplate nodeTemplate = new NodeTemplate(); - nodeTemplate.setType(ToscaNodeType.CINDER_VOLUME.getDisplayName()); + + mdcDataDebugMessage.debugEntryMessage(null, null); + + NodeTemplate nodeTemplate = new NodeTemplate(); + nodeTemplate.setType(ToscaNodeType.CINDER_VOLUME); nodeTemplate.setProperties(TranslatorHeatToToscaPropertyConverter - .getToscaPropertiesSimpleConversion(translateTo.getResource().getProperties(), + .getToscaPropertiesSimpleConversion(translateTo.getServiceTemplate(),translateTo. + getResourceId(),translateTo.getResource().getProperties(), nodeTemplate.getProperties(), translateTo.getHeatFileName(), translateTo.getHeatOrchestrationTemplate(), translateTo.getResource().getType(), nodeTemplate, translateTo.getContext())); handleSizeProperty(nodeTemplate.getProperties()); - Object readOnly = nodeTemplate.getProperties().get("read_only"); - if (readOnly != null && !(readOnly instanceof Map)) { - nodeTemplate.getProperties().put("read_only", HeatBoolean.eval(readOnly)); - } - Optional<String> resourceTranslatedId = getResourceTranslatedId(translateTo.getHeatFileName(), - translateTo.getHeatOrchestrationTemplate(), translateTo.getResourceId(), - translateTo.getContext()); - if (resourceTranslatedId.isPresent()) { - DataModelUtil.addNodeTemplate(translateTo.getServiceTemplate(), resourceTranslatedId.get(), - nodeTemplate); + String toscaReadOnlyPropName = + HeatToToscaUtil.getToscaPropertyName(translateTo, HeatConstants.READ_ONLY_PROPERTY_NAME); + Object readOnlyPropVal = nodeTemplate.getProperties().get(toscaReadOnlyPropName); + if (readOnlyPropVal != null && !(readOnlyPropVal instanceof Map)) { + nodeTemplate.getProperties().put(toscaReadOnlyPropName, HeatBoolean.eval(readOnlyPropVal)); } + DataModelUtil.addNodeTemplate(translateTo.getServiceTemplate(), translateTo.getTranslatedId(), + nodeTemplate); + + mdcDataDebugMessage.debugExitMessage(null, null); } + private void handleSizeProperty(Map<String, Object> nodeTemplateProperties) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + Object size = nodeTemplateProperties.get("size"); if (size == null) { return; @@ -64,14 +76,17 @@ public class ResourceTranslationCinderVolumeImpl extends ResourceTranslationBase if (size instanceof Map) { Map<String, Object> propMap = (Map) size; - if (propMap.entrySet().iterator().hasNext()) { - Map.Entry entry = propMap.entrySet().iterator().next(); + for (Map.Entry entry : propMap.entrySet()) { String val = "(" + entry.getKey() + " : " + entry.getValue() + ") * 1024"; nodeTemplateProperties.put("size", val); + + mdcDataDebugMessage.debugExitMessage(null, null); return; } } else { nodeTemplateProperties.put("size", size + "*1024"); } + + mdcDataDebugMessage.debugExitMessage(null, null); } } diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/ResourceTranslationContrailAttachPolicyImpl.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationContrailAttachPolicyImpl.java index 307e407119..d729c04cca 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/ResourceTranslationContrailAttachPolicyImpl.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationContrailAttachPolicyImpl.java @@ -18,14 +18,23 @@ * ============LICENSE_END========================================================= */ -package org.openecomp.sdc.translator.services.heattotosca.impl; +package org.openecomp.sdc.translator.services.heattotosca.impl.resourcetranslation; +import org.openecomp.sdc.logging.api.Logger; +import org.openecomp.sdc.logging.api.LoggerFactory; import org.openecomp.sdc.common.errors.CoreException; +import org.openecomp.sdc.datatypes.error.ErrorLevel; import org.openecomp.sdc.heat.datatypes.model.Resource; +import org.openecomp.sdc.logging.context.impl.MdcDataErrorMessage; +import org.openecomp.sdc.logging.types.LoggerConstants; +import org.openecomp.sdc.logging.types.LoggerErrorCode; +import org.openecomp.sdc.logging.types.LoggerErrorDescription; +import org.openecomp.sdc.logging.types.LoggerTragetServiceName; import org.openecomp.sdc.tosca.datatypes.ToscaCapabilityType; import org.openecomp.sdc.tosca.datatypes.ToscaRelationshipType; import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate; import org.openecomp.sdc.tosca.datatypes.model.RequirementAssignment; +import org.openecomp.sdc.tosca.datatypes.ToscaTopologyTemplateElements; import org.openecomp.sdc.tosca.services.DataModelUtil; import org.openecomp.sdc.tosca.services.ToscaConstants; import org.openecomp.sdc.translator.datatypes.heattotosca.AttachedResourceId; @@ -33,20 +42,23 @@ import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo; import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil; import org.openecomp.sdc.translator.services.heattotosca.ResourceTranslationFactory; import org.openecomp.sdc.translator.services.heattotosca.errors.MissingMandatoryPropertyErrorBuilder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.util.Optional; public class ResourceTranslationContrailAttachPolicyImpl extends ResourceTranslationBase { protected static Logger logger = - LoggerFactory.getLogger(ResourceTranslationContrailAttachPolicyImpl.class); + (Logger) LoggerFactory.getLogger(ResourceTranslationContrailAttachPolicyImpl.class); @Override protected void translate(TranslateTo translateTo) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + String heatFileName = translateTo.getHeatFileName(); String translatedNetworkResourceId = getTranslatedNetworkResourceId(translateTo); if (translatedNetworkResourceId == null) { + mdcDataDebugMessage.debugExitMessage(null, null); return; } @@ -56,28 +68,52 @@ public class ResourceTranslationContrailAttachPolicyImpl extends ResourceTransla .addRequirementAssignment(policyNodeTemplate, ToscaConstants.NETWORK_REQUIREMENT_ID, createRequirementAssignment(translatedNetworkResourceId)); } + + mdcDataDebugMessage.debugExitMessage(null, null); + } + + @Override + protected String generateTranslatedId(TranslateTo translateTo) { + return extractAttachedResourceIdHandleMissing(translateTo, "network").getEntityId() + .toString(); + } + + @Override + protected Optional<ToscaTopologyTemplateElements> getTranslatedToscaTopologyElement( + TranslateTo translateTo) { + return Optional.empty(); } private NodeTemplate getTranslatedPolicyNodeTemplate(TranslateTo translateTo, String heatFileName) { - Optional<AttachedResourceId> attachedPolicyResourceId = + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + AttachedResourceId attachedPolicyResourceId = extractAttachedResourceIdHandleMissing(translateTo, "policy"); NodeTemplate policyNodeTemplate = new NodeTemplate(); Optional<String> policyResourceId = - HeatToToscaUtil.getContrailAttachedHeatResourceId(attachedPolicyResourceId.get()); + HeatToToscaUtil.getContrailAttachedHeatResourceId(attachedPolicyResourceId); if (policyResourceId.isPresent()) { policyNodeTemplate = getPolicyNodeTemplate(translateTo, heatFileName, policyResourceId.get()); } else { logger.warn("Heat resource: '" + translateTo.getResourceId() + "' with type: '" + translateTo.getResource().getType() - + "' include 'policy' property without 'get_attr' of 'fq_name'/'get_resource'" - + " function, therefore this resource will be ignored in TOSCA translation."); + + "' include 'policy' property without 'get_attr' of 'fq_name'/'get_resource' function," + + " therefore this resource will be ignored in TOSCA translation."); } + + mdcDataDebugMessage.debugExitMessage(null, null); return policyNodeTemplate; } private NodeTemplate getPolicyNodeTemplate(TranslateTo translateTo, String heatFileName, String policyResourceId) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + Resource policyResource = HeatToToscaUtil .getResource(translateTo.getHeatOrchestrationTemplate(), policyResourceId, heatFileName); Optional<String> translatedPolicyResourceId = @@ -88,54 +124,71 @@ public class ResourceTranslationContrailAttachPolicyImpl extends ResourceTransla if (!translatedPolicyResourceId.isPresent()) { logger.warn("Heat resource: '" + translateTo.getResourceId() + "' with type: '" + translateTo.getResource().getType() - + "' include unsupported policy resource, therefore this " - + "resource will be ignored in TOSCA translation. "); + + "' include unsupported policy resource, therefore this resource will be ignored in " + + "TOSCA translation. "); + + mdcDataDebugMessage.debugExitMessage(null, null); return null; } + + mdcDataDebugMessage.debugExitMessage(null, null); return DataModelUtil - .getNodeTemplate(translateTo.getServiceTemplate(), - translatedPolicyResourceId.get()); + .getNodeTemplate(translateTo.getServiceTemplate(), translatedPolicyResourceId.get()); } private String getTranslatedNetworkResourceId(TranslateTo translateTo) { - Optional<AttachedResourceId> attachedNetworkResourceId = + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + AttachedResourceId attachedNetworkResourceId = extractAttachedResourceIdHandleMissing(translateTo, "network"); String translatedNetworkResourceId = null; - if (attachedNetworkResourceId.get().isGetResource()) { - translatedNetworkResourceId = (String) attachedNetworkResourceId.get().getTranslatedId(); + if (attachedNetworkResourceId.isGetResource()) { + translatedNetworkResourceId = (String) attachedNetworkResourceId.getTranslatedId(); } else { logger.warn("Heat resource: '" + translateTo.getResourceId() + "' with type: '" + translateTo.getResource().getType() - + "' include 'network' property without 'get_resource' function, " - + "therefore this resource will be ignored in TOSCA translation."); + + "' include 'network' property without 'get_resource' function, therefore this " + + "resource will be ignored in TOSCA translation."); } + + mdcDataDebugMessage.debugExitMessage(null, null); return translatedNetworkResourceId; } private RequirementAssignment createRequirementAssignment(String translatedNetworkResourceId) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + RequirementAssignment requirement = new RequirementAssignment(); - requirement.setCapability(ToscaCapabilityType.ATTACHMENT.getDisplayName()); + requirement.setCapability(ToscaCapabilityType.NATIVE_ATTACHMENT); requirement.setNode(translatedNetworkResourceId); - requirement.setRelationship(ToscaRelationshipType.ATTACHES_TO.getDisplayName()); + requirement.setRelationship(ToscaRelationshipType.ATTACHES_TO); + mdcDataDebugMessage.debugExitMessage(null, null); return requirement; } - private Optional<AttachedResourceId> extractAttachedResourceIdHandleMissing( + private AttachedResourceId extractAttachedResourceIdHandleMissing( TranslateTo translateTo, String propertyName) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + Optional<AttachedResourceId> attachedResourceId = HeatToToscaUtil.extractAttachedResourceId(translateTo, propertyName); if (!attachedResourceId.isPresent()) { + MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB, + LoggerTragetServiceName.CREATE_REQUIREMENT_ASSIGNMENT, ErrorLevel.ERROR.name(), + LoggerErrorCode.DATA_ERROR.getErrorCode(), + LoggerErrorDescription.MISSING_MANDATORY_PROPERTY); throw new CoreException(new MissingMandatoryPropertyErrorBuilder(propertyName).build()); } - return attachedResourceId; - } - - @Override - protected String generateTranslatedId(TranslateTo translateTo) { - return extractAttachedResourceIdHandleMissing(translateTo, "network").get().getEntityId() - .toString(); + mdcDataDebugMessage.debugExitMessage(null, null); + return attachedResourceId.get(); } } diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/ResourceTranslationContrailNetworkPolicyImpl.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationContrailNetworkPolicyImpl.java index 8084433fd5..374858be0c 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/ResourceTranslationContrailNetworkPolicyImpl.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationContrailNetworkPolicyImpl.java @@ -18,29 +18,34 @@ * ============LICENSE_END========================================================= */ -package org.openecomp.sdc.translator.services.heattotosca.impl; +package org.openecomp.sdc.translator.services.heattotosca.impl.resourcetranslation; +import org.openecomp.sdc.common.utils.CommonUtil; +import org.openecomp.sdc.logging.api.Logger; +import org.openecomp.sdc.logging.api.LoggerFactory; import org.openecomp.sdc.tosca.datatypes.ToscaNodeType; import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate; import org.openecomp.sdc.tosca.services.DataModelUtil; import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo; import org.openecomp.sdc.translator.services.heattotosca.mapping.TranslatorHeatToToscaPropertyConverter; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; public class ResourceTranslationContrailNetworkPolicyImpl extends ResourceTranslationBase { protected static Logger logger = - LoggerFactory.getLogger(ResourceTranslationContrailNetworkPolicyImpl.class); + (Logger) LoggerFactory.getLogger(ResourceTranslationContrailNetworkPolicyImpl.class); @Override protected void translate(TranslateTo translateTo) { + + mdcDataDebugMessage.debugEntryMessage(null, null); + NodeTemplate nodeTemplate = new NodeTemplate(); - nodeTemplate.setType(ToscaNodeType.CONTRAIL_NETWORK_RULE.getDisplayName()); + nodeTemplate.setType(ToscaNodeType.CONTRAIL_NETWORK_RULE); nodeTemplate.setProperties(TranslatorHeatToToscaPropertyConverter - .getToscaPropertiesSimpleConversion(translateTo.getResource().getProperties(), + .getToscaPropertiesSimpleConversion(translateTo.getServiceTemplate(),translateTo. + getResourceId(),translateTo.getResource().getProperties(), nodeTemplate.getProperties(), translateTo.getHeatFileName(), translateTo.getHeatOrchestrationTemplate(), translateTo.getResource().getType(), nodeTemplate, translateTo.getContext())); @@ -48,6 +53,6 @@ public class ResourceTranslationContrailNetworkPolicyImpl extends ResourceTransl DataModelUtil.addNodeTemplate(translateTo.getServiceTemplate(), translateTo.getTranslatedId(), nodeTemplate); - + mdcDataDebugMessage.debugExitMessage(null, null); } } diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/ResourceTranslationContrailServiceInstanceImpl.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationContrailServiceInstanceImpl.java index b2475f28a9..eed7953cda 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/ResourceTranslationContrailServiceInstanceImpl.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationContrailServiceInstanceImpl.java @@ -18,13 +18,21 @@ * ============LICENSE_END========================================================= */ -package org.openecomp.sdc.translator.services.heattotosca.impl; +package org.openecomp.sdc.translator.services.heattotosca.impl.resourcetranslation; import org.openecomp.sdc.common.errors.CoreException; +import org.openecomp.sdc.datatypes.error.ErrorLevel; import org.openecomp.sdc.heat.datatypes.HeatBoolean; import org.openecomp.sdc.heat.datatypes.model.HeatResourcesTypes; import org.openecomp.sdc.heat.datatypes.model.Resource; import org.openecomp.sdc.heat.services.HeatConstants; +import org.openecomp.sdc.logging.api.Logger; +import org.openecomp.sdc.logging.api.LoggerFactory; +import org.openecomp.sdc.logging.context.impl.MdcDataErrorMessage; +import org.openecomp.sdc.logging.types.LoggerConstants; +import org.openecomp.sdc.logging.types.LoggerErrorCode; +import org.openecomp.sdc.logging.types.LoggerErrorDescription; +import org.openecomp.sdc.logging.types.LoggerTragetServiceName; import org.openecomp.sdc.tosca.datatypes.ToscaCapabilityType; import org.openecomp.sdc.tosca.datatypes.ToscaFunctions; import org.openecomp.sdc.tosca.datatypes.ToscaGroupType; @@ -32,7 +40,7 @@ import org.openecomp.sdc.tosca.datatypes.ToscaNodeType; import org.openecomp.sdc.tosca.datatypes.ToscaRelationshipType; import org.openecomp.sdc.tosca.datatypes.model.AttributeDefinition; import org.openecomp.sdc.tosca.datatypes.model.GroupDefinition; -import org.openecomp.sdc.tosca.datatypes.model.Metadata; +import org.openecomp.sdc.tosca.datatypes.model.Import; import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate; import org.openecomp.sdc.tosca.datatypes.model.NodeType; import org.openecomp.sdc.tosca.datatypes.model.ParameterDefinition; @@ -43,8 +51,10 @@ import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; import org.openecomp.sdc.tosca.datatypes.model.SubstitutionMapping; import org.openecomp.sdc.tosca.datatypes.model.TopologyTemplate; import org.openecomp.sdc.tosca.services.DataModelUtil; +import org.openecomp.sdc.tosca.services.ToscaAnalyzerService; import org.openecomp.sdc.tosca.services.ToscaConstants; import org.openecomp.sdc.tosca.services.ToscaUtil; +import org.openecomp.sdc.tosca.services.impl.ToscaAnalyzerServiceImpl; import org.openecomp.sdc.tosca.services.impl.ToscaFileOutputServiceCsarImpl; import org.openecomp.sdc.translator.datatypes.heattotosca.AttachedResourceId; import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo; @@ -53,15 +63,9 @@ import org.openecomp.sdc.translator.services.heattotosca.Constants; import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil; import org.openecomp.sdc.translator.services.heattotosca.ResourceTranslationFactory; import org.openecomp.sdc.translator.services.heattotosca.errors.MissingMandatoryPropertyErrorBuilder; -import org.openecomp.sdc.translator.services.heattotosca.globaltypes.ContrailAbstractSubstituteGlobalType; -import org.openecomp.sdc.translator.services.heattotosca.globaltypes.ContrailComputeGlobalType; import org.openecomp.sdc.translator.services.heattotosca.globaltypes.GlobalTypesGenerator; -import org.openecomp.sdc.translator.services.heattotosca.globaltypes.GlobalTypesUtil; import org.openecomp.sdc.translator.services.heattotosca.helper.ContrailTranslationHelper; -import org.openecomp.sdc.translator.services.heattotosca.mapping.TranslatorHeatToToscaFunctionConverter; import org.openecomp.sdc.translator.services.heattotosca.mapping.TranslatorHeatToToscaPropertyConverter; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.Arrays; @@ -73,10 +77,14 @@ import java.util.Optional; public class ResourceTranslationContrailServiceInstanceImpl extends ResourceTranslationBase { protected static Logger logger = - LoggerFactory.getLogger(ResourceTranslationContrailServiceInstanceImpl.class); + (Logger) LoggerFactory.getLogger(ResourceTranslationContrailServiceInstanceImpl.class); @Override public void translate(TranslateTo translateTo) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + Resource serviceInstanceResource = translateTo.getResource(); AttachedResourceId contrailServiceTemplateAttached = getServiceTemplateAttachedId(translateTo, serviceInstanceResource); @@ -90,12 +98,13 @@ public class ResourceTranslationContrailServiceInstanceImpl extends ResourceTran .equals(HeatResourcesTypes.CONTRAIL_SERVICE_TEMPLATE.getHeatResource())) { logger.warn("resource id '" + translateTo.getResourceId() + "' with type '" + translateTo.getResource().getType() - + "+ has reference to resource '" + contrailServiceTemplateResourceId + "' with type " - + "'" + + "+ has reference to resource '" + contrailServiceTemplateResourceId + "' with type '" + contrailServiceTemplateResource.getType() + "' in property service_template. Invalid type, resource type should be type of '" + HeatResourcesTypes.CONTRAIL_SERVICE_TEMPLATE.getHeatResource() + "', therefore this resource will be ignored in TOSCA translation."); + + mdcDataDebugMessage.debugExitMessage(null, null); return; } Optional<String> contrailServiceTemplateTranslatedId = @@ -110,12 +119,18 @@ public class ResourceTranslationContrailServiceInstanceImpl extends ResourceTran + "' with type '" + contrailServiceTemplateResource.getType() + "' in property 'service_template'" + ", therefore this resource will be ignored in TOSCA translation."); + + mdcDataDebugMessage.debugExitMessage(null, null); return; + /*throw new CoreException(new ReferenceToUnsupportedResourceErrorBuilder + (translateTo.getResourceId(), translateTo.getResource().getType(), + contrailServiceTemplateResourceId, contrailServiceTemplateResource + .getType(), "service_template").build());*/ } ServiceTemplate globalSubstitutionServiceTemplate = - translateTo.getContext().getTranslatedServiceTemplates() - .get(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME); + translateTo.getContext().getTranslatedServiceTemplates().get( + Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME); String contrailStId = ResourceTranslationContrailServiceTemplateImpl .getContrailSubstitutedNodeTypeId(contrailServiceTemplateTranslatedId.get()); NodeType substitutedNodeType = @@ -127,6 +142,8 @@ public class ResourceTranslationContrailServiceInstanceImpl extends ResourceTran logger.warn("More than one ServiceInstance pointing to the same ServiceTemplate '" + contrailServiceTemplateResourceId + " ' with different number of interfaces." + ", therefore this resource will be ignored in TOSCA translation."); + + mdcDataDebugMessage.debugExitMessage(null, null); return; } @@ -136,30 +153,36 @@ public class ResourceTranslationContrailServiceInstanceImpl extends ResourceTran numberOfPorts); String computeNodeTypeId = new ContrailTranslationHelper() - .getComputeNodeTypeId(contrailServiceTemplateTranslatedId.get(), - contrailServiceTemplateResource); + .getComputeNodeTypeId(contrailServiceTemplateResource, contrailServiceTemplateResourceId, + contrailServiceTemplateTranslatedId.get(), translateTo.getContext()); boolean orderedInterfaces = getOrderedInterfaces(contrailServiceTemplateResource); ServiceTemplate nestedServiceTemplate = createNestedServiceTemplate(translateTo, computeNodeTypeId, contrailStId, substitutedNodeTemplate, orderedInterfaces); addAbstractSubstitutionProperty(translateTo, substitutedNodeTemplate.getProperties(), nestedServiceTemplate, contrailServiceTemplateResource); - translateTo.getContext().getTranslatedServiceTemplates() - .put(translateTo.getTranslatedId(), nestedServiceTemplate); + translateTo.getContext().getTranslatedServiceTemplates().put(new ContrailTranslationHelper() + .getSubstitutionContrailServiceTemplateMetadata(translateTo.getHeatFileName(), + translateTo.getTranslatedId()), nestedServiceTemplate); } else { logger.warn("Heat resource: '" + translateTo.getResourceId() + "' with type: '" + translateTo.getResource().getType() - + "' include 'service_template' property without 'get_resource' function, currently not " - + "supported, therefore this resource will be ignored in TOSCA translation."); + + "' include 'service_template' property without 'get_resource' function, currently not" + + " supported, therefore this resource will be ignored in TOSCA translation."); } + mdcDataDebugMessage.debugExitMessage(null, null); } private void addAbstractSubstitutionProperty(TranslateTo translateTo, Map<String, Object> substitutionProperties, ServiceTemplate nestedServiceTemplate, Resource contrailServiceTemplateResource) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + Map<String, Object> innerProps = new HashMap<>(); innerProps.put(ToscaConstants.SUBSTITUTE_SERVICE_TEMPLATE_PROPERTY_NAME, ToscaUtil.getServiceTemplateFileName(nestedServiceTemplate)); @@ -176,15 +199,22 @@ public class ResourceTranslationContrailServiceInstanceImpl extends ResourceTran } innerProps.put("mandatory", mandatory); substitutionProperties.put(ToscaConstants.SERVICE_TEMPLATE_FILTER_PROPERTY_NAME, innerProps); + + mdcDataDebugMessage.debugExitMessage(null, null); } private Object handleScaleOutProperty(TranslateTo translateTo, Map<String, Object> innerProps) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + Object scaleOutPropertyValue = translateTo.getResource().getProperties().get(HeatConstants.SCALE_OUT_PROPERTY_NAME); Object countValue = null; if (scaleOutPropertyValue != null && scaleOutPropertyValue instanceof Map) { countValue = TranslatorHeatToToscaPropertyConverter - .getToscaPropertyValue(Constants.MAX_INSTANCES_PROPERTY_NAME, + .getToscaPropertyValue(translateTo.getServiceTemplate(), translateTo.getTranslatedId(), + Constants.MAX_INSTANCES_PROPERTY_NAME, ((Map) scaleOutPropertyValue).get(Constants.MAX_INSTANCES_PROPERTY_NAME), null, translateTo.getHeatFileName(), translateTo.getHeatOrchestrationTemplate(), null, translateTo.getContext()); @@ -196,36 +226,52 @@ public class ResourceTranslationContrailServiceInstanceImpl extends ResourceTran } else { innerProps.put(ToscaConstants.COUNT_PROPERTY_NAME, 1); } + + mdcDataDebugMessage.debugExitMessage(null, null); return countValue; } private void handleServiceScalingProperty(TranslateTo translateTo, Map<String, Object> innerProps, Resource contrailServiceTemplateResource) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + Object serviceScalingPropertyValue = contrailServiceTemplateResource.getProperties() .get(HeatConstants.SERVICE_SCALING_PROPERTY_NAME); Object serviceScalingValue = null; if (serviceScalingPropertyValue != null) { serviceScalingValue = TranslatorHeatToToscaPropertyConverter - .getToscaPropertyValue(HeatConstants.SERVICE_SCALING_PROPERTY_NAME, - serviceScalingPropertyValue, null, translateTo.getHeatFileName(), - translateTo.getHeatOrchestrationTemplate(), null, translateTo.getContext()); + .getToscaPropertyValue(translateTo.getServiceTemplate(), translateTo.getTranslatedId(), + HeatConstants.SERVICE_SCALING_PROPERTY_NAME, serviceScalingPropertyValue, null, + translateTo.getHeatFileName(), translateTo.getHeatOrchestrationTemplate(), null, + translateTo.getContext()); if (serviceScalingValue != null) { innerProps.put(ToscaConstants.SCALING_ENABLED_PROPERTY_NAME, (HeatBoolean.isValueBoolean(serviceScalingValue)) ? HeatBoolean .eval(serviceScalingValue) : serviceScalingValue); } } + + mdcDataDebugMessage.debugExitMessage(null, null); } private boolean getOrderedInterfaces(Resource contrailServiceTemplate) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + Object orderedInterfaces = contrailServiceTemplate.getProperties().get("ordered_interfaces"); if (orderedInterfaces == null) { + mdcDataDebugMessage.debugExitMessage(null, null); return false; } if (orderedInterfaces instanceof String) { + mdcDataDebugMessage.debugExitMessage(null, null); return HeatBoolean.eval(orderedInterfaces); } //if get_param, set default value to true + mdcDataDebugMessage.debugExitMessage(null, null); return true; } @@ -234,32 +280,47 @@ public class ResourceTranslationContrailServiceInstanceImpl extends ResourceTran String substitutedNodeTypeId, NodeTemplate substitutedNodeTemplate, boolean orderedInterfaces) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + ServiceTemplate nestedSubstitutionServiceTemplate = new ServiceTemplate(); setNestedServiceTemplateGeneralDetails(translateTo, nestedSubstitutionServiceTemplate); String heatStackGroupKey = addHeatStackGroup(translateTo, nestedSubstitutionServiceTemplate); addSubstitutionMappingEntry(nestedSubstitutionServiceTemplate, substitutedNodeTypeId); - handleInputParameters(nestedSubstitutionServiceTemplate); + handleInputParameters(nestedSubstitutionServiceTemplate, translateTo); String computeNodeTemplateId = handleComputeNodeTemplate(translateTo, computeNodeTypeId, nestedSubstitutionServiceTemplate, heatStackGroupKey); - handleOutputParameters(nestedSubstitutionServiceTemplate, computeNodeTemplateId); + handleOutputParameters(nestedSubstitutionServiceTemplate, computeNodeTemplateId, translateTo); handleServiceInstanceInterfaces(translateTo, nestedSubstitutionServiceTemplate, substitutedNodeTemplate, heatStackGroupKey, orderedInterfaces, computeNodeTemplateId); + mdcDataDebugMessage.debugExitMessage(null, null); return nestedSubstitutionServiceTemplate; } private void handleOutputParameters(ServiceTemplate nestedSubstitutionServiceTemplate, - String nodeTemplateId) { + String nodeTemplateId, TranslateTo translateTo) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + if (nodeTemplateId == null) { return; } - NodeType contrailAbstractNodeType = - ContrailAbstractSubstituteGlobalType.createServiceTemplate().getNode_types() - .get(ToscaNodeType.CONTRAIL_ABSTRACT_SUBSTITUTE.getDisplayName()); + ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl(); + + Optional<NodeType> contrailAbstractNodeType = + toscaAnalyzerService.fetchNodeType(ToscaNodeType.CONTRAIL_ABSTRACT_SUBSTITUTE, translateTo + .getContext().getGlobalServiceTemplates().values()); + + if (!contrailAbstractNodeType.isPresent()) { + return; + } Map<String, AttributeDefinition> contrailAbstractAttributes = - contrailAbstractNodeType.getAttributes(); + contrailAbstractNodeType.get().getAttributes(); Map<String, ParameterDefinition> nestedSubstitutionServiceTemplateOutputs = new HashMap<>(); if (contrailAbstractAttributes == null) { @@ -282,6 +343,8 @@ public class ResourceTranslationContrailServiceInstanceImpl extends ResourceTran nestedSubstitutionServiceTemplate.getTopology_template() .setOutputs(nestedSubstitutionServiceTemplateOutputs); } + + mdcDataDebugMessage.debugExitMessage(null, null); } private void handleServiceInstanceInterfaces(TranslateTo translateTo, @@ -289,8 +352,13 @@ public class ResourceTranslationContrailServiceInstanceImpl extends ResourceTran NodeTemplate substitutedNodeTemplate, String heatStackGroupKey, boolean orderedInterfaces, String computeNodeTemplateId) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + Resource serviceInstanceResource = translateTo.getResource(); - Object interfaceListProperty = serviceInstanceResource.getProperties().get("interface_list"); + Object interfaceListProperty = + serviceInstanceResource.getProperties().get(HeatConstants.INTERFACE_LIST_PROPERTY_NAME); if (interfaceListProperty == null) { return; } @@ -304,6 +372,8 @@ public class ResourceTranslationContrailServiceInstanceImpl extends ResourceTran handleInterface(translateTo, interfaceListProperty, null, nestedSubstitutionServiceTemplate, heatStackGroupKey, substitutedNodeTemplate, orderedInterfaces, computeNodeTemplateId); } + + mdcDataDebugMessage.debugExitMessage(null, null); } private void handleInterface(TranslateTo translateTo, Object interfacePropertyValue, @@ -311,13 +381,17 @@ public class ResourceTranslationContrailServiceInstanceImpl extends ResourceTran ServiceTemplate nestedSubstitutionServiceTemplate, String heatStackGroupKey, NodeTemplate substitutedNodeTemplate, boolean orderedInterfaces, String computeNodeTemplateId) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + if (index == null) { index = new Integer(0); } NodeTemplate portNodeTemplate = createPortNodeTemplate(index, orderedInterfaces, computeNodeTemplateId); - String portNodeTemplateId = "port_" + index; - String portReqMappingKey = "link_" + portNodeTemplateId; + String portNodeTemplateId = Constants.SERVICE_INSTANCE_PORT_PREFIX + index; + String portReqMappingKey = Constants.SERVICE_INSTANCE_LINK_PREFIX + portNodeTemplateId; DataModelUtil .addNodeTemplate(nestedSubstitutionServiceTemplate, portNodeTemplateId, portNodeTemplate); @@ -326,17 +400,24 @@ public class ResourceTranslationContrailServiceInstanceImpl extends ResourceTran updateHeatStackGroup(nestedSubstitutionServiceTemplate, heatStackGroupKey, portNodeTemplateId); connectPortToNetwork(translateTo, interfacePropertyValue, substitutedNodeTemplate, portReqMappingKey); + + mdcDataDebugMessage.debugExitMessage(null, null); } private void connectPortToNetwork(TranslateTo translateTo, Object interfacePropertyValue, NodeTemplate substitutedNodeTemplate, String portReqMappingKey) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + List<String> validNetworksForConnections = Arrays .asList(HeatResourcesTypes.NEUTRON_NET_RESOURCE_TYPE.getHeatResource(), HeatResourcesTypes.CONTRAIL_VIRTUAL_NETWORK_RESOURCE_TYPE.getHeatResource()); if (interfacePropertyValue instanceof Map) { - Object virtualNetworkValue = ((Map) interfacePropertyValue).get("virtual_network"); + Object virtualNetworkValue = + ((Map) interfacePropertyValue).get(HeatConstants.VIRTUAL_NETWORK_PROPERTY_NAME); if (virtualNetworkValue != null) { Optional<AttachedResourceId> networkAttachedResourceId = HeatToToscaUtil .extractAttachedResourceId(translateTo.getHeatFileName(), @@ -354,18 +435,21 @@ public class ResourceTranslationContrailServiceInstanceImpl extends ResourceTran getResourceTranslatedId(translateTo.getHeatFileName(), translateTo.getHeatOrchestrationTemplate(), networkResourceId.get(), translateTo.getContext()); - if (networkTranslatedId.isPresent()) { - addLinkToNetworkRequirementAssignment(substitutedNodeTemplate, - networkTranslatedId.get(), portReqMappingKey); - } + networkTranslatedId + .ifPresent( + translatedId -> addLinkToNetworkRequirementAssignment(substitutedNodeTemplate, + translatedId, portReqMappingKey)); + } else { logger.warn("Heat resource " + translateTo.getResourceId() + " with type " + translateTo.getResource().getType() + " has connection to invalid/not supported network resource, therefore, this " + "connection will be ignored in the translation."); } - } else if (networkAttachedResourceId.get().isGetParam()) { - TranslatedHeatResource translatedSharedResourceId = + } else if (networkAttachedResourceId.get().isGetParam() + && networkAttachedResourceId.get().getEntityId() instanceof String) { + TranslatedHeatResource + translatedSharedResourceId = translateTo.getContext().getHeatSharedResourcesByParam() .get(networkAttachedResourceId.get().getEntityId()); if (Objects.nonNull(translatedSharedResourceId) @@ -387,14 +471,22 @@ public class ResourceTranslationContrailServiceInstanceImpl extends ResourceTran + translateTo.getResource().getType() + "' missing 'virtual_network' property in 'interface_list' entry, therefore, no " + "network connection is define for this entry."); + //throw new CoreException(new + // MissingMandatoryPropertyErrorBuilder("virtual_network").build()); } } + + mdcDataDebugMessage.debugExitMessage(null, null); } private NodeTemplate createPortNodeTemplate(Integer index, boolean orderedInterfaces, String computeNodeTemplateId) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + NodeTemplate portNodeTemplate = new NodeTemplate(); - portNodeTemplate.setType(ToscaNodeType.CONTRAIL_PORT.getDisplayName()); + portNodeTemplate.setType(ToscaNodeType.CONTRAIL_PORT); Map<String, Object> portProperties = new HashMap<>(); portProperties.put("static_routes", DataModelUtil .createGetInputPropertyValueFromListParameter("interface_list", index, "static_routes")); @@ -415,7 +507,9 @@ public class ResourceTranslationContrailServiceInstanceImpl extends ResourceTran portProperties.put("order", index); } portNodeTemplate.setProperties(portProperties); - addBindingReqFromPortToCompute(computeNodeTemplateId, portNodeTemplate); + HeatToToscaUtil.addBindingReqFromPortToCompute(computeNodeTemplateId, portNodeTemplate); + + mdcDataDebugMessage.debugExitMessage(null, null); return portNodeTemplate; } @@ -423,77 +517,122 @@ public class ResourceTranslationContrailServiceInstanceImpl extends ResourceTran private void addLinkToNetworkRequirementAssignment(NodeTemplate nodeTemplate, String connectedNodeTranslatedId, String requirementId) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + if (nodeTemplate == null || connectedNodeTranslatedId == null) { return; } RequirementAssignment requirement = new RequirementAssignment(); - requirement.setCapability(ToscaCapabilityType.NETWORK_LINKABLE.getDisplayName()); - requirement.setRelationship(ToscaRelationshipType.NETWORK_LINK_TO.getDisplayName()); + requirement.setCapability(ToscaCapabilityType.NATIVE_NETWORK_LINKABLE); + requirement.setRelationship(ToscaRelationshipType.NATIVE_NETWORK_LINK_TO); requirement.setNode(connectedNodeTranslatedId); DataModelUtil.addRequirementAssignment(nodeTemplate, requirementId, requirement); + + mdcDataDebugMessage.debugExitMessage(null, null); } private void updateHeatStackGroup(ServiceTemplate serviceTemplate, String heatStackGroupKey, String memberId) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + serviceTemplate.getTopology_template().getGroups().get(heatStackGroupKey).getMembers() .add(memberId); + + mdcDataDebugMessage.debugExitMessage(null, null); } private void updateSubstitutionMappingRequirement(ServiceTemplate serviceTemplate, String portReqMappingKey, String portNodeTemplateId) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + List<String> portReqMappingValue = new ArrayList<>(); portReqMappingValue.add(portNodeTemplateId); portReqMappingValue.add(ToscaConstants.LINK_REQUIREMENT_ID); DataModelUtil .addSubstitutionMappingReq(serviceTemplate, portReqMappingKey, portReqMappingValue); + + mdcDataDebugMessage.debugExitMessage(null, null); } private void addSubstitutionMappingEntry(ServiceTemplate nestedSubstitutionServiceTemplate, String substitutedNodeTypeId) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + SubstitutionMapping substitutionMappings = new SubstitutionMapping(); substitutionMappings.setNode_type(substitutedNodeTypeId); DataModelUtil.addSubstitutionMapping(nestedSubstitutionServiceTemplate, substitutionMappings); + + mdcDataDebugMessage.debugExitMessage(null, null); } - private void handleInputParameters(ServiceTemplate nestedSubstitutionServiceTemplate) { - NodeType contrailAbstractNodeType = - ContrailAbstractSubstituteGlobalType.createServiceTemplate().getNode_types() - .get(ToscaNodeType.CONTRAIL_ABSTRACT_SUBSTITUTE.getDisplayName()); - Map<String, PropertyDefinition> contrailAbstractProperties = - contrailAbstractNodeType.getProperties(); + private void handleInputParameters(ServiceTemplate nestedSubstitutionServiceTemplate, + TranslateTo translateTo) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl(); + + Optional<NodeType> contrailAbstractNodeType = + toscaAnalyzerService.fetchNodeType(ToscaNodeType.CONTRAIL_ABSTRACT_SUBSTITUTE, translateTo + .getContext().getGlobalServiceTemplates().values()); Map<String, ParameterDefinition> nestedSubstitutionServiceTemplateInputs = new HashMap<>(); + if (contrailAbstractNodeType.isPresent()) { + Map<String, PropertyDefinition> contrailAbstractProperties = + contrailAbstractNodeType.get().getProperties(); - for (String propertyKey : contrailAbstractProperties.keySet()) { - PropertyDefinition abstractPropertyDef = contrailAbstractProperties.get(propertyKey); - if (abstractPropertyDef != null) { - nestedSubstitutionServiceTemplateInputs - .put(propertyKey, DataModelUtil.convertPropertyDefToParameterDef(abstractPropertyDef)); + for (String propertyKey : contrailAbstractProperties.keySet()) { + PropertyDefinition abstractPropertyDef = contrailAbstractProperties.get(propertyKey); + if (abstractPropertyDef != null) { + nestedSubstitutionServiceTemplateInputs + .put(propertyKey, + DataModelUtil.convertPropertyDefToParameterDef(abstractPropertyDef)); + } } } if (!nestedSubstitutionServiceTemplateInputs.isEmpty()) { nestedSubstitutionServiceTemplate.getTopology_template() .setInputs(nestedSubstitutionServiceTemplateInputs); } + + mdcDataDebugMessage.debugExitMessage(null, null); } private String handleComputeNodeTemplate(TranslateTo translateTo, String computeNodeTypeId, ServiceTemplate nestedSubstitutionServiceTemplate, String heatStackGroupKey) { - NodeType contrailComputeNodeType = - ContrailComputeGlobalType.createServiceTemplate().getNode_types() - .get(ToscaNodeType.CONTRAIL_COMPUTE.getDisplayName()); - Map<String, PropertyDefinition> contrailComputeProperties = - contrailComputeNodeType.getProperties(); - Map<String, Object> computeNodeTemplateProperties = new HashMap<>(); - - if (contrailComputeProperties != null) { - for (String computePropertyKey : contrailComputeProperties.keySet()) { - Map getInputProperty = new HashMap<>(); - getInputProperty.put(ToscaFunctions.GET_INPUT.getDisplayName(), computePropertyKey); - computeNodeTemplateProperties.put(computePropertyKey, getInputProperty); + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl(); + Optional<NodeType> contrailComputeNodeType = toscaAnalyzerService + .fetchNodeType(ToscaNodeType.CONTRAIL_COMPUTE, + translateTo.getContext().getGlobalServiceTemplates().values()); + + Map<String, Object> computeNodeTemplateProperties = null; + if (contrailComputeNodeType.isPresent()) { + Map<String, PropertyDefinition> contrailComputeProperties = + contrailComputeNodeType.get().getProperties(); + computeNodeTemplateProperties = new HashMap<>(); + + if (contrailComputeProperties != null) { + for (String computePropertyKey : contrailComputeProperties.keySet()) { + Map getInputProperty = new HashMap<>(); + getInputProperty.put(ToscaFunctions.GET_INPUT.getDisplayName(), computePropertyKey); + computeNodeTemplateProperties.put(computePropertyKey, getInputProperty); + } } } @@ -508,39 +647,52 @@ public class ResourceTranslationContrailServiceInstanceImpl extends ResourceTran nestedSubstitutionServiceTemplate.getTopology_template().getGroups().get(heatStackGroupKey) .getMembers().add(computeNodeTemplateId); + mdcDataDebugMessage.debugExitMessage(null, null); return computeNodeTemplateId; } private String addHeatStackGroup(TranslateTo translateTo, ServiceTemplate serviceTemplate) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + GroupDefinition serviceInstanceGroupDefinition = new GroupDefinition(); - serviceInstanceGroupDefinition.setType(ToscaGroupType.HEAT_STACK.getDisplayName()); + serviceInstanceGroupDefinition.setType(ToscaGroupType.HEAT_STACK); Map<String, Object> groupProperties = new HashMap<>(); groupProperties.put("heat_file", "../" + (new ToscaFileOutputServiceCsarImpl()).getArtifactsFolderName() + "/" + translateTo.getHeatFileName()); serviceInstanceGroupDefinition.setProperties(groupProperties); serviceInstanceGroupDefinition.setMembers(new ArrayList<>()); - String heatStackGroupKey = translateTo.getTranslatedId(); + String heatStackGroupKey = translateTo.getTranslatedId() + "_group"; DataModelUtil.addGroupDefinitionToTopologyTemplate(serviceTemplate, heatStackGroupKey, serviceInstanceGroupDefinition); + mdcDataDebugMessage.debugExitMessage(null, null); return heatStackGroupKey; } private void setNestedServiceTemplateGeneralDetails(TranslateTo translateTo, - ServiceTemplate nestedSubstitutionServiceTemplate) { - Metadata nestedTemplateMetadata = new Metadata(); - String nestedTemplateName = translateTo.getResourceId(); - nestedTemplateMetadata.setTemplate_name(nestedTemplateName); + ServiceTemplate + nestedSubstitutionServiceTemplate) { + mdcDataDebugMessage.debugEntryMessage(null, null); + + Map<String, String> nestedTemplateMetadata = new HashMap<>(); + String nestedTemplateName = new ContrailTranslationHelper() + .getSubstitutionContrailServiceTemplateMetadata(translateTo.getHeatFileName(), + translateTo.getResourceId()); + nestedTemplateMetadata.put(ToscaConstants.ST_METADATA_TEMPLATE_NAME, nestedTemplateName); nestedSubstitutionServiceTemplate.setMetadata(nestedTemplateMetadata); nestedSubstitutionServiceTemplate .setTosca_definitions_version(ToscaConstants.TOSCA_DEFINITIONS_VERSION); nestedSubstitutionServiceTemplate.setTopology_template(new TopologyTemplate()); - nestedSubstitutionServiceTemplate.setImports(GlobalTypesGenerator.getGlobalTypesImportList()); - nestedSubstitutionServiceTemplate.getImports() - .put(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME, GlobalTypesUtil - .createServiceTemplateImport(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME)); + List<Map<String, Import>> globalTypesImportList = + GlobalTypesGenerator.getGlobalTypesImportList(); + globalTypesImportList.addAll( + HeatToToscaUtil.createImportList(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME)); + nestedSubstitutionServiceTemplate.setImports(globalTypesImportList); + mdcDataDebugMessage.debugExitMessage(null, null); } private NodeTemplate createSubstitutedNodeTemplate(TranslateTo translateTo, @@ -548,89 +700,127 @@ public class ResourceTranslationContrailServiceInstanceImpl extends ResourceTran String contrailServiceTemplateTranslatedId, int numberOfPorts) { - translateTo.getServiceTemplate().getImports() - .put(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME, GlobalTypesUtil - .createServiceTemplateImport(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME)); + + mdcDataDebugMessage.debugEntryMessage(null, null); + boolean isImportAddedToServiceTemplate = + DataModelUtil + .isImportAddedToServiceTemplate(translateTo.getServiceTemplate().getImports(), Constants + .GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME); + if (!isImportAddedToServiceTemplate) { + translateTo.getServiceTemplate().getImports() + .addAll(HeatToToscaUtil + .createImportList(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME)); + } NodeTemplate substitutesNodeTemplate = new NodeTemplate(); substitutesNodeTemplate.setType(contrailServiceTemplateTranslatedId); List<String> directiveList = new ArrayList<>(); directiveList.add(ToscaConstants.NODE_TEMPLATE_DIRECTIVE_SUBSTITUTABLE); substitutesNodeTemplate.setDirectives(directiveList); substitutesNodeTemplate.setProperties(TranslatorHeatToToscaPropertyConverter - .getToscaPropertiesSimpleConversion(translateTo.getResource().getProperties(), + .getToscaPropertiesSimpleConversion(translateTo.getServiceTemplate(), translateTo. + getResourceId(), translateTo.getResource().getProperties(), substitutesNodeTemplate.getProperties(), translateTo.getHeatFileName(), translateTo.getHeatOrchestrationTemplate(), HeatResourcesTypes.CONTRAIL_SERVICE_INSTANCE.getHeatResource(), substitutesNodeTemplate, translateTo.getContext())); substitutesNodeTemplate.setProperties(TranslatorHeatToToscaPropertyConverter - .getToscaPropertiesSimpleConversion(contrailServiceTemplateResource.getProperties(), + .getToscaPropertiesSimpleConversion(translateTo.getServiceTemplate(), translateTo. + getResourceId(), contrailServiceTemplateResource.getProperties(), substitutesNodeTemplate.getProperties(), translateTo.getHeatFileName(), translateTo.getHeatOrchestrationTemplate(), HeatResourcesTypes.CONTRAIL_SERVICE_TEMPLATE.getHeatResource(), substitutesNodeTemplate, translateTo.getContext())); - HeatToToscaUtil.mapBoolean(substitutesNodeTemplate, "availability_zone_enable"); - HeatToToscaUtil.mapBoolean(substitutesNodeTemplate, "ordered_interfaces"); + HeatToToscaUtil.mapBoolean(substitutesNodeTemplate, HeatToToscaUtil + .getToscaPropertyName(translateTo.getContext(), contrailServiceTemplateResource.getType(), + HeatConstants.AVAILABILITY_ZONE_ENABLE_PROPERTY_NAME)); + HeatToToscaUtil.mapBoolean(substitutesNodeTemplate, HeatToToscaUtil + .getToscaPropertyName(translateTo.getContext(), contrailServiceTemplateResource.getType(), + HeatConstants.ORDERED_INTERFACES_PROPERTY_NAME)); Object sharedIpListPropertyValue = - contrailServiceTemplateResource.getProperties().get("shared_ip_list"); + contrailServiceTemplateResource.getProperties() + .get(HeatConstants.SHARED_IP_LIST_PROPERTY_NAME); + String toscaSharedIpListPropertyName = HeatToToscaUtil + .getToscaPropertyName(translateTo.getContext(), contrailServiceTemplateResource.getType(), + HeatConstants.SHARED_IP_LIST_PROPERTY_NAME); Optional<List<Map<String, List>>> sharedIpTranslatedSplitFun = - TranslatorHeatToToscaFunctionConverter + new ContrailTranslationHelper() .translateFnSplitFunction(sharedIpListPropertyValue, numberOfPorts, true); if (sharedIpTranslatedSplitFun.isPresent()) { substitutesNodeTemplate.getProperties() - .put("shared_ip_list", sharedIpTranslatedSplitFun.get()); + .put(toscaSharedIpListPropertyName, sharedIpTranslatedSplitFun.get()); } else { - HeatToToscaUtil.mapBooleanList(substitutesNodeTemplate, "shared_ip_list"); + HeatToToscaUtil.mapBooleanList(substitutesNodeTemplate, toscaSharedIpListPropertyName); } Object staticRouteListPropertyValue = - contrailServiceTemplateResource.getProperties().get("static_routes_list"); + contrailServiceTemplateResource.getProperties() + .get(HeatConstants.STATIC_ROUTES_LIST_PROPERTY_NAME); + String toscaStaticRoutesListPropertyName = HeatToToscaUtil + .getToscaPropertyName(translateTo.getContext(), contrailServiceTemplateResource.getType(), + HeatConstants.STATIC_ROUTES_LIST_PROPERTY_NAME); Optional<List<Map<String, List>>> staticRouteTranslatedSplitFun = - TranslatorHeatToToscaFunctionConverter + new ContrailTranslationHelper() .translateFnSplitFunction(staticRouteListPropertyValue, numberOfPorts, true); if (staticRouteTranslatedSplitFun.isPresent()) { substitutesNodeTemplate.getProperties() - .put("static_routes_list", staticRouteTranslatedSplitFun.get()); + .put(toscaStaticRoutesListPropertyName, staticRouteTranslatedSplitFun.get()); } else { - HeatToToscaUtil.mapBooleanList(substitutesNodeTemplate, "static_routes_list"); + HeatToToscaUtil.mapBooleanList(substitutesNodeTemplate, toscaStaticRoutesListPropertyName); } Object serviceInterfaceTypeListPropertyValue = - contrailServiceTemplateResource.getProperties().get("service_interface_type_list"); + contrailServiceTemplateResource.getProperties() + .get(HeatConstants.SERVICE_INTERFCAE_TYPE_LIST_PROPERTY_NAME); + String toscaServiceInterfaceTypeListPropertyName = HeatToToscaUtil + .getToscaPropertyName(translateTo.getContext(), contrailServiceTemplateResource.getType(), + HeatConstants.SERVICE_INTERFCAE_TYPE_LIST_PROPERTY_NAME); Optional<List<Map<String, List>>> serviceInterfaceTypeTranslatedSplitFun = - TranslatorHeatToToscaFunctionConverter + new ContrailTranslationHelper() .translateFnSplitFunction(serviceInterfaceTypeListPropertyValue, numberOfPorts, false); - if (serviceInterfaceTypeTranslatedSplitFun.isPresent()) { - substitutesNodeTemplate.getProperties() - .put("service_interface_type_list", serviceInterfaceTypeTranslatedSplitFun.get()); - } + serviceInterfaceTypeTranslatedSplitFun + .ifPresent(translatedSplitFun -> substitutesNodeTemplate.getProperties() + .put(toscaServiceInterfaceTypeListPropertyName, translatedSplitFun)); String substitutedNodeTemplateId = translateTo.getTranslatedId(); DataModelUtil.addNodeTemplate(translateTo.getServiceTemplate(), substitutedNodeTemplateId, substitutesNodeTemplate); + + mdcDataDebugMessage.debugExitMessage(null, null); return substitutesNodeTemplate; } private void addNetworkLinkRequirements(NodeType nodeType, int numberOfPorts) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + if (nodeType.getRequirements() == null) { List<Map<String, RequirementDefinition>> requirementList = new ArrayList<>(); for (int i = 0; i < numberOfPorts; i++) { Map<String, RequirementDefinition> requirementDefinitionMap = new HashMap<>(); requirementDefinitionMap.put(ToscaConstants.LINK_REQUIREMENT_ID + "_port_" + i, - DataModelUtil.createRequirement(ToscaCapabilityType.NETWORK_LINKABLE.getDisplayName(), - ToscaNodeType.ROOT.getDisplayName(), - ToscaRelationshipType.NETWORK_LINK_TO.getDisplayName(), null)); + DataModelUtil.createRequirement(ToscaCapabilityType.NATIVE_NETWORK_LINKABLE, + ToscaNodeType.NATIVE_ROOT, + ToscaRelationshipType.NATIVE_NETWORK_LINK_TO, null)); requirementList.add(requirementDefinitionMap); } if (numberOfPorts > 0) { nodeType.setRequirements(requirementList); } } + + mdcDataDebugMessage.debugExitMessage(null, null); } private int getServiceInstanceNumberOfPorts(Resource serviceInstanceResource) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + int numberOfPorts; - Object interfaceTypeProperty = serviceInstanceResource.getProperties().get("interface_list"); + Object interfaceTypeProperty = + serviceInstanceResource.getProperties().get(HeatConstants.INTERFACE_LIST_PROPERTY_NAME); if (interfaceTypeProperty == null) { numberOfPorts = 0; } else if (interfaceTypeProperty instanceof List) { @@ -641,11 +831,16 @@ public class ResourceTranslationContrailServiceInstanceImpl extends ResourceTran numberOfPorts = 0; } + mdcDataDebugMessage.debugExitMessage(null, null); return numberOfPorts; } private AttachedResourceId getServiceTemplateAttachedId(TranslateTo translateTo, Resource serviceInstanceResource) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + Object serviceTemplateProperty = serviceInstanceResource.getProperties().get("service_template"); Optional<AttachedResourceId> serviceTemplateId = HeatToToscaUtil @@ -653,8 +848,13 @@ public class ResourceTranslationContrailServiceInstanceImpl extends ResourceTran translateTo.getHeatOrchestrationTemplate(), translateTo.getContext(), serviceTemplateProperty); if (serviceTemplateId.isPresent()) { + mdcDataDebugMessage.debugExitMessage(null, null); return serviceTemplateId.get(); } else { + MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB, + LoggerTragetServiceName.GET_SERVICE_TEMPLATE, ErrorLevel.ERROR.name(), + LoggerErrorCode.DATA_ERROR.getErrorCode(), + LoggerErrorDescription.MISSING_MANDATORY_PROPERTY); throw new CoreException(new MissingMandatoryPropertyErrorBuilder("service_template").build()); } } diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/ResourceTranslationContrailServiceTemplateImpl.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationContrailServiceTemplateImpl.java index e0a3ed422f..8b862e585f 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/ResourceTranslationContrailServiceTemplateImpl.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationContrailServiceTemplateImpl.java @@ -18,75 +18,113 @@ * ============LICENSE_END========================================================= */ -package org.openecomp.sdc.translator.services.heattotosca.impl; +package org.openecomp.sdc.translator.services.heattotosca.impl.resourcetranslation; import org.openecomp.sdc.common.errors.CoreException; +import org.openecomp.sdc.datatypes.error.ErrorLevel; +import org.openecomp.sdc.logging.context.impl.MdcDataErrorMessage; +import org.openecomp.sdc.logging.types.LoggerConstants; +import org.openecomp.sdc.logging.types.LoggerErrorCode; +import org.openecomp.sdc.logging.types.LoggerErrorDescription; +import org.openecomp.sdc.logging.types.LoggerTragetServiceName; import org.openecomp.sdc.tosca.datatypes.ToscaNodeType; -import org.openecomp.sdc.tosca.datatypes.model.Metadata; +import org.openecomp.sdc.tosca.datatypes.ToscaTopologyTemplateElements; import org.openecomp.sdc.tosca.datatypes.model.NodeType; import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; import org.openecomp.sdc.tosca.services.DataModelUtil; import org.openecomp.sdc.tosca.services.ToscaConstants; +import org.openecomp.sdc.translator.datatypes.heattotosca.TranslationContext; import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo; import org.openecomp.sdc.translator.services.heattotosca.Constants; import org.openecomp.sdc.translator.services.heattotosca.errors.MissingMandatoryPropertyErrorBuilder; import org.openecomp.sdc.translator.services.heattotosca.globaltypes.GlobalTypesGenerator; import org.openecomp.sdc.translator.services.heattotosca.helper.ContrailTranslationHelper; +import java.util.HashMap; import java.util.Map; import java.util.Objects; +import java.util.Optional; public class ResourceTranslationContrailServiceTemplateImpl extends ResourceTranslationBase { static String getContrailSubstitutedNodeTypeId(String serviceTemplateTranslatedId) { - return ToscaConstants.NODES_SUBSTITUTION_PREFIX + serviceTemplateTranslatedId; + return ToscaNodeType.ABSTRACT_NODE_TYPE_PREFIX + "heat." + serviceTemplateTranslatedId; + } + + @Override + public void translate(TranslateTo translateTo) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + ServiceTemplate globalSubstitutionServiceTemplate = + getGlobalSubstitutionTypesServiceTemplate(translateTo); + addSubstitutedNodeType(translateTo, globalSubstitutionServiceTemplate); + addComputeNodeType(translateTo, globalSubstitutionServiceTemplate, translateTo.getContext()); + mdcDataDebugMessage.debugExitMessage(null, null); } @Override protected boolean isEssentialRequirementsValid(TranslateTo translateTo) { Map<String, Object> properties = translateTo.getResource().getProperties(); if (Objects.isNull(properties) || Objects.isNull(properties.get("image_name"))) { + MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB, + LoggerTragetServiceName.GENERATE_TRANSLATED_ID, ErrorLevel.ERROR.name(), + LoggerErrorCode.DATA_ERROR.getErrorCode(), + LoggerErrorDescription.MISSING_MANDATORY_PROPERTY); throw new CoreException(new MissingMandatoryPropertyErrorBuilder("image_name").build()); } return true; } - @Override - public void translate(TranslateTo translateTo) { - - ServiceTemplate globalSubstitutionServiceTemplate = - getGlobalSubstitutionTypesServiceTemplate(translateTo); - addSubstitutedNodeType(translateTo, globalSubstitutionServiceTemplate); - addComputeNodeType(translateTo, globalSubstitutionServiceTemplate); - } - private void addComputeNodeType(TranslateTo translateTo, - ServiceTemplate globalSubstitutionServiceTemplate) { + ServiceTemplate globalSubstitutionServiceTemplate, + TranslationContext context) { + mdcDataDebugMessage.debugEntryMessage(null, null); NodeType computeNodeType = new NodeType(); - computeNodeType.setDerived_from(ToscaNodeType.CONTRAIL_COMPUTE.getDisplayName()); + computeNodeType.setDerived_from(ToscaNodeType.CONTRAIL_COMPUTE); String computeNodeTypeId = new ContrailTranslationHelper() - .getComputeNodeTypeId(translateTo.getTranslatedId(), translateTo.getResource()); + .getComputeNodeTypeId(translateTo.getResource(), translateTo.getResourceId(), + translateTo.getTranslatedId(), context); DataModelUtil .addNodeType(globalSubstitutionServiceTemplate, computeNodeTypeId, computeNodeType); + + mdcDataDebugMessage.debugExitMessage(null, null); } private void addSubstitutedNodeType(TranslateTo translateTo, ServiceTemplate globalSubstitutionServiceTemplate) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + NodeType substitutedNodeType = new NodeType(); substitutedNodeType - .setDerived_from(ToscaNodeType.CONTRAIL_ABSTRACT_SUBSTITUTE.getDisplayName()); + .setDerived_from(ToscaNodeType.CONTRAIL_ABSTRACT_SUBSTITUTE); DataModelUtil.addNodeType(globalSubstitutionServiceTemplate, getContrailSubstitutedNodeTypeId(translateTo.getTranslatedId()), substitutedNodeType); + + mdcDataDebugMessage.debugExitMessage(null, null); + } + + @Override + protected Optional<ToscaTopologyTemplateElements> getTranslatedToscaTopologyElement( + TranslateTo translateTo) { + return Optional.empty(); } private ServiceTemplate getGlobalSubstitutionTypesServiceTemplate(TranslateTo translateTo) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + ServiceTemplate globalSubstitutionServiceTemplate = - translateTo.getContext().getTranslatedServiceTemplates() - .get(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME); + translateTo.getContext().getTranslatedServiceTemplates().get( + Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME); if (globalSubstitutionServiceTemplate == null) { globalSubstitutionServiceTemplate = new ServiceTemplate(); - Metadata templateMetadata = new Metadata(); - templateMetadata.setTemplate_name(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME); + Map<String, String> templateMetadata = new HashMap<>(); + templateMetadata.put(ToscaConstants.ST_METADATA_TEMPLATE_NAME, Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME); globalSubstitutionServiceTemplate.setMetadata(templateMetadata); globalSubstitutionServiceTemplate.setImports(GlobalTypesGenerator.getGlobalTypesImportList()); globalSubstitutionServiceTemplate @@ -95,6 +133,9 @@ public class ResourceTranslationContrailServiceTemplateImpl extends ResourceTran .put(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME, globalSubstitutionServiceTemplate); } + + mdcDataDebugMessage.debugExitMessage(null, null); return globalSubstitutionServiceTemplate; } + } diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/ResourceTranslationContrailV2NetworkPolicyImpl.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationContrailV2NetworkPolicyImpl.java index 72a25985a8..71efc18816 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/ResourceTranslationContrailV2NetworkPolicyImpl.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationContrailV2NetworkPolicyImpl.java @@ -18,32 +18,39 @@ * ============LICENSE_END========================================================= */ -package org.openecomp.sdc.translator.services.heattotosca.impl; +package org.openecomp.sdc.translator.services.heattotosca.impl.resourcetranslation; +import org.openecomp.sdc.common.utils.CommonUtil; +import org.openecomp.sdc.logging.api.Logger; +import org.openecomp.sdc.logging.api.LoggerFactory; import org.openecomp.sdc.tosca.datatypes.ToscaNodeType; import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate; import org.openecomp.sdc.tosca.services.DataModelUtil; import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo; import org.openecomp.sdc.translator.services.heattotosca.mapping.TranslatorHeatToToscaPropertyConverter; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; public class ResourceTranslationContrailV2NetworkPolicyImpl extends ResourceTranslationBase { protected static Logger logger = - LoggerFactory.getLogger(ResourceTranslationContrailV2NetworkPolicyImpl.class); + (Logger) LoggerFactory.getLogger(ResourceTranslationContrailV2NetworkPolicyImpl.class); @Override protected void translate(TranslateTo translateTo) { + + mdcDataDebugMessage.debugEntryMessage(null, null); + NodeTemplate nodeTemplate = new NodeTemplate(); - nodeTemplate.setType(ToscaNodeType.CONTRAILV2_NETWORK_RULE.getDisplayName()); + nodeTemplate.setType(ToscaNodeType.CONTRAILV2_NETWORK_RULE); nodeTemplate.setProperties(TranslatorHeatToToscaPropertyConverter - .getToscaPropertiesSimpleConversion(translateTo.getResource().getProperties(), + .getToscaPropertiesSimpleConversion(translateTo.getServiceTemplate(),translateTo. + getResourceId(),translateTo.getResource().getProperties(), nodeTemplate.getProperties(), translateTo.getHeatFileName(), translateTo.getHeatOrchestrationTemplate(), translateTo.getResource().getType(), nodeTemplate, translateTo.getContext())); DataModelUtil.addNodeTemplate(translateTo.getServiceTemplate(), translateTo.getTranslatedId(), nodeTemplate); + + mdcDataDebugMessage.debugExitMessage(null, null); } } diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/ResourceTranslationContrailV2VirtualNetworkImpl.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationContrailV2VirtualNetworkImpl.java index d81f3196a3..d39d0f1c45 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/ResourceTranslationContrailV2VirtualNetworkImpl.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationContrailV2VirtualNetworkImpl.java @@ -18,9 +18,12 @@ * ============LICENSE_END========================================================= */ -package org.openecomp.sdc.translator.services.heattotosca.impl; +package org.openecomp.sdc.translator.services.heattotosca.impl.resourcetranslation; import org.apache.commons.collections.CollectionUtils; +import org.openecomp.sdc.common.utils.CommonUtil; +import org.openecomp.sdc.logging.api.Logger; +import org.openecomp.sdc.logging.api.LoggerFactory; import org.openecomp.sdc.heat.datatypes.model.HeatResourcesTypes; import org.openecomp.sdc.heat.datatypes.model.Resource; import org.openecomp.sdc.tosca.datatypes.ToscaCapabilityType; @@ -31,13 +34,11 @@ import org.openecomp.sdc.tosca.datatypes.model.RequirementAssignment; import org.openecomp.sdc.tosca.services.DataModelUtil; import org.openecomp.sdc.tosca.services.ToscaConstants; import org.openecomp.sdc.translator.datatypes.heattotosca.AttachedResourceId; -import org.openecomp.sdc.translator.datatypes.heattotosca.ResourceReferenceType; +import org.openecomp.sdc.translator.datatypes.heattotosca.ReferenceType; import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo; import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil; import org.openecomp.sdc.translator.services.heattotosca.ResourceTranslationFactory; import org.openecomp.sdc.translator.services.heattotosca.mapping.TranslatorHeatToToscaPropertyConverter; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.Collection; @@ -48,29 +49,34 @@ import java.util.Optional; public class ResourceTranslationContrailV2VirtualNetworkImpl extends ResourceTranslationBase { protected static Logger logger = - LoggerFactory.getLogger(ResourceTranslationContrailV2VirtualNetworkImpl.class); + (Logger) LoggerFactory.getLogger(ResourceTranslationContrailV2VirtualNetworkImpl.class); @Override public void translate(TranslateTo translateTo) { + + mdcDataDebugMessage.debugEntryMessage(null, null); + NodeTemplate nodeTemplate = new NodeTemplate(); - nodeTemplate.setType(ToscaNodeType.CONTRAILV2_VIRTUAL_NETWORK.getDisplayName()); + nodeTemplate.setType(ToscaNodeType.CONTRAILV2_VIRTUAL_NETWORK); nodeTemplate.setProperties(TranslatorHeatToToscaPropertyConverter - .getToscaPropertiesSimpleConversion(translateTo.getResource().getProperties(), + .getToscaPropertiesSimpleConversion(translateTo.getServiceTemplate(),translateTo. + getResourceId(),translateTo.getResource().getProperties(), nodeTemplate.getProperties(), translateTo.getHeatFileName(), translateTo.getHeatOrchestrationTemplate(), translateTo.getResource().getType(), nodeTemplate, translateTo.getContext())); - Optional<String> resourceTranslatedId = getResourceTranslatedId(translateTo.getHeatFileName(), - translateTo.getHeatOrchestrationTemplate(), translateTo.getResourceId(), - translateTo.getContext()); - if (resourceTranslatedId.isPresent()) { - DataModelUtil.addNodeTemplate(translateTo.getServiceTemplate(), resourceTranslatedId.get(), - nodeTemplate); - } + DataModelUtil.addNodeTemplate(translateTo.getServiceTemplate(), translateTo.getTranslatedId(), + nodeTemplate); linkToPolicyNodeTemplate(translateTo); + + mdcDataDebugMessage.debugExitMessage(null, null); } private void linkToPolicyNodeTemplate(TranslateTo translateTo) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + List<AttachedResourceId> networkPolicyIdList = extractNetworkPolicyIdList(translateTo); if (CollectionUtils.isEmpty(networkPolicyIdList)) { return; @@ -83,20 +89,31 @@ public class ResourceTranslationContrailV2VirtualNetworkImpl extends ResourceTra .addRequirementAssignment(policyNodeTemplate, ToscaConstants.NETWORK_REQUIREMENT_ID, createRequirementAssignment(translateTo.getTranslatedId())); } + + mdcDataDebugMessage.debugExitMessage(null, null); } private List<AttachedResourceId> extractNetworkPolicyIdList(TranslateTo translateTo) { + + mdcDataDebugMessage.debugEntryMessage(null, null); + Object propertyValue = translateTo.getResource().getProperties().get("network_policy_refs"); if (propertyValue != null) { + mdcDataDebugMessage.debugExitMessage(null, null); return extractNetworkPolicyId(propertyValue, translateTo); } else { + mdcDataDebugMessage.debugExitMessage(null, null); return null; } } private List<AttachedResourceId> extractNetworkPolicyId(Object propertyValue, TranslateTo translateTo) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + List<AttachedResourceId> attachedResourceIdList = new ArrayList<>(); if (propertyValue instanceof List) { @@ -109,14 +126,20 @@ public class ResourceTranslationContrailV2VirtualNetworkImpl extends ResourceTra attachedResourceIdList.add(resourceId); } } + + mdcDataDebugMessage.debugExitMessage(null, null); return attachedResourceIdList; } private AttachedResourceId parsNetworkPolicyId(Object propertyValue, TranslateTo translateTo) { + + mdcDataDebugMessage.debugEntryMessage(null, null); + Optional<String> translatedPolicyResourceId; String policyResourceId = extractResourceId(propertyValue, translateTo); if (policyResourceId == null) { + mdcDataDebugMessage.debugExitMessage(null, null); return null; } @@ -125,6 +148,7 @@ public class ResourceTranslationContrailV2VirtualNetworkImpl extends ResourceTra translateTo.getHeatFileName()); if (!policyResource.getType() .equals(HeatResourcesTypes.CONTRAIL_V2_NETWORK_RULE_RESOURCE_TYPE.getHeatResource())) { + mdcDataDebugMessage.debugExitMessage(null, null); return null; } translatedPolicyResourceId = ResourceTranslationFactory.getInstance(policyResource) @@ -134,13 +158,16 @@ public class ResourceTranslationContrailV2VirtualNetworkImpl extends ResourceTra if (!translatedPolicyResourceId.isPresent()) { logger.warn("Heat resource: '" + translateTo.getResourceId() + "' with type: '" + translateTo.getResource().getType() - + "' property network_policy_refs is referenced to an " - + "unsupported resource the connection will be ignored in TOSCA translation."); + + "' property network_policy_refs is referenced to an unsupported resource the " + + "connection will be ignored in TOSCA translation."); + mdcDataDebugMessage.debugExitMessage(null, null); return null; } - return + AttachedResourceId attachedResourceId = new AttachedResourceId(translatedPolicyResourceId.get(), policyResourceId, - ResourceReferenceType.GET_ATTR); + ReferenceType.GET_ATTR); + mdcDataDebugMessage.debugExitMessage(null, null); + return attachedResourceId; } private String extractResourceId(Object propertyValue, TranslateTo translateTo) { @@ -156,9 +183,8 @@ public class ResourceTranslationContrailV2VirtualNetworkImpl extends ResourceTra } else { logger.warn("Heat resource: '" + translateTo.getResourceId() + "' with type: '" + translateTo.getResource().getType() - + "' has property with invalid format of 'get_attr' function " - + "with 'fq_name' value, therefore this property" - + " will be ignored in TOSCA translation."); + + "' has property with invalid format of 'get_attr' function with 'fq_name' " + + "value, therefore this property will be ignored in TOSCA translation."); } } } @@ -169,8 +195,8 @@ public class ResourceTranslationContrailV2VirtualNetworkImpl extends ResourceTra } else { logger.warn("Heat resource: '" + translateTo.getResourceId() + "' with type: '" + translateTo.getResource().getType() - + "' has property invalid format of 'get_resource' function, therefore" - + " this property will be ignored in TOSCA translation."); + + "' has property invalid format of 'get_resource' function, therefore this property" + + " will be ignored in TOSCA translation."); } } else { Collection<Object> valCollection = ((Map) propertyValue).values(); @@ -192,16 +218,21 @@ public class ResourceTranslationContrailV2VirtualNetworkImpl extends ResourceTra } logger.warn("Heat resource: '" + translateTo.getResourceId() + "' with type: '" + translateTo.getResource().getType() - + "' invalid format of property value, therefore " - + "this resource will be ignored in TOSCA translation."); + + "' invalid format of property value, therefore this resource will be ignored in TOSCA " + + "translation."); return null; } private RequirementAssignment createRequirementAssignment(String translatedNetworkResourceId) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + RequirementAssignment requirement = new RequirementAssignment(); - requirement.setCapability(ToscaCapabilityType.ATTACHMENT.getDisplayName()); + requirement.setCapability(ToscaCapabilityType.NATIVE_ATTACHMENT); requirement.setNode(translatedNetworkResourceId); - requirement.setRelationship(ToscaRelationshipType.ATTACHES_TO.getDisplayName()); + requirement.setRelationship(ToscaRelationshipType.ATTACHES_TO); + mdcDataDebugMessage.debugExitMessage(null, null); return requirement; } diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationContrailV2VlanSubInterfaceImpl.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationContrailV2VlanSubInterfaceImpl.java new file mode 100644 index 0000000000..e0e6c459a1 --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationContrailV2VlanSubInterfaceImpl.java @@ -0,0 +1,132 @@ +/*- + * ============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.services.heattotosca.impl.resourcetranslation; + +import org.openecomp.sdc.common.utils.CommonUtil; +import org.openecomp.sdc.logging.api.Logger; +import org.openecomp.sdc.logging.api.LoggerFactory; +import org.openecomp.sdc.heat.datatypes.model.HeatResourcesTypes; +import org.openecomp.sdc.heat.datatypes.model.Resource; +import org.openecomp.sdc.heat.services.HeatConstants; +import org.openecomp.sdc.tosca.datatypes.ToscaNodeType; +import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate; +import org.openecomp.sdc.tosca.services.DataModelUtil; +import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo; +import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil; +import org.openecomp.sdc.translator.services.heattotosca.helper.ContrailV2VirtualMachineInterfaceHelper; +import org.openecomp.sdc.translator.services.heattotosca.mapping.TranslatorHeatToToscaPropertyConverter; + +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.Optional; + + +public class ResourceTranslationContrailV2VlanSubInterfaceImpl extends ResourceTranslationBase { + protected static Logger logger = + (Logger) LoggerFactory.getLogger(ResourceTranslationContrailV2VlanSubInterfaceImpl.class); + + @Override + protected void translate(TranslateTo translateTo) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + NodeTemplate nodeTemplate = new NodeTemplate(); + nodeTemplate.setType(ToscaNodeType.CONTRAILV2_VLAN_SUB_INTERFACE); + + nodeTemplate.setProperties(TranslatorHeatToToscaPropertyConverter + .getToscaPropertiesSimpleConversion(translateTo.getServiceTemplate(),translateTo. + getResourceId(),translateTo.getResource().getProperties(), + nodeTemplate.getProperties(), translateTo.getHeatFileName(), + translateTo.getHeatOrchestrationTemplate(), translateTo.getResource().getType(), + nodeTemplate, translateTo.getContext())); + + new ContrailV2VirtualMachineInterfaceHelper() + .connectVmiToNetwork(this, translateTo, nodeTemplate); + connectSubInterfaceToInterface(translateTo, nodeTemplate); + DataModelUtil.addNodeTemplate(translateTo.getServiceTemplate(), translateTo.getTranslatedId(), + nodeTemplate); + + mdcDataDebugMessage.debugExitMessage(null, null); + } + + //connection to shared interface is not supported + private void connectSubInterfaceToInterface(TranslateTo translateTo, + NodeTemplate vlanSubInterfaceNodeTemplate) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + Object interfaceRefs = + translateTo.getResource().getProperties().get(HeatConstants.VMI_REFS_PROPERTY_NAME); + if (Objects.isNull(interfaceRefs) || !(interfaceRefs instanceof List) + || ((List) interfaceRefs).size() == 0) { + return; + } + List<String> acceptableResourceTypes = Arrays + .asList(HeatResourcesTypes.CONTRAIL_V2_VIRTUAL_MACHINE_INTERFACE_RESOURCE_TYPE + .getHeatResource(), + HeatResourcesTypes.NEUTRON_PORT_RESOURCE_TYPE.getHeatResource()); + if (((List) interfaceRefs).size() > 1) { + logger.warn("Heat resource: '" + translateTo.getResourceId() + "' with type: '" + + translateTo.getResource().getType() + + "' include '" + HeatConstants.VMI_REFS_PROPERTY_NAME + + "' property with more than one interface values, only " + + "the first interface will be connected, " + + "all rest will be ignored in TOSCA translation."); + } + Object interfaceRef = ((List) interfaceRefs).get(0); + + Optional<String> interfaceResourceId = + HeatToToscaUtil.extractContrailGetResourceAttachedHeatResourceId(interfaceRef); + if (interfaceResourceId.isPresent()) { // get_resource + Resource interfaceResource = HeatToToscaUtil + .getResource(translateTo.getHeatOrchestrationTemplate(), interfaceResourceId.get(), + translateTo.getHeatFileName()); + + if (acceptableResourceTypes.contains(interfaceResource.getType()) + && !(new ContrailV2VirtualMachineInterfaceHelper() + .isVlanSubInterfaceResource(interfaceResource))) { + Optional<String> interfaceResourceTranslatedId = + getResourceTranslatedId(translateTo.getHeatFileName(), + translateTo.getHeatOrchestrationTemplate(), interfaceResourceId.get(), + translateTo.getContext()); + interfaceResourceTranslatedId.ifPresent(interfaceResourceTranslatedIdVal -> HeatToToscaUtil + .addBindingReqFromSubInterfaceToInterface(vlanSubInterfaceNodeTemplate, + interfaceResourceTranslatedIdVal)); + } else { + logger.warn("Heat resource: '" + translateTo.getResourceId() + "' with type: '" + + translateTo.getResource().getType() + + "' include '" + HeatConstants.VMI_REFS_PROPERTY_NAME + + "' property which is connect to unsupported/incorrect " + + (true == (new ContrailV2VirtualMachineInterfaceHelper() + .isVlanSubInterfaceResource(interfaceResource)) ? "Vlan Sub interface " : "") + + "resource '" + interfaceResourceId.get() + "' with type '" + + interfaceResource.getType() + + "', therefore, this connection will be ignored in TOSCA translation."); + } + } + + mdcDataDebugMessage.debugExitMessage(null, null); + } + +} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationContrailV2VmInterfaceImpl.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationContrailV2VmInterfaceImpl.java new file mode 100644 index 0000000000..1736bbef96 --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationContrailV2VmInterfaceImpl.java @@ -0,0 +1,138 @@ +/*- + * ============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.services.heattotosca.impl.resourcetranslation; + +import org.openecomp.sdc.heat.services.HeatConstants; +import org.openecomp.sdc.logging.api.Logger; +import org.openecomp.sdc.logging.api.LoggerFactory; +import org.openecomp.sdc.tosca.datatypes.ToscaNodeType; +import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate; +import org.openecomp.sdc.tosca.services.DataModelUtil; +import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo; +import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil; +import org.openecomp.sdc.translator.services.heattotosca.helper.ContrailV2VirtualMachineInterfaceHelper; +import org.openecomp.sdc.translator.services.heattotosca.mapping.TranslatorHeatToToscaPropertyConverter; + +import java.util.List; +import java.util.Map; + + +public class ResourceTranslationContrailV2VmInterfaceImpl extends ResourceTranslationBase { + protected static Logger logger = + (Logger) LoggerFactory.getLogger(ResourceTranslationContrailV2VmInterfaceImpl.class); + + @Override + protected String generateTranslatedId(TranslateTo translateTo) { + if (new ContrailV2VirtualMachineInterfaceHelper().isVlanSubInterfaceResource(translateTo + .getResource())) { + return null; + } else { + return super.generateTranslatedId(translateTo); + } + } + + @Override + protected void translate(TranslateTo translateTo) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + if (new ContrailV2VirtualMachineInterfaceHelper().isVlanSubInterfaceResource(translateTo + .getResource())) { + translateVlanSubInterfaceResource(translateTo); + } else { + translateVirtualMachineInterfaceResource(translateTo); + } + + mdcDataDebugMessage.debugExitMessage(null, null); + } + + + private void translateVirtualMachineInterfaceResource(TranslateTo translateTo) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + NodeTemplate nodeTemplate = new NodeTemplate(); + nodeTemplate.setType(ToscaNodeType.CONTRAILV2_VIRTUAL_MACHINE_INTERFACE); + nodeTemplate.setProperties(TranslatorHeatToToscaPropertyConverter + .getToscaPropertiesSimpleConversion(translateTo.getServiceTemplate(),translateTo. + getResourceId(),translateTo.getResource().getProperties(), + nodeTemplate.getProperties(), translateTo.getHeatFileName(), + translateTo.getHeatOrchestrationTemplate(), translateTo.getResource().getType(), + nodeTemplate, translateTo.getContext())); + String toscaVmiRefsPropertyName = + HeatToToscaUtil.getToscaPropertyName(translateTo, HeatConstants.VMI_REFS_PROPERTY_NAME); + if (nodeTemplate.getProperties().containsKey(toscaVmiRefsPropertyName)) { + nodeTemplate.getProperties().remove(toscaVmiRefsPropertyName); + } + + handleVmiMacAddressesInProperties(translateTo, nodeTemplate); + + new ContrailV2VirtualMachineInterfaceHelper() + .connectVmiToNetwork(this, translateTo, nodeTemplate); + DataModelUtil.addNodeTemplate(translateTo.getServiceTemplate(), translateTo.getTranslatedId(), + nodeTemplate); + + mdcDataDebugMessage.debugExitMessage(null, null); + } + + private void handleVmiMacAddressesInProperties(TranslateTo translateTo, + NodeTemplate nodeTemplate) { + String toscaVmiMacAddressesName = + HeatToToscaUtil.getToscaPropertyName(translateTo, HeatConstants.VMI_MAC_ADDRESSES); + String toscaVmiMacAddressesMacAddressesName = + HeatToToscaUtil.getToscaPropertyName(translateTo, HeatConstants.VMI_MAC_ADDRESSES_MAC_ADDRESSES); + + if(nodeTemplate.getProperties().containsKey(toscaVmiMacAddressesName)){ + Object macAddressesValue = nodeTemplate.getProperties().get(toscaVmiMacAddressesName); + if(macAddressesValue instanceof Map && ((Map<String, Object>)macAddressesValue).containsKey + (toscaVmiMacAddressesMacAddressesName)){ + updateMacAddressesMacAddressesInProperties(nodeTemplate, toscaVmiMacAddressesName, + toscaVmiMacAddressesMacAddressesName, + (Map<String, Object>) macAddressesValue); + } + } + } + + private void updateMacAddressesMacAddressesInProperties(NodeTemplate nodeTemplate, + String toscaVmiMacAddressesName, + String toscaVmiMacAddressesMacAddressesName, + Map<String, Object> macAddressesValue) { + Object macAddressesMacAddressesValue = + macAddressesValue.get(toscaVmiMacAddressesMacAddressesName); + if(macAddressesMacAddressesValue instanceof List){ + nodeTemplate.getProperties().put(toscaVmiMacAddressesName, macAddressesMacAddressesValue); + }else{ + nodeTemplate.getProperties().remove(toscaVmiMacAddressesName); + } + } + + private void translateVlanSubInterfaceResource(TranslateTo translateTo) { + + mdcDataDebugMessage.debugEntryMessage(null, null); + + new ResourceTranslationContrailV2VlanSubInterfaceImpl().translate(translateTo); + + mdcDataDebugMessage.debugExitMessage(null, null); + } + +} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/ResourceTranslationNeutronNetImpl.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationContrailVirtualNetworkImpl.java index 0b4ed61753..a6fc9ac2c1 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/ResourceTranslationNeutronNetImpl.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationContrailVirtualNetworkImpl.java @@ -18,35 +18,34 @@ * ============LICENSE_END========================================================= */ -package org.openecomp.sdc.translator.services.heattotosca.impl; +package org.openecomp.sdc.translator.services.heattotosca.impl.resourcetranslation; +import org.openecomp.sdc.common.utils.CommonUtil; import org.openecomp.sdc.tosca.datatypes.ToscaNodeType; import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate; import org.openecomp.sdc.tosca.services.DataModelUtil; import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo; -import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil; import org.openecomp.sdc.translator.services.heattotosca.mapping.TranslatorHeatToToscaPropertyConverter; -public class ResourceTranslationNeutronNetImpl extends ResourceTranslationBase { +public class ResourceTranslationContrailVirtualNetworkImpl extends ResourceTranslationBase { @Override public void translate(TranslateTo translateTo) { + + mdcDataDebugMessage.debugEntryMessage(null, null); + NodeTemplate nodeTemplate = new NodeTemplate(); - nodeTemplate.setType(ToscaNodeType.NEUTRON_NET.getDisplayName()); + nodeTemplate.setType(ToscaNodeType.CONTRAIL_VIRTUAL_NETWORK); nodeTemplate.setProperties(TranslatorHeatToToscaPropertyConverter - .getToscaPropertiesSimpleConversion(translateTo.getResource().getProperties(), + .getToscaPropertiesSimpleConversion(translateTo.getServiceTemplate(),translateTo. + getResourceId(),translateTo.getResource().getProperties(), nodeTemplate.getProperties(), translateTo.getHeatFileName(), translateTo.getHeatOrchestrationTemplate(), translateTo.getResource().getType(), nodeTemplate, translateTo.getContext())); + DataModelUtil.addNodeTemplate(translateTo.getServiceTemplate(), + translateTo.getTranslatedId(),nodeTemplate); - HeatToToscaUtil.mapBoolean(nodeTemplate, "port_security_enabled"); - HeatToToscaUtil.mapBoolean(nodeTemplate, "shared"); - HeatToToscaUtil.mapBoolean(nodeTemplate, "admin_state_up"); - - DataModelUtil.addNodeTemplate(translateTo.getServiceTemplate(), translateTo.getTranslatedId(), - nodeTemplate); + mdcDataDebugMessage.debugExitMessage(null, null); } - - } diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/ResourceTranslationDefaultImpl.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationDefaultImpl.java index 1182b60a6a..15a3c178b9 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/ResourceTranslationDefaultImpl.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationDefaultImpl.java @@ -18,24 +18,38 @@ * ============LICENSE_END========================================================= */ -package org.openecomp.sdc.translator.services.heattotosca.impl; +package org.openecomp.sdc.translator.services.heattotosca.impl.resourcetranslation; +import org.openecomp.sdc.tosca.datatypes.ToscaTopologyTemplateElements; import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo; -public class ResourceTranslationDefaultImpl extends ResourceTranslationBase { +import java.util.Optional; - @Override - protected String generateTranslatedId(TranslateTo translateTo) { - return null; - } +public class ResourceTranslationDefaultImpl extends ResourceTranslationBase { @Override public void translate(TranslateTo translateTo) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + //no translation is needed, this default is used for unsupported resources logger.warn("Heat resource: '" + translateTo.getResourceId() + "' with type: '" + translateTo.getResource().getType() + "' is not supported, will be ignored in TOSCA translation"); + mdcDataDebugMessage.debugExitMessage(null, null); + } + + @Override + protected String generateTranslatedId(TranslateTo translateTo) { + return null; + } + + @Override + protected Optional<ToscaTopologyTemplateElements> getTranslatedToscaTopologyElement( + TranslateTo translateTo) { + return Optional.empty(); } } diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationNestedImpl.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationNestedImpl.java new file mode 100644 index 0000000000..843d9fabc6 --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationNestedImpl.java @@ -0,0 +1,236 @@ +/*- + * ============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.services.heattotosca.impl.resourcetranslation; + +import org.openecomp.core.utilities.file.FileUtils; +import org.openecomp.sdc.heat.datatypes.manifest.FileData; +import org.openecomp.sdc.logging.api.Logger; +import org.openecomp.sdc.logging.api.LoggerFactory; +import org.openecomp.sdc.tosca.datatypes.ToscaNodeType; +import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate; +import org.openecomp.sdc.tosca.datatypes.model.NodeType; +import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; +import org.openecomp.sdc.tosca.services.DataModelUtil; +import org.openecomp.sdc.tosca.services.ToscaUtil; +import org.openecomp.sdc.tosca.services.impl.ToscaAnalyzerServiceImpl; +import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo; +import org.openecomp.sdc.translator.services.heattotosca.ConsolidationDataUtil; +import org.openecomp.sdc.translator.services.heattotosca.Constants; +import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil; +import org.openecomp.sdc.translator.services.heattotosca.TranslationService; + +public class ResourceTranslationNestedImpl extends ResourceTranslationBase { + + protected static Logger logger = + (Logger) LoggerFactory.getLogger(ResourceTranslationNestedImpl.class); + + @Override + public void translate(TranslateTo translateTo) { + mdcDataDebugMessage.debugEntryMessage(null, null); + + FileData nestedFileData = + HeatToToscaUtil.getFileData(translateTo.getResource().getType(), translateTo.getContext()); + if (nestedFileData == null) { + logger.warn("Nested File '" + translateTo.getResource().getType() + + "' is not exist, therefore, the nested resource with the ID '" + + translateTo.getResourceId() + "' will be ignored in TOSCA translation"); + return; + } + String templateName = FileUtils.getFileWithoutExtention(translateTo.getResource().getType()); + String substitutionNodeTypeKey = ToscaNodeType.ABSTRACT_NODE_TYPE_PREFIX + "heat." + + templateName; + + if (!translateTo.getContext().getTranslatedServiceTemplates() + .containsKey(translateTo.getResource().getType())) { + + //substitution service template + ServiceTemplate nestedSubstitutionServiceTemplate = + createSubstitutionServiceTemplate(translateTo, nestedFileData, templateName); + + //global substitution service template + ServiceTemplate globalSubstitutionServiceTemplate = new HeatToToscaUtil() + .fetchGlobalSubstitutionServiceTemplate(translateTo.getServiceTemplate(), + translateTo.getContext()); + + //substitution node type + NodeType substitutionNodeType = new ToscaAnalyzerServiceImpl() + .createInitSubstitutionNodeType(nestedSubstitutionServiceTemplate, + ToscaNodeType.ABSTRACT_SUBSTITUTE); + DataModelUtil.addNodeType(globalSubstitutionServiceTemplate, substitutionNodeTypeKey, + substitutionNodeType); + //substitution mapping + HeatToToscaUtil + .handleSubstitutionMapping(translateTo.getContext(), substitutionNodeTypeKey, + nestedSubstitutionServiceTemplate, substitutionNodeType); + + //add new nested service template + translateTo.getContext().getTranslatedServiceTemplates() + .put(translateTo.getResource().getType(), nestedSubstitutionServiceTemplate); + } + + NodeTemplate substitutionNodeTemplate = + HeatToToscaUtil.createAbstractSubstitutionNodeTemplate(translateTo, templateName, + substitutionNodeTypeKey); + manageSubstitutionNodeTemplateConnectionPoint(translateTo, nestedFileData, + substitutionNodeTemplate, substitutionNodeTypeKey); + DataModelUtil.addNodeTemplate(translateTo.getServiceTemplate(), translateTo.getTranslatedId(), + substitutionNodeTemplate); + + //Add nested node template id to consolidation data + ConsolidationDataUtil.updateNestedNodeTemplateId(translateTo); + + mdcDataDebugMessage.debugExitMessage(null, null); + } + + private ServiceTemplate createSubstitutionServiceTemplate(TranslateTo translateTo, + FileData nestedFileData, + String templateName) { + ServiceTemplate nestedSubstitutionServiceTemplate = + HeatToToscaUtil.createInitSubstitutionServiceTemplate(templateName); + translateTo.getContext() + .addNestedHeatFileName(ToscaUtil.getServiceTemplateFileName(templateName), + translateTo.getResource().getType()); + new TranslationService().translateHeatFile(nestedSubstitutionServiceTemplate, nestedFileData, + translateTo.getContext()); + return nestedSubstitutionServiceTemplate; + } + + + private void manageSubstitutionNodeTemplateConnectionPoint(TranslateTo translateTo, + FileData nestedFileData, + NodeTemplate substitutionNodeTemplate, + String substitutionNodeTypeId) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + ServiceTemplate globalSubstitutionTemplate = + translateTo.getContext().getTranslatedServiceTemplates() + .get(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME); + NodeType nodeType = globalSubstitutionTemplate.getNode_types().get(substitutionNodeTypeId); + handlePortToNetConnections(translateTo, nestedFileData, substitutionNodeTemplate, nodeType); + handleSecurityRulesToPortConnections(translateTo, nestedFileData, substitutionNodeTemplate, + nodeType); + handleNovaToVolConnection(translateTo, nestedFileData, substitutionNodeTemplate, nodeType); + handleContrailV2VmInterfaceToNetworkConnection(translateTo, nestedFileData, + substitutionNodeTemplate, nodeType); + handleContrailPortToNetConnections(translateTo, nestedFileData, substitutionNodeTemplate, + nodeType); + handleVlanSubInterfaceToInterfaceConnections(translateTo, nestedFileData, + substitutionNodeTemplate, nodeType); + + mdcDataDebugMessage.debugExitMessage(null, null); + } + + private void handleVlanSubInterfaceToInterfaceConnections(TranslateTo translateTo, + FileData nestedFileData, + NodeTemplate substitutionNodeTemplate, + NodeType nodeType) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + ContrailV2VlanToInterfaceResourceConnection linker = + new ContrailV2VlanToInterfaceResourceConnection(this, translateTo, nestedFileData, + substitutionNodeTemplate, nodeType); + linker.connect(); + + mdcDataDebugMessage.debugExitMessage(null, null); + } + + + private void handleContrailV2VmInterfaceToNetworkConnection(TranslateTo translateTo, + FileData nestedFileData, + NodeTemplate substitutionNodeTemplate, + NodeType nodeType) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + ContrailV2VmInterfaceToNetResourceConnection linker = + new ContrailV2VmInterfaceToNetResourceConnection(this, translateTo, nestedFileData, + substitutionNodeTemplate, nodeType); + linker.connect(); + + mdcDataDebugMessage.debugExitMessage(null, null); + } + + private void handleNovaToVolConnection(TranslateTo translateTo, FileData nestedFileData, + NodeTemplate substitutionNodeTemplate, NodeType nodeType) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + NovaToVolResourceConnection linker = + new NovaToVolResourceConnection(this, translateTo, nestedFileData, substitutionNodeTemplate, + nodeType); + linker.connect(); + + mdcDataDebugMessage.debugExitMessage(null, null); + } + + private void handleSecurityRulesToPortConnections(TranslateTo translateTo, + FileData nestedFileData, + NodeTemplate substitutionNodeTemplate, + NodeType nodeType) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + SecurityRulesToPortResourceConnection linker = + new SecurityRulesToPortResourceConnection(this, translateTo, nestedFileData, + substitutionNodeTemplate, nodeType); + linker.connect(); + + mdcDataDebugMessage.debugExitMessage(null, null); + } + + private void handlePortToNetConnections(TranslateTo translateTo, FileData nestedFileData, + NodeTemplate substitutionNodeTemplate, + NodeType nodeType) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + PortToNetResourceConnection linker = + new PortToNetResourceConnection(this, translateTo, nestedFileData, substitutionNodeTemplate, + nodeType); + linker.connect(); + + mdcDataDebugMessage.debugExitMessage(null, null); + } + + private void handleContrailPortToNetConnections(TranslateTo translateTo, FileData nestedFileData, + NodeTemplate substitutionNodeTemplate, + NodeType nodeType) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + ContrailPortToNetResourceConnection linker = + new ContrailPortToNetResourceConnection(this, translateTo, nestedFileData, + substitutionNodeTemplate, nodeType); + linker.connect(); + + mdcDataDebugMessage.debugExitMessage(null, null); + } + +} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/ResourceTranslationContrailVirtualNetworkImpl.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationNeutronNetImpl.java index 3a3a532d59..49fdcaafa9 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/ResourceTranslationContrailVirtualNetworkImpl.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationNeutronNetImpl.java @@ -18,34 +18,46 @@ * ============LICENSE_END========================================================= */ -package org.openecomp.sdc.translator.services.heattotosca.impl; +package org.openecomp.sdc.translator.services.heattotosca.impl.resourcetranslation; +import org.openecomp.sdc.heat.services.HeatConstants; import org.openecomp.sdc.tosca.datatypes.ToscaNodeType; import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate; import org.openecomp.sdc.tosca.services.DataModelUtil; import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo; +import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil; import org.openecomp.sdc.translator.services.heattotosca.mapping.TranslatorHeatToToscaPropertyConverter; -import java.util.Optional; -public class ResourceTranslationContrailVirtualNetworkImpl extends ResourceTranslationBase { +public class ResourceTranslationNeutronNetImpl extends ResourceTranslationBase { @Override public void translate(TranslateTo translateTo) { + + mdcDataDebugMessage.debugEntryMessage(null, null); + NodeTemplate nodeTemplate = new NodeTemplate(); - nodeTemplate.setType(ToscaNodeType.CONTRAIL_VIRTUAL_NETWORK.getDisplayName()); + nodeTemplate.setType(ToscaNodeType.NEUTRON_NET); nodeTemplate.setProperties(TranslatorHeatToToscaPropertyConverter - .getToscaPropertiesSimpleConversion(translateTo.getResource().getProperties(), + .getToscaPropertiesSimpleConversion(translateTo.getServiceTemplate(),translateTo. + getResourceId(),translateTo.getResource().getProperties(), nodeTemplate.getProperties(), translateTo.getHeatFileName(), translateTo.getHeatOrchestrationTemplate(), translateTo.getResource().getType(), nodeTemplate, translateTo.getContext())); - Optional<String> resourceTranslatedId = getResourceTranslatedId(translateTo.getHeatFileName(), - translateTo.getHeatOrchestrationTemplate(), translateTo.getResourceId(), - translateTo.getContext()); - if (resourceTranslatedId.isPresent()) { - DataModelUtil.addNodeTemplate(translateTo.getServiceTemplate(), resourceTranslatedId.get(), - nodeTemplate); - } + + HeatToToscaUtil.mapBoolean(nodeTemplate, HeatToToscaUtil + .getToscaPropertyName(translateTo, HeatConstants.PORT_SECURITY_ENABLED_PROPERTY_NAME)); + HeatToToscaUtil.mapBoolean(nodeTemplate, HeatToToscaUtil + .getToscaPropertyName(translateTo, HeatConstants.SHARED_PROPERTY_NAME)); + HeatToToscaUtil.mapBoolean(nodeTemplate, HeatToToscaUtil + .getToscaPropertyName(translateTo, HeatConstants.ADMIN_STATE_UP_PROPERTY_NAME)); + + DataModelUtil.addNodeTemplate(translateTo.getServiceTemplate(), translateTo.getTranslatedId(), + nodeTemplate); + + mdcDataDebugMessage.debugExitMessage(null, null); } + + } diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/ResourceTranslationNeutronPortImpl.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationNeutronPortImpl.java index 343462d266..f1bd6790c2 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/ResourceTranslationNeutronPortImpl.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationNeutronPortImpl.java @@ -18,7 +18,7 @@ * ============LICENSE_END========================================================= */ -package org.openecomp.sdc.translator.services.heattotosca.impl; +package org.openecomp.sdc.translator.services.heattotosca.impl.resourcetranslation; import org.openecomp.sdc.heat.datatypes.model.HeatResourcesTypes; import org.openecomp.sdc.heat.datatypes.model.Resource; @@ -32,11 +32,15 @@ import org.openecomp.sdc.tosca.services.ToscaConstants; import org.openecomp.sdc.translator.datatypes.heattotosca.AttachedResourceId; import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo; import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslatedHeatResource; +import org.openecomp.sdc.translator.services.heattotosca.ConsolidationDataUtil; import org.openecomp.sdc.translator.services.heattotosca.Constants; +import org.openecomp.sdc.translator.services.heattotosca.ConsolidationEntityType; import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil; import org.openecomp.sdc.translator.services.heattotosca.ResourceTranslationFactory; +import org.openecomp.sdc.translator.services.heattotosca.helper.ResourceTranslationNeutronPortHelper; import org.openecomp.sdc.translator.services.heattotosca.mapping.TranslatorHeatToToscaPropertyConverter; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -50,21 +54,32 @@ public class ResourceTranslationNeutronPortImpl extends ResourceTranslationBase @Override public void translate(TranslateTo translateTo) { - NodeTemplate nodeTemplate = new NodeTemplate(); - nodeTemplate.setType(ToscaNodeType.NEUTRON_PORT.getDisplayName()); + mdcDataDebugMessage.debugEntryMessage(null, null); + + NodeTemplate nodeTemplate = new NodeTemplate(); + nodeTemplate.setType(ToscaNodeType.NEUTRON_PORT); nodeTemplate.setProperties(TranslatorHeatToToscaPropertyConverter - .getToscaPropertiesSimpleConversion(translateTo.getResource().getProperties(), + .getToscaPropertiesSimpleConversion(translateTo.getServiceTemplate(), translateTo. + getResourceId(), translateTo.getResource().getProperties(), nodeTemplate.getProperties(), translateTo.getHeatFileName(), translateTo.getHeatOrchestrationTemplate(), translateTo.getResource().getType(), nodeTemplate, translateTo.getContext())); + new ResourceTranslationNeutronPortHelper().setAdditionalProperties(nodeTemplate + .getProperties()); handleNetworkRequirement(translateTo, nodeTemplate); String resourceTranslatedId = handleSecurityRulesRequirement(translateTo); DataModelUtil .addNodeTemplate(translateTo.getServiceTemplate(), resourceTranslatedId, nodeTemplate); + + mdcDataDebugMessage.debugExitMessage(null, null); } private String handleSecurityRulesRequirement(TranslateTo translateTo) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + String resourceTranslatedId = translateTo.getTranslatedId(); Map<String, Object> properties = translateTo.getResource().getProperties(); Optional<Object> securityGroups = @@ -76,17 +91,22 @@ public class ResourceTranslationNeutronPortImpl extends ResourceTranslationBase .extractAttachedResourceId(translateTo.getHeatFileName(), translateTo.getHeatOrchestrationTemplate(), translateTo.getContext(), resourceValue); - if (securityGroupResourceId.isPresent()) { - handleSecurityGroupResourceId(translateTo, resourceTranslatedId, - securityGroupResourceId.get()); - } + securityGroupResourceId.ifPresent( + attachedResourceId -> handleSecurityGroupResourceId(translateTo, resourceTranslatedId, + attachedResourceId)); }); } + + mdcDataDebugMessage.debugExitMessage(null, null); return resourceTranslatedId; } private void handleSecurityGroupResourceId(TranslateTo translateTo, String resourceTranslatedId, AttachedResourceId securityGroupResourceId) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + List<String> supportedSecurityGroupsTypes = Collections .singletonList(HeatResourcesTypes.NEUTRON_SECURITY_GROUP_RESOURCE_TYPE.getHeatResource()); if (securityGroupResourceId.isGetResource()) { @@ -96,11 +116,19 @@ public class ResourceTranslationNeutronPortImpl extends ResourceTranslationBase handleGetParam(translateTo, resourceTranslatedId, securityGroupResourceId, supportedSecurityGroupsTypes); } + + mdcDataDebugMessage.debugExitMessage(null, null); } private void handleGetParam(TranslateTo translateTo, String resourceTranslatedId, AttachedResourceId securityGroupResourceId, List<String> supportedSecurityGroupsTypes) { + mdcDataDebugMessage.debugEntryMessage(null, null); + + if (!(securityGroupResourceId.getEntityId() instanceof String)) { + mdcDataDebugMessage.debugExitMessage(null, null); + return; + } TranslatedHeatResource translatedSharedResourceId = translateTo.getContext().getHeatSharedResourcesByParam() .get(securityGroupResourceId.getEntityId()); @@ -108,24 +136,36 @@ public class ResourceTranslationNeutronPortImpl extends ResourceTranslationBase && !HeatToToscaUtil.isHeatFileNested(translateTo, translateTo.getHeatFileName())) { if (validateResourceTypeSupportedForReqCreation(translateTo, supportedSecurityGroupsTypes, translatedSharedResourceId.getHeatResource(), "security_groups")) { + mdcDataDebugMessage.debugExitMessage(null, null); return; } final NodeTemplate securityGroupNodeTemplate = DataModelUtil .getNodeTemplate(translateTo.getServiceTemplate(), translatedSharedResourceId.getTranslatedId()); RequirementAssignment requirement = new RequirementAssignment(); - requirement.setCapability(ToscaCapabilityType.ATTACHMENT.getDisplayName()); + requirement.setCapability(ToscaCapabilityType.NATIVE_ATTACHMENT); requirement.setNode(resourceTranslatedId); - requirement.setRelationship(ToscaRelationshipType.ATTACHES_TO.getDisplayName()); + requirement.setRelationship(ToscaRelationshipType.ATTACHES_TO); DataModelUtil .addRequirementAssignment(securityGroupNodeTemplate, ToscaConstants.PORT_REQUIREMENT_ID, requirement); + + ConsolidationDataUtil + .updateNodesConnectedIn(translateTo, translatedSharedResourceId.getTranslatedId(), + ConsolidationEntityType.PORT, translateTo.getResourceId(), + ToscaConstants.PORT_REQUIREMENT_ID, requirement); } + + mdcDataDebugMessage.debugExitMessage(null, null); } private void handleGetResource(TranslateTo translateTo, String resourceTranslatedId, AttachedResourceId securityGroupResourceId, List<String> supportedSecurityGroupsTypes) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + String resourceId = (String) securityGroupResourceId.getEntityId(); Resource securityGroupResource = HeatToToscaUtil .getResource(translateTo.getHeatOrchestrationTemplate(), resourceId, @@ -138,21 +178,32 @@ public class ResourceTranslationNeutronPortImpl extends ResourceTranslationBase if (securityGroupTranslatedId.isPresent()) { if (validateResourceTypeSupportedForReqCreation(translateTo, supportedSecurityGroupsTypes, securityGroupResource, "security_groups")) { + mdcDataDebugMessage.debugExitMessage(null, null); return; } final NodeTemplate securityGroupNodeTemplate = DataModelUtil .getNodeTemplate(translateTo.getServiceTemplate(), securityGroupTranslatedId.get()); RequirementAssignment requirement = new RequirementAssignment(); - requirement.setCapability(ToscaCapabilityType.ATTACHMENT.getDisplayName()); + requirement.setCapability(ToscaCapabilityType.NATIVE_ATTACHMENT); requirement.setNode(resourceTranslatedId); - requirement.setRelationship(ToscaRelationshipType.ATTACHES_TO.getDisplayName()); + requirement.setRelationship(ToscaRelationshipType.ATTACHES_TO); DataModelUtil .addRequirementAssignment(securityGroupNodeTemplate, ToscaConstants.PORT_REQUIREMENT_ID, requirement); + + ConsolidationDataUtil.updateNodesConnectedIn(translateTo, securityGroupTranslatedId.get(), + ConsolidationEntityType.PORT, translateTo.getResourceId(), + ToscaConstants.PORT_REQUIREMENT_ID, requirement); } + + mdcDataDebugMessage.debugExitMessage(null, null); } private void handleNetworkRequirement(TranslateTo translateTo, NodeTemplate nodeTemplate) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + Optional<AttachedResourceId> networkResourceId = HeatToToscaUtil.extractAttachedResourceId(translateTo, "network"); if (networkResourceId.isPresent()) { @@ -165,11 +216,17 @@ public class ResourceTranslationNeutronPortImpl extends ResourceTranslationBase addRequirementAssignmentForNetworkResource(translateTo, nodeTemplate, attachedResourceId); } } + + mdcDataDebugMessage.debugExitMessage(null, null); } private void addRequirementAssignmentForNetworkResource(TranslateTo translateTo, NodeTemplate nodeTemplate, AttachedResourceId attachedResourceId) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + String networkTranslatedId; List<String> supportedNetworkTypes = Arrays.asList(HeatResourcesTypes.NEUTRON_NET_RESOURCE_TYPE.getHeatResource(), @@ -183,8 +240,14 @@ public class ResourceTranslationNeutronPortImpl extends ResourceTranslationBase return; } networkTranslatedId = (String) attachedResourceId.getTranslatedId(); - addRequirementAssignment(nodeTemplate, networkTranslatedId); - } else if (attachedResourceId.isGetParam()) { + RequirementAssignment requirementAssignment = HeatToToscaUtil.addLinkReqFromPortToNetwork( + nodeTemplate, networkTranslatedId); + + ConsolidationDataUtil.updateNodesConnectedOut(translateTo, networkTranslatedId, + ConsolidationEntityType.PORT, ToscaConstants.LINK_REQUIREMENT_ID, requirementAssignment); + + } else if (attachedResourceId.isGetParam() + && attachedResourceId.getEntityId() instanceof String) { TranslatedHeatResource translatedSharedResourceId = translateTo.getContext().getHeatSharedResourcesByParam() .get(attachedResourceId.getEntityId()); @@ -194,18 +257,16 @@ public class ResourceTranslationNeutronPortImpl extends ResourceTranslationBase translatedSharedResourceId.getHeatResource(), "network'\\'network_id")) { return; } - addRequirementAssignment(nodeTemplate, translatedSharedResourceId.getTranslatedId()); + RequirementAssignment requirementAssignment = HeatToToscaUtil.addLinkReqFromPortToNetwork( + nodeTemplate, translatedSharedResourceId.getTranslatedId()); + + ConsolidationDataUtil.updateNodesConnectedOut(translateTo, + translatedSharedResourceId.getTranslatedId(), ConsolidationEntityType.PORT, + ToscaConstants.LINK_REQUIREMENT_ID, requirementAssignment); } } - } - private void addRequirementAssignment(NodeTemplate nodeTemplate, String translatedId) { - RequirementAssignment requirement = new RequirementAssignment(); - requirement.setCapability(ToscaCapabilityType.NETWORK_LINKABLE.getDisplayName()); - requirement.setRelationship(ToscaRelationshipType.NETWORK_LINK_TO.getDisplayName()); - requirement.setNode(translatedId); - DataModelUtil - .addRequirementAssignment(nodeTemplate, ToscaConstants.LINK_REQUIREMENT_ID, requirement); + mdcDataDebugMessage.debugExitMessage(null, null); } @@ -213,21 +274,23 @@ public class ResourceTranslationNeutronPortImpl extends ResourceTranslationBase List<String> supportedTypes, Resource heatResource, final String propertyName) { - if (!isResourceTypeValidForRequirement(heatResource, supportedTypes)) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + if (!isResourceTypeSupported(heatResource, supportedTypes)) { logger.warn( "'" + propertyName + "' property of port resource('" + translateTo.getResourceId() + "') is pointing to a resource of type '" + heatResource.getType() + "' " + "which is not supported for this requirement. " + "Supported types are: " + supportedTypes.toString()); + + mdcDataDebugMessage.debugExitMessage(null, null); return true; } + mdcDataDebugMessage.debugExitMessage(null, null); return false; } - private boolean isResourceTypeValidForRequirement(Resource networkHeatResource, - List<String> supportedNetworkTypes) { - return Objects.nonNull(networkHeatResource) - && supportedNetworkTypes.contains(networkHeatResource.getType()); - } } diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/ResourceTranslationNeutronSecurityGroupImpl.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationNeutronSecurityGroupImpl.java index cacaf4c5c7..96e79aca60 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/ResourceTranslationNeutronSecurityGroupImpl.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationNeutronSecurityGroupImpl.java @@ -18,29 +18,37 @@ * ============LICENSE_END========================================================= */ -package org.openecomp.sdc.translator.services.heattotosca.impl; +package org.openecomp.sdc.translator.services.heattotosca.impl.resourcetranslation; +import org.openecomp.sdc.common.utils.CommonUtil; import org.openecomp.sdc.tosca.datatypes.ToscaNodeType; import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate; import org.openecomp.sdc.tosca.services.DataModelUtil; import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo; import org.openecomp.sdc.translator.services.heattotosca.mapping.TranslatorHeatToToscaPropertyConverter; + public class ResourceTranslationNeutronSecurityGroupImpl extends ResourceTranslationBase { @Override public void translate(TranslateTo translateTo) { + + mdcDataDebugMessage.debugEntryMessage(null, null); + NodeTemplate nodeTemplate = new NodeTemplate(); - nodeTemplate.setType(ToscaNodeType.NEUTRON_SECURITY_RULES.getDisplayName()); + nodeTemplate.setType(ToscaNodeType.NEUTRON_SECURITY_RULES); nodeTemplate.setProperties(TranslatorHeatToToscaPropertyConverter - .getToscaPropertiesSimpleConversion(translateTo.getResource().getProperties(), + .getToscaPropertiesSimpleConversion(translateTo.getServiceTemplate(),translateTo. + getResourceId(),translateTo.getResource().getProperties(), nodeTemplate.getProperties(), translateTo.getHeatFileName(), translateTo.getHeatOrchestrationTemplate(), translateTo.getResource().getType(), nodeTemplate, translateTo.getContext())); DataModelUtil.addNodeTemplate(translateTo.getServiceTemplate(), translateTo.getTranslatedId(), nodeTemplate); + + mdcDataDebugMessage.debugExitMessage(null, null); } diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/ResourceTranslationNeutronSubnetImpl.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationNeutronSubnetImpl.java index 8306f57146..76a8c447d1 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/ResourceTranslationNeutronSubnetImpl.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationNeutronSubnetImpl.java @@ -18,11 +18,19 @@ * ============LICENSE_END========================================================= */ -package org.openecomp.sdc.translator.services.heattotosca.impl; +package org.openecomp.sdc.translator.services.heattotosca.impl.resourcetranslation; import org.openecomp.sdc.common.errors.CoreException; +import org.openecomp.sdc.datatypes.error.ErrorLevel; import org.openecomp.sdc.heat.datatypes.HeatBoolean; import org.openecomp.sdc.heat.datatypes.model.Resource; +import org.openecomp.sdc.logging.api.Logger; +import org.openecomp.sdc.logging.api.LoggerFactory; +import org.openecomp.sdc.logging.context.impl.MdcDataErrorMessage; +import org.openecomp.sdc.logging.types.LoggerConstants; +import org.openecomp.sdc.logging.types.LoggerErrorCode; +import org.openecomp.sdc.logging.types.LoggerErrorDescription; +import org.openecomp.sdc.logging.types.LoggerTragetServiceName; import org.openecomp.sdc.tosca.datatypes.ToscaFunctions; import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate; import org.openecomp.sdc.tosca.datatypes.model.ParameterDefinition; @@ -31,13 +39,10 @@ import org.openecomp.sdc.tosca.services.DataModelUtil; import org.openecomp.sdc.tosca.services.ToscaConstants; import org.openecomp.sdc.translator.datatypes.heattotosca.AttachedResourceId; import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo; - import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil; import org.openecomp.sdc.translator.services.heattotosca.ResourceTranslationFactory; import org.openecomp.sdc.translator.services.heattotosca.errors.MissingMandatoryPropertyErrorBuilder; import org.openecomp.sdc.translator.services.heattotosca.mapping.TranslatorHeatToToscaPropertyConverter; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.util.HashMap; import java.util.Map; @@ -45,28 +50,15 @@ import java.util.Optional; public class ResourceTranslationNeutronSubnetImpl extends ResourceTranslationBase { protected static Logger logger = - LoggerFactory.getLogger(ResourceTranslationNeutronSubnetImpl.class); - - @Override - protected String generateTranslatedId(TranslateTo translateTo) { - Optional<AttachedResourceId> subnetNetwork = getAttachedNetworkResource(translateTo); - - if (!subnetNetwork.get().isGetResource()) { - logger.warn("Heat resource: '" + translateTo.getResourceId() + "' with type: '" - + translateTo.getResource().getType() - + "' include 'network_id/'network'' property without 'get_resource' function," - + " therefore this resource will be ignored in TOSCA translation."); - return null; - } - return (String) subnetNetwork.get().getTranslatedId(); - } + (Logger) LoggerFactory.getLogger(ResourceTranslationNeutronSubnetImpl.class); @Override public void translate(TranslateTo translateTo) { + mdcDataDebugMessage.debugEntryMessage(null, null); Optional<AttachedResourceId> subnetNetwork = getAttachedNetworkResource(translateTo); - if (!subnetNetwork.get().isGetResource()) { + if (!subnetNetwork.isPresent() || !subnetNetwork.get().isGetResource()) { return; } @@ -87,13 +79,15 @@ public class ResourceTranslationNeutronSubnetImpl extends ResourceTranslationBas subNetMap = new HashMap<>(); networkNodeTemplate.getProperties().put("subnets", subNetMap); TranslatorHeatToToscaPropertyConverter - .setSimpleProperty(translateTo.getResource().getProperties(), + .setSimpleProperty(translateTo.getServiceTemplate(),translateTo.getTranslatedId(), + translateTo.getResource().getProperties(), translateTo.getHeatFileName(), translateTo.getResource().getType(), translateTo.getHeatOrchestrationTemplate(), translateTo.getContext(), networkNodeTemplate.getProperties(), "enable_dhcp", ToscaConstants.DHCP_ENABLED_PROPERTY_NAME, networkNodeTemplate); //dhcp_enabled TranslatorHeatToToscaPropertyConverter - .setSimpleProperty(translateTo.getResource().getProperties(), + .setSimpleProperty(translateTo.getServiceTemplate(),translateTo.getTranslatedId(), + translateTo.getResource().getProperties(), translateTo.getHeatFileName(), translateTo.getResource().getType(), translateTo.getHeatOrchestrationTemplate(), translateTo.getContext(), networkNodeTemplate.getProperties(), "ip_version", null, networkNodeTemplate); @@ -102,15 +96,42 @@ public class ResourceTranslationNeutronSubnetImpl extends ResourceTranslationBas Map<String, Object> properties; properties = TranslatorHeatToToscaPropertyConverter - .getToscaPropertiesSimpleConversion(translateTo.getResource().getProperties(), null, + .getToscaPropertiesSimpleConversion(translateTo.getServiceTemplate(),translateTo. + getResourceId(),translateTo.getResource().getProperties(), null, translateTo.getHeatFileName(), translateTo.getHeatOrchestrationTemplate(), translateTo.getResource().getType(), networkNodeTemplate, translateTo.getContext()); subNetMap.put(translateTo.getResourceId(), properties); } + + mdcDataDebugMessage.debugExitMessage(null, null); + } + + @Override + protected String generateTranslatedId(TranslateTo translateTo) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + Optional<AttachedResourceId> subnetNetwork = getAttachedNetworkResource(translateTo); + + if (!subnetNetwork.isPresent() || !subnetNetwork.get().isGetResource()) { + logger.warn("Heat resource: '" + translateTo.getResourceId() + "' with type: '" + + translateTo.getResource().getType() + + "' include 'network_id/'network'' property without 'get_resource' function, therefore" + + " this resource will be ignored in TOSCA translation."); + + mdcDataDebugMessage.debugExitMessage(null, null); + return null; + } + + mdcDataDebugMessage.debugExitMessage(null, null); + return (String) subnetNetwork.get().getTranslatedId(); } private void handleDhcpProperty(TranslateTo translateTo, NodeTemplate networkNodeTemplate) { + mdcDataDebugMessage.debugEntryMessage(null, null); + Object dhcpEnabled = networkNodeTemplate.getProperties().get(ToscaConstants.DHCP_ENABLED_PROPERTY_NAME); if (dhcpEnabled instanceof Map) { @@ -145,9 +166,15 @@ public class ResourceTranslationNeutronSubnetImpl extends ResourceTranslationBas } } } + + mdcDataDebugMessage.debugExitMessage(null, null); } private Optional<AttachedResourceId> getAttachedNetworkResource(TranslateTo translateTo) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + Optional<AttachedResourceId> subnetNetwork = Optional.empty(); Optional<AttachedResourceId> attachedNetworkId = HeatToToscaUtil.extractAttachedResourceId(translateTo, "network_id"); @@ -155,6 +182,10 @@ public class ResourceTranslationNeutronSubnetImpl extends ResourceTranslationBas Optional<AttachedResourceId> attachedNetwork = HeatToToscaUtil.extractAttachedResourceId(translateTo, "network"); if (!attachedNetwork.isPresent()) { + MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB, + LoggerTragetServiceName.GET_RESOURCE, ErrorLevel.ERROR.name(), + LoggerErrorCode.DATA_ERROR.getErrorCode(), + LoggerErrorDescription.MISSING_MANDATORY_PROPERTY); throw new CoreException( new MissingMandatoryPropertyErrorBuilder("network_id/'network'").build()); } else { @@ -163,6 +194,8 @@ public class ResourceTranslationNeutronSubnetImpl extends ResourceTranslationBas } else { subnetNetwork = attachedNetworkId; } + + mdcDataDebugMessage.debugExitMessage(null, null); return subnetNetwork; } } diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationNovaServerGroupsImpl.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationNovaServerGroupsImpl.java new file mode 100644 index 0000000000..875903f8a2 --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationNovaServerGroupsImpl.java @@ -0,0 +1,208 @@ +/*- + * ============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.services.heattotosca.impl.resourcetranslation; + +import org.apache.commons.collections4.CollectionUtils; +import org.openecomp.sdc.heat.datatypes.model.Resource; +import org.openecomp.sdc.tosca.datatypes.ToscaGroupType; +import org.openecomp.sdc.tosca.datatypes.ToscaPolicyType; +import org.openecomp.sdc.tosca.datatypes.model.GroupDefinition; +import org.openecomp.sdc.tosca.datatypes.model.PolicyDefinition; +import org.openecomp.sdc.tosca.datatypes.ToscaTopologyTemplateElements; +import org.openecomp.sdc.tosca.services.DataModelUtil; +import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo; +import org.openecomp.sdc.translator.services.heattotosca.mapping.TranslatorHeatToToscaPropertyConverter; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + + +public class ResourceTranslationNovaServerGroupsImpl extends ResourceTranslationBase { + private static final String AFFINITY = "affinity"; + private static final String ANTI_AFFINITY = "anti-affinity"; + private static List<String> supportedPolicies = Arrays.asList(AFFINITY, ANTI_AFFINITY); + + @Override + protected String generateTranslatedId(TranslateTo translateTo) { + return isEssentialRequirementsValid(translateTo) ? getTranslatedGroupId( + translateTo.getResourceId()) : null; + } + + @Override + protected boolean isEssentialRequirementsValid(TranslateTo translateTo) { + return validatePolicyType(translateTo); + } + + @Override + protected Optional<ToscaTopologyTemplateElements> getTranslatedToscaTopologyElement( + TranslateTo translateTo) { + if (isEssentialRequirementsValid(translateTo)) { + return Optional.of(ToscaTopologyTemplateElements.GROUP); + } else { + return Optional.empty(); + } + } + + private boolean validatePolicyType(TranslateTo translateTo) { + Map<String, Object> properties = translateTo.getResource().getProperties(); + if (Objects.isNull(properties) || Objects.isNull(properties.get("policies"))) { + return true; + } + + Object policies = properties.get("policies"); + if (!(policies instanceof List)) { + return false; + } + + for (Object policy : (List) policies) { + if (!isValidPolicyType(policy, translateTo.getResourceId(), translateTo.getResource())) { + return false; + } + } + return true; + } + + private boolean isValidPolicyType(Object policy, String resourceId, Resource resource) { + if (!(policy instanceof String)) { + return false; + } + + if ((policy instanceof String) && !supportedPolicies.contains(policy)) { + logger.warn("Resource '" + resourceId + "'(" + resource.getType() + + ") contains unsupported policy '" + policy.toString() + + "'. This resource is been ignored during the translation"); + return false; + } + + return true; + } + + @Override + protected void translate(TranslateTo translateTo) { + mdcDataDebugMessage.debugEntryMessage(null, null); + + String resourceId = translateTo.getResourceId(); + List<String> toscaPolicyTypes = getToscaPolicies(translateTo.getResource(), resourceId); + if (!CollectionUtils.isEmpty(toscaPolicyTypes)) { + String translatedGroupId = addGroupToTopology(translateTo, resourceId); + addPoliciesToTopology(translateTo, translatedGroupId, toscaPolicyTypes); + } + + mdcDataDebugMessage.debugExitMessage(null, null); + } + + private void addPoliciesToTopology(TranslateTo translateTo, String policyTargetEntityId, + List<String> toscaPolicyTypes) { + mdcDataDebugMessage.debugEntryMessage(null, null); + + logger.info("******** Start creating policies for resource '%s' ********", + translateTo.getResourceId()); + for (int i = 0; i < toscaPolicyTypes.size(); i++) { + String policy = toscaPolicyTypes.get(i); + logger.info("******** Creating policy '%s' ********", policy); + PolicyDefinition policyDefinition = new PolicyDefinition(); + policyDefinition.setType(policy); + policyDefinition.setTargets(Arrays.asList(policyTargetEntityId)); + policyDefinition.setProperties(TranslatorHeatToToscaPropertyConverter + .getToscaPropertiesSimpleConversion(translateTo.getServiceTemplate(), + translateTo.getResourceId(),translateTo.getResource().getProperties(), + policyDefinition.getProperties(), translateTo.getHeatFileName(), + translateTo.getHeatOrchestrationTemplate(), translateTo.getResource().getType(), + policyDefinition, translateTo.getContext())); + policyDefinition.getProperties().put( + policy.equals(ToscaPolicyType.PLACEMENT_ANTILOCATE) ? "container_type" + : AFFINITY, "host"); + String policyId = getTranslatedPolicyId(translateTo, toscaPolicyTypes, i); + DataModelUtil + .addPolicyDefinition(translateTo.getServiceTemplate(), policyId, policyDefinition); + logger.info("******** Policy '%s' created ********", policy); + } + + logger + .info("******** All policies for resource '%s' created successfully ********", + translateTo.getResourceId()); + + mdcDataDebugMessage.debugExitMessage(null, null); + } + + private String getTranslatedPolicyId(TranslateTo translateTo, List<String> toscaPolicyTypes, + int policyIndex) { + mdcDataDebugMessage.debugEntryMessage(null, null); + + mdcDataDebugMessage.debugExitMessage(null, null); + return translateTo.getResourceId() + (toscaPolicyTypes.size() > 1 ? policyIndex : "") + + "_policy"; + } + + private String addGroupToTopology(TranslateTo translateTo, String resourceId) { + mdcDataDebugMessage.debugEntryMessage(null, null); + + logger.info("******** Start creating group for resource '%s' ********", resourceId); + GroupDefinition group = new GroupDefinition(); + group.setMembers(new ArrayList<>()); + group.setType(ToscaGroupType.NATIVE_ROOT); + String translatedGroupId = getTranslatedGroupId(resourceId); + DataModelUtil + .addGroupDefinitionToTopologyTemplate(translateTo.getServiceTemplate(), + translatedGroupId, group); + logger.info("******** Creating group '%s' for resource '%s' ********", resourceId, resourceId); + + mdcDataDebugMessage.debugExitMessage(null, null); + return translatedGroupId; + } + + private String getTranslatedGroupId(String resourceId) { + return resourceId + "_group"; + } + + private List<String> getToscaPolicies(Resource resource, String resourceId) { + mdcDataDebugMessage.debugEntryMessage(null, null); + + Map<String, Object> properties = resource.getProperties(); + if (Objects.isNull(properties) || Objects.isNull(properties.get("policies"))) { + return Arrays.asList(ToscaPolicyType.PLACEMENT_ANTILOCATE); + } + + List<Object> policies = (List) properties.get("policies"); + List<String> retList = new ArrayList<>(); + policies.forEach(policy -> { + if (isValidPolicyType(policy, resourceId, resource)) { + retList.add(getToscaPolicyByHotPolicy(policy)); + } + }); + + mdcDataDebugMessage.debugExitMessage(null, null); + return retList; + } + + private String getToscaPolicyByHotPolicy(Object policy) { + if (Objects.equals(policy, AFFINITY)) { + return ToscaPolicyType.PLACEMENT_COLOCATE; + } else { + return ToscaPolicyType.PLACEMENT_ANTILOCATE; + } + } + +} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/ResourceTranslationNovaServerImpl.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationNovaServerImpl.java index 59e0691b2b..499ac5f80a 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/ResourceTranslationNovaServerImpl.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationNovaServerImpl.java @@ -18,16 +18,20 @@ * ============LICENSE_END========================================================= */ -package org.openecomp.sdc.translator.services.heattotosca.impl; +package org.openecomp.sdc.translator.services.heattotosca.impl.resourcetranslation; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.MapUtils; import org.openecomp.sdc.heat.datatypes.model.HeatOrchestrationTemplate; import org.openecomp.sdc.heat.datatypes.model.HeatResourcesTypes; import org.openecomp.sdc.heat.datatypes.model.Resource; +import org.openecomp.sdc.heat.services.HeatConstants; +import org.openecomp.sdc.logging.api.Logger; +import org.openecomp.sdc.logging.api.LoggerFactory; import org.openecomp.sdc.tosca.datatypes.ToscaCapabilityType; import org.openecomp.sdc.tosca.datatypes.ToscaNodeType; import org.openecomp.sdc.tosca.datatypes.ToscaRelationshipType; +import org.openecomp.sdc.tosca.datatypes.model.GroupDefinition; import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate; import org.openecomp.sdc.tosca.datatypes.model.NodeType; import org.openecomp.sdc.tosca.datatypes.model.RelationshipTemplate; @@ -36,18 +40,20 @@ import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; import org.openecomp.sdc.tosca.services.DataModelUtil; import org.openecomp.sdc.tosca.services.ToscaConstants; import org.openecomp.sdc.translator.datatypes.heattotosca.AttachedResourceId; +import org.openecomp.sdc.translator.datatypes.heattotosca.PropertyRegexMatcher; +import org.openecomp.sdc.translator.datatypes.heattotosca.TranslationContext; import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo; import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslatedHeatResource; + +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.ComputeTemplateConsolidationData; +import org.openecomp.sdc.translator.services.heattotosca.ConfigConstants; +import org.openecomp.sdc.translator.services.heattotosca.ConsolidationDataUtil; import org.openecomp.sdc.translator.services.heattotosca.Constants; import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil; +import org.openecomp.sdc.translator.services.heattotosca.NameExtractor; import org.openecomp.sdc.translator.services.heattotosca.ResourceTranslationFactory; -import org.openecomp.sdc.translator.services.heattotosca.TranslationContext; -import org.openecomp.sdc.translator.services.heattotosca.helper.NameExtractorService; -import org.openecomp.sdc.translator.services.heattotosca.helper.PropertyRegexMatcher; -import org.openecomp.sdc.translator.services.heattotosca.helper.impl.NameExtractorServiceImpl; + import org.openecomp.sdc.translator.services.heattotosca.mapping.TranslatorHeatToToscaPropertyConverter; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.Arrays; @@ -58,62 +64,85 @@ import java.util.Map; import java.util.Objects; import java.util.Optional; + public class ResourceTranslationNovaServerImpl extends ResourceTranslationBase { - protected static Logger logger = LoggerFactory.getLogger(ResourceTranslationNovaServerImpl.class); + protected static Logger logger = + (Logger) LoggerFactory.getLogger(ResourceTranslationNovaServerImpl.class); @Override protected void translate(TranslateTo translateTo) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + TranslationContext context = translateTo.getContext(); Map<String, Object> properties = translateTo.getResource().getProperties(); String heatFileName = translateTo.getHeatFileName(); ServiceTemplate serviceTemplate = translateTo.getServiceTemplate(); + String nodeTypeRef = createLocalNodeType(serviceTemplate, translateTo.getResource(), + translateTo.getResourceId(), translateTo.getTranslatedId(), context); - String nodeTypeRef = - createLocalNodeType(serviceTemplate, translateTo.getResource().getProperties(), - translateTo.getTranslatedId()); + //create compute in consolidation data + ConsolidationDataUtil.getComputeTemplateConsolidationData(context, serviceTemplate, + nodeTypeRef, translateTo.getTranslatedId()); NodeTemplate novaNodeTemplate = new NodeTemplate(); novaNodeTemplate.setType(nodeTypeRef); HeatOrchestrationTemplate heatOrchestrationTemplate = translateTo.getHeatOrchestrationTemplate(); novaNodeTemplate.setProperties(TranslatorHeatToToscaPropertyConverter - .getToscaPropertiesSimpleConversion(properties, novaNodeTemplate.getProperties(), - heatFileName, heatOrchestrationTemplate, translateTo.getResource().getType(), + .getToscaPropertiesSimpleConversion(serviceTemplate, translateTo.getResourceId(), + properties, novaNodeTemplate.getProperties(), heatFileName, + heatOrchestrationTemplate, translateTo.getResource().getType(), novaNodeTemplate, context)); - manageNovaServerNetwork(heatFileName, serviceTemplate, heatOrchestrationTemplate, - translateTo.getResource(), translateTo.getTranslatedId(), context, novaNodeTemplate); - manageNovaServerBlockDeviceMapping(heatFileName, serviceTemplate, novaNodeTemplate, - heatOrchestrationTemplate, translateTo.getResource(), translateTo.getResourceId(), - translateTo.getTranslatedId(), context); + HeatToToscaUtil.mapBoolean(novaNodeTemplate, HeatToToscaUtil + .getToscaPropertyName(translateTo, HeatConstants.CONFIG_DRIVE_PROPERTY_NAME)); + manageNovaServerNetwork(translateTo, novaNodeTemplate); + manageNovaServerBlockDeviceMapping(translateTo, novaNodeTemplate); manageNovaServerGroupMapping(translateTo, context, properties, heatFileName, serviceTemplate, - heatOrchestrationTemplate); + novaNodeTemplate, heatOrchestrationTemplate); DataModelUtil.addNodeTemplate(serviceTemplate, translateTo.getTranslatedId(), novaNodeTemplate); + + mdcDataDebugMessage.debugExitMessage(null, null); } private void manageNovaServerGroupMapping(TranslateTo translateTo, TranslationContext context, Map<String, Object> properties, String heatFileName, ServiceTemplate serviceTemplate, + NodeTemplate novaNodeTemplate, HeatOrchestrationTemplate heatOrchestrationTemplate) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + if (isSchedulerHintsPropExist(properties)) { Object schedulerHints = properties.get("scheduler_hints"); if (schedulerHints instanceof Map) { - addServerGroupHintsToPoliciesProups(translateTo, context, heatFileName, serviceTemplate, - heatOrchestrationTemplate, (Map<String, Object>) schedulerHints); + addServerGroupHintsToPoliciesGroups(translateTo, context, heatFileName, serviceTemplate, + novaNodeTemplate, heatOrchestrationTemplate, (Map<String, Object>) schedulerHints); } else { logger.warn("'scheduler_hints' property of resource '" + translateTo.getResourceId() + "' is not valid. This property should be a map"); } } + + mdcDataDebugMessage.debugExitMessage(null, null); } - private void addServerGroupHintsToPoliciesProups(TranslateTo translateTo, + private void addServerGroupHintsToPoliciesGroups(TranslateTo translateTo, TranslationContext context, String heatFileName, ServiceTemplate serviceTemplate, - HeatOrchestrationTemplate heatOrchestrationTemplate, - Map<String, Object> schedulerHints) { + NodeTemplate novaNodeTemplate, + HeatOrchestrationTemplate + heatOrchestrationTemplate, + Map<String, Object> schedulerHints) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + for (Object hint : schedulerHints.values()) { Optional<AttachedResourceId> attachedResourceId = HeatToToscaUtil .extractAttachedResourceId(heatFileName, heatOrchestrationTemplate, context, hint); @@ -126,20 +155,51 @@ public class ResourceTranslationNovaServerImpl extends ResourceTranslationBase { serverGroupResourceToTranslate); if (isHintOfTypeNovaServerGroup) { addNovaServerToPolicyGroup(translateTo, context, heatFileName, serviceTemplate, - heatOrchestrationTemplate, (String) serverGroupResourceToTranslate); + heatOrchestrationTemplate, (String) serverGroupResourceToTranslate, + novaNodeTemplate); } - } else if (serverGroupResourceId.isGetParam()) { - TranslatedHeatResource translatedServerGroupResource = + } else if (serverGroupResourceId.isGetParam() + && serverGroupResourceToTranslate instanceof String) { + TranslatedHeatResource + translatedServerGroupResource = context.getHeatSharedResourcesByParam().get(serverGroupResourceToTranslate); if (Objects.nonNull(translatedServerGroupResource) - && !HeatToToscaUtil.isHeatFileNested(translateTo, translateTo.getHeatFileName())) { - serviceTemplate.getTopology_template().getGroups() - .get(translatedServerGroupResource.getTranslatedId()).getMembers() - .add(translateTo.getTranslatedId()); + && !HeatToToscaUtil.isHeatFileNested(translateTo, translateTo.getHeatFileName()) + && isResourceTypeServerGroup(translatedServerGroupResource)) { + Map<String, GroupDefinition> groups = + serviceTemplate.getTopology_template().getGroups(); + if(MapUtils.isNotEmpty(groups) && Objects.nonNull(groups.get(translatedServerGroupResource + .getTranslatedId()))) { + groups + .get(translatedServerGroupResource.getTranslatedId()).getMembers() + .add(translateTo.getTranslatedId()); + //Add group Id to compute consolidation data + updateComputeConsolidationDataGroup(translateTo, novaNodeTemplate, + translatedServerGroupResource.getTranslatedId()); + } } } } } + + mdcDataDebugMessage.debugExitMessage(null, null); + } + + private boolean isResourceTypeServerGroup(TranslatedHeatResource translatedServerGroupResource) { + return translatedServerGroupResource.getHeatResource().getType().equals(HeatResourcesTypes.NOVA_SERVER_GROUP_RESOURCE_TYPE.getHeatResource()); + } + + private void updateComputeConsolidationDataGroup(TranslateTo translateTo, + NodeTemplate novaNodeTemplate, + String groupId) { + TranslationContext translationContext = translateTo.getContext(); + ServiceTemplate serviceTemplate = translateTo.getServiceTemplate(); + ComputeTemplateConsolidationData computeTemplateConsolidationData = ConsolidationDataUtil + .getComputeTemplateConsolidationData(translationContext, serviceTemplate, + novaNodeTemplate.getType(), + translateTo.getTranslatedId()); + ConsolidationDataUtil.updateGroupIdInConsolidationData(computeTemplateConsolidationData, + groupId); } private boolean isHintOfTypeNovaServerGroup(HeatOrchestrationTemplate heatOrchestrationTemplate, @@ -151,7 +211,10 @@ public class ResourceTranslationNovaServerImpl extends ResourceTranslationBase { private void addNovaServerToPolicyGroup(TranslateTo translateTo, TranslationContext context, String heatFileName, ServiceTemplate serviceTemplate, HeatOrchestrationTemplate heatOrchestrationTemplate, - String resourceToTranslate) { + String resourceToTranslate, + NodeTemplate novaNodeTemplate) { + mdcDataDebugMessage.debugEntryMessage(null, null); + Resource serverGroup = HeatToToscaUtil.getResource(heatOrchestrationTemplate, resourceToTranslate, heatFileName); Optional<String> serverGroupTranslatedId = ResourceTranslationFactory.getInstance(serverGroup) @@ -160,21 +223,28 @@ public class ResourceTranslationNovaServerImpl extends ResourceTranslationBase { if (serverGroupTranslatedId.isPresent()) { serviceTemplate.getTopology_template().getGroups().get(serverGroupTranslatedId.get()) .getMembers().add(translateTo.getTranslatedId()); + updateComputeConsolidationDataGroup(translateTo, novaNodeTemplate, + serverGroupTranslatedId.get()); + } + mdcDataDebugMessage.debugExitMessage(null, null); } private boolean isSchedulerHintsPropExist(Map<String, Object> properties) { return !MapUtils.isEmpty(properties) && Objects.nonNull(properties.get("scheduler_hints")); } - private void manageNovaServerBlockDeviceMapping(String heatFileName, - ServiceTemplate serviceTemplate, - NodeTemplate novaNodeTemplate, - HeatOrchestrationTemplate heatOrchestrationTemplate, - Resource resource, String resourceId, - String novaServerTranslatedId, - TranslationContext context) { - + private void manageNovaServerBlockDeviceMapping(TranslateTo translateTo, + NodeTemplate novaNodeTemplate) { + mdcDataDebugMessage.debugEntryMessage(null, null); + String heatFileName = translateTo.getHeatFileName(); + TranslationContext context = translateTo.getContext(); + ServiceTemplate serviceTemplate = translateTo.getServiceTemplate(); + Resource resource = translateTo.getResource(); + String resourceId = translateTo.getResourceId(); + String novaServerTranslatedId = translateTo.getTranslatedId(); + HeatOrchestrationTemplate heatOrchestrationTemplate = translateTo + .getHeatOrchestrationTemplate(); List<Map<String, Object>> blockDeviceMappingList = getBlockDeviceMappingList(resource); if (CollectionUtils.isEmpty(blockDeviceMappingList)) { return; @@ -197,67 +267,93 @@ public class ResourceTranslationNovaServerImpl extends ResourceTranslationBase { continue; } if (volumeIdObject == null) { - String deviceName = (String) blockDeviceMapping.get("device_name"); - String relationshipId = novaServerTranslatedId + "_" + index; - Optional<AttachedResourceId> attachedSnapshotId = HeatToToscaUtil .extractAttachedResourceId(heatFileName, heatOrchestrationTemplate, context, snapshotIdObject); - volumeResourceId = novaServerTranslatedId + "_" + attachedSnapshotId.get().getEntityId(); - createVolumeAttachesToRelationship(serviceTemplate, deviceName, novaServerTranslatedId, - volumeResourceId, relationshipId); - createCinderVolumeNodeTemplate(serviceTemplate, volumeResourceId, heatFileName, - blockDeviceMapping, heatOrchestrationTemplate, context); - connectNovaServerToVolume(novaNodeTemplate, volumeResourceId, relationshipId); + if (attachedSnapshotId.isPresent()) { + volumeResourceId = novaServerTranslatedId + "_" + attachedSnapshotId.get().getEntityId(); + String deviceName = (String) blockDeviceMapping.get("device_name"); + String relationshipId = novaServerTranslatedId + "_" + index; + + createVolumeAttachesToRelationship(serviceTemplate, deviceName, novaServerTranslatedId, + volumeResourceId, relationshipId); + createCinderVolumeNodeTemplate(serviceTemplate, translateTo.getResourceId(), + volumeResourceId, heatFileName, blockDeviceMapping, heatOrchestrationTemplate, + context); + connectNovaServerToVolume(novaNodeTemplate, volumeResourceId, relationshipId, + translateTo); + } } else { Optional<AttachedResourceId> attachedVolumeId = HeatToToscaUtil .extractAttachedResourceId(heatFileName, heatOrchestrationTemplate, context, volumeIdObject); - if (attachedVolumeId.get().isGetResource()) { + if (attachedVolumeId.isPresent() && attachedVolumeId.get().isGetResource()) { connectNovaServerToVolume(novaNodeTemplate, - (String) attachedVolumeId.get().getTranslatedId(), null); + (String) attachedVolumeId.get().getTranslatedId(), null, translateTo); } } index++; } + + mdcDataDebugMessage.debugExitMessage(null, null); } private void connectNovaServerToVolume(NodeTemplate novaNodeTemplate, String volumeResourceId, - String relationshipId) { + String relationshipId, TranslateTo translateTo) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + RequirementAssignment requirementAssignment = new RequirementAssignment(); - requirementAssignment.setCapability(ToscaCapabilityType.ATTACHMENT.getDisplayName()); + requirementAssignment.setCapability(ToscaCapabilityType.NATIVE_ATTACHMENT); requirementAssignment.setNode(volumeResourceId); if (relationshipId != null) { requirementAssignment.setRelationship(relationshipId); } else { requirementAssignment - .setRelationship(ToscaRelationshipType.NATIVE_ATTACHES_TO.getDisplayName()); + .setRelationship(ToscaRelationshipType.NATIVE_ATTACHES_TO); } DataModelUtil .addRequirementAssignment(novaNodeTemplate, ToscaConstants.LOCAL_STORAGE_REQUIREMENT_ID, requirementAssignment); + //Add volume consolidation data + ConsolidationDataUtil.updateComputeConsolidationDataVolumes(translateTo, novaNodeTemplate + .getType(), translateTo.getTranslatedId(), ToscaConstants.LOCAL_STORAGE_REQUIREMENT_ID, + requirementAssignment); + + mdcDataDebugMessage.debugExitMessage(null, null); } - private void createCinderVolumeNodeTemplate(ServiceTemplate serviceTemplate, + private void createCinderVolumeNodeTemplate(ServiceTemplate serviceTemplate, String resourceId, String volumeResourceId, String heatFileName, Map<String, Object> blockDeviceMapping, HeatOrchestrationTemplate heatOrchestrationTemplate, TranslationContext context) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + NodeTemplate cinderVolumeNodeTemplate = new NodeTemplate(); - cinderVolumeNodeTemplate.setType(ToscaNodeType.CINDER_VOLUME.getDisplayName()); + cinderVolumeNodeTemplate.setType(ToscaNodeType.CINDER_VOLUME); cinderVolumeNodeTemplate.setProperties(TranslatorHeatToToscaPropertyConverter - .getToscaPropertiesSimpleConversion(blockDeviceMapping, null, heatFileName, - heatOrchestrationTemplate, + .getToscaPropertiesSimpleConversion(serviceTemplate, resourceId, blockDeviceMapping, null, + heatFileName, heatOrchestrationTemplate, HeatResourcesTypes.CINDER_VOLUME_RESOURCE_TYPE.getHeatResource(), cinderVolumeNodeTemplate, context)); DataModelUtil.addNodeTemplate(serviceTemplate, volumeResourceId, cinderVolumeNodeTemplate); + + mdcDataDebugMessage.debugExitMessage(null, null); } private void createVolumeAttachesToRelationship(ServiceTemplate serviceTemplate, String deviceName, String novaServerTranslatedId, String volumeId, String relationshipId) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + RelationshipTemplate relationshipTemplate = new RelationshipTemplate(); - relationshipTemplate.setType(ToscaRelationshipType.CINDER_VOLUME_ATTACHES_TO.getDisplayName()); + relationshipTemplate.setType(ToscaRelationshipType.CINDER_VOLUME_ATTACHES_TO); Map<String, Object> properties = new HashMap<>(); properties.put("instance_uuid", novaServerTranslatedId); properties.put("volume_id", volumeId); @@ -267,10 +363,15 @@ public class ResourceTranslationNovaServerImpl extends ResourceTranslationBase { relationshipTemplate.setProperties(properties); DataModelUtil.addRelationshipTemplate(serviceTemplate, relationshipId, relationshipTemplate); + + mdcDataDebugMessage.debugExitMessage(null, null); } private List<Map<String, Object>> getBlockDeviceMappingList(Resource resource) { + + mdcDataDebugMessage.debugEntryMessage(null, null); + if (Objects.isNull(resource.getProperties())) { return Collections.emptyList(); } @@ -283,19 +384,32 @@ public class ResourceTranslationNovaServerImpl extends ResourceTranslationBase { blockDeviceMappingList.addAll(blockDeviceMappingV2List); } else if (CollectionUtils.isEmpty(blockDeviceMappingList) && CollectionUtils.isEmpty(blockDeviceMappingV2List)) { + + mdcDataDebugMessage.debugExitMessage(null, null); return null; } else { blockDeviceMappingList = blockDeviceMappingList != null ? blockDeviceMappingList : blockDeviceMappingV2List; } + + mdcDataDebugMessage.debugExitMessage(null, null); return blockDeviceMappingList; } - private void manageNovaServerNetwork(String heatFileName, ServiceTemplate serviceTemplate, - HeatOrchestrationTemplate heatOrchestrationTemplate, - Resource resource, String translatedId, - TranslationContext context, NodeTemplate novaNodeTemplate) { + private void manageNovaServerNetwork(TranslateTo translateTo, + NodeTemplate novaNodeTemplate) { + + + String heatFileName = translateTo.getHeatFileName(); + ServiceTemplate serviceTemplate = translateTo.getServiceTemplate(); + HeatOrchestrationTemplate heatOrchestrationTemplate = translateTo + .getHeatOrchestrationTemplate(); + Resource resource = translateTo.getResource(); + String translatedId = translateTo.getTranslatedId(); + TranslationContext context = translateTo.getContext(); + + mdcDataDebugMessage.debugEntryMessage(null, null); if (resource.getProperties() == null) { return; @@ -308,18 +422,28 @@ public class ResourceTranslationNovaServerImpl extends ResourceTranslationBase { } for (Map<String, Object> heatNetwork : heatNetworkList) { - getOrTranslatePortTemplate(heatFileName, heatOrchestrationTemplate, - heatNetwork.get(Constants.PORT_PROPERTY_NAME), serviceTemplate, translatedId, context, - novaNodeTemplate); + getOrTranslatePortTemplate(translateTo, heatNetwork.get( + Constants.PORT_PROPERTY_NAME), translatedId, novaNodeTemplate); } + mdcDataDebugMessage.debugExitMessage(null, null); + } - private void getOrTranslatePortTemplate(String heatFileName, - HeatOrchestrationTemplate heatOrchestrationTemplate, - Object port, ServiceTemplate serviceTemplate, - String novaServerResourceId, TranslationContext context, + private void getOrTranslatePortTemplate(TranslateTo translateTo, + Object port, + String novaServerResourceId, NodeTemplate novaNodeTemplate) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + String heatFileName = translateTo.getHeatFileName(); + HeatOrchestrationTemplate heatOrchestrationTemplate = translateTo + .getHeatOrchestrationTemplate(); + ServiceTemplate serviceTemplate = translateTo.getServiceTemplate(); + TranslationContext context = translateTo.getContext(); + Optional<AttachedResourceId> attachedPortId = HeatToToscaUtil .extractAttachedResourceId(heatFileName, heatOrchestrationTemplate, context, port); @@ -337,11 +461,11 @@ public class ResourceTranslationNovaServerImpl extends ResourceTranslationBase { logger.warn("NovaServer connect to port resource with id : " + resourceId + " and type : " + portResource.getType() + ". This resource type is not supported, therefore the connection to the port is " - + "ignored. " - + "Supported types are: " + + "ignored. Supported types are: " + HeatResourcesTypes.NEUTRON_PORT_RESOURCE_TYPE.getHeatResource() + ", " + HeatResourcesTypes.CONTRAIL_V2_VIRTUAL_MACHINE_INTERFACE_RESOURCE_TYPE - .getHeatResource()); + .getHeatResource()); + mdcDataDebugMessage.debugExitMessage(null, null); return; } else if (HeatResourcesTypes.CONTRAIL_V2_VIRTUAL_MACHINE_INTERFACE_RESOURCE_TYPE .getHeatResource().equals(portResource.getType())) { @@ -356,7 +480,11 @@ public class ResourceTranslationNovaServerImpl extends ResourceTranslationBase { if (translatedPortId.isPresent()) { NodeTemplate portNodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate, translatedPortId.get()); - addBindingReqFromPortToCompute(novaServerResourceId, portNodeTemplate); + HeatToToscaUtil.addBindingReqFromPortToCompute(novaServerResourceId, portNodeTemplate); + + // Add ports + ConsolidationDataUtil.updatePortInConsolidationData(translateTo, novaNodeTemplate.getType(), + translatedPortId.get()); } else { logger.warn("NovaServer connect to port resource with id : " + resourceId + " and type : " + portResource.getType() @@ -364,44 +492,43 @@ public class ResourceTranslationNovaServerImpl extends ResourceTranslationBase { + "ignored."); } } + + mdcDataDebugMessage.debugExitMessage(null, null); } - /** - * Create local node type string. - * - * @param serviceTemplate the service template - * @param properties the properties - * @param resourceTranslatedId the resource translated id - * @return the string - */ - public String createLocalNodeType(ServiceTemplate serviceTemplate, Map<String, Object> properties, - String resourceTranslatedId) { - NameExtractorService nodeTypeNameExtractor = new NameExtractorServiceImpl(); - List<PropertyRegexMatcher> propertyRegexMatchers = - getPropertiesAndRegexMatchers(nodeTypeNameExtractor); - Optional<String> extractedNodeTypeName = nodeTypeNameExtractor - .extractNodeTypeNameByPropertiesPriority(properties, propertyRegexMatchers); - - String nodeTypeName = ToscaConstants.NODES_PREFIX - + (extractedNodeTypeName.isPresent() ? extractedNodeTypeName.get() - : resourceTranslatedId.replace(".", "_")); + + private String createLocalNodeType(ServiceTemplate serviceTemplate, Resource resource, String + resourceId, + String translatedId, TranslationContext context) { + mdcDataDebugMessage.debugEntryMessage(null, null); + NameExtractor nodeTypeNameExtractor = context.getNameExtractorImpl(resource.getType()); + String nodeTypeName = + nodeTypeNameExtractor.extractNodeTypeName(resource, resourceId, translatedId); + if (!isNodeTypeCreated(serviceTemplate, nodeTypeName)) { DataModelUtil.addNodeType(serviceTemplate, nodeTypeName, createNodeType()); } + + mdcDataDebugMessage.debugExitMessage(null, null); return nodeTypeName; } - private List<PropertyRegexMatcher> getPropertiesAndRegexMatchers( - NameExtractorService nodeTypeNameExtractor) { + /** + * Get property Regx matcher list. + * + * @return Regex exprission per nova resource property, while nova node type name is consider when + * setting the name value. + */ + public List<PropertyRegexMatcher> getPropertyRegexMatchersForNovaNodeType() { List<PropertyRegexMatcher> propertyRegexMatchers = new ArrayList<>(); - propertyRegexMatchers.add(nodeTypeNameExtractor - .getPropertyRegexMatcher(Constants.NAME_PROPERTY_NAME, + propertyRegexMatchers + .add(new PropertyRegexMatcher(Constants.NAME_PROPERTY_NAME, Arrays.asList(".+_name$", ".+_names$", ".+_name_[0-9]+"), "_name")); - propertyRegexMatchers.add(nodeTypeNameExtractor - .getPropertyRegexMatcher("image", Collections.singletonList(".+_image_name$"), + propertyRegexMatchers + .add(new PropertyRegexMatcher("image", Collections.singletonList(".+_image_name$"), "_image_name")); - propertyRegexMatchers.add(nodeTypeNameExtractor - .getPropertyRegexMatcher("flavor", Collections.singletonList(".+_flavor_name$"), + propertyRegexMatchers + .add(new PropertyRegexMatcher("flavor", Collections.singletonList(".+_flavor_name$"), "_flavor_name")); return propertyRegexMatchers; } @@ -413,7 +540,7 @@ public class ResourceTranslationNovaServerImpl extends ResourceTranslationBase { private NodeType createNodeType() { NodeType nodeType = new NodeType(); - nodeType.setDerived_from(ToscaNodeType.NOVA_SERVER.getDisplayName()); + nodeType.setDerived_from(ToscaNodeType.NOVA_SERVER); return nodeType; } } diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/ResourceTranslationResourceGroupImpl.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationResourceGroupImpl.java index 4665249351..5d25c7ef25 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/ResourceTranslationResourceGroupImpl.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationResourceGroupImpl.java @@ -18,12 +18,19 @@ * ============LICENSE_END========================================================= */ -package org.openecomp.sdc.translator.services.heattotosca.impl; +package org.openecomp.sdc.translator.services.heattotosca.impl.resourcetranslation; import org.openecomp.sdc.common.errors.CoreException; +import org.openecomp.sdc.common.utils.CommonUtil; +import org.openecomp.sdc.datatypes.error.ErrorLevel; import org.openecomp.sdc.heat.datatypes.model.HeatResourcesTypes; import org.openecomp.sdc.heat.datatypes.model.Resource; import org.openecomp.sdc.heat.services.HeatConstants; +import org.openecomp.sdc.logging.context.impl.MdcDataErrorMessage; +import org.openecomp.sdc.logging.types.LoggerConstants; +import org.openecomp.sdc.logging.types.LoggerErrorCode; +import org.openecomp.sdc.logging.types.LoggerErrorDescription; +import org.openecomp.sdc.logging.types.LoggerTragetServiceName; import org.openecomp.sdc.tosca.datatypes.ToscaFunctions; import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate; import org.openecomp.sdc.tosca.services.DataModelUtil; @@ -44,6 +51,10 @@ public class ResourceTranslationResourceGroupImpl extends ResourceTranslationBas @Override protected void translate(TranslateTo translateTo) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + final String heatFileName = translateTo.getHeatFileName(); Object resourceDef = translateTo.getResource().getProperties().get(HeatConstants.RESOURCE_DEF_PROPERTY_NAME); @@ -52,16 +63,18 @@ public class ResourceTranslationResourceGroupImpl extends ResourceTranslationBas if (!(typeDefinition instanceof String)) { logger.warn("Resource '" + translateTo.getResourceId() + "' of type'" + HeatResourcesTypes.RESOURCE_GROUP_RESOURCE_TYPE.getHeatResource() - + "' with resourceDef which is not pointing to nested heat file " - + "is not supported and will be ignored in the translation "); + + "' with resourceDef which is not pointing to nested heat file is not supported and " + + "will be ignored in the translation "); return; } String type = (String) typeDefinition; if (!HeatToToscaUtil.isYmlFileType(type)) { logger.warn("Resource '" + translateTo.getResourceId() + "' of type'" + HeatResourcesTypes.RESOURCE_GROUP_RESOURCE_TYPE.getHeatResource() - + "' with resourceDef which is not pointing to nested heat " - + "file is not supported and will be ignored in the translation "); + + "' with resourceDef which is not pointing to nested heat file is not supported and " + + "will be ignored in the translation "); + + mdcDataDebugMessage.debugExitMessage(null, null); return; } @@ -88,11 +101,18 @@ public class ResourceTranslationResourceGroupImpl extends ResourceTranslationBas substitutionNodeTemplate); } + mdcDataDebugMessage.debugExitMessage(null, null); } private void handlingIndexVar(TranslateTo translateTo, NodeTemplate substitutionNodeTemplate) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + String indexVarValue = getIndexVarValue(translateTo); replacePropertiesIndexVarValue(indexVarValue, substitutionNodeTemplate.getProperties()); + + mdcDataDebugMessage.debugExitMessage(null, null); } private Map<String, List> getNewIndexVarValue() { @@ -107,6 +127,10 @@ public class ResourceTranslationResourceGroupImpl extends ResourceTranslationBas private void replacePropertiesIndexVarValue(String indexVarValue, Map<String, Object> properties) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + if (properties == null || properties.isEmpty()) { return; } @@ -118,9 +142,15 @@ public class ResourceTranslationResourceGroupImpl extends ResourceTranslationBas properties.put(propertyEntry.getKey(), newPropertyValue); } } + + mdcDataDebugMessage.debugExitMessage(null, null); } private Object getUpdatedPropertyValueWithIndex(String indexVarValue, Object propertyValue) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + if (propertyValue instanceof String && propertyValue != null) { if (propertyValue.equals(indexVarValue)) { return getNewIndexVarValue(); @@ -147,6 +177,8 @@ public class ResourceTranslationResourceGroupImpl extends ResourceTranslationBas concatMap.put(ToscaFunctions.CONCAT.getDisplayName(), concatList); return concatMap; } + + mdcDataDebugMessage.debugExitMessage(null, null); return propertyValue; //no update is needed } else if (propertyValue instanceof Map && !((Map) propertyValue).isEmpty()) { replacePropertiesIndexVarValue(indexVarValue, (Map<String, Object>) propertyValue); @@ -156,12 +188,19 @@ public class ResourceTranslationResourceGroupImpl extends ResourceTranslationBas for (Object entry : ((List) propertyValue)) { newPropertyValueList.add(getUpdatedPropertyValueWithIndex(indexVarValue, entry)); } + + mdcDataDebugMessage.debugExitMessage(null, null); return newPropertyValueList; } + + mdcDataDebugMessage.debugExitMessage(null, null); return propertyValue; } private String getIndexVarValue(TranslateTo translateTo) { + + mdcDataDebugMessage.debugEntryMessage(null, null); + Object indexVar = translateTo.getResource().getProperties().get(HeatConstants.INDEX_PROPERTY_NAME); if (indexVar == null) { @@ -169,8 +208,13 @@ public class ResourceTranslationResourceGroupImpl extends ResourceTranslationBas } if (indexVar instanceof String) { + + mdcDataDebugMessage.debugExitMessage(null, null); return (String) indexVar; } else { + MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB, + LoggerTragetServiceName.GET_RESOURCE, ErrorLevel.ERROR.name(), + LoggerErrorCode.DATA_ERROR.getErrorCode(), LoggerErrorDescription.INVALID_PROPERTY); throw new CoreException( new InvalidPropertyValueErrorBuilder("index_var", indexVar.toString(), "String").build()); } @@ -179,10 +223,15 @@ public class ResourceTranslationResourceGroupImpl extends ResourceTranslationBas private void populateServiceTemplateFilterProperties(TranslateTo translateTo, NodeTemplate substitutionNodeTemplate, Map serviceTemplateFilter) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + boolean mandatory = false; Object countValue = TranslatorHeatToToscaPropertyConverter - .getToscaPropertyValue(ToscaConstants.COUNT_PROPERTY_NAME, - translateTo.getResource().getProperties().get(ToscaConstants.COUNT_PROPERTY_NAME), null, + .getToscaPropertyValue(translateTo.getServiceTemplate(),translateTo.getResourceId(), + ToscaConstants.COUNT_PROPERTY_NAME, translateTo.getResource().getProperties().get + (ToscaConstants.COUNT_PROPERTY_NAME), null, translateTo.getHeatFileName(), translateTo.getHeatOrchestrationTemplate(), substitutionNodeTemplate, translateTo.getContext()); @@ -198,5 +247,7 @@ public class ResourceTranslationResourceGroupImpl extends ResourceTranslationBas mandatory = true; } serviceTemplateFilter.put("mandatory", mandatory); + + mdcDataDebugMessage.debugExitMessage(null, null); } } diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/SecurityRulesToPortResourceConnection.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/SecurityRulesToPortResourceConnection.java new file mode 100644 index 0000000000..3d183b1ad9 --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/SecurityRulesToPortResourceConnection.java @@ -0,0 +1,182 @@ +/*- + * ============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.services.heattotosca.impl.resourcetranslation; + +import org.openecomp.sdc.heat.datatypes.manifest.FileData; + +import org.openecomp.sdc.heat.datatypes.model.HeatOrchestrationTemplate; +import org.openecomp.sdc.heat.datatypes.model.HeatResourcesTypes; +import org.openecomp.sdc.heat.datatypes.model.Resource; +import org.openecomp.sdc.tosca.datatypes.ToscaCapabilityType; +import org.openecomp.sdc.tosca.datatypes.ToscaNodeType; +import org.openecomp.sdc.tosca.datatypes.ToscaRelationshipType; +import org.openecomp.sdc.tosca.datatypes.model.CapabilityDefinition; +import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate; +import org.openecomp.sdc.tosca.datatypes.model.NodeType; +import org.openecomp.sdc.tosca.datatypes.model.RequirementDefinition; +import org.openecomp.sdc.tosca.services.ToscaConstants; +import org.openecomp.sdc.translator.datatypes.heattotosca.AttachedResourceId; +import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo; +import org.openecomp.sdc.translator.services.heattotosca.Constants; +import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.function.Predicate; + + +class SecurityRulesToPortResourceConnection extends ResourceConnectionUsingCapabilityHelper { + SecurityRulesToPortResourceConnection(ResourceTranslationNestedImpl resourceTranslationNested, + TranslateTo translateTo, FileData nestedFileData, + NodeTemplate substitutionNodeTemplate, NodeType nodeType) { + super(resourceTranslationNested, translateTo, nestedFileData, substitutionNodeTemplate, + nodeType); + } + + @Override + protected boolean isDesiredNodeTemplateType(NodeTemplate nodeTemplate) { + return nodeTemplate.getType().equals(ToscaNodeType.NEUTRON_PORT); + } + + @Override + protected List<Predicate<CapabilityDefinition>> getPredicatesListForConnectionPoints() { + ArrayList<Predicate<CapabilityDefinition>> predicates = new ArrayList<>(); + predicates.add(cap -> cap.getType().equals(ToscaCapabilityType.NATIVE_ATTACHMENT)); + return predicates; + } + + @Override + protected Optional<List<String>> getConnectorPropertyParamName(String heatResourceId, + Resource heatResource, + HeatOrchestrationTemplate + nestedHeatOrchestrationTemplate, + String nestedHeatFileName) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + Object securityGroups = + heatResource.getProperties().get(Constants.SECURITY_GROUPS_PROPERTY_NAME); + List<String> paramsList = new ArrayList<>(); + if (securityGroups instanceof List) { + ((List) securityGroups).forEach(group -> { + Optional<AttachedResourceId> attachedResourceId = HeatToToscaUtil + .extractAttachedResourceId(nestedFileData.getFile(), nestedHeatOrchestrationTemplate, + translateTo.getContext(), group); + if (attachedResourceId.isPresent() + && attachedResourceId.get().isGetParam() + && attachedResourceId.get().getEntityId() instanceof String) { + paramsList.add((String) attachedResourceId.get().getEntityId()); + } + }); + + mdcDataDebugMessage.debugExitMessage(null, null); + return Optional.of(paramsList); + } + + mdcDataDebugMessage.debugExitMessage(null, null); + return Optional.empty(); + } + + @Override + protected String getDesiredResourceType() { + return HeatResourcesTypes.NEUTRON_PORT_RESOURCE_TYPE.getHeatResource(); + } + + @Override + void addRequirementToConnectResources( + Map.Entry<String, CapabilityDefinition> connectionPointEntry, List<String> paramNames) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + if (paramNames == null || paramNames.isEmpty()) { + return; + } + List<String> supportedSecurityRulesTypes = Collections + .singletonList(HeatResourcesTypes.NEUTRON_SECURITY_GROUP_RESOURCE_TYPE.getHeatResource()); + + for (String paramName : paramNames) { + addRequirementToConnectResource(connectionPointEntry, supportedSecurityRulesTypes, paramName); + } + + mdcDataDebugMessage.debugExitMessage(null, null); + } + + @Override + boolean validateResourceTypeSupportedForReqCreation(String nestedResourceId, + String nestedPropertyName, + String connectionPointId, + Resource connectedResource, + List<String> supportedTypes) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + if (!resourceTranslationBase.isResourceTypeSupported(connectedResource, supportedTypes)) { + logger.warn("Nested resource '" + nestedResourceId + "' property '" + nestedPropertyName + + "' is pointing to resource with type '" + connectedResource.getType() + + "' which is not supported for capability '" + connectionPointId + + "' connection, (security rules to port connection). Supported types are: '" + + supportedTypes.toString() + "', therefore, this TOSCA capability will not be " + + "connected."); + + mdcDataDebugMessage.debugExitMessage(null, null); + return false; + } + + mdcDataDebugMessage.debugExitMessage(null, null); + return true; + } + + @Override + Map.Entry<String, RequirementDefinition> createRequirementDefinition(String capabilityKey) { + + + mdcDataDebugMessage.debugEntryMessage(null, null); + + RequirementDefinition definition = new RequirementDefinition(); + definition.setCapability(capabilityKey); + definition.setRelationship(ToscaRelationshipType.ATTACHES_TO); + mdcDataDebugMessage.debugExitMessage(null, null); + return new Map.Entry<String, RequirementDefinition>() { + @Override + public String getKey() { + return ToscaConstants.PORT_REQUIREMENT_ID; + } + + @Override + public RequirementDefinition getValue() { + return definition; + } + + @Override + public RequirementDefinition setValue(RequirementDefinition value) { + return null; + } + }; + } + + +} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/unifiedcomposition/UnifiedCompositionCatalogInstance.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/unifiedcomposition/UnifiedCompositionCatalogInstance.java new file mode 100644 index 0000000000..9742a44f52 --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/unifiedcomposition/UnifiedCompositionCatalogInstance.java @@ -0,0 +1,28 @@ +package org.openecomp.sdc.translator.services.heattotosca.impl.unifiedcomposition; + +import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; +import org.openecomp.sdc.translator.datatypes.heattotosca.TranslationContext; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.UnifiedCompositionData; +import org.openecomp.sdc.translator.services.heattotosca.UnifiedComposition; +import org.openecomp.sdc.translator.services.heattotosca.UnifiedCompositionService; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +public class UnifiedCompositionCatalogInstance implements UnifiedComposition { + @Override + public void createUnifiedComposition(ServiceTemplate serviceTemplate, + ServiceTemplate nestedServiceTemplate, + List<UnifiedCompositionData> unifiedComposotionDataList, + TranslationContext context) { + + UnifiedCompositionSingleSubstitution unifiedCompositionSingleSubstitution = + new UnifiedCompositionSingleSubstitution(); + + unifiedCompositionSingleSubstitution + .createUnifiedComposition(serviceTemplate, null, unifiedComposotionDataList, context); + } + + +} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/unifiedcomposition/UnifiedCompositionNestedSingleCompute.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/unifiedcomposition/UnifiedCompositionNestedSingleCompute.java new file mode 100644 index 0000000000..03d7eb02df --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/unifiedcomposition/UnifiedCompositionNestedSingleCompute.java @@ -0,0 +1,38 @@ +package org.openecomp.sdc.translator.services.heattotosca.impl.unifiedcomposition; + +import org.apache.commons.collections4.CollectionUtils; +import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; +import org.openecomp.sdc.translator.datatypes.heattotosca.TranslationContext; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.UnifiedCompositionData; +import org.openecomp.sdc.translator.services.heattotosca.UnifiedComposition; +import org.openecomp.sdc.translator.services.heattotosca.UnifiedCompositionService; + +import java.util.ArrayList; +import java.util.List; + +public class UnifiedCompositionNestedSingleCompute implements UnifiedComposition { + @Override + public void createUnifiedComposition(ServiceTemplate serviceTemplate, + ServiceTemplate nestedServiceTemplate, + List<UnifiedCompositionData> unifiedCompositionDataList, + TranslationContext context) { + UnifiedCompositionService unifiedCompositionService = new UnifiedCompositionService(); + if (CollectionUtils.isEmpty(unifiedCompositionDataList)) { + return; + } + + for (int i = 0; i < unifiedCompositionDataList.size(); i++) { + List<UnifiedCompositionData> nestedUnifiedCompositionDataList = new ArrayList<>(); + nestedUnifiedCompositionDataList.add(unifiedCompositionDataList.get(i)); + + unifiedCompositionService + .handleUnifiedNestedDefinition(serviceTemplate, nestedServiceTemplate, + unifiedCompositionDataList, context); + unifiedCompositionService + .updateUnifiedNestedConnectivity(serviceTemplate, nestedServiceTemplate, + nestedUnifiedCompositionDataList, context); + unifiedCompositionService + .cleanUnifiedNestedEntities(serviceTemplate, nestedUnifiedCompositionDataList, context); + } + } +} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/unifiedcomposition/UnifiedCompositionScalingInstances.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/unifiedcomposition/UnifiedCompositionScalingInstances.java new file mode 100644 index 0000000000..fe287a4014 --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/unifiedcomposition/UnifiedCompositionScalingInstances.java @@ -0,0 +1,48 @@ +package org.openecomp.sdc.translator.services.heattotosca.impl.unifiedcomposition; + +import org.apache.commons.collections4.CollectionUtils; +import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; +import org.openecomp.sdc.translator.datatypes.heattotosca.TranslationContext; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.UnifiedCompositionData; +import org.openecomp.sdc.translator.services.heattotosca.UnifiedComposition; +import org.openecomp.sdc.translator.services.heattotosca.UnifiedCompositionService; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +public class UnifiedCompositionScalingInstances implements UnifiedComposition { + + private UnifiedCompositionService unifiedCompositionService = new UnifiedCompositionService(); + + @Override + public void createUnifiedComposition(ServiceTemplate serviceTemplate, + ServiceTemplate nestedServiceTemplate, + List<UnifiedCompositionData> unifiedCompositionDataList, + TranslationContext context) { + if (CollectionUtils.isEmpty(unifiedCompositionDataList)) { + return; + } + + Integer index = null; + Optional<ServiceTemplate> substitutionServiceTemplate = + unifiedCompositionService.createUnifiedSubstitutionServiceTemplate(serviceTemplate, + unifiedCompositionDataList, context, index); + + if (!substitutionServiceTemplate.isPresent()) { + return; + } + + String abstractNodeTemplateId = unifiedCompositionService + .createAbstractSubstituteNodeTemplate(serviceTemplate, substitutionServiceTemplate.get(), + unifiedCompositionDataList, context, index); + + unifiedCompositionService + .updateCompositionConnectivity(serviceTemplate, unifiedCompositionDataList, context); + + unifiedCompositionService + .cleanUnifiedCompositionEntities(serviceTemplate, unifiedCompositionDataList, context); + + unifiedCompositionService.cleanNodeTypes(serviceTemplate, unifiedCompositionDataList, context); + } +} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/unifiedcomposition/UnifiedCompositionSingleSubstitution.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/unifiedcomposition/UnifiedCompositionSingleSubstitution.java new file mode 100644 index 0000000000..c3965a5f52 --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/unifiedcomposition/UnifiedCompositionSingleSubstitution.java @@ -0,0 +1,65 @@ +package org.openecomp.sdc.translator.services.heattotosca.impl.unifiedcomposition; + +import org.apache.commons.collections4.CollectionUtils; +import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; +import org.openecomp.sdc.translator.datatypes.heattotosca.TranslationContext; +import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.UnifiedCompositionData; +import org.openecomp.sdc.translator.services.heattotosca.UnifiedComposition; +import org.openecomp.sdc.translator.services.heattotosca.UnifiedCompositionService; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + + +/** + * The type Unified composition single substitution. + */ +public class UnifiedCompositionSingleSubstitution implements UnifiedComposition { + + // There is no consolidation in SingleSubstitution implemetation. + // In case of single substitution, if there is more than one entry in the + // unifiedComposotionDataList, they all should contain the same compute type but the + // consolidation between them was canceled. + // For different compute type, this implementation will be called more than once, each time + // per diff compute type, while sending one entry in the unifiedComposotionDataList. + @Override + public void createUnifiedComposition(ServiceTemplate serviceTemplate, + ServiceTemplate nestedServiceTemplate, + List<UnifiedCompositionData> unifiedCompositionDataList, + TranslationContext context) { + UnifiedCompositionService unifiedCompositionService = new UnifiedCompositionService(); + if (CollectionUtils.isEmpty(unifiedCompositionDataList)) { + return; + } + + for (int i = 0; i < unifiedCompositionDataList.size(); i++) { + List<UnifiedCompositionData> singleSubstitutionUnifiedList = new ArrayList<>(); + singleSubstitutionUnifiedList.add(unifiedCompositionDataList.get(i)); + + Integer index = unifiedCompositionDataList.size() > 1 ? i : null; + Optional<ServiceTemplate> substitutionServiceTemplate = + unifiedCompositionService.createUnifiedSubstitutionServiceTemplate(serviceTemplate, + singleSubstitutionUnifiedList, context, index); + + if (!substitutionServiceTemplate.isPresent()) { + continue; + } + + String abstractNodeTemplateId = unifiedCompositionService + .createAbstractSubstituteNodeTemplate(serviceTemplate, substitutionServiceTemplate.get(), + singleSubstitutionUnifiedList, context, index); + + unifiedCompositionService + .updateCompositionConnectivity(serviceTemplate, singleSubstitutionUnifiedList, context); + + unifiedCompositionService + .cleanUnifiedCompositionEntities(serviceTemplate, singleSubstitutionUnifiedList, context); + + } + + unifiedCompositionService + .cleanNodeTypes(serviceTemplate, unifiedCompositionDataList, context); + + } +} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/mapping/TranslatorHeatToToscaFunctionConverter.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/mapping/TranslatorHeatToToscaFunctionConverter.java deleted file mode 100644 index 0aa5c5ff96..0000000000 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/mapping/TranslatorHeatToToscaFunctionConverter.java +++ /dev/null @@ -1,410 +0,0 @@ -/*- - * ============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.services.heattotosca.mapping; - -import org.openecomp.core.utilities.yaml.YamlUtil; -import org.openecomp.sdc.heat.datatypes.HeatBoolean; -import org.openecomp.sdc.heat.datatypes.model.HeatOrchestrationTemplate; -import org.openecomp.sdc.heat.datatypes.model.Resource; -import org.openecomp.sdc.heat.services.HeatConstants; -import org.openecomp.sdc.tosca.datatypes.ToscaArtifactType; -import org.openecomp.sdc.tosca.datatypes.ToscaFunctions; -import org.openecomp.sdc.tosca.datatypes.model.ArtifactDefinition; -import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate; -import org.openecomp.sdc.tosca.datatypes.model.Template; -import org.openecomp.sdc.tosca.services.ToscaConstants; -import org.openecomp.sdc.tosca.services.ToscaFileOutputService; -import org.openecomp.sdc.tosca.services.impl.ToscaFileOutputServiceCsarImpl; -import org.openecomp.sdc.translator.services.heattotosca.Constants; -import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil; -import org.openecomp.sdc.translator.services.heattotosca.TranslationContext; -import org.openecomp.sdc.translator.services.heattotosca.impl.ResourceTranslationBase; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.Set; -import java.util.stream.Collectors; - - -public class TranslatorHeatToToscaFunctionConverter { - private static final String UNSUPPORTED_RESOURCE = "UNSUPPORTED_RESOURCE_"; - private static final String UNSUPPORTED_ATTRIBUTE = "UNSUPPORTED_ATTRIBUTE_"; - - protected static Set<String> functionNameSet; - - static { - functionNameSet = new HashSet<>(); - functionNameSet.add("get_param"); - functionNameSet.add("get_attr"); - functionNameSet.add("get_resource"); - functionNameSet.add("get_file"); - } - - /** - * Gets tosca function. - * - * @param functionName the function name - * @param function the function - * @param heatFileName the heat file name - * @param heatOrchestrationTemplate the heat orchestration template - * @param template the template - * @param context the context - * @return the tosca function - */ - public static Object getToscaFunction(String functionName, Object function, String heatFileName, - HeatOrchestrationTemplate heatOrchestrationTemplate, - Template template, TranslationContext context) { - Object returnValue = null; - if ("get_param".equals(functionName)) { - returnValue = - handleGetParamFunction(function, heatFileName, heatOrchestrationTemplate, context); - } else if ("get_attr".equals(functionName)) { - returnValue = - handleGetAttrFunction(function, heatFileName, heatOrchestrationTemplate, context); - } else if ("get_resource".equals(functionName)) { - returnValue = - handleGetResourceFunction(function, heatFileName, heatOrchestrationTemplate, context); - } else if ("get_file".equals(functionName)) { - returnValue = handleGetFileFunction(function, template); - } - return returnValue; - } - - private static Object handleGetFileFunction(Object function, Template template) { - String file = ((String) function).replace("file:///", ""); - Object returnValue; - final String artifactId = file.split("\\.")[0]; - - returnValue = new HashMap<>(); - List artifactParameters = new ArrayList(); - artifactParameters.add(0, ToscaConstants.MODELABLE_ENTITY_NAME_SELF); - ((Map) returnValue).put(ToscaFunctions.GET_ARTIFACT.getDisplayName(), artifactParameters); - artifactParameters.add(1, artifactId); - - ToscaFileOutputService toscaFileOutputService = new ToscaFileOutputServiceCsarImpl(); - if (template != null) { - if (template instanceof NodeTemplate) { - NodeTemplate nodeTemplate = (NodeTemplate) template; - ArtifactDefinition artifactDefinition = - createArtifactDefinition(file, toscaFileOutputService); - if (nodeTemplate.getArtifacts() == null) { - nodeTemplate.setArtifacts(new HashMap<>()); - } - nodeTemplate.getArtifacts().put(artifactId, artifactDefinition); - } - } - return returnValue; - } - - private static Object handleGetResourceFunction(Object function, String heatFileName, - HeatOrchestrationTemplate - heatOrchestrationTemplate, - TranslationContext context) { - Object returnValue; - Optional<String> resourceTranslatedId = ResourceTranslationBase - .getResourceTranslatedId(heatFileName, heatOrchestrationTemplate, (String) function, - context); - if (resourceTranslatedId.isPresent()) { - returnValue = resourceTranslatedId.get(); - } else { - returnValue = UNSUPPORTED_RESOURCE + function; - } - return returnValue; - } - - private static Object handleGetAttrFunction(Object function, String heatFileName, - HeatOrchestrationTemplate heatOrchestrationTemplate, - TranslationContext context) { - Object returnValue = new HashMap<>(); - List<Object> attributeFunctionExpression = - translateGetAttributeFunctionExpression(function, heatFileName, heatOrchestrationTemplate, - context); - if (isResourceSupported(attributeFunctionExpression.get(0).toString()) - && isAttributeSupported(attributeFunctionExpression.get(0).toString())) { - ((Map) returnValue) - .put(ToscaFunctions.GET_ATTRIBUTE.getDisplayName(), attributeFunctionExpression); - } else { - returnValue = attributeFunctionExpression; - } - return returnValue; - } - - private static Object handleGetParamFunction(Object function, String heatFileName, - HeatOrchestrationTemplate heatOrchestrationTemplate, - TranslationContext context) { - Map returnValue = new HashMap<>(); - returnValue.put(ToscaFunctions.GET_INPUT.getDisplayName(), - translateGetParamFunctionExpression(function, heatFileName, heatOrchestrationTemplate, - context)); - return returnValue; - } - - private static ArtifactDefinition createArtifactDefinition(Object function, - ToscaFileOutputService - toscaFileOutputService) { - ArtifactDefinition artifactDefinition = new ArtifactDefinition(); - artifactDefinition.setType(ToscaArtifactType.DEPLOYMENT.getDisplayName()); - artifactDefinition - .setFile("../" + toscaFileOutputService.getArtifactsFolderName() + "/" + function); - return artifactDefinition; - } - - private static Object translateGetParamFunctionExpression(Object function, String heatFileName, - HeatOrchestrationTemplate - heatOrchestrationTemplate, - TranslationContext context) { - Object returnValue = null; - if (function instanceof String) { - returnValue = function; - } else { - if (function instanceof List) { - returnValue = new ArrayList<>(); - for (int i = 0; i < ((List) function).size(); i++) { - Object paramValue = ((List) function).get(i); - if ((paramValue instanceof Map && !((Map) paramValue).isEmpty())) { - Map<String, Object> paramMap = (Map) paramValue; - Map.Entry<String, Object> entry = paramMap.entrySet().iterator().next(); - ((List) returnValue).add( - getToscaFunction(entry.getKey(), entry.getValue(), heatFileName, - heatOrchestrationTemplate, null, context)); - } else { - ((List) returnValue).add(paramValue); - } - } - } - } - - return returnValue; - } - - private static List<Object> translateGetAttributeFunctionExpression( - Object function,String heatFileName, - HeatOrchestrationTemplate heatOrchestrationTemplate, - TranslationContext context) { - List<String> attributeParamList = (List) function; - List<Object> toscaAttributeParamList = new ArrayList<>(); - - Optional<String> resourceTranslatedId = - handleResourceName(attributeParamList.get(0), heatFileName, heatOrchestrationTemplate, - context); - if (!resourceTranslatedId.isPresent()) { - //unsupported resource - toscaAttributeParamList.add(UNSUPPORTED_RESOURCE + attributeParamList.get(0)); - return toscaAttributeParamList; - } else { - toscaAttributeParamList.add(resourceTranslatedId.get()); - } - - Optional<List<Object>> toscaAttList = - handleAttributeName(attributeParamList, heatOrchestrationTemplate, heatFileName, context); - if (!toscaAttList.isPresent()) { - //Unsupported attribute - toscaAttributeParamList.clear(); - toscaAttributeParamList - .add(UNSUPPORTED_ATTRIBUTE + attributeParamList.get(0) + "." + attributeParamList.get(1)); - return toscaAttributeParamList; - } else { - toscaAttributeParamList.addAll(toscaAttList.get()); - } - - Optional<List<String>> toscaIndexOrKey = handleAttributeIndexOrKey(attributeParamList); - if (toscaIndexOrKey.isPresent()) { - toscaAttributeParamList.addAll(toscaIndexOrKey.get()); - } - - return toscaAttributeParamList; - } - - private static Optional<List<String>> handleAttributeIndexOrKey(List<String> attributeParamList) { - List<String> attributeIndexOrKey = new ArrayList<>(); - if (attributeParamList.size() < 2) { - return Optional.empty(); - } - - for (int i = 2; i < attributeParamList.size(); i++) { - attributeIndexOrKey.add(attributeParamList.get(i)); - } - - return Optional.of(attributeIndexOrKey); - } - - private static Optional<List<Object>> handleAttributeName(List<String> attributeParamList, - HeatOrchestrationTemplate - heatOrchestrationTemplate, - String heatFileName, - TranslationContext context) { - String resourceId = attributeParamList.get(0); - Resource resource = - HeatToToscaUtil.getResource(heatOrchestrationTemplate, resourceId, heatFileName); - - if (attributeParamList.size() == 1) { - return getResourceTranslatedAttributesList(resource, context); - } - - if (HeatToToscaUtil.isNestedResource(resource)) { - return getNestedResourceTranslatedAttribute(attributeParamList.get(1)); - } else { - return getResourceTranslatedAttribute(resource, attributeParamList.get(1), context); - } - } - - private static Optional<List<Object>> getResourceTranslatedAttribute(Resource resource, - String attributeName, - TranslationContext context) { - List<Object> translatedAttributesList = new ArrayList<>(); - String translatedAttribute = - context.getElementMapping(resource.getType(), Constants.ATTR, attributeName); - if (translatedAttribute != null) { - translatedAttributesList.add(translatedAttribute); - return Optional.of(translatedAttributesList); - } else { //unsupported attribute - return Optional.empty(); - } - } - - private static Optional<List<Object>> getNestedResourceTranslatedAttribute(String attributeName) { - List<Object> translatedAttributesList = new ArrayList<>(); - - if (attributeName.startsWith(HeatConstants.GET_ATT_FROM_RESOURCE_GROUP_PREFIX)) { - String[] attributeSplit = attributeName.split("\\."); - if (attributeSplit.length == 2) { - translatedAttributesList.add(attributeSplit[1]); - } else if (attributeSplit.length == 3) { - translatedAttributesList.add(attributeSplit[2]); - translatedAttributesList.add(Integer.valueOf(attributeSplit[1])); - } else { - return Optional.empty(); - } - } else { - translatedAttributesList.add(attributeName); - } - return Optional.of(translatedAttributesList); - } - - private static Optional<List<Object>> getResourceTranslatedAttributesList(Resource resource, - TranslationContext - context) { - List<Object> translatedAttributes = new ArrayList<>(); - if (HeatToToscaUtil.isNestedResource(resource)) { - Optional<String> nestedFile = HeatToToscaUtil.getNestedFile(resource); - if (!nestedFile.isPresent()) { - return Optional.empty(); - } - HeatOrchestrationTemplate nestedHeatOrchestrationTemplate = new YamlUtil() - .yamlToObject(context.getFiles().getFileContent(nestedFile.get()), - HeatOrchestrationTemplate.class); - translatedAttributes.addAll(nestedHeatOrchestrationTemplate.getOutputs().keySet()); - return Optional.of(translatedAttributes); - - } else { - Map<String, String> resourceMappingAttributes = - context.getElementMapping(resource.getType(), Constants.ATTR); - Set<String> mappingAttributes = new HashSet<>(); - mappingAttributes - .addAll(resourceMappingAttributes.values().stream().collect(Collectors.toList())); - translatedAttributes.addAll(mappingAttributes); - return Optional.of(translatedAttributes); - } - } - - private static Optional<String> handleResourceName(String resourceId, String heatFileName, - HeatOrchestrationTemplate - heatOrchestrationTemplate, - TranslationContext context) { - return ResourceTranslationBase - .getResourceTranslatedId(heatFileName, heatOrchestrationTemplate, resourceId, context); - } - - public static boolean isResourceSupported(String translatedResourceId) { - return !translatedResourceId.startsWith(UNSUPPORTED_RESOURCE); - } - - public static boolean isAttributeSupported(String translatedAttName) { - return !translatedAttName.startsWith(UNSUPPORTED_ATTRIBUTE); - } - - /** - * Translate fn split function optional. - * - * @param propertyValue the property value - * @param listSize the list size - * @param includeBooleanValue the include boolean value - * @return the optional - */ - public static Optional<List<Map<String, List>>> translateFnSplitFunction( - Object propertyValue,int listSize, - boolean includeBooleanValue) { - List<Map<String, List>> tokenPropertyValueList = new ArrayList<>(); - - if (propertyValue instanceof Map && !((Map) propertyValue).isEmpty()) { - Map<String, Object> propMap = (Map) propertyValue; - Map.Entry<String, Object> entry = propMap.entrySet().iterator().next(); - Object entity = entry.getValue(); - String key = entry.getKey(); - String tokenChar; - - if (key.equals("Fn::Split") && entity instanceof List) { - tokenChar = (String) ((List) entity).get(0); - Object refParameter = ((List) entity).get(1); - - for (int substringIndex = 0; substringIndex < listSize; substringIndex++) { - Map<String, List> tokenPropertyValue = new HashMap<>(); - tokenPropertyValue.put("token", new ArrayList<>()); - - if (refParameter instanceof Map && ((Map) refParameter).get("Ref") != null) { - Map<String, String> stringWithToken = new HashMap<>(); - ((Map) stringWithToken) - .put(ToscaFunctions.GET_INPUT.getDisplayName(), ((Map) refParameter).get("Ref")); - tokenPropertyValue.get("token").add(stringWithToken); - } else if (refParameter instanceof String) { - if (includeBooleanValue) { - StringBuffer booleanBuffer = new StringBuffer(); - String[] booleanValueList = ((String) refParameter).split(tokenChar); - for (int i = 0; i < booleanValueList.length; i++) { - if (i == 0) { - booleanBuffer.append(HeatBoolean.eval(booleanValueList[i])); - } else { - booleanBuffer.append(tokenChar); - booleanBuffer.append(HeatBoolean.eval(booleanValueList[i])); - } - } - tokenPropertyValue.get("token").add(booleanBuffer.toString()); - } else { - tokenPropertyValue.get("token").add(refParameter); - } - } - tokenPropertyValue.get("token").add(tokenChar); - tokenPropertyValue.get("token").add(substringIndex); - tokenPropertyValueList.add(tokenPropertyValue); - } - - return Optional.of(tokenPropertyValueList); - - } - } - - return Optional.empty(); - } -} diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/mapping/TranslatorHeatToToscaParameterConverter.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/mapping/TranslatorHeatToToscaParameterConverter.java index 07ab6d1542..23a4d7317b 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/mapping/TranslatorHeatToToscaParameterConverter.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/mapping/TranslatorHeatToToscaParameterConverter.java @@ -20,15 +20,20 @@ package org.openecomp.sdc.translator.services.heattotosca.mapping; +import org.apache.commons.collections4.MapUtils; import org.openecomp.sdc.heat.datatypes.model.HeatOrchestrationTemplate; import org.openecomp.sdc.heat.datatypes.model.Output; import org.openecomp.sdc.heat.datatypes.model.Parameter; import org.openecomp.sdc.tosca.datatypes.model.Constraint; import org.openecomp.sdc.tosca.datatypes.model.EntrySchema; +import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate; import org.openecomp.sdc.tosca.datatypes.model.ParameterDefinition; +import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; +import org.openecomp.sdc.tosca.datatypes.model.Template; import org.openecomp.sdc.tosca.datatypes.model.heatextend.ParameterDefinitionExt; -import org.openecomp.sdc.translator.services.heattotosca.TranslationContext; - +import org.openecomp.sdc.translator.datatypes.heattotosca.TranslationContext; +import org.openecomp.sdc.translator.services.heattotosca.ConsolidationDataUtil; +import org.openecomp.sdc.translator.services.heattotosca.FunctionTranslationFactory; import java.util.ArrayList; import java.util.Arrays; @@ -36,6 +41,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; + public class TranslatorHeatToToscaParameterConverter { @@ -65,16 +71,18 @@ public class TranslatorHeatToToscaParameterConverter { * @param context the context * @return the map */ - public static Map<String, ParameterDefinition> parameterConverter( + public static Map<String, ParameterDefinition> parameterConverter(ServiceTemplate serviceTemplate, Map<String, Parameter> parameters, HeatOrchestrationTemplate heatOrchestrationTemplate, String heatFileName, TranslationContext context) { Map<String, ParameterDefinition> parameterDefinitionMap = new HashMap<>(); for (Map.Entry<String, Parameter> entry : parameters.entrySet()) { - //parameterDefinitionMap.put(entry.getKey()+"_"+ FileUtils - // .getFileWithoutExtention(heatFileName),getToscaParameter(entry.getValue(), - // heatOrchestrationTemplate, heatFileName, context)); + //parameterDefinitionMap.put(entry.getKey()+"_"+ FileUtils.getFileWithoutExtention + // (heatFileName),getToscaParameter(entry.getValue(), heatOrchestrationTemplate, + // heatFileName, context)); parameterDefinitionMap.put(entry.getKey(), - getToscaParameter(entry.getValue(), heatOrchestrationTemplate, heatFileName, context)); + getToscaParameter(serviceTemplate,entry.getKey(), entry.getValue(), + heatOrchestrationTemplate, + heatFileName, context)); } return parameterDefinitionMap; } @@ -88,16 +96,16 @@ public class TranslatorHeatToToscaParameterConverter { * @param context the context * @return the map */ - public static Map<String, ParameterDefinition> parameterOutputConverter( + public static Map<String, ParameterDefinition> parameterOutputConverter(ServiceTemplate + serviceTemplate, Map<String, Output> parameters, HeatOrchestrationTemplate heatOrchestrationTemplate, String heatFileName, TranslationContext context) { Map<String, ParameterDefinition> parameterDefinitionMap = new HashMap<>(); for (Map.Entry<String, Output> entry : parameters.entrySet()) { - //parameterDefinitionMap.put(entry.getKey()+"_"+FileUtils - // .getFileWithoutExtention(heatFileName),getToscaOutputParameter(entry.getValue(), - // heatOrchestrationTemplate, heatFileName, context)); parameterDefinitionMap.put(entry.getKey(), - getToscaOutputParameter(entry.getValue(), heatOrchestrationTemplate, heatFileName, + getToscaOutputParameter(serviceTemplate,entry.getKey(),entry.getValue(), + heatOrchestrationTemplate, + heatFileName, context)); } return parameterDefinitionMap; @@ -112,9 +120,11 @@ public class TranslatorHeatToToscaParameterConverter { * @param context the context * @return the tosca parameter */ - public static ParameterDefinitionExt getToscaParameter(Parameter heatParameter, + public static ParameterDefinitionExt getToscaParameter(ServiceTemplate serviceTemplate, + String parameterName, + Parameter heatParameter, HeatOrchestrationTemplate - heatOrchestrationTemplate, + heatOrchestrationTemplate, String heatFileName, TranslationContext context) { @@ -124,8 +134,8 @@ public class TranslatorHeatToToscaParameterConverter { toscaParameter.setLabel(heatParameter.getLabel()); toscaParameter.setDescription(heatParameter.getDescription()); toscaParameter.set_default( - getToscaParameterDefaultValue(heatParameter.get_default(), toscaParameter.getType(), - heatFileName, heatOrchestrationTemplate, context)); + getToscaParameterDefaultValue(serviceTemplate, parameterName, heatParameter.get_default(), + toscaParameter.getType(), heatFileName, heatOrchestrationTemplate, context)); toscaParameter.setHidden(heatParameter.isHidden()); toscaParameter.setImmutable(heatParameter.isImmutable()); toscaParameter.setConstraints(getToscaConstrains(heatParameter.getConstraints())); @@ -141,16 +151,19 @@ public class TranslatorHeatToToscaParameterConverter { * @param context the context * @return the tosca output parameter */ - public static ParameterDefinitionExt getToscaOutputParameter(Output heatOutputParameter, + public static ParameterDefinitionExt getToscaOutputParameter(ServiceTemplate serviceTemplate, + String parameterName, + Output heatOutputParameter, HeatOrchestrationTemplate - heatOrchestrationTemplate, + heatOrchestrationTemplate, String heatFileName, TranslationContext context) { ParameterDefinitionExt toscaParameter = new ParameterDefinitionExt(); toscaParameter.setDescription(heatOutputParameter.getDescription()); toscaParameter.setValue( - getToscaParameterDefaultValue(heatOutputParameter.getValue(), toscaParameter.getType(), + getToscaParameterDefaultValue(serviceTemplate,parameterName,heatOutputParameter.getValue(), + toscaParameter.getType(), heatFileName, heatOrchestrationTemplate, context)); return toscaParameter; } @@ -158,44 +171,53 @@ public class TranslatorHeatToToscaParameterConverter { /** * Gets tosca parameter default value. * - * @param defaultObj the a default + * @param obj the a default * @param type the type * @param heatFileName the heat file name * @param heatOrchestrationTemplate the heat orchestration template * @param context the context * @return the tosca parameter default value */ - public static Object getToscaParameterDefaultValue(Object defaultObj, String type, + public static Object getToscaParameterDefaultValue(ServiceTemplate serviceTemplate, + String parameterName, + Object obj, String type, String heatFileName, HeatOrchestrationTemplate - heatOrchestrationTemplate, + heatOrchestrationTemplate, TranslationContext context) { - if (defaultObj == null) { + if (obj == null) { return null; } + Object toscaDefaultValue = obj; if ("list".equals(type)) { - if (defaultObj instanceof String) { - return Arrays.asList(((String) defaultObj).split(",")); + if (obj instanceof String) { + return Arrays.asList(((String) obj).split(",")); } else { - return defaultObj; + return toscaDefaultValue; } } - return getToscaParameterValue(defaultObj, heatFileName, heatOrchestrationTemplate, + return getToscaParameterValue(serviceTemplate,parameterName,toscaDefaultValue, heatFileName, + heatOrchestrationTemplate, context); } - private static Object getToscaParameterValue(Object paramValue, String heatFileName, + private static Object getToscaParameterValue(ServiceTemplate serviceTemplate, + String parameterName, + Object paramValue, String heatFileName, HeatOrchestrationTemplate heatOrchestrationTemplate, TranslationContext context) { if (paramValue instanceof Map) { + if(MapUtils.isEmpty((Map) paramValue)){ + return new HashMap<>(); + } Map.Entry<String, Object> functionMapEntry = (Map.Entry<String, Object>) ((Map) paramValue).entrySet().iterator().next(); - if (TranslatorHeatToToscaFunctionConverter.functionNameSet - .contains(functionMapEntry.getKey())) { - return TranslatorHeatToToscaFunctionConverter - .getToscaFunction(functionMapEntry.getKey(), functionMapEntry.getValue(), heatFileName, + if (FunctionTranslationFactory.getInstance(functionMapEntry.getKey()).isPresent()) { + return FunctionTranslationFactory.getInstance(functionMapEntry.getKey()).get() + .translateFunction(serviceTemplate, null, parameterName, functionMapEntry.getKey(), + functionMapEntry.getValue(),heatFileName, heatOrchestrationTemplate, null, context); } } diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/mapping/TranslatorHeatToToscaPropertyConverter.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/mapping/TranslatorHeatToToscaPropertyConverter.java index d1079c2dc5..e22d21dae0 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/mapping/TranslatorHeatToToscaPropertyConverter.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/mapping/TranslatorHeatToToscaPropertyConverter.java @@ -21,9 +21,12 @@ package org.openecomp.sdc.translator.services.heattotosca.mapping; import org.openecomp.sdc.heat.datatypes.model.HeatOrchestrationTemplate; +import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; import org.openecomp.sdc.tosca.datatypes.model.Template; +import org.openecomp.sdc.translator.datatypes.heattotosca.TranslationContext; +import org.openecomp.sdc.translator.services.heattotosca.ConfigConstants; import org.openecomp.sdc.translator.services.heattotosca.Constants; -import org.openecomp.sdc.translator.services.heattotosca.TranslationContext; +import org.openecomp.sdc.translator.services.heattotosca.FunctionTranslationFactory; import java.util.ArrayList; import java.util.HashMap; @@ -45,16 +48,18 @@ public class TranslatorHeatToToscaPropertyConverter { * @return the tosca properties simple conversion */ //Convert property assuming the property type in heat is same as the property type in tosca - public static Map<String, Object> getToscaPropertiesSimpleConversion( - Map<String, Object> heatProperties, Map<String, Object> toscaProperties, String heatFileName, - HeatOrchestrationTemplate heatOrchestrationTemplate, String resourceType, Template template, - TranslationContext context) { + public static Map<String, Object> getToscaPropertiesSimpleConversion(ServiceTemplate + serviceTemplate, + String resourceId,Map<String, Object> heatProperties, Map<String, Object> toscaProperties, + String heatFileName, HeatOrchestrationTemplate heatOrchestrationTemplate, String + resourceType, Template template, TranslationContext context) { toscaProperties = toscaProperties != null ? toscaProperties : new HashMap<>(); for (String heatPropertyName : context.getElementSet(resourceType, Constants.PROP)) { - setSimpleProperty(heatProperties, heatFileName, resourceType, heatOrchestrationTemplate, + setSimpleProperty(serviceTemplate, resourceId, heatProperties, heatFileName, resourceType, + heatOrchestrationTemplate, context, toscaProperties, heatPropertyName, null, template); } return toscaProperties; @@ -73,7 +78,9 @@ public class TranslatorHeatToToscaPropertyConverter { * @param toscaPropertyName the tosca property name * @param template the template */ - public static void setSimpleProperty(Map<String, Object> heatProperties, String heatFileName, + public static void setSimpleProperty(ServiceTemplate serviceTemplate,String resourceId, + Map<String, Object> heatProperties, + String heatFileName, String resourceType, HeatOrchestrationTemplate heatOrchestrationTemplate, TranslationContext context, @@ -90,10 +97,14 @@ public class TranslatorHeatToToscaPropertyConverter { if (toscaPropertyName == null) { toscaPropertyName = resourceType == null ? heatPropertyName : context.getElementMapping(resourceType, Constants.PROP, heatPropertyName); + if (toscaPropertyName == null) { + return; + } } toscaProperties.put(toscaPropertyName, - getToscaPropertyValue(heatPropertyName, propertyValue, resourceType, heatFileName, - heatOrchestrationTemplate, template, context)); + getToscaPropertyValue(serviceTemplate, resourceId,heatPropertyName, propertyValue, + resourceType, + heatFileName, heatOrchestrationTemplate, template, context)); } @@ -109,26 +120,30 @@ public class TranslatorHeatToToscaPropertyConverter { * @param context the context * @return the tosca property value */ - public static Object getToscaPropertyValue(String propertyName, Object propertyValue, - String resourceType, String heatFileName, + public static Object getToscaPropertyValue(ServiceTemplate serviceTemplate, String resourceId, + String propertyName, Object propertyValue, + String resourceType, String heatFileName, HeatOrchestrationTemplate heatOrchestrationTemplate, Template template, TranslationContext context) { if (propertyValue instanceof Map && !((Map) propertyValue).isEmpty()) { Map.Entry<String, Object> functionMapEntry = (Map.Entry<String, Object>) ((Map) propertyValue).entrySet().iterator().next(); - if (TranslatorHeatToToscaFunctionConverter.functionNameSet - .contains(functionMapEntry.getKey())) { - return TranslatorHeatToToscaFunctionConverter - .getToscaFunction(functionMapEntry.getKey(), functionMapEntry.getValue(), heatFileName, - heatOrchestrationTemplate, template, context); + if (FunctionTranslationFactory.getInstance(functionMapEntry.getKey()).isPresent()) { + return FunctionTranslationFactory.getInstance(functionMapEntry.getKey()).get() + .translateFunction(serviceTemplate, resourceId, propertyName ,functionMapEntry + .getKey(), functionMapEntry + .getValue(), heatFileName, heatOrchestrationTemplate, template, context); } Map<String, Object> propertyValueMap = new HashMap<>(); for (Map.Entry<String, Object> entry : ((Map<String, Object>) propertyValue).entrySet()) { String toscaPropertyName = resourceType == null ? null : context - .getElementMapping(resourceType, Constants.PROP, propertyName + "." + entry.getKey()); + .getElementMapping(resourceType, Constants.PROP, propertyName + + ConfigConstants.TRANS_MAPPING_DELIMITER_CHAR + entry.getKey()); toscaPropertyName = toscaPropertyName != null ? toscaPropertyName : entry.getKey(); propertyValueMap.put(toscaPropertyName, - getToscaPropertyValue(propertyName, entry.getValue(), resourceType, heatFileName, + getToscaPropertyValue(serviceTemplate, resourceId, + propertyName + ConfigConstants.TRANS_MAPPING_DELIMITER_CHAR + + entry.getKey(), entry.getValue(), resourceType, heatFileName, heatOrchestrationTemplate, template, context)); } return propertyValueMap; @@ -136,8 +151,9 @@ public class TranslatorHeatToToscaPropertyConverter { List propertyValueArray = new ArrayList<>(); for (int i = 0; i < ((List) propertyValue).size(); i++) { propertyValueArray.add( - getToscaPropertyValue(propertyName, ((List) propertyValue).get(i), resourceType, - heatFileName, heatOrchestrationTemplate, template, context)); + getToscaPropertyValue(serviceTemplate, resourceId, propertyName, ((List) + propertyValue).get(i), + resourceType, heatFileName, heatOrchestrationTemplate, template, context)); } return propertyValueArray; } diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/utils/ResourceWalker.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/utils/ResourceWalker.java new file mode 100644 index 0000000000..7e8ef16631 --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/utils/ResourceWalker.java @@ -0,0 +1,144 @@ +package org.openecomp.sdc.translator.utils; + +import org.apache.commons.io.IOUtils; +import org.openecomp.sdc.common.errors.CoreException; +import org.openecomp.sdc.common.errors.ErrorCategory; +import org.openecomp.sdc.common.errors.ErrorCode; +import org.openecomp.sdc.datatypes.error.ErrorLevel; +import org.openecomp.sdc.logging.context.impl.MdcDataErrorMessage; +import org.openecomp.sdc.logging.types.LoggerConstants; +import org.openecomp.sdc.logging.types.LoggerErrorCode; +import org.openecomp.sdc.logging.types.LoggerErrorDescription; +import org.openecomp.sdc.logging.types.LoggerTragetServiceName; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Map; +import java.util.function.BiConsumer; +import java.util.function.Predicate; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; + +/** + * @author EVITALIY. + * @since 02 Apr 17 + */ +public class ResourceWalker { + + public static Map<String, String> readResourcesFromDirectory(String resourceDirectoryToStart) + throws + Exception { + Map<String, String> filesContent = new HashMap<>(); + traverse(resourceDirectoryToStart, (fileName, stream) -> { + BufferedReader reader = new BufferedReader(new InputStreamReader(stream)); + try { + filesContent.put(fileName, IOUtils.toString(reader)); + } catch (IOException exception) { + MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_API, + LoggerTragetServiceName.READ_RESOURCE_FILE, ErrorLevel.ERROR.name(), + LoggerErrorCode.DATA_ERROR.getErrorCode(), + LoggerErrorDescription.RESOURCE_FILE_READ_ERROR + + " File name = " + fileName); + throw new CoreException((new ErrorCode.ErrorCodeBuilder()) + .withMessage(LoggerErrorDescription.RESOURCE_FILE_READ_ERROR + + " File name = " + fileName) + .withId("Resource Read Error").withCategory(ErrorCategory.APPLICATION).build(), + exception); + } + }); + return filesContent; + } + + private static void traverse(String start, BiConsumer<String, InputStream> handler) throws + Exception { + + URL url = ResourceWalker.class.getClassLoader().getResource(start); + if (url == null) { + throw new FileNotFoundException("Resource not found: " + start); + } + + switch (url.getProtocol().toLowerCase()) { + + case "file": + traverseFile(new File(url.getPath()), handler); + break; + case "zip": + case "jar": + String path = url.getPath(); + int resourcePosition = path.lastIndexOf("!/" + start); + traverseArchive(path.substring(0, resourcePosition), start, handler); + break; + default: + throw new IllegalArgumentException("Unknown protocol"); + } + } + + private static void traverseArchive(String file, String resource, BiConsumer<String, InputStream> + handler) + throws URISyntaxException, IOException { + + // There is what looks like a bug in Java: + // if "abc" is a directory in an archive, + // both "abc" and "abc/" will be found successfully. + // However, calling isDirectory() will return "true" for "abc/", + // but "false" for "abc". + try (ZipFile zip = new ZipFile(new URI(file).getPath())) { + + Predicate<ZipEntry> predicate = buildPredicate(resource); + Enumeration<? extends ZipEntry> entries = zip.entries(); + while (entries.hasMoreElements()) { + handleZipEntry(predicate, zip, entries.nextElement(), handler); + } + } + } + + private static Predicate<ZipEntry> buildPredicate(String resource) { + + if (resource.endsWith("/")) { + return zipEntry -> + zipEntry.getName().startsWith(resource) && !zipEntry.isDirectory(); + } else { + return zipEntry -> { + String name = zipEntry.getName(); + return (name.equals(resource) || name.startsWith(resource + "/")) + && !zipEntry.isDirectory(); + }; + } + } + + private static void handleZipEntry(Predicate<ZipEntry> predicate, ZipFile zip, ZipEntry zipEntry, + BiConsumer<String, InputStream> handler) + throws IOException { + + if (predicate.test(zipEntry)) { + + try (InputStream input = zip.getInputStream(zipEntry)) { + handler.accept(zipEntry.getName(), input); + } + } + } + + private static void traverseFile(File file, BiConsumer<String, InputStream> handler) throws + IOException { + + if (file.isDirectory()) { + for (File sub : file.listFiles()) { + traverseFile(sub, handler); + } + } else { + try (FileInputStream stream = new FileInputStream(file)) { + handler.accept(file.getName(), stream); + } + } + } +} |