From d981ef67e956f1e5a28ca77f2841f49e468c5b1b Mon Sep 17 00:00:00 2001 From: ojasdubey Date: Wed, 23 May 2018 18:04:28 +0530 Subject: Refactor Onboarding Translator code 1. Fixed sonar violations 2. Fixed static analysis issues 3. Refactored methods for code smells 4. Moved log messages to a common place Change-Id: I33725bc51040a2c7683b06b4294dea6f96c425e3 Issue-ID: SDC-1331 Signed-off-by: ojasdubey --- .../heattotosca/HeatToToscaLogConstants.java | 62 +++ .../NameExtractorContrailComputeImpl.java | 46 +- .../nameextractor/NameExtractorNovaServerImpl.java | 44 +- .../BaseResourceConnection.java | 462 +++++++++--------- .../ContrailPortToNetResourceConnection.java | 262 +++++----- ...ontrailV2VlanToInterfaceResourceConnection.java | 215 ++++---- ...ntrailV2VmInterfaceToNetResourceConnection.java | 210 ++++---- .../NovaToVolResourceConnection.java | 353 +++++++------- .../PortToNetResourceConnection.java | 208 ++++---- .../ResourceConnectionUsingCapabilityHelper.java | 297 ++++++----- .../ResourceConnectionUsingRequirementHelper.java | 211 ++++---- .../ResourceTranslationBase.java | 543 ++++++++++----------- ...ourceTranslationCinderVolumeAttachmentImpl.java | 332 ++++++------- .../ResourceTranslationCinderVolumeImpl.java | 89 ++-- ...urceTranslationContrailServiceInstanceImpl.java | 9 +- .../ResourceTranslationNeutronPortImpl.java | 6 +- .../SecurityRulesToPortResourceConnection.java | 8 +- .../sdc/tosca/services/DataModelUtil.java | 3 +- .../sdc/tosca/services/ToscaConstants.java | 2 + 19 files changed, 1694 insertions(+), 1668 deletions(-) diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/HeatToToscaLogConstants.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/HeatToToscaLogConstants.java index 15c9ccd401..02f4fd6226 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/HeatToToscaLogConstants.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/HeatToToscaLogConstants.java @@ -79,6 +79,68 @@ public class HeatToToscaLogConstants { + "include '{}' property which is connect to unsupported/incorrect {} resource '{}' with type '{}', " + LOG_UNSUPPORTED_RESOURCE_CONNECTION_SUFFIX; + //Security rules to port + public static final String LOG_UNSUPPORTED_SECURITY_RULE_PORT_CAPABILITY_CONNECTION = + "Nested resource '{}' property '{}' is pointing to resource with type '{}' which is not supported for " + + "capability '{}' connection, (security rules to port connection). Supported types are: '{}', " + + "therefore, this TOSCA capability will not be connected."; + + //Neutron Port + public static final String LOG_UNSUPPORTED_RESOURCE_REQUIREMENT_CONNECTION = + "'{}' property of port resource('{}') is pointing to a resource of type '{}' which is not supported for " + + "this requirement. Supported types are: {}"; + //Volume Attachment + public static final String LOG_INVALID_INSTANCE_UUID = LOG_HEAT_RESOURCE_TYPE_PREFIX + + "include 'instance_uuid' property without 'get_resource' function, " + + LOG_UNSUPPORTED_HEAT_RESOURCE_SUFFIX; + public static final String LOG_UNSUPPORTED_VOLUME_ATTACHMENT_MSG = + "Volume attachment with id '{}' is pointing to unsupported resource type({}) through the property " + + "'volume_id'. The connection to the volume is ignored. Supported types are: {}"; + + //Capability/Requirement helpers + public static final String LOG_NESTED_RESOURCE_PROPERTY_NOT_DEFINED = "'{}' property is not define in nested " + + "resource '{}' for the nested heat file, therefore, '{}' TOSCA {} will not be connected."; + public static final String LOG_UNSUPPORTED_CAPABILITY_CONNECTION = + "'{}' connection to '{}' capability of type '{}' is not supported/invalid," + + LOG_UNSUPPORTED_RESOURCE_CONNECTION_SUFFIX; + + //Port to Net Resource Connection + public static final String LOG_UNSUPPORTED_PORT_NETWORK_REQUIREMENT_CONNECTION = + "Nested resource '{}' property '{}' is pointing to a resource with type '{}' which is not " + + "supported for requirement '{}' that connect port to network. Supported types are: '{}', " + + "therefore, this TOSCA requirement will not be connected."; + + public static final String LOG_UNSUPPORTED_VOL_ATTACHMENT_VOLUME_REQUIREMENT_CONNECTION = + "Nested resource '{}' property '{}' is pointing to a resource with type '{}' which is not " + + "supported for requirement '{}' that connect VolumeAttachment to Volume. Supported " + + "types are: '{}', therefore, this TOSCA requirement will not be connected."; + + //Contrail v2 vmi to net resource connection + public static final String LOG_MULTIPLE_VIRTUAL_NETWORK_REFS_VALUES = + "Heat resource: '{}' with nested heat file: '{}' has resource '{}' with " + + "type '{}' which 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."; + public static final String LOG_UNSUPPORTED_VMI_NETWORK_REQUIREMENT_CONNECTION = + "Nested resource '{}' property '{}' is pointing to a resource with type '{}' which is not supported for " + + "requirement '{}' that connect virtual machine interface to network. Supported " + + "types are: '{}', therefore, this TOSCA requirement will not be connected."; + + //Contrail v2 vlan to interface connection + public static final String LOG_UNSUPPORTED_VMI_VLAN_SUB_INTERFACE_REQUIREMENT_CONNECTION = + "Nested resource '{}' property '{}' is pointing to a {} resource with type '{}' which is not supported " + + "for requirement '{}' that connect vmi vlan sub interface to interface. Supported types are: " + + "'{}' (excluding Vlan), therefore, this TOSCA requirement will not be connected."; + + public static final String LOG_MULTIPLE_INTERFACE_VALUES_NESTED = + "Heat resource: '{}' with nested heat file: '{}' has resource '{}' with type '{}' which include '{}' " + + "property with more than one interface values, only the first interface will be connected, all " + + "rest will be ignored in TOSCA translation."; + + public static final String LOG_UNSUPPORTED_CONTRAIL_PORT_NETWORK_REQUIREMENT_CONNECTION = + "Nested resource '{}' property '{}' is pointing to a resource with type '{}' which is not supported" + + "for requirement '{}' that connect contrail port to network. Supported types " + + "are: '{}', therefore, this TOSCA requirement will not be connected."; + private HeatToToscaLogConstants() { //Hiding implicit constructor } 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 index 637aff9406..f7297d402f 100644 --- 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 @@ -1,25 +1,26 @@ -/*- - * ============LICENSE_START======================================================= - * SDC - * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ +/* + * Copyright © 2016-2018 European Support Limited + * * 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 static org.openecomp.sdc.tosca.services.ToscaConstants.HEAT_NODE_TYPE_SUFFIX; + +import java.util.List; +import java.util.Optional; + import org.openecomp.sdc.heat.datatypes.model.Resource; import org.openecomp.sdc.tosca.datatypes.ToscaNodeType; import org.openecomp.sdc.translator.datatypes.heattotosca.PropertyRegexMatcher; @@ -27,23 +28,18 @@ 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 propertyRegexMatchers = - contrailTranslationHelper.getPropertyRegexMatchersForComputeNodeType(); - Optional extractedNodeTypeName = - NameExtractorUtil.extractNodeTypeNameByPropertiesPriority(resource.getProperties(), - propertyRegexMatchers); - - return ToscaNodeType.VFC_NODE_TYPE_PREFIX + "heat." - + (extractedNodeTypeName.isPresent() ? extractedNodeTypeName.get() - : "compute_" + translatedId); - } + @Override + public String extractNodeTypeName(Resource resource, String resourceId, String translatedId) { + ContrailTranslationHelper contrailTranslationHelper = new ContrailTranslationHelper(); + List propertyRegexMatchers = + contrailTranslationHelper.getPropertyRegexMatchersForComputeNodeType(); + Optional extractedNodeTypeName = NameExtractorUtil.extractNodeTypeNameByPropertiesPriority(resource + .getProperties(), propertyRegexMatchers); + + return ToscaNodeType.VFC_NODE_TYPE_PREFIX + HEAT_NODE_TYPE_SUFFIX + + (extractedNodeTypeName.orElseGet(() -> "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 index 52ceafa454..9cfd2aeddc 100644 --- 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 @@ -1,25 +1,26 @@ -/*- - * ============LICENSE_START======================================================= - * SDC - * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ +/* + * Copyright © 2016-2018 European Support Limited + * * 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 static org.openecomp.sdc.tosca.services.ToscaConstants.HEAT_NODE_TYPE_SUFFIX; + +import java.util.List; +import java.util.Optional; + import org.openecomp.sdc.heat.datatypes.model.Resource; import org.openecomp.sdc.tosca.datatypes.ToscaNodeType; import org.openecomp.sdc.translator.datatypes.heattotosca.PropertyRegexMatcher; @@ -27,24 +28,19 @@ 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 propertyRegexMatchers = - novaServerTranslator.getPropertyRegexMatchersForNovaNodeType(); + @Override + public String extractNodeTypeName(Resource resource, String resourceId, String translatedId) { + ResourceTranslationNovaServerImpl novaServerTranslator = new ResourceTranslationNovaServerImpl(); + List propertyRegexMatchers = + novaServerTranslator.getPropertyRegexMatchersForNovaNodeType(); - Optional extractedNodeTypeName = NameExtractorUtil - .extractNodeTypeNameByPropertiesPriority(resource.getProperties(), propertyRegexMatchers); + Optional extractedNodeTypeName = NameExtractorUtil + .extractNodeTypeNameByPropertiesPriority(resource.getProperties(), propertyRegexMatchers); - return ToscaNodeType.VFC_NODE_TYPE_PREFIX + "heat." - + (extractedNodeTypeName.isPresent() ? extractedNodeTypeName.get() - : translatedId.replace(".", "_")); - } + return ToscaNodeType.VFC_NODE_TYPE_PREFIX + HEAT_NODE_TYPE_SUFFIX + + (extractedNodeTypeName.orElseGet(() -> 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 index 065092b00f..6b7f1cf5b9 100644 --- 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 @@ -1,26 +1,37 @@ -/*- - * ============LICENSE_START======================================================= - * SDC - * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ +/* + * Copyright © 2016-2018 European Support Limited + * * 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 java.util.ArrayList; +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; + +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.MapUtils; +import org.onap.sdc.tosca.datatypes.model.NodeTemplate; +import org.onap.sdc.tosca.datatypes.model.NodeType; +import org.onap.sdc.tosca.datatypes.model.RequirementAssignment; +import org.onap.sdc.tosca.datatypes.model.RequirementDefinition; +import org.onap.sdc.tosca.datatypes.model.ServiceTemplate; +import org.onap.sdc.tosca.services.YamlUtil; import org.openecomp.sdc.common.errors.CoreException; import org.openecomp.sdc.common.errors.ErrorCategory; import org.openecomp.sdc.common.errors.ErrorCode; @@ -29,14 +40,9 @@ 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.onap.sdc.tosca.datatypes.model.NodeTemplate; -import org.onap.sdc.tosca.datatypes.model.NodeType; -import org.onap.sdc.tosca.datatypes.model.RequirementAssignment; -import org.onap.sdc.tosca.datatypes.model.RequirementDefinition; -import org.onap.sdc.tosca.datatypes.model.ServiceTemplate; +import org.openecomp.sdc.tosca.datatypes.ToscaFunctions; import org.openecomp.sdc.tosca.services.DataModelUtil; import org.openecomp.sdc.tosca.services.ToscaAnalyzerService; -import org.onap.sdc.tosca.services.YamlUtil; 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; @@ -44,267 +50,265 @@ import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslatedHeatResou 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 { - protected static Logger logger = LoggerFactory.getLogger(BaseResourceConnection.class); - protected TranslateTo translateTo; - FileData nestedFileData; - NodeTemplate substitutionNodeTemplate; - NodeType nodeType; - ResourceTranslationBase resourceTranslationBase; + protected static Logger logger = LoggerFactory.getLogger(BaseResourceConnection.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; - } + 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 boolean isDesiredNodeTemplateType(NodeTemplate nodeTemplate); - abstract List> getPredicatesListForConnectionPoints(); + abstract List> getPredicatesListForConnectionPoints(); - abstract Optional> getConnectorPropertyParamName(String heatResourceId, - Resource heatResource, - HeatOrchestrationTemplate - nestedHeatOrchestrationTemplate, - String nestedHeatFileName); + abstract Optional> getConnectorPropertyParamName(String heatResourceId, + Resource heatResource, + HeatOrchestrationTemplate + nestedHeatOrchestrationTemplate, + String nestedHeatFileName); - abstract String getDesiredResourceType(); + abstract String getDesiredResourceType(); - abstract String getMappedNodeTranslatedResourceId(ServiceTemplate nestedServiceTemplate, - Map.Entry connectionPointEntry); + abstract String getMappedNodeTranslatedResourceId(ServiceTemplate nestedServiceTemplate, + Map.Entry connectionPointEntry); - abstract Map.Entry getMappedConnectionPointEntry(ServiceTemplate nestedServiceTemplate, - Map.Entry - connectionPointEntry); + abstract Map.Entry getMappedConnectionPointEntry(ServiceTemplate nestedServiceTemplate, + Map.Entry + connectionPointEntry); - abstract void addRequirementToConnectResources(Map.Entry connectionPointEntry, - List paramNames); + abstract void addRequirementToConnectResources(Map.Entry connectionPointEntry, + List paramNames); - abstract List> getAllConnectionPoints(); + abstract List> getAllConnectionPoints(); - abstract boolean validateResourceTypeSupportedForReqCreation(String nestedResourceId, - final String nestedPropertyName, - String connectionPointId, - Resource connectedResource, - List supportedTypes); + abstract boolean validateResourceTypeSupportedForReqCreation(String nestedResourceId, + final String nestedPropertyName, + String connectionPointId, + Resource connectedResource, + List supportedTypes); - void connect() { - ServiceTemplate nestedServiceTemplate = translateTo.getContext().getTranslatedServiceTemplates() - .get(translateTo.getResource().getType()); - List paramNames; - HeatOrchestrationTemplate nestedHeatOrchestrationTemplate = new YamlUtil() - .yamlToObject(translateTo.getContext().getFileContent(nestedFileData.getFile()), - HeatOrchestrationTemplate.class); - List> exposedConnectionPoints = getAllConnectionPoints(); - for (Map connectionPointsMap : exposedConnectionPoints) { - for (Map.Entry connectionPointEntry : connectionPointsMap.entrySet()) { - paramNames = - getConnectionParameterName(nestedServiceTemplate, nestedHeatOrchestrationTemplate, - nestedFileData.getFile(), connectionPointEntry); - if (paramNames != null && !paramNames.isEmpty()) { - addRequirementToConnectResources(connectionPointEntry, paramNames); + void connect() { + ServiceTemplate nestedServiceTemplate = translateTo.getContext().getTranslatedServiceTemplates() + .get(translateTo.getResource().getType()); + List paramNames; + HeatOrchestrationTemplate nestedHeatOrchestrationTemplate = new YamlUtil() + .yamlToObject(translateTo.getContext().getFileContent(nestedFileData.getFile()), + HeatOrchestrationTemplate.class); + List> exposedConnectionPoints = getAllConnectionPoints(); + for (Map connectionPointsMap : exposedConnectionPoints) { + for (Map.Entry connectionPointEntry : connectionPointsMap.entrySet()) { + paramNames = + getConnectionParameterName(nestedServiceTemplate, nestedHeatOrchestrationTemplate, + nestedFileData.getFile(), connectionPointEntry); + if (CollectionUtils.isNotEmpty(paramNames)) { + addRequirementToConnectResources(connectionPointEntry, paramNames); + } + } } - } } - } - private List getConnectionParameterName(ServiceTemplate nestedServiceTemplate, - HeatOrchestrationTemplate - nestedHeatOrchestrationTemplate, - String nestedHeatFileName, - Map.Entry connectionPointEntry) { - List 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); - } + private List getConnectionParameterName(ServiceTemplate nestedServiceTemplate, + HeatOrchestrationTemplate + nestedHeatOrchestrationTemplate, + String nestedHeatFileName, + Map.Entry connectionPointEntry) { + List 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 mappedSubstituteServiceTemplateName = toscaAnalyzerService - .getSubstituteServiceTemplateName(mappedTranslatedResourceId, mappedNodeTemplate); - if (mappedSubstituteServiceTemplateName.isPresent()) { + ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl(); + if (!toscaAnalyzerService.isSubstitutableNodeTemplate(mappedNodeTemplate)) { + return Collections.emptyList(); + } + Optional mappedSubstituteServiceTemplateName = toscaAnalyzerService + .getSubstituteServiceTemplateName(mappedTranslatedResourceId, mappedNodeTemplate); + if (!mappedSubstituteServiceTemplateName.isPresent()) { + return Collections.emptyList(); + } String mappedNestedHeatFileName = translateTo.getContext().getNestedHeatFileName() - .get(mappedSubstituteServiceTemplateName.get()); + .get(mappedSubstituteServiceTemplateName.get()); if (Objects.isNull(mappedNestedHeatFileName)) { - return null; + return Collections.emptyList(); } HeatOrchestrationTemplate mappedNestedHeatOrchestrationTemplate = new YamlUtil() - .yamlToObject(translateTo.getContext().getFileContent(mappedNestedHeatFileName), - HeatOrchestrationTemplate.class); + .yamlToObject(translateTo.getContext().getFileContent(mappedNestedHeatFileName), + HeatOrchestrationTemplate.class); ServiceTemplate mappedNestedServiceTemplate = - translateTo.getContext().getTranslatedServiceTemplates().get(mappedNestedHeatFileName); + translateTo.getContext().getTranslatedServiceTemplates().get(mappedNestedHeatFileName); List nestedPropertyNames = getConnectionParameterName(mappedNestedServiceTemplate, - mappedNestedHeatOrchestrationTemplate, mappedNestedHeatFileName, - getMappedConnectionPointEntry(nestedServiceTemplate, connectionPointEntry)); + mappedNestedHeatOrchestrationTemplate, mappedNestedHeatFileName, + getMappedConnectionPointEntry(nestedServiceTemplate, connectionPointEntry)); - if (nestedPropertyNames != null && !nestedPropertyNames.isEmpty()) { - for (String propertyName : nestedPropertyNames) { + if (CollectionUtils.isEmpty(nestedPropertyNames)) { + return connectionParameterNameList; + } + 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); - } + if (propertyValue instanceof Map + && ((Map) propertyValue).containsKey(ToscaFunctions.GET_INPUT.getDisplayName())) { + Object paramName = ((Map) propertyValue).get(ToscaFunctions.GET_INPUT.getDisplayName()); + if (paramName instanceof String) { + connectionParameterNameList.add((String) paramName); + } } - } } return connectionParameterNameList; - } } - return null; - } - private List getResourcesConnectionParameterName(String translatedResourceId, - HeatOrchestrationTemplate - nestedHeatOrchestrationTemplate, - String nestedHeatFileName) { - List params = new ArrayList<>(); - Optional>> heatResources = - getResourceByTranslatedResourceId(translatedResourceId, nestedHeatOrchestrationTemplate); - if (heatResources.isPresent()) { - for (Map.Entry resourceEntry : heatResources.get()) { - Resource heatResource = resourceEntry.getValue(); - if (!MapUtils.isEmpty(heatResource.getProperties())) { - Optional> connectorParamName = - getConnectorPropertyParamName(resourceEntry.getKey(), heatResource, - nestedHeatOrchestrationTemplate, nestedHeatFileName); - connectorParamName.ifPresent(params::addAll); + private List getResourcesConnectionParameterName(String translatedResourceId, + HeatOrchestrationTemplate + nestedHeatOrchestrationTemplate, + String nestedHeatFileName) { + List params = new ArrayList<>(); + Optional>> heatResources = + getResourceByTranslatedResourceId(translatedResourceId, nestedHeatOrchestrationTemplate); + if (!heatResources.isPresent()) { + return params; } - } + for (Map.Entry resourceEntry : heatResources.get()) { + Resource heatResource = resourceEntry.getValue(); + if (!MapUtils.isEmpty(heatResource.getProperties())) { + Optional> connectorParamName = + getConnectorPropertyParamName(resourceEntry.getKey(), heatResource, + nestedHeatOrchestrationTemplate, nestedHeatFileName); + connectorParamName.ifPresent(params::addAll); + } + } + return params; } - return params; - } - protected Optional>> getResourceByTranslatedResourceId( - String translatedResourceId, HeatOrchestrationTemplate nestedHeatOrchestrationTemplate) { - Optional>> 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()); + protected Optional>> getResourceByTranslatedResourceId( + String translatedResourceId, HeatOrchestrationTemplate nestedHeatOrchestrationTemplate) { + Optional>> 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; } - return resourceByTranslatedResourceId; - } - RequirementAssignment createRequirementAssignment(Map.Entry - requirementEntry, String node, - NodeTemplate nodeTemplate) { - 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); + RequirementAssignment createRequirementAssignment(Map.Entry requirementEntry, + String node, + NodeTemplate nodeTemplate) { + 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); + } + return requirementAssignment; } - return requirementAssignment; - } - Optional getConnectionTranslatedNodeUsingGetParamFunc( - Map.Entry connectionPointEntry, String paramName, - List supportedNodeTypes) { + Optional getConnectionTranslatedNodeUsingGetParamFunc( + Map.Entry connectionPointEntry, String paramName, + List supportedNodeTypes) { - Optional 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()); + Optional 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 (isSupportedSharedResource(paramName, connectionPointEntry.getKey(), supportedNodeTypes, + shareResource)) { + return Optional.of(shareResource.getTranslatedId()); + } + } + return Optional.empty(); } - return Optional.empty(); - } - - Optional getConnectionTranslatedHeatResourceUsingGetParamFunc( - Map.Entry connectionPointEntry, String paramName, - List supportedNodeTypes) { - Optional attachedResourceId = - HeatToToscaUtil.extractAttachedResourceId(translateTo, paramName); - if (!attachedResourceId.isPresent()) { - return Optional.empty(); + private boolean isSupportedSharedResource(String paramName, String connectionPointId, + List supportedNodeTypes, + TranslatedHeatResource shareResource) { + return Objects.nonNull(shareResource) + && !HeatToToscaUtil.isHeatFileNested(translateTo, translateTo.getHeatFileName()) + && validateResourceTypeSupportedForReqCreation(translateTo.getResourceId(), paramName, + connectionPointId, shareResource.getHeatResource(), supportedNodeTypes); } - 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); + + Optional getConnectionTranslatedHeatResourceUsingGetParamFunc( + Map.Entry connectionPointEntry, String paramName, + List supportedNodeTypes) { + + Optional 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 (isSupportedSharedResource(paramName, connectionPointEntry.getKey(), supportedNodeTypes, + shareResource)) { + return Optional.of(shareResource); + } } - } + return Optional.empty(); } - return Optional.empty(); - } - Optional getConnectionTranslatedNodeUsingGetResourceFunc( - Map.Entry connectionPointEntry, String paramName, Object paramValue, - List supportedNodeTypes) { - Optional 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()); - } - } + Optional getConnectionTranslatedNodeUsingGetResourceFunc( + Map.Entry connectionPointEntry, String paramName, Object paramValue, + List supportedNodeTypes) { + Optional 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(); - } + return Optional.empty(); + } - Optional getConnectionResourceUsingGetResourceFunc( - Map.Entry connectionPointEntry, String paramName, Object paramValue, - List supportedNodeTypes) { - Optional 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; - } + Optional getConnectionResourceUsingGetResourceFunc( + Map.Entry connectionPointEntry, String paramName, Object paramValue, + List supportedNodeTypes) { + Optional 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(); } - 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 index c3b55a9646..64912fce3b 100644 --- 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 @@ -1,26 +1,34 @@ -/*- - * ============LICENSE_START======================================================= - * SDC - * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ +/* + * Copyright © 2016-2018 European Support Limited + * * 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 static org.openecomp.sdc.translator.services.heattotosca.HeatToToscaLogConstants.LOG_UNSUPPORTED_CONTRAIL_PORT_NETWORK_REQUIREMENT_CONNECTION; +import com.google.common.collect.ImmutableList; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.function.Predicate; + +import org.onap.sdc.tosca.datatypes.model.NodeTemplate; +import org.onap.sdc.tosca.datatypes.model.NodeType; +import org.onap.sdc.tosca.datatypes.model.RequirementDefinition; import org.openecomp.sdc.heat.datatypes.manifest.FileData; import org.openecomp.sdc.heat.datatypes.model.HeatOrchestrationTemplate; import org.openecomp.sdc.heat.datatypes.model.HeatResourcesTypes; @@ -30,137 +38,137 @@ 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.onap.sdc.tosca.datatypes.model.NodeTemplate; -import org.onap.sdc.tosca.datatypes.model.NodeType; -import org.onap.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 { - 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> getPredicatesListForConnectionPoints() { - ArrayList> 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> getConnectorPropertyParamName(String heatResourceId, - Resource heatResource, - HeatOrchestrationTemplate - nestedHeatOrchestrationTemplate, - String nestedHeatFileName) { - Object interfaceListProperty = - heatResource.getProperties().get(HeatConstants.INTERFACE_LIST_PROPERTY_NAME); - if (interfaceListProperty == null) { - return Optional.empty(); + ContrailPortToNetResourceConnection(ResourceTranslationBase resourceTranslationBase, + TranslateTo translateTo, FileData nestedFileData, + NodeTemplate substitutionNodeTemplate, + NodeType nodeType) { + super(resourceTranslationBase, translateTo, nestedFileData, substitutionNodeTemplate, nodeType); } - List 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 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()); - } + + @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> getPredicatesListForConnectionPoints() { + ArrayList> 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> getConnectorPropertyParamName(String heatResourceId, + Resource heatResource, + HeatOrchestrationTemplate + nestedHeatOrchestrationTemplate, + String nestedHeatFileName) { + Object interfaceListProperty = heatResource.getProperties().get(HeatConstants.INTERFACE_LIST_PROPERTY_NAME); + if (interfaceListProperty == null) { + return Optional.empty(); + } + List paramsList = new ArrayList<>(); + if (interfaceListProperty instanceof List) { + return getConnectorPropertyParamNameFromList(nestedHeatOrchestrationTemplate, nestedHeatFileName, + (List) interfaceListProperty, paramsList); + } else if (interfaceListProperty instanceof Map) { + return getConnectorPropertyParamNameFromMap(nestedHeatOrchestrationTemplate, nestedHeatFileName, + (Map) interfaceListProperty, paramsList); + } + return Optional.empty(); + } + + private Optional> getConnectorPropertyParamNameFromList( + HeatOrchestrationTemplate nestedHeatOrchestrationTemplate, String nestedHeatFileName, + List interfaceListProperty, List paramsList) { + for (Object interfaceEntry : interfaceListProperty) { + if (interfaceEntry instanceof Map) { + Optional 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()); + } + } } - } - return Optional.of(paramsList); - } else if (interfaceListProperty instanceof Map) { - Optional 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); - } } - return Optional.empty(); - } - - @Override - protected String getDesiredResourceType() { - return HeatResourcesTypes.CONTRAIL_SERVICE_INSTANCE.getHeatResource(); - } - - @Override - protected void addRequirementToConnectResources( - Map.Entry requirementDefinitionEntry, - List paramNames) { - if (paramNames == null || paramNames.isEmpty()) { - return; + + private Optional> getConnectorPropertyParamNameFromMap(HeatOrchestrationTemplate + nestedHeatOrchestrationTemplate, + String nestedHeatFileName, + Map interfaceListProperty, + List paramsList) { + Optional attachedVirtualNetwork = HeatToToscaUtil + .extractAttachedResourceId(nestedHeatFileName, nestedHeatOrchestrationTemplate, + translateTo.getContext(), + 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); + } + return Optional.empty(); + } + + @Override + protected String getDesiredResourceType() { + return HeatResourcesTypes.CONTRAIL_SERVICE_INSTANCE.getHeatResource(); + } + + @Override + protected void addRequirementToConnectResources( + Map.Entry requirementDefinitionEntry, + List paramNames) { + 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 supportedNetworkTypes = + ImmutableList.of(HeatResourcesTypes.NEUTRON_NET_RESOURCE_TYPE.getHeatResource(), + HeatResourcesTypes.CONTRAIL_VIRTUAL_NETWORK_RESOURCE_TYPE.getHeatResource()); + + addRequirementToConnectResource(requirementDefinitionEntry, paramName, paramValue, + supportedNetworkTypes); } - 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 supportedNetworkTypes = - Arrays.asList(HeatResourcesTypes.NEUTRON_NET_RESOURCE_TYPE.getHeatResource(), - HeatResourcesTypes.CONTRAIL_VIRTUAL_NETWORK_RESOURCE_TYPE.getHeatResource()); - - addRequirementToConnectResource(requirementDefinitionEntry, paramName, paramValue, - supportedNetworkTypes); - } - - @Override - boolean validateResourceTypeSupportedForReqCreation(String nestedResourceId, - final String nestedPropertyName, - String connectionPointId, - Resource connectedResource, - List supportedTypes) { - 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."); - return false; + + @Override + boolean validateResourceTypeSupportedForReqCreation(String nestedResourceId, + final String nestedPropertyName, + String connectionPointId, + Resource connectedResource, + List supportedTypes) { + if (resourceTranslationBase.isUnsupportedResourceType(connectedResource, supportedTypes)) { + logger.warn(LOG_UNSUPPORTED_CONTRAIL_PORT_NETWORK_REQUIREMENT_CONNECTION, nestedResourceId, + nestedPropertyName, connectedResource.getType(), connectionPointId, supportedTypes.toString()); + return false; + } + return true; } - 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 index 7f80f47522..24ff55de60 100644 --- 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 @@ -1,25 +1,35 @@ -/*- - * ============LICENSE_START======================================================= - * SDC - * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ +/* + * Copyright © 2016-2018 European Support Limited + * * 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 static org.openecomp.sdc.translator.services.heattotosca.HeatToToscaLogConstants.LOG_MULTIPLE_INTERFACE_VALUES_NESTED; +import static org.openecomp.sdc.translator.services.heattotosca.HeatToToscaLogConstants.LOG_UNSUPPORTED_VMI_VLAN_SUB_INTERFACE_REQUIREMENT_CONNECTION; + +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; + +import org.onap.sdc.tosca.datatypes.model.NodeTemplate; +import org.onap.sdc.tosca.datatypes.model.NodeType; +import org.onap.sdc.tosca.datatypes.model.RequirementDefinition; import org.openecomp.sdc.heat.datatypes.manifest.FileData; import org.openecomp.sdc.heat.datatypes.model.HeatOrchestrationTemplate; import org.openecomp.sdc.heat.datatypes.model.HeatResourcesTypes; @@ -28,124 +38,109 @@ 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.onap.sdc.tosca.datatypes.model.NodeTemplate; -import org.onap.sdc.tosca.datatypes.model.NodeType; -import org.onap.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 { + 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); - } + ContrailV2VlanToInterfaceResourceConnection(ResourceTranslationBase resourceTranslationBase, + TranslateTo translateTo, FileData nestedFileData, + NodeTemplate substitutionNodeTemplate, NodeType nodeType) { + super(resourceTranslationBase, translateTo, nestedFileData, substitutionNodeTemplate, nodeType); + } - @Override - protected List> getPredicatesListForConnectionPoints() { - ArrayList> 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 boolean isDesiredNodeTemplateType(NodeTemplate nodeTemplate) { + return nodeTemplate.getType().equals(ToscaNodeType.CONTRAILV2_VLAN_SUB_INTERFACE); + } - @Override - protected Optional> getConnectorPropertyParamName(String heatResourceId, - Resource heatResource, - HeatOrchestrationTemplate - nestedHeatOrchestrationTemplate, - String nestedHeatFileName) { - List 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(); + @Override + protected List> getPredicatesListForConnectionPoints() { + ArrayList> 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; } - 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."); + + @Override + protected Optional> getConnectorPropertyParamName(String heatResourceId, + Resource heatResource, + HeatOrchestrationTemplate + nestedHeatOrchestrationTemplate, + String nestedHeatFileName) { + List interfaces = new ArrayList<>(); + Object interfaceRefs = heatResource.getProperties().get(HeatConstants.VMI_REFS_PROPERTY_NAME); + if (Objects.isNull(interfaceRefs) || !(interfaceRefs instanceof List) + || ((List) interfaceRefs).isEmpty()) { + return Optional.empty(); + } + if (((List) interfaceRefs).size() > 1) { + logger.warn(LOG_MULTIPLE_INTERFACE_VALUES_NESTED, + translateTo.getResourceId(), translateTo.getResource().getType(), heatResourceId, + HeatResourcesTypes.CONTRAIL_V2_VIRTUAL_MACHINE_INTERFACE_RESOURCE_TYPE.getHeatResource(), + HeatConstants.VMI_REFS_PROPERTY_NAME); + } + Object interfaceRef = ((List) interfaceRefs).get(0); + Optional 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()); + } + return Optional.of(interfaces); } - Object interfaceRef = ((List) interfaceRefs).get(0); - Optional 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()); + + @Override + protected String getDesiredResourceType() { + return HeatResourcesTypes.CONTRAIL_V2_VIRTUAL_MACHINE_INTERFACE_RESOURCE_TYPE.getHeatResource(); } - return Optional.of(interfaces); - } - @Override - protected String getDesiredResourceType() { - return HeatResourcesTypes.CONTRAIL_V2_VIRTUAL_MACHINE_INTERFACE_RESOURCE_TYPE.getHeatResource(); - } + @Override + protected void addRequirementToConnectResources( + Map.Entry requirementDefinitionEntry, + List paramNames) { + if (paramNames == null || paramNames.isEmpty()) { + return; + } + for (String paramName : paramNames) { + Object paramValue = translateTo.getResource().getProperties().get(paramName); + List supportedInterfaceTypes = + Arrays.asList(HeatResourcesTypes.NEUTRON_PORT_RESOURCE_TYPE.getHeatResource(), + HeatResourcesTypes.CONTRAIL_V2_VIRTUAL_MACHINE_INTERFACE_RESOURCE_TYPE + .getHeatResource()); - @Override - protected void addRequirementToConnectResources( - Map.Entry requirementDefinitionEntry, - List paramNames) { - if (paramNames == null || paramNames.isEmpty()) { - return; + addRequirementToConnectResource(requirementDefinitionEntry, paramName, paramValue, + supportedInterfaceTypes); + } } - for (String paramName : paramNames) { - Object paramValue = translateTo.getResource().getProperties().get(paramName); - List supportedInterfaceTypes = - Arrays.asList(HeatResourcesTypes.NEUTRON_PORT_RESOURCE_TYPE.getHeatResource(), - HeatResourcesTypes.CONTRAIL_V2_VIRTUAL_MACHINE_INTERFACE_RESOURCE_TYPE - .getHeatResource()); - addRequirementToConnectResource(requirementDefinitionEntry, paramName, paramValue, - supportedInterfaceTypes); + @Override + boolean validateResourceTypeSupportedForReqCreation(String nestedResourceId, + final String nestedPropertyName, + String connectionPointId, + Resource connectedResource, + List supportedTypes) { + if (resourceTranslationBase.isUnsupportedResourceType(connectedResource, supportedTypes) + || (new ContrailV2VirtualMachineInterfaceHelper() + .isVlanSubInterfaceResource(connectedResource))) { + logger.warn(LOG_UNSUPPORTED_VMI_VLAN_SUB_INTERFACE_REQUIREMENT_CONNECTION, nestedResourceId, + nestedPropertyName, + getLogMessageSuffixForConnectedResource(connectedResource), connectedResource.getType(), + connectionPointId, supportedTypes.toString()); + return false; + } + return true; } - } - @Override - boolean validateResourceTypeSupportedForReqCreation(String nestedResourceId, - final String nestedPropertyName, - String connectionPointId, - Resource connectedResource, - List supportedTypes) { - 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."); - return false; + private String getLogMessageSuffixForConnectedResource(Resource connectedResource) { + return new ContrailV2VirtualMachineInterfaceHelper() + .isVlanSubInterfaceResource(connectedResource) ? "Vlan Sub interface " : ""; } - 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/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 d5fb91a8a2..75938d69f9 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/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 @@ -1,145 +1,139 @@ -/*- - * ============LICENSE_START======================================================= - * SDC - * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ +/* + * Copyright © 2016-2018 European Support Limited + * * 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 static org.openecomp.sdc.translator.services.heattotosca.HeatToToscaLogConstants.LOG_MULTIPLE_VIRTUAL_NETWORK_REFS_VALUES; +import static org.openecomp.sdc.translator.services.heattotosca.HeatToToscaLogConstants.LOG_UNSUPPORTED_VMI_NETWORK_REQUIREMENT_CONNECTION; + +import com.google.common.collect.ImmutableList; + +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; + +import org.onap.sdc.tosca.datatypes.model.NodeTemplate; +import org.onap.sdc.tosca.datatypes.model.NodeType; +import org.onap.sdc.tosca.datatypes.model.RequirementDefinition; 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.onap.sdc.tosca.datatypes.model.NodeTemplate; -import org.onap.sdc.tosca.datatypes.model.NodeType; -import org.onap.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.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.function.Predicate; - public class ContrailV2VmInterfaceToNetResourceConnection - extends ResourceConnectionUsingRequirementHelper { + extends ResourceConnectionUsingRequirementHelper { - public ContrailV2VmInterfaceToNetResourceConnection( - 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_VIRTUAL_MACHINE_INTERFACE) - || nodeTemplate.getType() - .equals(ToscaNodeType.CONTRAILV2_VLAN_SUB_INTERFACE)); - } - - @Override - protected List> getPredicatesListForConnectionPoints() { - ArrayList> 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> getConnectorPropertyParamName(String heatResourceId, - Resource heatResource, - HeatOrchestrationTemplate - nestedHeatOrchestrationTemplate, - String nestedHeatFileName) { - List networks = new ArrayList<>(); - Object virtualNetworkRefs = heatResource.getProperties().get("virtual_network_refs"); - if (Objects.isNull(virtualNetworkRefs) || !(virtualNetworkRefs instanceof List) - || ((List) virtualNetworkRefs).size() == 0) { - return Optional.empty(); + ContrailV2VmInterfaceToNetResourceConnection(ResourceTranslationBase resourceTranslationBase, + TranslateTo translateTo, FileData nestedFileData, + NodeTemplate substitutionNodeTemplate, NodeType nodeType) { + super(resourceTranslationBase, translateTo, nestedFileData, substitutionNodeTemplate, nodeType); } - if (((List) virtualNetworkRefs).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 '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."); + + @Override + protected boolean isDesiredNodeTemplateType(NodeTemplate nodeTemplate) { + return (nodeTemplate.getType() + .equals(ToscaNodeType.CONTRAILV2_VIRTUAL_MACHINE_INTERFACE) + || nodeTemplate.getType() + .equals(ToscaNodeType.CONTRAILV2_VLAN_SUB_INTERFACE)); } - Object virtualNetworkRef = ((List) virtualNetworkRefs).get(0); - Optional network = HeatToToscaUtil - .extractAttachedResourceId(nestedFileData.getFile(), nestedHeatOrchestrationTemplate, - translateTo.getContext(), virtualNetworkRef); - if (network.isPresent() && network.get().isGetParam() - && network.get().getEntityId() instanceof String) { - networks.add((String) network.get().getEntityId()); + + @Override + protected List> getPredicatesListForConnectionPoints() { + ArrayList> 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; } - return Optional.of(networks); - } - @Override - protected String getDesiredResourceType() { - return HeatResourcesTypes.CONTRAIL_V2_VIRTUAL_MACHINE_INTERFACE_RESOURCE_TYPE.getHeatResource(); - } + @Override + protected Optional> getConnectorPropertyParamName(String heatResourceId, + Resource heatResource, + HeatOrchestrationTemplate + nestedHeatOrchestrationTemplate, + String nestedHeatFileName) { + List networks = new ArrayList<>(); + Object virtualNetworkRefs = heatResource.getProperties().get(HeatConstants.VIRTUAL_NETWORK_REFS_PROPERTY_NAME); + if (Objects.isNull(virtualNetworkRefs) || !(virtualNetworkRefs instanceof List) + || ((List) virtualNetworkRefs).isEmpty()) { + return Optional.empty(); + } + if (((List) virtualNetworkRefs).size() > 1) { + logger.warn(LOG_MULTIPLE_VIRTUAL_NETWORK_REFS_VALUES, translateTo.getResourceId(), + translateTo.getResource().getType(), heatResourceId, + HeatResourcesTypes.CONTRAIL_V2_VIRTUAL_MACHINE_INTERFACE_RESOURCE_TYPE.getHeatResource()); + } + Object virtualNetworkRef = ((List) virtualNetworkRefs).get(0); + Optional network = HeatToToscaUtil + .extractAttachedResourceId(nestedFileData.getFile(), nestedHeatOrchestrationTemplate, + translateTo.getContext(), virtualNetworkRef); + if (network.isPresent() && network.get().isGetParam() + && network.get().getEntityId() instanceof String) { + networks.add((String) network.get().getEntityId()); + } + return Optional.of(networks); + } - @Override - protected void addRequirementToConnectResources( - Map.Entry requirementDefinitionEntry, - List paramNames) { - if (paramNames == null || paramNames.isEmpty()) { - return; + @Override + protected String getDesiredResourceType() { + return HeatResourcesTypes.CONTRAIL_V2_VIRTUAL_MACHINE_INTERFACE_RESOURCE_TYPE.getHeatResource(); } - for (String paramName : paramNames) { - Object paramValue = translateTo.getResource().getProperties().get(paramName); - List supportedNetworkTypes = - Arrays.asList(HeatResourcesTypes.NEUTRON_NET_RESOURCE_TYPE.getHeatResource(), - HeatResourcesTypes.CONTRAIL_V2_VIRTUAL_NETWORK_RESOURCE_TYPE.getHeatResource()); - addRequirementToConnectResource(requirementDefinitionEntry, paramName, paramValue, - supportedNetworkTypes); + @Override + protected void addRequirementToConnectResources( + Map.Entry requirementDefinitionEntry, + List paramNames) { + if (paramNames == null || paramNames.isEmpty()) { + return; + } + for (String paramName : paramNames) { + Object paramValue = translateTo.getResource().getProperties().get(paramName); + List supportedNetworkTypes = + ImmutableList.of(HeatResourcesTypes.NEUTRON_NET_RESOURCE_TYPE.getHeatResource(), + HeatResourcesTypes.CONTRAIL_V2_VIRTUAL_NETWORK_RESOURCE_TYPE.getHeatResource()); + + addRequirementToConnectResource(requirementDefinitionEntry, paramName, paramValue, + supportedNetworkTypes); + } } - } - @Override - boolean validateResourceTypeSupportedForReqCreation(String nestedResourceId, - final String nestedPropertyName, - String connectionPointId, - Resource connectedResource, - List supportedTypes) { - 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."); - return false; + @Override + boolean validateResourceTypeSupportedForReqCreation(String nestedResourceId, + final String nestedPropertyName, + String connectionPointId, + Resource connectedResource, + List supportedTypes) { + if (resourceTranslationBase.isUnsupportedResourceType(connectedResource, supportedTypes)) { + logger.warn(LOG_UNSUPPORTED_VMI_NETWORK_REQUIREMENT_CONNECTION, + nestedResourceId, nestedPropertyName, connectedResource.getType(), connectionPointId, + supportedTypes.toString()); + return false; + } + return true; } - 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/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 ee65581ac5..cd8e3764e2 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/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 @@ -1,26 +1,36 @@ -/*- - * ============LICENSE_START======================================================= - * SDC - * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ +/* + * Copyright © 2016-2018 European Support Limited + * * 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 static org.openecomp.sdc.translator.services.heattotosca.HeatToToscaLogConstants.LOG_UNSUPPORTED_VOL_ATTACHMENT_VOLUME_REQUIREMENT_CONNECTION; + +import java.util.ArrayList; +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; +import java.util.stream.Collectors; + import org.apache.commons.collections4.CollectionUtils; +import org.onap.sdc.tosca.datatypes.model.NodeTemplate; +import org.onap.sdc.tosca.datatypes.model.NodeType; +import org.onap.sdc.tosca.datatypes.model.RequirementDefinition; import org.openecomp.sdc.common.errors.CoreException; import org.openecomp.sdc.heat.datatypes.manifest.FileData; import org.openecomp.sdc.heat.datatypes.model.HeatOrchestrationTemplate; @@ -30,9 +40,6 @@ 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.onap.sdc.tosca.datatypes.model.NodeTemplate; -import org.onap.sdc.tosca.datatypes.model.NodeType; -import org.onap.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; @@ -44,202 +51,180 @@ import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil; import org.openecomp.sdc.translator.services.heattotosca.errors.MissingMandatoryPropertyErrorBuilder; import org.openecomp.sdc.translator.services.heattotosca.helper.VolumeTranslationHelper; -import java.util.ArrayList; -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; -import java.util.stream.Collectors; - class NovaToVolResourceConnection extends ResourceConnectionUsingRequirementHelper { - public NovaToVolResourceConnection(ResourceTranslationBase resourceTranslationBase, - TranslateTo translateTo, FileData nestedFileData, - NodeTemplate substitutionNodeTemplate, NodeType nodeType) { - super(resourceTranslationBase, translateTo, nestedFileData, substitutionNodeTemplate, nodeType); - } - - @Override - boolean isDesiredNodeTemplateType(NodeTemplate nodeTemplate) { - ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl(); - ToscaServiceModel toscaServiceModel = - HeatToToscaUtil.getToscaServiceModel(translateTo.getContext()); - return toscaAnalyzerService.isTypeOf(nodeTemplate, ToscaNodeType.NOVA_SERVER, - translateTo.getContext().getTranslatedServiceTemplates() - .get(translateTo.getResource().getType()), toscaServiceModel); - } - - @Override - List> getPredicatesListForConnectionPoints() { - ArrayList> predicates = new ArrayList<>(); - predicates - .add(req -> req.getCapability().equals(ToscaCapabilityType.NATIVE_ATTACHMENT) - && req.getNode().equals(ToscaNodeType.NATIVE_BLOCK_STORAGE) - && req.getRelationship() - .equals(ToscaRelationshipType.NATIVE_ATTACHES_TO)); - return predicates; - } - - @Override - Optional> getConnectorPropertyParamName(String heatResourceId, Resource heatResource, - HeatOrchestrationTemplate - nestedHeatOrchestrationTemplate, - String nestedHeatFileName) { - - - - Optional volumeId = HeatToToscaUtil - .extractAttachedResourceId(nestedFileData.getFile(), nestedHeatOrchestrationTemplate, - translateTo.getContext(), heatResource.getProperties().get("volume_id")); - if (volumeId.isPresent() && volumeId.get().isGetParam() - && volumeId.get().getEntityId() instanceof String) { - return Optional.of(Collections.singletonList((String) volumeId.get().getEntityId())); - } else { - return Optional.empty(); + NovaToVolResourceConnection(ResourceTranslationBase resourceTranslationBase, + TranslateTo translateTo, FileData nestedFileData, + NodeTemplate substitutionNodeTemplate, NodeType nodeType) { + super(resourceTranslationBase, translateTo, nestedFileData, substitutionNodeTemplate, nodeType); } - } - - @Override - String getDesiredResourceType() { - return HeatResourcesTypes.CINDER_VOLUME_ATTACHMENT_RESOURCE_TYPE.getHeatResource(); - } - - @Override - void addRequirementToConnectResources( - Map.Entry requirementDefinitionEntry, - List paramNames) { - + @Override + boolean isDesiredNodeTemplateType(NodeTemplate nodeTemplate) { + ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl(); + ToscaServiceModel toscaServiceModel = + HeatToToscaUtil.getToscaServiceModel(translateTo.getContext()); + return toscaAnalyzerService.isTypeOf(nodeTemplate, ToscaNodeType.NOVA_SERVER, + translateTo.getContext().getTranslatedServiceTemplates() + .get(translateTo.getResource().getType()), toscaServiceModel); + } - if (paramNames == null || paramNames.isEmpty()) { - return; + @Override + List> getPredicatesListForConnectionPoints() { + ArrayList> predicates = new ArrayList<>(); + predicates + .add(req -> req.getCapability().equals(ToscaCapabilityType.NATIVE_ATTACHMENT) + && req.getNode().equals(ToscaNodeType.NATIVE_BLOCK_STORAGE) + && req.getRelationship() + .equals(ToscaRelationshipType.NATIVE_ATTACHES_TO)); + return predicates; } - List supportedVolumeTypes = - Collections.singletonList(HeatResourcesTypes.CINDER_VOLUME_RESOURCE_TYPE.getHeatResource()); + @Override + Optional> getConnectorPropertyParamName(String heatResourceId, Resource heatResource, + HeatOrchestrationTemplate + nestedHeatOrchestrationTemplate, + String nestedHeatFileName) { + + + Optional volumeId = HeatToToscaUtil + .extractAttachedResourceId(nestedFileData.getFile(), nestedHeatOrchestrationTemplate, + translateTo.getContext(), heatResource.getProperties().get("volume_id")); + if (volumeId.isPresent() && volumeId.get().isGetParam() + && volumeId.get().getEntityId() instanceof String) { + return Optional.of(Collections.singletonList((String) volumeId.get().getEntityId())); + } else { + return Optional.empty(); + } + } - for (String paramName : paramNames) { - Object paramValue = translateTo.getResource().getProperties().get(paramName); - addRequirementToConnectResource(requirementDefinitionEntry, paramName, paramValue, - supportedVolumeTypes); + @Override + String getDesiredResourceType() { + return HeatResourcesTypes.CINDER_VOLUME_ATTACHMENT_RESOURCE_TYPE.getHeatResource(); } - } + @Override + void addRequirementToConnectResources( + Map.Entry requirementDefinitionEntry, + List paramNames) { - @Override - boolean validateResourceTypeSupportedForReqCreation(String nestedResourceId, - String nestedPropertyName, - String connectionPointId, - Resource connectedResource, - List supportedTypes) { + if (paramNames == null || paramNames.isEmpty()) { + return; + } + List supportedVolumeTypes = + Collections.singletonList(HeatResourcesTypes.CINDER_VOLUME_RESOURCE_TYPE.getHeatResource()); - 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."); + for (String paramName : paramNames) { + Object paramValue = translateTo.getResource().getProperties().get(paramName); + addRequirementToConnectResource(requirementDefinitionEntry, paramName, paramValue, + supportedVolumeTypes); + } - return false; } - return true; - } - - @Override - protected Optional>> getResourceByTranslatedResourceId( - String translatedResourceId, HeatOrchestrationTemplate nestedHeatOrchestrationTemplate) { - - - - List>> predicates = - buildPredicates(nestedFileData.getFile(), nestedHeatOrchestrationTemplate, - translatedResourceId); - List> list = - nestedHeatOrchestrationTemplate.getResources().entrySet() - .stream() - .filter(entry -> predicates - .stream() - .allMatch(p -> p.test(entry))) - .collect(Collectors.toList()); - if (CollectionUtils.isEmpty(list)) { - return Optional.empty(); - } else { - return Optional.of(list); + @Override + boolean validateResourceTypeSupportedForReqCreation(String nestedResourceId, + String nestedPropertyName, + String connectionPointId, + Resource connectedResource, + List supportedTypes) { + + + if (resourceTranslationBase.isUnsupportedResourceType(connectedResource, supportedTypes)) { + logger.warn(LOG_UNSUPPORTED_VOL_ATTACHMENT_VOLUME_REQUIREMENT_CONNECTION, nestedResourceId, + nestedPropertyName, connectedResource.getType(), connectionPointId, supportedTypes.toString()); + return false; + } + + return true; } - } - @Override - Optional getConnectionTranslatedNodeUsingGetParamFunc( - Map.Entry requirementDefinitionEntry, String paramName, - List supportedTargetNodeTypes) { + @Override + protected Optional>> getResourceByTranslatedResourceId( + String translatedResourceId, HeatOrchestrationTemplate nestedHeatOrchestrationTemplate) { + + + List>> predicates = + buildPredicates(nestedFileData.getFile(), nestedHeatOrchestrationTemplate, + translatedResourceId); + List> list = + nestedHeatOrchestrationTemplate.getResources().entrySet() + .stream() + .filter(entry -> predicates + .stream() + .allMatch(p -> p.test(entry))) + .collect(Collectors.toList()); + if (CollectionUtils.isEmpty(list)) { + return Optional.empty(); + } else { + return Optional.of(list); + } + } + @Override + Optional getConnectionTranslatedNodeUsingGetParamFunc( + Map.Entry requirementDefinitionEntry, String paramName, + List supportedTargetNodeTypes) { - Optional targetTranslatedNodeId = super - .getConnectionTranslatedNodeUsingGetParamFunc(requirementDefinitionEntry, paramName, - supportedTargetNodeTypes); - if (targetTranslatedNodeId.isPresent()) { - return targetTranslatedNodeId; - } else { - Optional 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 allFilesData = - translateTo.getContext().getManifest().getContent().getData(); - Optional fileData = - HeatToToscaUtil.getFileData(translateTo.getHeatFileName(), allFilesData); - if (fileData.isPresent()) { - Optional fileDataContainingResource = - new VolumeTranslationHelper(logger) - .getFileDataContainingVolume(fileData.get().getData(), - (String) resourceId.getEntityId(), translateTo, FileData.Type.HEAT_VOL); - if (fileDataContainingResource.isPresent()) { - return Optional.of(fileDataContainingResource.get().getTranslatedResourceId()); + Optional targetTranslatedNodeId = super + .getConnectionTranslatedNodeUsingGetParamFunc(requirementDefinitionEntry, paramName, + supportedTargetNodeTypes); + if (targetTranslatedNodeId.isPresent()) { + return targetTranslatedNodeId; + } + Optional 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)) { + return Optional.empty(); + } + List allFilesData = translateTo.getContext().getManifest().getContent().getData(); + Optional fileData = HeatToToscaUtil.getFileData(translateTo.getHeatFileName(), allFilesData); + if (fileData.isPresent()) { + Optional fileDataContainingResource = new VolumeTranslationHelper(logger) + .getFileDataContainingVolume(fileData.get().getData(), + (String) resourceId.getEntityId(), translateTo, FileData.Type.HEAT_VOL); + if (fileDataContainingResource.isPresent()) { + return Optional.of(fileDataContainingResource.get().getTranslatedResourceId()); + } } - } } - } - return Optional.empty(); + return Optional.empty(); + } + + private List>> buildPredicates( + String fileName, + HeatOrchestrationTemplate heatOrchestrationTemplate, + String novaTranslatedResourceId) { + List>> list = new ArrayList<>(); + list.add(entry -> entry.getValue().getType().equals(getDesiredResourceType())); + list.add(entry -> { + Object instanceUuidProp = entry.getValue().getProperties().get("instance_uuid"); + TranslationContext context = translateTo.getContext(); + Optional instanceUuid = HeatToToscaUtil + .extractAttachedResourceId(fileName, heatOrchestrationTemplate, context, + instanceUuidProp); + if (instanceUuid.isPresent()) { + Optional resourceTranslatedId = + ResourceTranslationBase.getResourceTranslatedId(fileName, heatOrchestrationTemplate, + (String) instanceUuid.get().getTranslatedId(), context); + return resourceTranslatedId.isPresent() + && resourceTranslatedId.get().equals(novaTranslatedResourceId); + + } else { + throw new CoreException(new MissingMandatoryPropertyErrorBuilder("instance_uuid").build()); + } + }); + return list; } - } - - private List>> buildPredicates( - String fileName, - HeatOrchestrationTemplate heatOrchestrationTemplate, - String novaTranslatedResourceId) { - List>> list = new ArrayList<>(); - list.add(entry -> entry.getValue().getType().equals(getDesiredResourceType())); - list.add(entry -> { - Object instanceUuidProp = entry.getValue().getProperties().get("instance_uuid"); - TranslationContext context = translateTo.getContext(); - Optional instanceUuid = HeatToToscaUtil - .extractAttachedResourceId(fileName, heatOrchestrationTemplate, context, - instanceUuidProp); - if (instanceUuid.isPresent()) { - Optional resourceTranslatedId = - ResourceTranslationBase.getResourceTranslatedId(fileName, heatOrchestrationTemplate, - (String) instanceUuid.get().getTranslatedId(), context); - return resourceTranslatedId.isPresent() - && resourceTranslatedId.get().equals(novaTranslatedResourceId); - - } else { - throw new CoreException(new MissingMandatoryPropertyErrorBuilder("instance_uuid").build()); - } - }); - return list; - } } 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 index 4a9cd92329..bcdc8aaf4d 100644 --- 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 @@ -1,138 +1,134 @@ -/*- - * ============LICENSE_START======================================================= - * SDC - * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ +/* + * Copyright © 2016-2018 European Support Limited + * * 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 static org.openecomp.sdc.translator.services.heattotosca.HeatToToscaLogConstants.LOG_UNSUPPORTED_PORT_NETWORK_REQUIREMENT_CONNECTION; + +import com.google.common.collect.ImmutableList; + +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; + +import org.onap.sdc.tosca.datatypes.model.NodeTemplate; +import org.onap.sdc.tosca.datatypes.model.NodeType; +import org.onap.sdc.tosca.datatypes.model.RequirementDefinition; 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.onap.sdc.tosca.datatypes.model.NodeTemplate; -import org.onap.sdc.tosca.datatypes.model.NodeType; -import org.onap.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> getPredicatesListForConnectionPoints() { - ArrayList> 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> getConnectorPropertyParamName(String heatResourceId, - Resource heatResource, - HeatOrchestrationTemplate - nestedHeatOrchestrationTemplate, - String nestedHeatFileName) { - Optional 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) { - return Optional.of(Collections.singletonList((String) network.get().getEntityId())); - } else { - return Optional.empty(); - } + 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> getPredicatesListForConnectionPoints() { + ArrayList> 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> getConnectorPropertyParamName(String heatResourceId, + Resource heatResource, + HeatOrchestrationTemplate + nestedHeatOrchestrationTemplate, + String nestedHeatFileName) { + Optional network = HeatToToscaUtil + .extractAttachedResourceId(nestedHeatFileName, nestedHeatOrchestrationTemplate, translateTo + .getContext(), heatResource.getProperties().get(HeatConstants.NETWORK_PROPERTY_NAME)); + 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(HeatConstants.NETWORK_ID_PROPERTY_NAME)); + if (network.isPresent() + && network.get().isGetParam() + && network.get().getEntityId() instanceof String) { + 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 getDesiredResourceType() { - return HeatResourcesTypes.NEUTRON_PORT_RESOURCE_TYPE.getHeatResource(); - } - - @Override - protected void addRequirementToConnectResources( - Map.Entry requirementDefinitionEntry, - List paramNames) { - if (paramNames == null || paramNames.isEmpty()) { - return; + + @Override + protected void addRequirementToConnectResources( + Map.Entry requirementDefinitionEntry, + List paramNames) { + 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 supportedNetworkTypes = ImmutableList.of( + 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); } - 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 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); - } - - @Override - boolean validateResourceTypeSupportedForReqCreation(String nestedResourceId, - final String nestedPropertyName, - String connectionPointId, - Resource connectedResource, - List supportedTypes) { - 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."); - return false; + + @Override + boolean validateResourceTypeSupportedForReqCreation(String nestedResourceId, + final String nestedPropertyName, + String connectionPointId, + Resource connectedResource, + List supportedTypes) { + if (resourceTranslationBase.isUnsupportedResourceType(connectedResource, supportedTypes)) { + logger.warn(LOG_UNSUPPORTED_PORT_NETWORK_REQUIREMENT_CONNECTION, nestedResourceId, + nestedPropertyName, connectedResource.getType(), connectionPointId, supportedTypes.toString()); + return false; + } + return true; } - 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 index 15af3c0771..b5ef95e5d0 100644 --- 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 @@ -1,183 +1,180 @@ -/*- - * ============LICENSE_START======================================================= - * SDC - * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ +/* + * Copyright © 2016-2018 European Support Limited + * * 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.Resource; +import static org.openecomp.sdc.translator.services.heattotosca.HeatToToscaLogConstants.LOG_NESTED_RESOURCE_PROPERTY_NOT_DEFINED; +import static org.openecomp.sdc.translator.services.heattotosca.HeatToToscaLogConstants.LOG_UNSUPPORTED_CAPABILITY_CONNECTION; + +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; + import org.onap.sdc.tosca.datatypes.model.CapabilityDefinition; import org.onap.sdc.tosca.datatypes.model.NodeTemplate; import org.onap.sdc.tosca.datatypes.model.NodeType; import org.onap.sdc.tosca.datatypes.model.RequirementAssignment; import org.onap.sdc.tosca.datatypes.model.RequirementDefinition; import org.onap.sdc.tosca.datatypes.model.ServiceTemplate; +import org.openecomp.sdc.heat.datatypes.manifest.FileData; +import org.openecomp.sdc.heat.datatypes.model.Resource; import org.openecomp.sdc.tosca.services.DataModelUtil; +import org.openecomp.sdc.tosca.services.ToscaConstants; 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.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 { + + ResourceConnectionUsingCapabilityHelper(ResourceTranslationBase resourceTranslationBase, + TranslateTo translateTo, FileData nestedFileData, + NodeTemplate substitutionNodeTemplate, + NodeType nodeType) { + super(resourceTranslationBase, translateTo, nestedFileData, substitutionNodeTemplate, nodeType); + } + + abstract Map.Entry createRequirementDefinition( + String capabilityKey); + + @Override + String getMappedNodeTranslatedResourceId(ServiceTemplate nestedServiceTemplate, + Map.Entry connectionPointEntry) { + List substitutionMapping = + nestedServiceTemplate.getTopology_template().getSubstitution_mappings().getCapabilities() + .get(connectionPointEntry.getKey()); + return substitutionMapping.get(0); + } + + @Override + Map.Entry getMappedConnectionPointEntry( + ServiceTemplate nestedServiceTemplate, + Map.Entry connectionPointEntry) { + List 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 = + DataModelUtil.getCapabilityDefinition(substituteNodeType, mappedCapabilityId); + return new Map.Entry() { + @Override + public String getKey() { + return mappedCapabilityId; + } -public abstract class ResourceConnectionUsingCapabilityHelper - extends BaseResourceConnection { - public ResourceConnectionUsingCapabilityHelper(ResourceTranslationBase resourceTranslationBase, - TranslateTo translateTo, FileData nestedFileData, - NodeTemplate substitutionNodeTemplate, - NodeType nodeType) { - super(resourceTranslationBase, translateTo, nestedFileData, substitutionNodeTemplate, nodeType); - } - - abstract Map.Entry createRequirementDefinition( - String capabilityKey); - - @Override - String getMappedNodeTranslatedResourceId(ServiceTemplate nestedServiceTemplate, - Map.Entry connectionPointEntry) { - List substitutionMapping = - nestedServiceTemplate.getTopology_template().getSubstitution_mappings().getCapabilities() - .get(connectionPointEntry.getKey()); - return substitutionMapping.get(0); - } - - @Override - Map.Entry getMappedConnectionPointEntry( - ServiceTemplate nestedServiceTemplate, - Map.Entry connectionPointEntry) { - List 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 = - DataModelUtil.getCapabilityDefinition(substituteNodeType, mappedCapabilityId); - return new Map.Entry() { - @Override - public String getKey() { - return mappedCapabilityId; - } - - @Override - public CapabilityDefinition getValue() { - return capabilityDefinition.get(); - } - - @Override - public CapabilityDefinition setValue(CapabilityDefinition value) { - return null; - } - }; - } - - @Override - protected List> getAllConnectionPoints() { - List> exposedRequirementsList = new ArrayList<>(); - List> predicates = getPredicatesListForConnectionPoints(); - Map capabilities = this.nodeType.getCapabilities(); - if (capabilities == null) { - return exposedRequirementsList; + @Override + public CapabilityDefinition getValue() { + return capabilityDefinition.orElse(null); + } + + @Override + public CapabilityDefinition setValue(CapabilityDefinition value) { + return null; + } + }; } - capabilities.entrySet() - .stream() - .filter(entry -> predicates - .stream() - .anyMatch(p -> p.test(entry.getValue()))) - .forEach(entry -> { - Map exposedRequirementsMap = new HashMap<>(); - exposedRequirementsMap.put(entry.getKey(), entry.getValue()); - exposedRequirementsList.add(exposedRequirementsMap); - }); - return exposedRequirementsList; - } - - void addRequirementToConnectResource(Map.Entry connectionPointEntry, - List supportedSourceNodeTypes, String paramName) { - 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."); - return; + + @Override + protected List> getAllConnectionPoints() { + List> exposedRequirementsList = new ArrayList<>(); + List> predicates = getPredicatesListForConnectionPoints(); + Map 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 exposedRequirementsMap = new HashMap<>(); + exposedRequirementsMap.put(entry.getKey(), entry.getValue()); + exposedRequirementsList.add(exposedRequirementsMap); + }); + return exposedRequirementsList; } - Map.Entry requirementDefinition = - createRequirementDefinition(connectionPointEntry.getKey()); - - Optional sourceResourceId = - getConnectionResourceUsingGetResourceFunc(connectionPointEntry, paramName, paramValue, - supportedSourceNodeTypes); - if (sourceResourceId.isPresent()) { - Resource sourceResource = HeatToToscaUtil - .getResource(translateTo.getHeatOrchestrationTemplate(), sourceResourceId.get(), - translateTo.getHeatFileName()); - Optional 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 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); - } + void addRequirementToConnectResource(Map.Entry connectionPointEntry, + List supportedSourceNodeTypes, String paramName) { + Object paramValue = translateTo.getResource().getProperties().get(paramName); + if (paramValue == null) { + logger.warn(LOG_NESTED_RESOURCE_PROPERTY_NOT_DEFINED, paramName, + translateTo.getResourceId(), connectionPointEntry.getKey(), ToscaConstants.CAPABILITY); + return; + } + + Map.Entry requirementDefinition = + createRequirementDefinition(connectionPointEntry.getKey()); + + Optional sourceResourceId = + getConnectionResourceUsingGetResourceFunc(connectionPointEntry, paramName, paramValue, + supportedSourceNodeTypes); + if (sourceResourceId.isPresent()) { + Resource sourceResource = HeatToToscaUtil + .getResource(translateTo.getHeatOrchestrationTemplate(), sourceResourceId.get(), + translateTo.getHeatFileName()); + Optional 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(LOG_UNSUPPORTED_CAPABILITY_CONNECTION, sourceResource.getType(), + connectionPointEntry.getKey(), + connectionPointEntry.getValue().getType()); + } + } else { + Optional 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); + } + } } - } } 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 index ff6521c4fe..729578ef60 100644 --- 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 @@ -1,32 +1,22 @@ -/*- - * ============LICENSE_START======================================================= - * SDC - * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ +/* + * Copyright © 2016-2018 European Support Limited + * * 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.onap.sdc.tosca.datatypes.model.NodeTemplate; -import org.onap.sdc.tosca.datatypes.model.NodeType; -import org.onap.sdc.tosca.datatypes.model.RequirementDefinition; -import org.onap.sdc.tosca.datatypes.model.ServiceTemplate; -import org.openecomp.sdc.tosca.services.DataModelUtil; -import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo; +import static org.openecomp.sdc.translator.services.heattotosca.HeatToToscaLogConstants.LOG_NESTED_RESOURCE_PROPERTY_NOT_DEFINED; import java.util.ArrayList; import java.util.HashMap; @@ -35,104 +25,111 @@ import java.util.Map; import java.util.Optional; import java.util.function.Predicate; -public abstract class ResourceConnectionUsingRequirementHelper - extends BaseResourceConnection { - public ResourceConnectionUsingRequirementHelper(ResourceTranslationBase resourceTranslationBase, - TranslateTo translateTo, FileData nestedFileData, - NodeTemplate substitutionNodeTemplate, - NodeType nodeType) { - super(resourceTranslationBase, translateTo, nestedFileData, substitutionNodeTemplate, nodeType); - } +import org.onap.sdc.tosca.datatypes.model.NodeTemplate; +import org.onap.sdc.tosca.datatypes.model.NodeType; +import org.onap.sdc.tosca.datatypes.model.RequirementDefinition; +import org.onap.sdc.tosca.datatypes.model.ServiceTemplate; +import org.openecomp.sdc.heat.datatypes.manifest.FileData; +import org.openecomp.sdc.tosca.services.DataModelUtil; +import org.openecomp.sdc.tosca.services.ToscaConstants; +import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo; - @Override - String getMappedNodeTranslatedResourceId(ServiceTemplate nestedServiceTemplate, - Map.Entry connectionPointEntry) { - List substitutionMapping = - nestedServiceTemplate.getTopology_template().getSubstitution_mappings().getRequirements() - .get(connectionPointEntry.getKey()); - return substitutionMapping.get(0); - } +abstract class ResourceConnectionUsingRequirementHelper extends BaseResourceConnection { + ResourceConnectionUsingRequirementHelper(ResourceTranslationBase resourceTranslationBase, + TranslateTo translateTo, FileData nestedFileData, + NodeTemplate substitutionNodeTemplate, + NodeType nodeType) { + super(resourceTranslationBase, translateTo, nestedFileData, substitutionNodeTemplate, nodeType); + } - @Override - Map.Entry getMappedConnectionPointEntry( - ServiceTemplate nestedServiceTemplate, - Map.Entry connectionPointEntry) { - List 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 = - DataModelUtil.getRequirementDefinition(substituteNodeType, mappedReqId); - return new Map.Entry() { - @Override - public String getKey() { - return mappedReqId; - } + @Override + String getMappedNodeTranslatedResourceId(ServiceTemplate nestedServiceTemplate, + Map.Entry connectionPointEntry) { + List substitutionMapping = + nestedServiceTemplate.getTopology_template().getSubstitution_mappings().getRequirements() + .get(connectionPointEntry.getKey()); + return substitutionMapping.get(0); + } - @Override - public RequirementDefinition getValue() { - return requirementDefinition.get(); - } + @Override + Map.Entry getMappedConnectionPointEntry( + ServiceTemplate nestedServiceTemplate, + Map.Entry connectionPointEntry) { + List 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 = + DataModelUtil.getRequirementDefinition(substituteNodeType, mappedReqId); + return new Map.Entry() { + @Override + public String getKey() { + return mappedReqId; + } - @Override - public RequirementDefinition setValue(RequirementDefinition value) { - return null; - } - }; - } + @Override + public RequirementDefinition getValue() { + return requirementDefinition.orElse(null); + } - @Override - List> getAllConnectionPoints() { - List> exposedRequirementsList = new ArrayList<>(); - List> predicates = getPredicatesListForConnectionPoints(); - List> requirements = this.nodeType.getRequirements(); - if (requirements == null) { - return exposedRequirementsList; + @Override + public RequirementDefinition setValue(RequirementDefinition value) { + return null; + } + }; } - requirements.stream() - .map(Map::entrySet) - .forEach(x -> x.stream() - .filter(entry -> predicates - .stream() - .anyMatch(p -> p.test(entry.getValue()))) - .forEach(entry -> { - Map exposedRequirementsMap = new HashMap<>(); - exposedRequirementsMap.put(entry.getKey(), entry.getValue()); - exposedRequirementsList.add(exposedRequirementsMap); - })); - return exposedRequirementsList; - } - void addRequirementToConnectResource( - Map.Entry requirementDefinitionEntry, String paramName, - Object paramValue, List supportedNetworkTypes) { - 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; + @Override + List> getAllConnectionPoints() { + List> exposedRequirementsList = new ArrayList<>(); + List> predicates = getPredicatesListForConnectionPoints(); + List> 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 exposedRequirementsMap = new HashMap<>(); + exposedRequirementsMap.put(entry.getKey(), entry.getValue()); + exposedRequirementsList.add(exposedRequirementsMap); + })); + return exposedRequirementsList; } - Optional 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)); + + void addRequirementToConnectResource( + Map.Entry requirementDefinitionEntry, String paramName, + Object paramValue, List supportedNetworkTypes) { + if (paramValue == null) { + logger.warn(LOG_NESTED_RESOURCE_PROPERTY_NOT_DEFINED, paramName, translateTo.getResourceId(), + requirementDefinitionEntry.getKey(), ToscaConstants.REQUIREMENT); + return; + } + Optional 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)); + } } - } } 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 index f93d3714ca..a19075f050 100644 --- 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 @@ -16,15 +16,26 @@ package org.openecomp.sdc.translator.services.heattotosca.impl.resourcetranslation; +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.Set; +import java.util.function.Predicate; +import java.util.stream.Collectors; + import org.apache.commons.collections4.CollectionUtils; +import org.onap.sdc.tosca.datatypes.model.RequirementAssignment; +import org.onap.sdc.tosca.datatypes.model.ServiceTemplate; import org.openecomp.sdc.common.errors.CoreException; import org.openecomp.sdc.heat.datatypes.model.HeatOrchestrationTemplate; 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.ToscaTopologyTemplateElements; -import org.onap.sdc.tosca.datatypes.model.RequirementAssignment; -import org.onap.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; @@ -38,303 +49,285 @@ import org.openecomp.sdc.translator.services.heattotosca.errors.ResourceNotFound 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.Set; -import java.util.function.Predicate; -import java.util.stream.Collectors; - public abstract class ResourceTranslationBase { - protected static Logger logger = LoggerFactory.getLogger(ResourceTranslationBase.class); - 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 translateResource(String heatFileName, ServiceTemplate serviceTemplate, - HeatOrchestrationTemplate heatOrchestrationTemplate, - Resource resource, String resourceId, - TranslationContext context) { - Optional translatedId = - getResourceTranslatedId(heatFileName, heatOrchestrationTemplate, resourceId, context); - context.getTranslatedResources().putIfAbsent(heatFileName, new HashSet<>()); - - if (isResourceWithSameIdAppearsInOtherFiles(heatFileName, resourceId, context)) { - throw new CoreException( - new DuplicateResourceIdsInDifferentFilesErrorBuilder(resourceId).build()); - } - if (context.getTranslatedResources().get(heatFileName).contains(resourceId)) { - return translatedId; + protected static Logger logger = LoggerFactory.getLogger(ResourceTranslationBase.class); + + /** + * 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 getResourceTranslatedId(String heatFileName, + HeatOrchestrationTemplate + heatOrchestrationTemplate, + String resourceId, + TranslationContext context) { + if (!context.getTranslatedIds().containsKey(heatFileName)) { + context.getTranslatedIds().put(heatFileName, new HashMap<>()); + } + + Map 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()); + } + return getTranslatedResourceId(resourceId, heatFileName, resource, heatOrchestrationTemplate, + context + ); } - if (!translatedId.isPresent()) { - return Optional.empty(); + + private static Optional getTranslatedResourceId(String resourceId, + String heatFileName, + Resource resource, + HeatOrchestrationTemplate heatOrchestrationTemplate, + TranslationContext context) { + TranslateTo translateTo = + generateTranslationTo(heatFileName, heatOrchestrationTemplate, resource, resourceId, + context); + + String translatedId = + ResourceTranslationFactory.getInstance(resource).generateTranslatedId(translateTo); + + if (ConsolidationDataUtil.isNodeTemplatePointsToServiceTemplateWithoutNodeTemplates(translatedId, + heatFileName, context)) { + return Optional.empty(); + } + + if (translatedId != null) { + context.getTranslatedIds().get(heatFileName).put(resourceId, translatedId); + } + + return Optional.ofNullable(translatedId); } - logger.debug("Translate- file: {} resource Id: {} translated resource id: {}", - heatFileName, resourceId, 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); + + private static Optional getResourceTranslatedElementTemplate(String heatFileName, + HeatOrchestrationTemplate heatOrchestrationTemplate, + String resourceId, TranslationContext context) { + Resource resource = heatOrchestrationTemplate.getResources().get(resourceId); + if (resource == null) { + throw new CoreException( + new ResourceNotFoundInHeatFileErrorBuilder(resourceId, heatFileName).build()); + } + TranslateTo translateTo = + generateTranslationTo(heatFileName, heatOrchestrationTemplate, resource, resourceId, + context); + + return ResourceTranslationFactory.getInstance(resource) + .getTranslatedToscaTopologyElement(translateTo); } - return translatedId; - } - - private boolean isResourceWithSameIdAppearsInOtherFiles(String heatFileName, - String resourceId, - TranslationContext context) { - Set translatedResourceIdsFromOtherFiles = - context.getTranslatedResourceIdsFromOtherFiles(heatFileName); - - return CollectionUtils.isNotEmpty(translatedResourceIdsFromOtherFiles) - && translatedResourceIdsFromOtherFiles.contains(resourceId); - } - - /** - * 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 getResourceTranslatedId(String heatFileName, - HeatOrchestrationTemplate + + private static TranslateTo generateTranslationTo(String heatFileName, + HeatOrchestrationTemplate heatOrchestrationTemplate, - String resourceId, - TranslationContext context) { - if (!context.getTranslatedIds().containsKey(heatFileName)) { - context.getTranslatedIds().put(heatFileName, new HashMap<>()); + Resource resource, String resourceId, + TranslationContext context) { + TranslateTo to = new TranslateTo(); + to.setHeatFileName(heatFileName); + to.setServiceTemplate(null); + to.setHeatOrchestrationTemplate(heatOrchestrationTemplate); + to.setResource(resource); + to.setResourceId(resourceId); + to.setTranslatedId(null); + to.setContext(context); + return to; } - Map translatedIdsPerFile = context.getTranslatedIds().get(heatFileName); - String translatedId = translatedIdsPerFile.get(resourceId); - if (translatedId != null) { - return Optional.of(translatedId); + 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 translateResource(String heatFileName, ServiceTemplate serviceTemplate, + HeatOrchestrationTemplate heatOrchestrationTemplate, + Resource resource, String resourceId, + TranslationContext context) { + Optional translatedId = + getResourceTranslatedId(heatFileName, heatOrchestrationTemplate, resourceId, context); + context.getTranslatedResources().putIfAbsent(heatFileName, new HashSet<>()); + + if (isResourceWithSameIdAppearsInOtherFiles(heatFileName, resourceId, context)) { + throw new CoreException( + new DuplicateResourceIdsInDifferentFilesErrorBuilder(resourceId).build()); + } + if (context.getTranslatedResources().get(heatFileName).contains(resourceId)) { + return translatedId; + } + if (!translatedId.isPresent()) { + return Optional.empty(); + } + logger.debug("Translate- file: {} resource Id: {} translated resource id: {}", + heatFileName, resourceId, 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); + } + return translatedId; } - Resource resource = heatOrchestrationTemplate.getResources().get(resourceId); - if (resource == null) { - throw new CoreException( - new ResourceNotFoundInHeatFileErrorBuilder(resourceId, heatFileName).build()); - } - return getTranslatedResourceId(resourceId, heatFileName, resource, heatOrchestrationTemplate, - context - ); - } - - private static Optional getTranslatedResourceId(String resourceId, - String heatFileName, - Resource resource, - HeatOrchestrationTemplate heatOrchestrationTemplate, - TranslationContext context) { - TranslateTo translateTo = - generateTranslationTo(heatFileName, null, heatOrchestrationTemplate, resource, resourceId, - null, context); - - String translatedId = - ResourceTranslationFactory.getInstance(resource).generateTranslatedId(translateTo); - - if (ConsolidationDataUtil.isNodeTemplatePointsToServiceTemplateWithoutNodeTemplates - (translatedId, heatFileName, context)) { - return Optional.empty(); - } + private boolean isResourceWithSameIdAppearsInOtherFiles(String heatFileName, + String resourceId, + TranslationContext context) { + Set translatedResourceIdsFromOtherFiles = + context.getTranslatedResourceIdsFromOtherFiles(heatFileName); - if (translatedId != null) { - context.getTranslatedIds().get(heatFileName).put(resourceId, translatedId); + return CollectionUtils.isNotEmpty(translatedResourceIdsFromOtherFiles) + && translatedResourceIdsFromOtherFiles.contains(resourceId); } - 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 getResourceTranslatedElementTemplate( - String heatFileName, - HeatOrchestrationTemplate heatOrchestrationTemplate, - String resourceId, TranslationContext context) { - 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); - - return ResourceTranslationFactory.getInstance(resource) - .getTranslatedToscaTopologyElement(translateTo); - } - - protected String generateTranslatedId(TranslateTo translateTo) { - if (isEssentialRequirementsValid(translateTo)) { - return translateTo.getResourceId(); - } else { - return null; + protected String generateTranslatedId(TranslateTo translateTo) { + if (isEssentialRequirementsValid(translateTo)) { + return translateTo.getResourceId(); + } else { + return null; + } + } - } + protected Optional getTranslatedToscaTopologyElement( + TranslateTo translateTo) { + if (isEssentialRequirementsValid(translateTo)) { + return Optional.of(ToscaTopologyTemplateElements.NODE_TEMPLATE); + } else { + return Optional.empty(); + } + } - protected Optional getTranslatedToscaTopologyElement( - TranslateTo translateTo) { - if (isEssentialRequirementsValid(translateTo)) { - return Optional.of(ToscaTopologyTemplateElements.NODE_TEMPLATE); - } else { - return Optional.empty(); + protected boolean isEssentialRequirementsValid(TranslateTo translateTo) { + return true; } - } - - 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) { - - Resource resource = translateTo.getResource(); - if (resource.getDepends_on() == null) { - return; + + private void updateResourceDependency(TranslateTo translateTo) { + + Resource resource = translateTo.getResource(); + if (resource.getDepends_on() == null) { + return; + } + + if (resource.getDepends_on() instanceof List) { + List dependsOnList = (List) resource.getDepends_on(); + for (String dependsOnResourceId : dependsOnList) { + addDependency(dependsOnResourceId, translateTo); + } + } else { + String dependsOnResourceId = (String) resource.getDepends_on(); + addDependency(dependsOnResourceId, translateTo); + } } - if (resource.getDepends_on() instanceof List) { - List dependsOnList = (List) resource.getDepends_on(); - for (String dependsOnResourceId : dependsOnList) { - addDependOnRequirement(dependsOnResourceId, translateTo); - } - } else { - String dependsOnResourceId = (String) resource.getDepends_on(); - addDependOnRequirement(dependsOnResourceId, translateTo); + private void addDependency(String dependsOnResourceId, TranslateTo translateTo) { + String heatFileName = translateTo.getHeatFileName(); + HeatOrchestrationTemplate heatOrchestrationTemplate = translateTo + .getHeatOrchestrationTemplate(); + TranslationContext context = translateTo.getContext(); + + Optional resourceTranslatedId = + getResourceTranslatedId(heatFileName, heatOrchestrationTemplate, dependsOnResourceId, + context); + + Optional 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 (isValidDependency(sourceResource, targetResource, translateTo)) { + addDependsOnRequirement(dependsOnResourceId, translateTo, resourceTranslatedId.get(), sourceResource, + targetResource); + } + } } - } - - private void addDependOnRequirement(String dependsOnResourceId, TranslateTo translateTo) { - 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 resourceTranslatedId = - getResourceTranslatedId(heatFileName, heatOrchestrationTemplate, dependsOnResourceId, - context); - - Optional 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 (isValidDependency(sourceResource, targetResource, translateTo)) { - requirementAssignment.setNode(resourceTranslatedId.get()); + + private void addDependsOnRequirement(String dependsOnResourceId, TranslateTo translateTo, + String resourceTranslatedId, Resource sourceResource, + Resource targetResource) { + RequirementAssignment requirementAssignment = new RequirementAssignment(); + requirementAssignment.setNode(resourceTranslatedId); 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); + DataModelUtil.addRequirementAssignment(translateTo.getServiceTemplate().getTopology_template() + .getNode_templates().get(translateTo.getTranslatedId()), + ToscaConstants.DEPENDS_ON_REQUIREMENT_ID, requirementAssignment); ConsolidationDataUtil - .updateNodesConnectedData(translateTo, dependsOnResourceId, targetResource, - sourceResource, nodeTemplateId, ToscaConstants.DEPENDS_ON_REQUIREMENT_ID, - requirementAssignment); - } + .updateNodesConnectedData(translateTo, dependsOnResourceId, targetResource, + sourceResource, translateTo.getTranslatedId(), ToscaConstants.DEPENDS_ON_REQUIREMENT_ID, + requirementAssignment); + } + + private boolean isValidDependency(Resource sourceResource, Resource targetResource, TranslateTo translateTo) { + return !(HeatToToscaUtil.isNestedResource(sourceResource) || HeatToToscaUtil.isNestedResource(targetResource)) + && HeatToToscaUtil.isValidDependsOnCandidate(sourceResource, targetResource, + ConsolidationEntityType.OTHER, translateTo.getContext()); + } + + Optional>> getResourceByTranslatedResourceId( + String heatFileName, + HeatOrchestrationTemplate heatOrchestrationTemplate, + String translatedResourceId, + TranslateTo translateTo, + String heatResourceType) { + List> 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)) { + return Optional.empty(); + } else { + return Optional.of(list); + } } - } - - private boolean isValidDependency(Resource sourceResource, Resource targetResource, TranslateTo translateTo) { - return !(HeatToToscaUtil.isNestedResource(sourceResource) || HeatToToscaUtil.isNestedResource(targetResource)) - && HeatToToscaUtil.isValidDependsOnCandidate(sourceResource, targetResource, - ConsolidationEntityType.OTHER, translateTo.getContext()); - } - - Optional>> getResourceByTranslatedResourceId( - String heatFileName, - HeatOrchestrationTemplate heatOrchestrationTemplate, - String translatedResourceId, - TranslateTo translateTo, - String heatResourceType) { - List> 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)) { - return Optional.empty(); - } else { - return Optional.of(list); + + private List>> getPredicatesForTranslatedIdToResourceId( + String heatFileName, HeatOrchestrationTemplate heatOrchestrationTemplate, + String translatedResourceId, TranslationContext context, String heatResourceType) { + List>> list = new ArrayList<>(); + list.add(entry -> + entry.getValue().getType().equals(heatResourceType)); + list.add(entry -> { + Optional resourceTranslatedId = + getResourceTranslatedId(heatFileName, heatOrchestrationTemplate, entry.getKey(), context); + return resourceTranslatedId.isPresent() + && resourceTranslatedId.get().equals(translatedResourceId); + }); + return list; + } + + boolean isUnsupportedResourceType(Resource resource, List supportedTypes) { + return !Objects.nonNull(resource) || !supportedTypes.contains(resource.getType()); } - } - - private List>> getPredicatesForTranslatedIdToResourceId( - String heatFileName, HeatOrchestrationTemplate heatOrchestrationTemplate, - String translatedResourceId, TranslationContext context, String heatResourceType) { - List>> list = new ArrayList<>(); - list.add(entry -> - entry.getValue().getType().equals(heatResourceType)); - list.add(entry -> { - Optional resourceTranslatedId = - getResourceTranslatedId(heatFileName, heatOrchestrationTemplate, entry.getKey(), context); - return resourceTranslatedId.isPresent() - && resourceTranslatedId.get().equals(translatedResourceId); - }); - return list; - } - - boolean isResourceTypeSupported(Resource resource, List 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/resourcetranslation/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 73debf02a8..a2ed9e92f7 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/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 @@ -1,26 +1,32 @@ -/*- - * ============LICENSE_START======================================================= - * SDC - * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ +/* + * Copyright © 2016-2018 European Support Limited + * * 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 static org.openecomp.sdc.translator.services.heattotosca.HeatToToscaLogConstants.LOG_INVALID_INSTANCE_UUID; +import static org.openecomp.sdc.translator.services.heattotosca.HeatToToscaLogConstants.LOG_UNSUPPORTED_VOLUME_ATTACHMENT_MSG; +import static org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil.getResource; + +import java.util.List; +import java.util.Optional; + import org.apache.commons.lang3.StringUtils; +import org.onap.sdc.tosca.datatypes.model.NodeTemplate; +import org.onap.sdc.tosca.datatypes.model.RelationshipTemplate; +import org.onap.sdc.tosca.datatypes.model.RequirementAssignment; import org.openecomp.sdc.common.errors.CoreException; import org.openecomp.sdc.heat.datatypes.manifest.FileData; import org.openecomp.sdc.heat.datatypes.model.HeatResourcesTypes; @@ -28,11 +34,9 @@ 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.ToscaRelationshipType; import org.openecomp.sdc.tosca.datatypes.ToscaTopologyTemplateElements; -import org.onap.sdc.tosca.datatypes.model.NodeTemplate; -import org.onap.sdc.tosca.datatypes.model.RelationshipTemplate; -import org.onap.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; @@ -45,170 +49,170 @@ import org.openecomp.sdc.translator.services.heattotosca.errors.MissingMandatory import org.openecomp.sdc.translator.services.heattotosca.helper.VolumeTranslationHelper; import org.openecomp.sdc.translator.services.heattotosca.mapping.TranslatorHeatToToscaPropertyConverter; -import java.util.List; -import java.util.Optional; +public class ResourceTranslationCinderVolumeAttachmentImpl extends ResourceTranslationBase { -import static org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil.getResource; + protected static Logger logger = LoggerFactory.getLogger(ResourceTranslationCinderVolumeAttachmentImpl.class); + + @Override + protected void translate(TranslateTo translateTo) { + RelationshipTemplate relationTemplate = new RelationshipTemplate(); + relationTemplate.setType(ToscaRelationshipType.CINDER_VOLUME_ATTACHES_TO); + String heatFileName = translateTo.getHeatFileName(); + relationTemplate.setProperties(TranslatorHeatToToscaPropertyConverter + .getToscaPropertiesSimpleConversion(translateTo.getServiceTemplate(), + translateTo.getResourceId(), translateTo.getResource().getProperties(), + relationTemplate.getProperties(), heatFileName, + translateTo.getHeatOrchestrationTemplate(), translateTo.getResource().getType(), + relationTemplate, translateTo.getContext())); + + String volumeIdPropertyName = HeatConstants.VOL_ID_PROPERTY_NAME; + AttachedResourceId attachedVolumeId = getAttachedResourceId(translateTo, volumeIdPropertyName); + String instanceUuid = HeatConstants.INSTANCE_UUID_PROPERTY_NAME; + AttachedResourceId attachedNovaServerId = getAttachedResourceId(translateTo, instanceUuid); + if (attachedNovaServerId.isGetResource()) { + handleNovaGetResource(translateTo, relationTemplate, attachedVolumeId, + (String) attachedNovaServerId.getEntityId()); + } else { + logger.warn(LOG_INVALID_INSTANCE_UUID, translateTo.getResourceId(), translateTo.getResource().getType()); + } + } -public class ResourceTranslationCinderVolumeAttachmentImpl extends ResourceTranslationBase { + @Override + protected Optional getTranslatedToscaTopologyElement(TranslateTo translateTo) { + if (isEssentialRequirementsValid(translateTo)) { + return Optional.of(ToscaTopologyTemplateElements.RELATIONSHIP_TEMPLATE); + } else { + return Optional.empty(); + } + } - private static final String UNSUPPORTED_VOLUME_ATTACHMENT_MSG = - "Volume attachment with id '{}' is pointing to unsupported resource type({}) through the property " + - "'volume_id'. The connection to the volume is ignored. Supported types are: {}"; - - protected static Logger logger = LoggerFactory.getLogger(ResourceTranslationCinderVolumeAttachmentImpl.class); - - @Override - protected void translate(TranslateTo translateTo) { - RelationshipTemplate relationTemplate = new RelationshipTemplate(); - relationTemplate.setType(ToscaRelationshipType.CINDER_VOLUME_ATTACHES_TO); - String relationshipTemplateId = translateTo.getTranslatedId(); - String heatFileName = translateTo.getHeatFileName(); - relationTemplate.setProperties(TranslatorHeatToToscaPropertyConverter - .getToscaPropertiesSimpleConversion(translateTo.getServiceTemplate(),translateTo - .getResourceId(),translateTo.getResource().getProperties(), - relationTemplate.getProperties(), heatFileName, - translateTo.getHeatOrchestrationTemplate(), translateTo.getResource().getType(), - relationTemplate, translateTo.getContext())); - - String volumeIdPropertyName = "volume_id"; - AttachedResourceId attachedVolumeId = getAttachedResourceId(translateTo, volumeIdPropertyName); - String instanceUuid = HeatConstants.INSTANCE_UUID_PROPERTY_NAME; - AttachedResourceId attachedNovaServerId = getAttachedResourceId(translateTo, instanceUuid); - - if (attachedNovaServerId.isGetResource()) { - handleNovaGetResource(translateTo, relationTemplate, relationshipTemplateId, heatFileName, - attachedVolumeId, (String) attachedNovaServerId.getEntityId()); - } else { - logger.warn("Heat resource: '" + translateTo.getResourceId() + "' with type: '" - + translateTo.getResource().getType() - + "' include 'instance_uuid' property without 'get_resource' function, therefore this " - + "resource will be ignored in TOSCA translation."); + private AttachedResourceId getAttachedResourceId(TranslateTo translateTo, String propertyName) { + Optional attachedResourceId = HeatToToscaUtil.extractAttachedResourceId(translateTo, + propertyName); + if (!attachedResourceId.isPresent()) { + throw new CoreException(new MissingMandatoryPropertyErrorBuilder(propertyName).build()); + } + return attachedResourceId.get(); + } + + private void handleNovaGetResource(TranslateTo translateTo, RelationshipTemplate relationTemplate, + AttachedResourceId volResourceId, String novaResourceId) { + RequirementAssignment requirement = new RequirementAssignment(); + String toscaCapabilityAttachment = ToscaCapabilityType.NATIVE_ATTACHMENT; + requirement.setCapability(toscaCapabilityAttachment); + if (volResourceId.isGetResource()) { + createVolumeNovaRelationshipForVolGetResource(translateTo, relationTemplate, volResourceId, requirement); + } else if (volResourceId.isGetParam() && volResourceId.getEntityId() instanceof String) { + createVolumeNovaRelationshipForVolGetParam(translateTo, relationTemplate, volResourceId, requirement); + } + translateNovaServerResource(translateTo, novaResourceId, requirement); } - } - - @Override - protected Optional getTranslatedToscaTopologyElement( - TranslateTo translateTo) { - if (isEssentialRequirementsValid(translateTo)) { - return Optional.of(ToscaTopologyTemplateElements.RELATIONSHIP_TEMPLATE); - } else { - return Optional.empty(); + + private void translateNovaServerResource(TranslateTo translateTo, String novaResourceId, + RequirementAssignment requirement) { + Resource novaServerResource = + getResource(translateTo.getHeatOrchestrationTemplate(), novaResourceId, translateTo.getHeatFileName()); + if (!StringUtils.equals(HeatResourcesTypes.NOVA_SERVER_RESOURCE_TYPE.getHeatResource(), + novaServerResource.getType())) { + logger.warn(LOG_UNSUPPORTED_VOLUME_ATTACHMENT_MSG, translateTo.getResourceId(), + novaServerResource.getType(), HeatResourcesTypes.NOVA_SERVER_RESOURCE_TYPE.getHeatResource()); + return; + } + Optional translatedNovaServerId = ResourceTranslationFactory.getInstance(novaServerResource) + .translateResource(translateTo.getHeatFileName(), translateTo.getServiceTemplate(), + translateTo.getHeatOrchestrationTemplate(), novaServerResource, novaResourceId, + translateTo.getContext()); + + if (translatedNovaServerId.isPresent() && StringUtils.isNotEmpty(requirement.getNode())) { + NodeTemplate novaServerNodeTemplate = DataModelUtil + .getNodeTemplate(translateTo.getServiceTemplate(), translatedNovaServerId.get()); + 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); + } } - } - private AttachedResourceId getAttachedResourceId(TranslateTo translateTo, String propertyName) { - Optional attachedResourceId = - HeatToToscaUtil.extractAttachedResourceId(translateTo, propertyName); - if (!attachedResourceId.isPresent()) { - throw new CoreException(new MissingMandatoryPropertyErrorBuilder(propertyName).build()); + private void createVolumeNovaRelationshipForVolGetParam(TranslateTo translateTo, + RelationshipTemplate relationTemplate, + AttachedResourceId volResourceId, + RequirementAssignment requirement) { + String volumeResourceIdParamName = (String) volResourceId.getEntityId(); + if (translateTo.getContext().getHeatSharedResourcesByParam().containsKey(volumeResourceIdParamName) + && !isHeatFileNested(translateTo, translateTo.getHeatFileName())) { + handleSharedVolume(translateTo, relationTemplate, requirement, volumeResourceIdParamName); + } else { + handleUnsharedVolume(translateTo, relationTemplate, requirement, volumeResourceIdParamName); + } } - return attachedResourceId.get(); - } - - private void handleNovaGetResource(TranslateTo translateTo, RelationshipTemplate relationTemplate, - String relationshipTemplateId, String heatFileName, - AttachedResourceId volResourceId, String novaResourceId) { - RequirementAssignment requirement = new RequirementAssignment(); - String toscaCapabilityAttachment = "tosca.capabilities.Attachment"; - requirement.setCapability(toscaCapabilityAttachment); - if (volResourceId.isGetResource()) { - Resource volServerResource = getResource(translateTo.getHeatOrchestrationTemplate(), - (String) volResourceId.getTranslatedId(), heatFileName); - if (!StringUtils.equals(HeatResourcesTypes.CINDER_VOLUME_RESOURCE_TYPE.getHeatResource(), - volServerResource.getType())) { - logger.warn(UNSUPPORTED_VOLUME_ATTACHMENT_MSG, translateTo.getResourceId(), volServerResource.getType(), - HeatResourcesTypes.CINDER_VOLUME_RESOURCE_TYPE.getHeatResource()); - return; - } - requirement.setNode((String) volResourceId.getTranslatedId()); - requirement.setRelationship(relationshipTemplateId); - DataModelUtil - .addRelationshipTemplate(translateTo.getServiceTemplate(), relationshipTemplateId, - relationTemplate); - } else if (volResourceId.isGetParam() && volResourceId.getEntityId() instanceof String) { - String volumeResourceIdParamName = (String) volResourceId.getEntityId(); - if (translateTo.getContext().getHeatSharedResourcesByParam() - .containsKey(volumeResourceIdParamName) && !isHeatFileNested(translateTo, heatFileName)) { - Resource volServerResource = - translateTo.getContext().getHeatSharedResourcesByParam().get(volumeResourceIdParamName) - .getHeatResource(); + + private void handleSharedVolume(TranslateTo translateTo, RelationshipTemplate relationTemplate, + RequirementAssignment requirement, String volumeResourceIdParamName) { + Resource volServerResource = translateTo.getContext().getHeatSharedResourcesByParam() + .get(volumeResourceIdParamName).getHeatResource(); if (!StringUtils.equals(HeatResourcesTypes.CINDER_VOLUME_RESOURCE_TYPE.getHeatResource(), - volServerResource.getType())) { - logger.warn(UNSUPPORTED_VOLUME_ATTACHMENT_MSG, translateTo.getResourceId(), volServerResource.getType(), - HeatResourcesTypes.CINDER_VOLUME_RESOURCE_TYPE.getHeatResource()); - return; + volServerResource.getType())) { + logger.warn(LOG_UNSUPPORTED_VOLUME_ATTACHMENT_MSG, translateTo.getResourceId(), + volServerResource.getType(), + HeatResourcesTypes.CINDER_VOLUME_RESOURCE_TYPE.getHeatResource()); + return; } - requirement.setNode( - translateTo.getContext().getHeatSharedResourcesByParam().get(volumeResourceIdParamName) - .getTranslatedId()); - requirement.setRelationship(relationshipTemplateId); - DataModelUtil - .addRelationshipTemplate(translateTo.getServiceTemplate(), relationshipTemplateId, + requirement.setNode(translateTo.getContext().getHeatSharedResourcesByParam().get(volumeResourceIdParamName) + .getTranslatedId()); + requirement.setRelationship(translateTo.getTranslatedId()); + DataModelUtil.addRelationshipTemplate(translateTo.getServiceTemplate(), translateTo.getTranslatedId(), + relationTemplate); + } + + private void createVolumeNovaRelationshipForVolGetResource(TranslateTo translateTo, + RelationshipTemplate relationTemplate, + AttachedResourceId volResourceId, + RequirementAssignment requirement) { + Resource volServerResource = getResource(translateTo.getHeatOrchestrationTemplate(), + (String) volResourceId.getTranslatedId(), translateTo.getHeatFileName()); + if (!StringUtils.equals(HeatResourcesTypes.CINDER_VOLUME_RESOURCE_TYPE.getHeatResource(), + volServerResource.getType())) { + logger.warn(LOG_UNSUPPORTED_VOLUME_ATTACHMENT_MSG, translateTo.getResourceId(), volServerResource.getType(), + HeatResourcesTypes.CINDER_VOLUME_RESOURCE_TYPE.getHeatResource()); + return; + } + requirement.setNode((String) volResourceId.getTranslatedId()); + requirement.setRelationship(translateTo.getTranslatedId()); + DataModelUtil.addRelationshipTemplate(translateTo.getServiceTemplate(), translateTo.getTranslatedId(), relationTemplate); - } else { - handleUnsharedVolume(translateTo, relationTemplate, relationshipTemplateId, heatFileName, - requirement, volumeResourceIdParamName); - } } - Resource novaServerResource = - getResource(translateTo.getHeatOrchestrationTemplate(), novaResourceId, heatFileName); - if (!StringUtils.equals(HeatResourcesTypes.NOVA_SERVER_RESOURCE_TYPE.getHeatResource(), - novaServerResource.getType())) { - logger.warn(UNSUPPORTED_VOLUME_ATTACHMENT_MSG,translateTo.getResourceId(), - novaServerResource.getType(), HeatResourcesTypes.NOVA_SERVER_RESOURCE_TYPE.getHeatResource()); - return; + + private void handleUnsharedVolume(TranslateTo translateTo, RelationshipTemplate relationTemplate, + RequirementAssignment requirement, String volumeResourceId) { + List allFilesData = translateTo.getContext().getManifest().getContent().getData(); + Optional fileData = HeatToToscaUtil.getFileData(translateTo.getHeatFileName(), allFilesData); + if (fileData.isPresent()) { + Optional fileDataContainingResource = + new VolumeTranslationHelper(logger) + .getFileDataContainingVolume(fileData.get().getData(), volumeResourceId, translateTo, + FileData.Type.HEAT_VOL); + fileDataContainingResource.ifPresent(resourceFileDataAndIDs -> addRelationshipToServiceTemplate( + translateTo, relationTemplate, requirement, resourceFileDataAndIDs)); + } } - Optional translatedNovaServerId = - ResourceTranslationFactory.getInstance(novaServerResource) - .translateResource(heatFileName, translateTo.getServiceTemplate(), - translateTo.getHeatOrchestrationTemplate(), novaServerResource, novaResourceId, - translateTo.getContext()); - - if (translatedNovaServerId.isPresent() && StringUtils.isNotEmpty(requirement.getNode())) { - NodeTemplate novaServerNodeTemplate = DataModelUtil - .getNodeTemplate(translateTo.getServiceTemplate(), translatedNovaServerId.get()); - 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); + + private boolean isHeatFileNested(TranslateTo translateTo, String heatFileName) { + return translateTo.getContext().getNestedHeatsFiles().contains(heatFileName); } - } - - private void handleUnsharedVolume(TranslateTo translateTo, RelationshipTemplate relationTemplate, - String relationshipTemplateId, String heatFileName, - RequirementAssignment requirement, String volumeResourceId) { - List allFilesData = translateTo.getContext().getManifest().getContent().getData(); - Optional fileData = HeatToToscaUtil.getFileData(heatFileName, allFilesData); - if (fileData.isPresent()) { - Optional fileDataContainingResource = - new VolumeTranslationHelper(logger) - .getFileDataContainingVolume(fileData.get().getData(), volumeResourceId, translateTo, - FileData.Type.HEAT_VOL); - fileDataContainingResource.ifPresent( - resourceFileDataAndIDs -> addRelationshipToServiceTemplate(translateTo, relationTemplate, - relationshipTemplateId, requirement, resourceFileDataAndIDs)); + + private void addRelationshipToServiceTemplate(TranslateTo translateTo, + RelationshipTemplate relationTemplate, + RequirementAssignment requirement, + ResourceFileDataAndIDs resourceFileDataAndIDs) { + String translatedId = resourceFileDataAndIDs.getTranslatedResourceId(); + String toscaVolIdPropName = + HeatToToscaUtil.getToscaPropertyName(translateTo, HeatConstants.VOL_ID_PROPERTY_NAME); + relationTemplate.getProperties().put(toscaVolIdPropName, translatedId); + requirement.setNode(translatedId); + requirement.setRelationship(translateTo.getTranslatedId()); + DataModelUtil.addRelationshipTemplate(translateTo.getServiceTemplate(), translateTo.getTranslatedId(), + relationTemplate); } - } - - private boolean isHeatFileNested(TranslateTo translateTo, String heatFileName) { - return translateTo.getContext().getNestedHeatsFiles().contains(heatFileName); - } - - private void addRelationshipToServiceTemplate(TranslateTo translateTo, - RelationshipTemplate relationTemplate, - String relationshipTemplateId, - RequirementAssignment requirement, - ResourceFileDataAndIDs resourceFileDataAndIDs) { - String translatedId = resourceFileDataAndIDs.getTranslatedResourceId(); - 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); - } } 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/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 5b36d39ec0..fd6f28cec9 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/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 @@ -1,76 +1,71 @@ -/*- - * ============LICENSE_START======================================================= - * SDC - * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ +/* + * Copyright © 2016-2018 European Support Limited + * * 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 java.util.Map; + +import org.onap.sdc.tosca.datatypes.model.NodeTemplate; import org.openecomp.sdc.heat.datatypes.HeatBoolean; import org.openecomp.sdc.heat.services.HeatConstants; import org.openecomp.sdc.tosca.datatypes.ToscaNodeType; -import org.onap.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.Map; - public class ResourceTranslationCinderVolumeImpl extends ResourceTranslationBase { - @Override - public void translate(TranslateTo translateTo) { - NodeTemplate nodeTemplate = new NodeTemplate(); - nodeTemplate.setType(ToscaNodeType.CINDER_VOLUME); - nodeTemplate.setProperties(TranslatorHeatToToscaPropertyConverter - .getToscaPropertiesSimpleConversion(translateTo.getServiceTemplate(),translateTo. - getResourceId(),translateTo.getResource().getProperties(), - nodeTemplate.getProperties(), translateTo.getHeatFileName(), - translateTo.getHeatOrchestrationTemplate(), translateTo.getResource().getType(), - nodeTemplate, translateTo.getContext())); - handleSizeProperty(nodeTemplate.getProperties()); - 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); - } - + private static final String VOLUME_SIZE_PROPERTY_NAME = "size"; - private void handleSizeProperty(Map nodeTemplateProperties) { - Object size = nodeTemplateProperties.get("size"); - if (size == null) { - return; + @Override + public void translate(TranslateTo translateTo) { + NodeTemplate nodeTemplate = new NodeTemplate(); + nodeTemplate.setType(ToscaNodeType.CINDER_VOLUME); + nodeTemplate.setProperties(TranslatorHeatToToscaPropertyConverter + .getToscaPropertiesSimpleConversion(translateTo.getServiceTemplate(), + translateTo.getResourceId(), translateTo.getResource().getProperties(), + nodeTemplate.getProperties(), translateTo.getHeatFileName(), + translateTo.getHeatOrchestrationTemplate(), translateTo.getResource().getType(), + nodeTemplate, translateTo.getContext())); + handleSizeProperty(nodeTemplate.getProperties()); + 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); } - if (size instanceof Map) { - Map propMap = (Map) size; - for (Map.Entry entry : propMap.entrySet()) { - String val = "(" + entry.getKey() + " : " + entry.getValue() + ") * 1024"; - nodeTemplateProperties.put("size", val); - return; - } - } else { - nodeTemplateProperties.put("size", size + "*1024"); + + private void handleSizeProperty(Map nodeTemplateProperties) { + Object size = nodeTemplateProperties.get(VOLUME_SIZE_PROPERTY_NAME); + if (size == null) { + return; + } + if (size instanceof Map) { + Map propMap = (Map) size; + Map.Entry entry = propMap.entrySet().iterator().next(); + String val = "(" + entry.getKey() + " : " + entry.getValue() + ") * 1024"; + nodeTemplateProperties.put(VOLUME_SIZE_PROPERTY_NAME, val); + } else { + nodeTemplateProperties.put(VOLUME_SIZE_PROPERTY_NAME, size + "*1024"); + } } - } } 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/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 6f223e6937..75b2394f6c 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/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 @@ -25,8 +25,9 @@ import static org.openecomp.sdc.translator.services.heattotosca.HeatToToscaLogCo import static org.openecomp.sdc.translator.services.heattotosca.HeatToToscaLogConstants.LOG_SERVICE_TEMPLATE_PROPERTY_UNSUPPORTED_RESOURCE; import static org.openecomp.sdc.translator.services.heattotosca.HeatToToscaLogConstants.LOG_UNSUPPORTED_NETWORK_RESOURCE_CONNECTION; +import com.google.common.collect.ImmutableList; + import java.util.ArrayList; -import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -320,9 +321,9 @@ public class ResourceTranslationContrailServiceInstanceImpl extends ResourceTran private void connectPortToNetwork(TranslateTo translateTo, Object interfacePropertyValue, NodeTemplate substitutedNodeTemplate, String portReqMappingKey) { - List validNetworksForConnections = Arrays - .asList(HeatResourcesTypes.NEUTRON_NET_RESOURCE_TYPE.getHeatResource(), - HeatResourcesTypes.CONTRAIL_VIRTUAL_NETWORK_RESOURCE_TYPE.getHeatResource()); + List validNetworksForConnections = ImmutableList.of( + HeatResourcesTypes.NEUTRON_NET_RESOURCE_TYPE.getHeatResource(), + HeatResourcesTypes.CONTRAIL_VIRTUAL_NETWORK_RESOURCE_TYPE.getHeatResource()); if (!(interfacePropertyValue instanceof Map)) { return; } 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/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 3e3983ff88..d3faefd627 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/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 @@ -17,6 +17,7 @@ package org.openecomp.sdc.translator.services.heattotosca.impl.resourcetranslation; import static org.openecomp.sdc.translator.services.heattotosca.Constants.SECURITY_GROUPS_PROPERTY_NAME; +import static org.openecomp.sdc.translator.services.heattotosca.HeatToToscaLogConstants.LOG_UNSUPPORTED_RESOURCE_REQUIREMENT_CONNECTION; import com.google.common.collect.ImmutableList; @@ -224,10 +225,9 @@ public class ResourceTranslationNeutronPortImpl extends ResourceTranslationBase List supportedTypes, Resource heatResource, final String propertyName) { - if (!isResourceTypeSupported(heatResource, supportedTypes)) { + if (isUnsupportedResourceType(heatResource, supportedTypes)) { String supportedResourceTypes = supportedTypes.toString(); - logger.warn("'{}' property of port resource('{}') is pointing to a resource of type '{}' which is not " - + "supported for this requirement. Supported types are: {}", propertyName, translateTo + logger.warn(LOG_UNSUPPORTED_RESOURCE_REQUIREMENT_CONNECTION, propertyName, translateTo .getResourceId(), heatResource.getType(), supportedResourceTypes); 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/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 index 46219b3079..7573374b65 100644 --- 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 @@ -16,6 +16,8 @@ package org.openecomp.sdc.translator.services.heattotosca.impl.resourcetranslation; +import static org.openecomp.sdc.translator.services.heattotosca.HeatToToscaLogConstants.LOG_UNSUPPORTED_SECURITY_RULE_PORT_CAPABILITY_CONNECTION; + import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -120,10 +122,8 @@ class SecurityRulesToPortResourceConnection extends ResourceConnectionUsingCapab List supportedTypes) { - if (!resourceTranslationBase.isResourceTypeSupported(connectedResource, supportedTypes)) { - logger.warn("Nested resource '{}' property '{}' is pointing to resource with type '{}' which is not " - + "supported for capability '{}' connection, (security rules to port connection)." - + "Supported types are: '{}', therefore, this TOSCA capability will not be connected.", + if (resourceTranslationBase.isUnsupportedResourceType(connectedResource, supportedTypes)) { + logger.warn(LOG_UNSUPPORTED_SECURITY_RULE_PORT_CAPABILITY_CONNECTION, nestedResourceId, nestedPropertyName, connectedResource.getType(), connectionPointId, supportedTypes.toString()); diff --git a/openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/services/DataModelUtil.java b/openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/services/DataModelUtil.java index 69231d5c51..a8629aa287 100644 --- a/openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/services/DataModelUtil.java +++ b/openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/services/DataModelUtil.java @@ -1190,7 +1190,8 @@ public class DataModelUtil { SubstitutionMapping substitutionMapping = new SubstitutionMapping(); substitutionMapping.setNode_type(nodeTypeKey); substitutionMapping.setCapabilities( - manageCapabilityMapping(substitutionNodeType.getCapabilities(), mapping.get("capability"))); + manageCapabilityMapping(substitutionNodeType.getCapabilities(), mapping.get(ToscaConstants + .CAPABILITY))); substitutionMapping.setRequirements( manageRequirementMapping(substitutionNodeType.getRequirements(), mapping.get("requirement"))); diff --git a/openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/services/ToscaConstants.java b/openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/services/ToscaConstants.java index 47e2c9a2e1..4ce2535401 100644 --- a/openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/services/ToscaConstants.java +++ b/openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/services/ToscaConstants.java @@ -65,6 +65,8 @@ public class ToscaConstants { static final String ST_METADATA_FILE_NAME = "filename"; public static final String MANDATORY_PROPERTY_NAME = "mandatory"; public static final String HEAT_NODE_TYPE_SUFFIX = "heat."; + public static final String CAPABILITY = "capability"; + public static final String REQUIREMENT = "requirement"; private ToscaConstants() { //Hiding the implicit public constructor -- cgit 1.2.3-korg