2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
21 package org.openecomp.sdc.translator.services.heattotosca.impl.resourcetranslation;
23 import org.openecomp.sdc.common.utils.CommonUtil;
24 import org.openecomp.sdc.heat.datatypes.manifest.FileData;
25 import org.openecomp.sdc.heat.datatypes.model.Resource;
26 import org.openecomp.sdc.tosca.datatypes.model.CapabilityDefinition;
27 import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate;
28 import org.openecomp.sdc.tosca.datatypes.model.NodeType;
29 import org.openecomp.sdc.tosca.datatypes.model.RequirementAssignment;
30 import org.openecomp.sdc.tosca.datatypes.model.RequirementDefinition;
31 import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate;
32 import org.openecomp.sdc.tosca.services.DataModelUtil;
33 import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo;
34 import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslatedHeatResource;
35 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.ConsolidationData;
36 import org.openecomp.sdc.translator.services.heattotosca.ConsolidationDataUtil;
37 import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil;
38 import org.openecomp.sdc.translator.services.heattotosca.ResourceTranslationFactory;
40 import java.util.ArrayList;
41 import java.util.HashMap;
42 import java.util.List;
44 import java.util.Optional;
45 import java.util.function.Predicate;
47 public abstract class ResourceConnectionUsingCapabilityHelper
48 extends BaseResourceConnection<CapabilityDefinition> {
49 public ResourceConnectionUsingCapabilityHelper(ResourceTranslationBase resourceTranslationBase,
50 TranslateTo translateTo, FileData nestedFileData,
51 NodeTemplate substitutionNodeTemplate,
53 super(resourceTranslationBase, translateTo, nestedFileData, substitutionNodeTemplate, nodeType);
56 abstract Map.Entry<String, RequirementDefinition> createRequirementDefinition(
57 String capabilityKey);
60 String getMappedNodeTranslatedResourceId(ServiceTemplate nestedServiceTemplate,
62 CapabilityDefinition> connectionPointEntry) {
65 mdcDataDebugMessage.debugEntryMessage(null, null);
67 List<String> substitutionMapping =
68 nestedServiceTemplate.getTopology_template().getSubstitution_mappings().getCapabilities()
69 .get(connectionPointEntry.getKey());
71 mdcDataDebugMessage.debugExitMessage(null, null);
72 return substitutionMapping.get(0);
76 Map.Entry<String, CapabilityDefinition> getMappedConnectionPointEntry(
77 ServiceTemplate nestedServiceTemplate,
78 Map.Entry<String, CapabilityDefinition> connectionPointEntry) {
81 mdcDataDebugMessage.debugEntryMessage(null, null);
83 List<String> substitutionMapping =
84 nestedServiceTemplate.getTopology_template().getSubstitution_mappings().getCapabilities()
85 .get(connectionPointEntry.getKey());
86 String mappedNodeTranslatedId = substitutionMapping.get(0);
87 String mappedCapabilityId = substitutionMapping.get(1);
88 NodeTemplate mappedNodeTemplate =
89 nestedServiceTemplate.getTopology_template().getNode_templates()
90 .get(mappedNodeTranslatedId);
91 NodeType substituteNodeType =
92 translateTo.getContext().getGlobalSubstitutionServiceTemplate().getNode_types()
93 .get(mappedNodeTemplate.getType());
94 Optional<CapabilityDefinition> capabilityDefinition =
95 DataModelUtil.getCapabilityDefinition(substituteNodeType, mappedCapabilityId);
97 mdcDataDebugMessage.debugExitMessage(null, null);
98 return new Map.Entry<String, CapabilityDefinition>() {
100 public String getKey() {
101 return mappedCapabilityId;
105 public CapabilityDefinition getValue() {
106 return capabilityDefinition.get();
110 public CapabilityDefinition setValue(CapabilityDefinition value) {
117 protected List<Map<String, CapabilityDefinition>> getAllConnectionPoints() {
120 mdcDataDebugMessage.debugEntryMessage(null, null);
122 List<Map<String, CapabilityDefinition>> exposedRequirementsList = new ArrayList<>();
123 List<Predicate<CapabilityDefinition>> predicates = getPredicatesListForConnectionPoints();
124 Map<String, CapabilityDefinition> capabilities = this.nodeType.getCapabilities();
125 if (capabilities == null) {
126 return exposedRequirementsList;
128 capabilities.entrySet()
130 .filter(entry -> predicates
132 .anyMatch(p -> p.test(entry.getValue())))
134 Map<String, CapabilityDefinition> exposedRequirementsMap = new HashMap<>();
135 exposedRequirementsMap.put(entry.getKey(), entry.getValue());
136 exposedRequirementsList.add(exposedRequirementsMap);
139 mdcDataDebugMessage.debugExitMessage(null, null);
140 return exposedRequirementsList;
143 void addRequirementToConnectResource(Map.Entry<String, CapabilityDefinition> connectionPointEntry,
144 List<String> supportedSourceNodeTypes, String paramName) {
147 mdcDataDebugMessage.debugEntryMessage(null, null);
149 Object paramValue = translateTo.getResource().getProperties().get(paramName);
150 if (paramValue == null) {
151 logger.warn("'" + paramName + "' property is not define in nested resource '"
152 + translateTo.getResourceId() + "' for the nested heat file, therefore, '"
153 + connectionPointEntry.getKey() + "' TOSCA capability will not be connected.");
154 mdcDataDebugMessage.debugExitMessage(null, null);
158 Map.Entry<String, RequirementDefinition> requirementDefinition =
159 createRequirementDefinition(connectionPointEntry.getKey());
161 Optional<String> sourceResourceId =
162 getConnectionResourceUsingGetResourceFunc(connectionPointEntry, paramName, paramValue,
163 supportedSourceNodeTypes);
164 if (sourceResourceId.isPresent()) {
165 Resource sourceResource = HeatToToscaUtil
166 .getResource(translateTo.getHeatOrchestrationTemplate(), sourceResourceId.get(),
167 translateTo.getHeatFileName());
168 Optional<String> translatedSourceNodeId =
169 ResourceTranslationFactory.getInstance(sourceResource)
170 .translateResource(translateTo.getHeatFileName(), translateTo.getServiceTemplate(),
171 translateTo.getHeatOrchestrationTemplate(), sourceResource,
172 sourceResourceId.get(), translateTo.getContext());
173 if (translatedSourceNodeId.isPresent()) {
174 NodeTemplate sourceNodeTemplate = DataModelUtil
175 .getNodeTemplate(translateTo.getServiceTemplate(), translatedSourceNodeId.get());
176 RequirementAssignment requirementAssignment = createRequirementAssignment(
177 requirementDefinition, translateTo.getTranslatedId(), sourceNodeTemplate);
178 ConsolidationDataUtil.updateNodesConnectedData(translateTo, translateTo.getResourceId(),
179 translateTo.getResource(), sourceResource, translatedSourceNodeId.get(),
180 requirementDefinition.getKey(), requirementAssignment);
183 "'" + sourceResource.getType() + "' connection to '" + connectionPointEntry.getKey()
184 + "' capability of type '" + connectionPointEntry.getValue().getType()
185 + "' is not supported/invalid, therefore this connection will be ignored in the "
186 + "TOSCA translation");
189 Optional<TranslatedHeatResource> sharedSourceTranslatedHeatResource =
190 getConnectionTranslatedHeatResourceUsingGetParamFunc(connectionPointEntry, paramName,
191 supportedSourceNodeTypes);
192 if (sharedSourceTranslatedHeatResource.isPresent()) {
193 NodeTemplate sharedSourceNodeTemplate = DataModelUtil
194 .getNodeTemplate(translateTo.getServiceTemplate(),
195 sharedSourceTranslatedHeatResource.get().getTranslatedId());
196 RequirementAssignment requirementAssignment = createRequirementAssignment(
197 requirementDefinition, translateTo.getTranslatedId(), sharedSourceNodeTemplate);
199 ConsolidationDataUtil.updateNodesConnectedData(translateTo, translateTo.getResourceId(),
200 translateTo.getResource(), sharedSourceTranslatedHeatResource.get().getHeatResource(),
201 sharedSourceTranslatedHeatResource.get().getTranslatedId(),
202 requirementDefinition.getKey(),
203 requirementAssignment);
207 mdcDataDebugMessage.debugExitMessage(null, null);