diff options
Diffstat (limited to 'openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/BaseResourceConnection.java')
-rw-r--r-- | openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/BaseResourceConnection.java | 174 |
1 files changed, 174 insertions, 0 deletions
diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/BaseResourceConnection.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/BaseResourceConnection.java new file mode 100644 index 0000000000..d901ae9c98 --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/BaseResourceConnection.java @@ -0,0 +1,174 @@ +/*- + * ============LICENSE_START======================================================= + * SDC + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.openecomp.sdc.translator.services.heattotosca.impl; + +import org.apache.commons.collections4.MapUtils; +import org.openecomp.core.utilities.yaml.YamlUtil; +import org.openecomp.sdc.common.errors.CoreException; +import org.openecomp.sdc.common.errors.ErrorCategory; +import org.openecomp.sdc.common.errors.ErrorCode; +import org.openecomp.sdc.heat.datatypes.manifest.FileData; +import org.openecomp.sdc.heat.datatypes.model.HeatOrchestrationTemplate; +import org.openecomp.sdc.heat.datatypes.model.Resource; +import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate; +import org.openecomp.sdc.tosca.datatypes.model.NodeType; +import org.openecomp.sdc.tosca.datatypes.model.RequirementAssignment; +import org.openecomp.sdc.tosca.datatypes.model.RequirementDefinition; +import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; +import org.openecomp.sdc.tosca.services.DataModelUtil; +import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo; +import org.openecomp.sdc.translator.services.heattotosca.errors.TranslatorErrorCodes; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.function.Predicate; + +abstract class BaseResourceConnection<T> { + protected static Logger logger = + LoggerFactory.getLogger(ResourceTranslationCinderVolumeAttachmentImpl.class); + protected TranslateTo translateTo; + FileData nestedFileData; + NodeTemplate substitutionNodeTemplate; + NodeType nodeType; + ResourceTranslationBase resourceTranslationBase; + + BaseResourceConnection(ResourceTranslationBase resourceTranslationBase, TranslateTo translateTo, + FileData nestedFileData, NodeTemplate substitutionNodeTemplate, + NodeType nodeType) { + this.translateTo = translateTo; + this.nestedFileData = nestedFileData; + this.substitutionNodeTemplate = substitutionNodeTemplate; + this.nodeType = nodeType; + this.resourceTranslationBase = resourceTranslationBase; + } + + abstract boolean isDesiredNodeTemplateType(NodeTemplate nodeTemplate); + + abstract List<Predicate<T>> getPredicatesListForConnectionPoints(); + + abstract Optional<List<String>> getConnectorParamName(String heatResourceId, + Resource heatResource, + HeatOrchestrationTemplate + nestedHeatOrchestrationTemplate); + + abstract String getDesiredResourceType(); + + abstract String getTranslatedResourceIdFromSubstitutionMapping( + ServiceTemplate nestedServiceTemplate, Map.Entry<String, T> entry); + + abstract void addRequirementToConnectResources(Map.Entry<String, T> entry, + List<String> paramNames); + + abstract List<Map<String, T>> getAllConnectionPoints(); + + void connect() { + ServiceTemplate nestedServiceTemplate = translateTo.getContext().getTranslatedServiceTemplates() + .get(translateTo.getResource().getType()); + List<String> paramNames = null; + HeatOrchestrationTemplate nestedHeatOrchestrationTemplate = new YamlUtil() + .yamlToObject(translateTo.getContext().getFileContent(nestedFileData.getFile()), + HeatOrchestrationTemplate.class); + List<Map<String, T>> exposedConnectionPoints = getAllConnectionPoints(); + for (Map<String, T> connectionPointsMap : exposedConnectionPoints) { + for (Map.Entry<String, T> entry : connectionPointsMap.entrySet()) { + String translatedResourceId = + getTranslatedResourceIdFromSubstitutionMapping(nestedServiceTemplate, entry); + NodeTemplate nodeTemplate = nestedServiceTemplate.getTopology_template().getNode_templates() + .get(translatedResourceId); + if (!isDesiredNodeTemplateType(nodeTemplate)) { + continue; + } + paramNames = createResourcesConnection(translatedResourceId, paramNames, + nestedHeatOrchestrationTemplate, entry); + } + } + } + + private List<String> createResourcesConnection(String translatedResourceId, + List<String> paramNames, + HeatOrchestrationTemplate + nestedHeatOrchestrationTemplate, + Map.Entry<String, T> entry) { + List<String> params = paramNames; + Optional<List<Map.Entry<String, Resource>>> heatResources = + getResourceByTranslatedResourceId(translatedResourceId, nestedHeatOrchestrationTemplate); + if (heatResources.isPresent()) { + params = + addRequirementAndGetConnectorParamsFromResourceProperties(nestedHeatOrchestrationTemplate, + entry, params, heatResources.get()); + } + return params; + } + + private List<String> addRequirementAndGetConnectorParamsFromResourceProperties( + HeatOrchestrationTemplate nestedHeatOrchestrationTemplate, Map.Entry<String, T> entry, + List<String> params, List<Map.Entry<String, Resource>> heatResources) { + Resource heatResource; + for (Map.Entry<String, Resource> resourceEntry : heatResources) { + heatResource = resourceEntry.getValue(); + if (!MapUtils.isEmpty(heatResource.getProperties())) { + Optional<List<String>> connectorParamName = + getConnectorParamName(resourceEntry.getKey(), heatResource, + nestedHeatOrchestrationTemplate); + if (!connectorParamName.isPresent()) { + break; + } else { + params = connectorParamName.get(); + } + } + Objects.requireNonNull(params); + addRequirementToConnectResources(entry, params); + } + return params; + } + + protected Optional<List<Map.Entry<String, Resource>>> getResourceByTranslatedResourceId( + String translatedResourceId, HeatOrchestrationTemplate nestedHeatOrchestrationTemplate) { + Optional<List<Map.Entry<String, Resource>>> resourceByTranslatedResourceId = + resourceTranslationBase.getResourceByTranslatedResourceId(nestedFileData.getFile(), + nestedHeatOrchestrationTemplate, translatedResourceId, translateTo, + getDesiredResourceType()); + if (!resourceByTranslatedResourceId.isPresent()) { + throw new CoreException((new ErrorCode.ErrorCodeBuilder()).withMessage( + "Failed to get original resource from heat for translate resource id '" + + translatedResourceId + "'") + .withId(TranslatorErrorCodes.HEAT_TO_TOSCA_MAPPING_COLLISION) + .withCategory(ErrorCategory.APPLICATION).build()); + } + return resourceByTranslatedResourceId; + } + + void createRequirementAssignment(Map.Entry<String, RequirementDefinition> entry, String node, + NodeTemplate nodeTemplate) { + if (Objects.nonNull(node)) { + RequirementAssignment requirementAssignment; + requirementAssignment = new RequirementAssignment(); + requirementAssignment.setRelationship(entry.getValue().getRelationship()); + requirementAssignment.setCapability(entry.getValue().getCapability()); + requirementAssignment.setNode(node); + DataModelUtil.addRequirementAssignment(nodeTemplate, entry.getKey(), requirementAssignment); + } + } +} |