Add collaboration feature
[sdc.git] / 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 /*-
2  * ============LICENSE_START=======================================================
3  * SDC
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
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
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=========================================================
19  */
20
21 package org.openecomp.sdc.translator.services.heattotosca.impl.resourcetranslation;
22
23 import org.openecomp.sdc.heat.datatypes.manifest.FileData;
24 import org.openecomp.sdc.heat.datatypes.model.Resource;
25 import org.openecomp.sdc.tosca.datatypes.model.CapabilityDefinition;
26 import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate;
27 import org.openecomp.sdc.tosca.datatypes.model.NodeType;
28 import org.openecomp.sdc.tosca.datatypes.model.RequirementAssignment;
29 import org.openecomp.sdc.tosca.datatypes.model.RequirementDefinition;
30 import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate;
31 import org.openecomp.sdc.tosca.services.DataModelUtil;
32 import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo;
33 import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslatedHeatResource;
34 import org.openecomp.sdc.translator.services.heattotosca.ConsolidationDataUtil;
35 import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil;
36 import org.openecomp.sdc.translator.services.heattotosca.ResourceTranslationFactory;
37
38 import java.util.ArrayList;
39 import java.util.HashMap;
40 import java.util.List;
41 import java.util.Map;
42 import java.util.Optional;
43 import java.util.function.Predicate;
44
45 public abstract class ResourceConnectionUsingCapabilityHelper
46     extends BaseResourceConnection<CapabilityDefinition> {
47   public ResourceConnectionUsingCapabilityHelper(ResourceTranslationBase resourceTranslationBase,
48                                                  TranslateTo translateTo, FileData nestedFileData,
49                                                  NodeTemplate substitutionNodeTemplate,
50                                                  NodeType nodeType) {
51     super(resourceTranslationBase, translateTo, nestedFileData, substitutionNodeTemplate, nodeType);
52   }
53
54   abstract Map.Entry<String, RequirementDefinition> createRequirementDefinition(
55       String capabilityKey);
56
57   @Override
58   String getMappedNodeTranslatedResourceId(ServiceTemplate nestedServiceTemplate,
59                                            Map.Entry<String,
60                                                CapabilityDefinition> connectionPointEntry) {
61
62
63     mdcDataDebugMessage.debugEntryMessage(null, null);
64
65     List<String> substitutionMapping =
66         nestedServiceTemplate.getTopology_template().getSubstitution_mappings().getCapabilities()
67             .get(connectionPointEntry.getKey());
68
69     mdcDataDebugMessage.debugExitMessage(null, null);
70     return substitutionMapping.get(0);
71   }
72
73   @Override
74   Map.Entry<String, CapabilityDefinition> getMappedConnectionPointEntry(
75       ServiceTemplate nestedServiceTemplate,
76       Map.Entry<String, CapabilityDefinition> connectionPointEntry) {
77
78
79     mdcDataDebugMessage.debugEntryMessage(null, null);
80
81     List<String> substitutionMapping =
82         nestedServiceTemplate.getTopology_template().getSubstitution_mappings().getCapabilities()
83             .get(connectionPointEntry.getKey());
84     String mappedNodeTranslatedId = substitutionMapping.get(0);
85     String mappedCapabilityId = substitutionMapping.get(1);
86     NodeTemplate mappedNodeTemplate =
87         nestedServiceTemplate.getTopology_template().getNode_templates()
88             .get(mappedNodeTranslatedId);
89     NodeType substituteNodeType =
90         translateTo.getContext().getGlobalSubstitutionServiceTemplate().getNode_types()
91             .get(mappedNodeTemplate.getType());
92     Optional<CapabilityDefinition> capabilityDefinition =
93         DataModelUtil.getCapabilityDefinition(substituteNodeType, mappedCapabilityId);
94
95     mdcDataDebugMessage.debugExitMessage(null, null);
96     return new Map.Entry<String, CapabilityDefinition>() {
97       @Override
98       public String getKey() {
99         return mappedCapabilityId;
100       }
101
102       @Override
103       public CapabilityDefinition getValue() {
104         return capabilityDefinition.get();
105       }
106
107       @Override
108       public CapabilityDefinition setValue(CapabilityDefinition value) {
109         return null;
110       }
111     };
112   }
113
114   @Override
115   protected List<Map<String, CapabilityDefinition>> getAllConnectionPoints() {
116
117
118     mdcDataDebugMessage.debugEntryMessage(null, null);
119
120     List<Map<String, CapabilityDefinition>> exposedRequirementsList = new ArrayList<>();
121     List<Predicate<CapabilityDefinition>> predicates = getPredicatesListForConnectionPoints();
122     Map<String, CapabilityDefinition> capabilities = this.nodeType.getCapabilities();
123     if (capabilities == null) {
124       return exposedRequirementsList;
125     }
126     capabilities.entrySet()
127         .stream()
128         .filter(entry -> predicates
129             .stream()
130             .anyMatch(p -> p.test(entry.getValue())))
131         .forEach(entry -> {
132           Map<String, CapabilityDefinition> exposedRequirementsMap = new HashMap<>();
133           exposedRequirementsMap.put(entry.getKey(), entry.getValue());
134           exposedRequirementsList.add(exposedRequirementsMap);
135         });
136
137     mdcDataDebugMessage.debugExitMessage(null, null);
138     return exposedRequirementsList;
139   }
140
141   void addRequirementToConnectResource(Map.Entry<String, CapabilityDefinition> connectionPointEntry,
142                                        List<String> supportedSourceNodeTypes, String paramName) {
143
144
145     mdcDataDebugMessage.debugEntryMessage(null, null);
146
147     Object paramValue = translateTo.getResource().getProperties().get(paramName);
148     if (paramValue == null) {
149       logger.warn("'" + paramName + "' property is not define in nested resource '"
150           + translateTo.getResourceId() + "' for the nested heat file, therefore, '"
151           + connectionPointEntry.getKey() + "' TOSCA capability will not be connected.");
152       mdcDataDebugMessage.debugExitMessage(null, null);
153       return;
154     }
155
156     Map.Entry<String, RequirementDefinition> requirementDefinition =
157         createRequirementDefinition(connectionPointEntry.getKey());
158
159     Optional<String> sourceResourceId =
160         getConnectionResourceUsingGetResourceFunc(connectionPointEntry, paramName, paramValue,
161             supportedSourceNodeTypes);
162     if (sourceResourceId.isPresent()) {
163       Resource sourceResource = HeatToToscaUtil
164           .getResource(translateTo.getHeatOrchestrationTemplate(), sourceResourceId.get(),
165               translateTo.getHeatFileName());
166       Optional<String> translatedSourceNodeId =
167           ResourceTranslationFactory.getInstance(sourceResource)
168               .translateResource(translateTo.getHeatFileName(), translateTo.getServiceTemplate(),
169                   translateTo.getHeatOrchestrationTemplate(), sourceResource,
170                   sourceResourceId.get(), translateTo.getContext());
171       if (translatedSourceNodeId.isPresent()) {
172         NodeTemplate sourceNodeTemplate = DataModelUtil
173             .getNodeTemplate(translateTo.getServiceTemplate(), translatedSourceNodeId.get());
174         RequirementAssignment requirementAssignment = createRequirementAssignment(
175             requirementDefinition, translateTo.getTranslatedId(), sourceNodeTemplate);
176         ConsolidationDataUtil.updateNodesConnectedData(translateTo, translateTo.getResourceId(),
177             translateTo.getResource(), sourceResource, translatedSourceNodeId.get(),
178             requirementDefinition.getKey(), requirementAssignment);
179       } else {
180         logger.warn(
181             "'" + sourceResource.getType() + "' connection to '" + connectionPointEntry.getKey()
182                 + "' capability of type '" + connectionPointEntry.getValue().getType()
183                 + "' is not supported/invalid, therefore this connection will be ignored in the "
184                 + "TOSCA translation");
185       }
186     } else {
187       Optional<TranslatedHeatResource> sharedSourceTranslatedHeatResource =
188           getConnectionTranslatedHeatResourceUsingGetParamFunc(connectionPointEntry, paramName,
189               supportedSourceNodeTypes);
190       if (sharedSourceTranslatedHeatResource.isPresent()) {
191         NodeTemplate sharedSourceNodeTemplate = DataModelUtil
192             .getNodeTemplate(translateTo.getServiceTemplate(),
193                 sharedSourceTranslatedHeatResource.get().getTranslatedId());
194         RequirementAssignment requirementAssignment = createRequirementAssignment(
195             requirementDefinition, translateTo.getTranslatedId(), sharedSourceNodeTemplate);
196
197         ConsolidationDataUtil.updateNodesConnectedData(translateTo, translateTo.getResourceId(),
198             translateTo.getResource(), sharedSourceTranslatedHeatResource.get().getHeatResource(),
199             sharedSourceTranslatedHeatResource.get().getTranslatedId(),
200             requirementDefinition.getKey(),
201             requirementAssignment);
202       }
203     }
204
205     mdcDataDebugMessage.debugExitMessage(null, null);
206   }
207
208 }