2 * Copyright © 2016-2018 European Support Limited
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 package org.openecomp.sdc.translator.services.heattotosca.impl.resourcetranslation;
19 import org.apache.commons.collections4.CollectionUtils;
20 import org.apache.commons.lang3.StringUtils;
21 import org.openecomp.core.utilities.file.FileUtils;
22 import org.openecomp.sdc.heat.datatypes.manifest.FileData;
23 import org.openecomp.sdc.heat.datatypes.model.HeatResourcesTypes;
24 import org.openecomp.sdc.heat.datatypes.model.Resource;
25 import org.openecomp.sdc.heat.services.HeatConstants;
26 import org.openecomp.sdc.logging.api.Logger;
27 import org.openecomp.sdc.logging.api.LoggerFactory;
28 import org.openecomp.sdc.tosca.datatypes.ToscaCapabilityType;
29 import org.openecomp.sdc.tosca.datatypes.ToscaNodeType;
30 import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate;
31 import org.openecomp.sdc.tosca.datatypes.model.NodeType;
32 import org.openecomp.sdc.tosca.datatypes.model.RequirementAssignment;
33 import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate;
34 import org.openecomp.sdc.tosca.services.DataModelUtil;
35 import org.openecomp.sdc.tosca.services.ToscaUtil;
36 import org.openecomp.sdc.tosca.services.impl.ToscaAnalyzerServiceImpl;
37 import org.openecomp.sdc.translator.datatypes.heattotosca.TranslationContext;
38 import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo;
39 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.SubInterfaceTemplateConsolidationData;
40 import org.openecomp.sdc.translator.services.heattotosca.ConsolidationDataUtil;
41 import org.openecomp.sdc.translator.services.heattotosca.Constants;
42 import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil;
43 import org.openecomp.sdc.translator.services.heattotosca.TranslationService;
46 import java.util.Objects;
47 import java.util.Optional;
49 public class ResourceTranslationNestedImpl extends ResourceTranslationBase {
51 private static final String SUB_INTERFACE_COUNT = "count";
52 protected static Logger log = LoggerFactory.getLogger(ResourceTranslationNestedImpl.class);
55 public void translate(TranslateTo translateTo) {
56 TranslationContext context = translateTo.getContext();
57 FileData nestedFileData =
58 HeatToToscaUtil.getFileData(translateTo.getResource().getType(), context);
59 if (nestedFileData == null) {
60 log.warn("Nested File '" + translateTo.getResource().getType()
61 + "' is not exist, therefore, the nested resource with the ID '"
62 + translateTo.getResourceId() + "' will be ignored in TOSCA translation");
65 String templateName = FileUtils.getFileWithoutExtention(translateTo.getResource().getType());
66 String substitutionNodeTypeKey = HeatToToscaUtil.getNestedResourceTypePrefix(translateTo)
69 if (!context.getTranslatedServiceTemplates()
70 .containsKey(translateTo.getResource().getType())) {
72 //substitution service template
73 ServiceTemplate nestedSubstitutionServiceTemplate =
74 createSubstitutionServiceTemplate(translateTo, nestedFileData, templateName);
76 //global substitution service template
77 ServiceTemplate globalSubstitutionServiceTemplate = HeatToToscaUtil
78 .fetchGlobalSubstitutionServiceTemplate(translateTo.getServiceTemplate(),
81 //substitution node type
82 NodeType substitutionNodeType = new ToscaAnalyzerServiceImpl()
83 .createInitSubstitutionNodeType(nestedSubstitutionServiceTemplate,
84 ToscaNodeType.ABSTRACT_SUBSTITUTE);
85 DataModelUtil.addNodeType(globalSubstitutionServiceTemplate, substitutionNodeTypeKey,
86 substitutionNodeType);
87 //substitution mapping
89 .handleSubstitutionMapping(context, substitutionNodeTypeKey,
90 nestedSubstitutionServiceTemplate, substitutionNodeType);
92 //add new nested service template
93 context.getTranslatedServiceTemplates()
94 .put(translateTo.getResource().getType(), nestedSubstitutionServiceTemplate);
97 ServiceTemplate substitutionServiceTemplate = context.getTranslatedServiceTemplates()
98 .get(translateTo.getResource().getType());
100 if (DataModelUtil.isNodeTemplateSectionMissingFromServiceTemplate(substitutionServiceTemplate)) {
101 handleSubstitutionServiceTemplateWithoutNodeTemplates(
102 templateName, translateTo);
105 NodeTemplate substitutionNodeTemplate =
106 HeatToToscaUtil.createAbstractSubstitutionNodeTemplate(translateTo, templateName,
107 substitutionNodeTypeKey);
108 manageSubstitutionNodeTemplateConnectionPoint(translateTo, nestedFileData,
109 substitutionNodeTemplate, substitutionNodeTypeKey);
110 DataModelUtil.addNodeTemplate(translateTo.getServiceTemplate(), translateTo.getTranslatedId(),
111 substitutionNodeTemplate);
113 //Add nested node template id to consolidation data
114 ConsolidationDataUtil.updateNestedNodeTemplateId(translateTo);
116 //Gather consolidation data if the resource group represents a sub interface
117 if (StringUtils.isNotBlank(substitutionNodeTypeKey)
118 && substitutionNodeTypeKey.contains(ToscaNodeType
119 .VLAN_SUB_INTERFACE_RESOURCE_TYPE_PREFIX)) {
120 populateSubInterfaceTemplateConsolidationData(translateTo, substitutionNodeTemplate);
124 private void populateSubInterfaceTemplateConsolidationData(TranslateTo translateTo,
125 NodeTemplate nodeTemplate) {
127 Optional<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationData =
128 ConsolidationDataUtil.getSubInterfaceTemplateConsolidationData(translateTo, translateTo
130 if (!subInterfaceTemplateConsolidationData.isPresent()) {
133 Optional<String> subInterfaceNetworkRole =
134 HeatToToscaUtil.getNetworkRoleFromSubInterfaceId(translateTo.getResource(), translateTo.getContext());
135 subInterfaceNetworkRole.ifPresent(subInterfaceTemplateConsolidationData.get()::setNetworkRole);
136 Object count = getSubInterfaceCountFromResourceProperties(translateTo);
137 subInterfaceTemplateConsolidationData.get().setResourceGroupCount(count);
139 if (CollectionUtils.isNotEmpty(nodeTemplate.getRequirements())) {
140 //Add connectivity to network in consolidation data based on resource group link requirements
141 nodeTemplate.getRequirements().forEach((Map<String, RequirementAssignment> requirementMap) ->
142 requirementMap.entrySet().stream()
143 .filter(requirementAssignmentEntry -> ToscaCapabilityType.NATIVE_NETWORK_LINKABLE
144 .equals(requirementAssignmentEntry.getValue().getCapability()))
145 .forEach(requirementAssignmentEntry -> subInterfaceTemplateConsolidationData.get()
146 .addNodesConnectedOut(requirementAssignmentEntry.getValue().getNode(),
147 requirementAssignmentEntry.getKey(),
148 requirementAssignmentEntry.getValue())
154 private Object getSubInterfaceCountFromResourceProperties(TranslateTo translateTo) {
155 if (Objects.nonNull(translateTo.getHeatOrchestrationTemplate().getResources().get(translateTo
156 .getResourceId()))) {
157 Resource resource = translateTo.getHeatOrchestrationTemplate().getResources().get(translateTo
159 if(HeatResourcesTypes.RESOURCE_GROUP_RESOURCE_TYPE.getHeatResource().equals(resource.getType())) {
160 return resource.getProperties().get(SUB_INTERFACE_COUNT);
161 } else if (HeatToToscaUtil.isYamlFile(resource.getType())) {
162 return HeatConstants.DEFAULT_NESTED_HEAT_RESOURCE_COUNT;
168 private void handleSubstitutionServiceTemplateWithoutNodeTemplates(String templateName,
169 TranslateTo translateTo) {
170 translateTo.getContext().addServiceTemplateWithoutNodeTemplates(templateName);
171 translateTo.getContext()
172 .addNestedNodeTemplateIdPointsToStWithoutNodeTemplates(translateTo.getTranslatedId());
173 translateTo.getContext().getTranslatedServiceTemplates().remove(translateTo.getResource().getType());
176 private ServiceTemplate createSubstitutionServiceTemplate(TranslateTo translateTo,
177 FileData nestedFileData,
178 String templateName) {
179 ServiceTemplate nestedSubstitutionServiceTemplate =
180 HeatToToscaUtil.createInitSubstitutionServiceTemplate(templateName);
181 translateTo.getContext()
182 .addNestedHeatFileName(ToscaUtil.getServiceTemplateFileName(templateName),
183 translateTo.getResource().getType());
184 new TranslationService().translateHeatFile(nestedSubstitutionServiceTemplate,
185 nestedFileData, translateTo.getContext());
186 return nestedSubstitutionServiceTemplate;
190 private void manageSubstitutionNodeTemplateConnectionPoint(TranslateTo translateTo,
191 FileData nestedFileData,
192 NodeTemplate substitutionNodeTemplate,
193 String substitutionNodeTypeId) {
194 ServiceTemplate globalSubstitutionTemplate =
195 translateTo.getContext().getTranslatedServiceTemplates()
196 .get(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME);
197 NodeType nodeType = globalSubstitutionTemplate.getNode_types().get(substitutionNodeTypeId);
198 handlePortToNetConnections(translateTo, nestedFileData, substitutionNodeTemplate, nodeType);
199 handleSecurityRulesToPortConnections(translateTo, nestedFileData, substitutionNodeTemplate,
201 handleNovaToVolConnection(translateTo, nestedFileData, substitutionNodeTemplate, nodeType);
202 handleContrailV2VmInterfaceToNetworkConnection(translateTo, nestedFileData,
203 substitutionNodeTemplate, nodeType);
204 handleContrailPortToNetConnections(translateTo, nestedFileData, substitutionNodeTemplate,
206 handleVlanSubInterfaceToInterfaceConnections(translateTo, nestedFileData,
207 substitutionNodeTemplate, nodeType);
210 private void handleVlanSubInterfaceToInterfaceConnections(TranslateTo translateTo,
211 FileData nestedFileData,
212 NodeTemplate substitutionNodeTemplate,
214 ContrailV2VlanToInterfaceResourceConnection linker =
215 new ContrailV2VlanToInterfaceResourceConnection(this, translateTo, nestedFileData,
216 substitutionNodeTemplate, nodeType);
221 private void handleContrailV2VmInterfaceToNetworkConnection(TranslateTo translateTo,
222 FileData nestedFileData,
223 NodeTemplate substitutionNodeTemplate,
225 ContrailV2VmInterfaceToNetResourceConnection linker =
226 new ContrailV2VmInterfaceToNetResourceConnection(this, translateTo, nestedFileData,
227 substitutionNodeTemplate, nodeType);
231 private void handleNovaToVolConnection(TranslateTo translateTo, FileData nestedFileData,
232 NodeTemplate substitutionNodeTemplate, NodeType nodeType) {
233 NovaToVolResourceConnection linker =
234 new NovaToVolResourceConnection(this, translateTo, nestedFileData, substitutionNodeTemplate,
239 private void handleSecurityRulesToPortConnections(TranslateTo translateTo,
240 FileData nestedFileData,
241 NodeTemplate substitutionNodeTemplate,
243 SecurityRulesToPortResourceConnection linker =
244 new SecurityRulesToPortResourceConnection(this, translateTo, nestedFileData,
245 substitutionNodeTemplate, nodeType);
249 private void handlePortToNetConnections(TranslateTo translateTo, FileData nestedFileData,
250 NodeTemplate substitutionNodeTemplate,
252 PortToNetResourceConnection linker =
253 new PortToNetResourceConnection(this, translateTo, nestedFileData, substitutionNodeTemplate,
258 private void handleContrailPortToNetConnections(TranslateTo translateTo, FileData nestedFileData,
259 NodeTemplate substitutionNodeTemplate,
261 ContrailPortToNetResourceConnection linker =
262 new ContrailPortToNetResourceConnection(this, translateTo, nestedFileData,
263 substitutionNodeTemplate, nodeType);