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.onap.sdc.tosca.datatypes.model.NodeTemplate;
22 import org.onap.sdc.tosca.datatypes.model.NodeType;
23 import org.onap.sdc.tosca.datatypes.model.RequirementAssignment;
24 import org.onap.sdc.tosca.datatypes.model.ServiceTemplate;
25 import org.openecomp.core.utilities.file.FileUtils;
26 import org.openecomp.sdc.heat.datatypes.manifest.FileData;
27 import org.openecomp.sdc.heat.datatypes.model.HeatResourcesTypes;
28 import org.openecomp.sdc.heat.datatypes.model.Resource;
29 import org.openecomp.sdc.heat.services.HeatConstants;
30 import org.openecomp.sdc.logging.api.Logger;
31 import org.openecomp.sdc.logging.api.LoggerFactory;
32 import org.openecomp.sdc.tosca.datatypes.ToscaCapabilityType;
33 import org.openecomp.sdc.tosca.datatypes.ToscaNodeType;
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.SubInterfaceConsolidationDataHandler;
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 = HeatToToscaUtil.getFileData(translateTo.getResource().getType(), context);
58 if (nestedFileData == null) {
59 log.warn("Nested File '{}' is not exist, therefore, the nested resource with the ID '{}' will be ignored "
60 + "in TOSCA translation", translateTo.getResource().getType(), translateTo.getResourceId());
63 String templateName = FileUtils.getFileWithoutExtention(translateTo.getResource().getType());
64 String substitutionNodeTypeKey = HeatToToscaUtil.getNestedResourceTypePrefix(translateTo) + templateName;
65 if (!context.getTranslatedServiceTemplates().containsKey(translateTo.getResource().getType())) {
66 translateNestedHeat(translateTo, nestedFileData, templateName, substitutionNodeTypeKey);
68 ServiceTemplate substitutionServiceTemplate = context.getTranslatedServiceTemplates()
69 .get(translateTo.getResource().getType());
70 if (DataModelUtil.isNodeTemplateSectionMissingFromServiceTemplate(substitutionServiceTemplate)) {
71 handleSubstitutionServiceTemplateWithoutNodeTemplates(templateName, translateTo);
74 NodeTemplate substitutionNodeTemplate = HeatToToscaUtil.createAbstractSubstitutionNodeTemplate(translateTo,
75 templateName, substitutionNodeTypeKey);
76 manageSubstitutionNodeTemplateConnectionPoint(translateTo, nestedFileData, substitutionNodeTemplate,
77 substitutionNodeTypeKey);
78 DataModelUtil.addNodeTemplate(translateTo.getServiceTemplate(), translateTo.getTranslatedId(),
79 substitutionNodeTemplate);
80 //Add nested node template id to consolidation data
81 ConsolidationDataUtil.updateNestedNodeTemplateId(translateTo);
82 //Gather consolidation data if the resource group represents a sub interface
83 if (isResourceGroupSubInterface(substitutionNodeTypeKey)) {
84 populateSubInterfaceTemplateConsolidationData(translateTo, substitutionNodeTemplate);
88 private boolean isResourceGroupSubInterface(String substitutionNodeTypeKey) {
89 return StringUtils.isNotBlank(substitutionNodeTypeKey)
90 && substitutionNodeTypeKey.contains(ToscaNodeType.VLAN_SUB_INTERFACE_RESOURCE_TYPE_PREFIX);
93 private void translateNestedHeat(TranslateTo translateTo, FileData nestedFileData, String templateName,
94 String substitutionNodeTypeKey) {
95 TranslationContext context = translateTo.getContext();
96 //substitution service template
97 ServiceTemplate nestedSubstitutionServiceTemplate =
98 createSubstitutionServiceTemplate(translateTo, nestedFileData, templateName);
99 //global substitution service template
100 ServiceTemplate globalSubstitutionServiceTemplate = HeatToToscaUtil
101 .fetchGlobalSubstitutionServiceTemplate(translateTo.getServiceTemplate(), context);
102 //substitution node type
103 NodeType substitutionNodeType = new ToscaAnalyzerServiceImpl()
104 .createInitSubstitutionNodeType(nestedSubstitutionServiceTemplate, ToscaNodeType.ABSTRACT_SUBSTITUTE);
105 DataModelUtil.addNodeType(globalSubstitutionServiceTemplate, substitutionNodeTypeKey,
106 substitutionNodeType);
107 //substitution mapping
108 HeatToToscaUtil.handleSubstitutionMapping(context, substitutionNodeTypeKey,
109 nestedSubstitutionServiceTemplate, substitutionNodeType);
110 //add new nested service template
111 context.getTranslatedServiceTemplates().put(translateTo.getResource().getType(),
112 nestedSubstitutionServiceTemplate);
115 private void populateSubInterfaceTemplateConsolidationData(TranslateTo translateTo,
116 NodeTemplate nodeTemplate) {
118 SubInterfaceConsolidationDataHandler consolidationDataHandler =
119 translateTo.getContext().getSubInterfaceConsolidationDataHandler();
121 String translatedId = translateTo.getTranslatedId();
122 Optional<String> subInterfaceNetworkRole =
123 HeatToToscaUtil.getNetworkRoleFromSubInterfaceId(translateTo.getResource(), translateTo.getContext());
124 subInterfaceNetworkRole.ifPresent(networkRole -> consolidationDataHandler.setNetworkRole(translateTo,
125 translatedId, networkRole));
127 consolidationDataHandler.setResourceGroupCount(translateTo, translatedId,
128 getSubInterfaceCountFromResourceProperties(translateTo));
130 if (CollectionUtils.isEmpty(nodeTemplate.getRequirements())) {
133 //Add connectivity to network in consolidation data based on resource group link requirements
134 nodeTemplate.getRequirements().forEach((Map<String, RequirementAssignment> requirementMap) ->
135 requirementMap.entrySet().stream()
136 .filter(requirementAssignmentEntry -> ToscaCapabilityType.NATIVE_NETWORK_LINKABLE
137 .equals(requirementAssignmentEntry.getValue().getCapability()))
138 .forEach(requirementAssignmentEntry ->
139 consolidationDataHandler.addNodesConnectedOut(translateTo,
140 requirementAssignmentEntry.getValue().getNode(),
141 requirementAssignmentEntry.getKey(),
142 requirementAssignmentEntry.getValue())
147 private Object getSubInterfaceCountFromResourceProperties(TranslateTo translateTo) {
148 if (Objects.nonNull(translateTo.getHeatOrchestrationTemplate().getResources().get(translateTo
149 .getResourceId()))) {
150 Resource resource = translateTo.getHeatOrchestrationTemplate().getResources().get(translateTo
152 if (HeatResourcesTypes.RESOURCE_GROUP_RESOURCE_TYPE.getHeatResource().equals(resource.getType())) {
153 return resource.getProperties().get(SUB_INTERFACE_COUNT);
154 } else if (HeatToToscaUtil.isYamlFile(resource.getType())) {
155 return HeatConstants.DEFAULT_NESTED_HEAT_RESOURCE_COUNT;
161 private void handleSubstitutionServiceTemplateWithoutNodeTemplates(String templateName,
162 TranslateTo translateTo) {
163 translateTo.getContext().addServiceTemplateWithoutNodeTemplates(templateName);
164 translateTo.getContext()
165 .addNestedNodeTemplateIdPointsToStWithoutNodeTemplates(translateTo.getTranslatedId());
166 translateTo.getContext().getTranslatedServiceTemplates().remove(translateTo.getResource().getType());
169 private ServiceTemplate createSubstitutionServiceTemplate(TranslateTo translateTo,
170 FileData nestedFileData,
171 String templateName) {
172 ServiceTemplate nestedSubstitutionServiceTemplate =
173 HeatToToscaUtil.createInitSubstitutionServiceTemplate(templateName);
174 translateTo.getContext().addNestedHeatFileName(ToscaUtil.getServiceTemplateFileName(templateName),
175 translateTo.getResource().getType());
176 new TranslationService().translateHeatFile(nestedSubstitutionServiceTemplate, nestedFileData, translateTo
178 return nestedSubstitutionServiceTemplate;
182 private void manageSubstitutionNodeTemplateConnectionPoint(TranslateTo translateTo,
183 FileData nestedFileData,
184 NodeTemplate substitutionNodeTemplate,
185 String substitutionNodeTypeId) {
186 ServiceTemplate globalSubstitutionTemplate =
187 translateTo.getContext().getTranslatedServiceTemplates()
188 .get(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME);
189 NodeType nodeType = globalSubstitutionTemplate.getNode_types().get(substitutionNodeTypeId);
190 handlePortToNetConnections(translateTo, nestedFileData, substitutionNodeTemplate, nodeType);
191 handleSecurityRulesToPortConnections(translateTo, nestedFileData, substitutionNodeTemplate,
193 handleNovaToVolConnection(translateTo, nestedFileData, substitutionNodeTemplate, nodeType);
194 handleContrailV2VmInterfaceToNetworkConnection(translateTo, nestedFileData,
195 substitutionNodeTemplate, nodeType);
196 handleContrailPortToNetConnections(translateTo, nestedFileData, substitutionNodeTemplate,
198 handleVlanSubInterfaceToInterfaceConnections(translateTo, nestedFileData,
199 substitutionNodeTemplate, nodeType);
202 private void handleVlanSubInterfaceToInterfaceConnections(TranslateTo translateTo,
203 FileData nestedFileData,
204 NodeTemplate substitutionNodeTemplate,
206 ContrailV2VlanToInterfaceResourceConnection linker =
207 new ContrailV2VlanToInterfaceResourceConnection(this, translateTo, nestedFileData,
208 substitutionNodeTemplate, nodeType);
213 private void handleContrailV2VmInterfaceToNetworkConnection(TranslateTo translateTo,
214 FileData nestedFileData,
215 NodeTemplate substitutionNodeTemplate,
217 ContrailV2VmInterfaceToNetResourceConnection linker =
218 new ContrailV2VmInterfaceToNetResourceConnection(this, translateTo, nestedFileData,
219 substitutionNodeTemplate, nodeType);
223 private void handleNovaToVolConnection(TranslateTo translateTo, FileData nestedFileData,
224 NodeTemplate substitutionNodeTemplate, NodeType nodeType) {
225 NovaToVolResourceConnection linker =
226 new NovaToVolResourceConnection(this, translateTo, nestedFileData, substitutionNodeTemplate,
231 private void handleSecurityRulesToPortConnections(TranslateTo translateTo,
232 FileData nestedFileData,
233 NodeTemplate substitutionNodeTemplate,
235 SecurityRulesToPortResourceConnection linker =
236 new SecurityRulesToPortResourceConnection(this, translateTo, nestedFileData,
237 substitutionNodeTemplate, nodeType);
241 private void handlePortToNetConnections(TranslateTo translateTo, FileData nestedFileData,
242 NodeTemplate substitutionNodeTemplate,
244 PortToNetResourceConnection linker =
245 new PortToNetResourceConnection(this, translateTo, nestedFileData, substitutionNodeTemplate,
250 private void handleContrailPortToNetConnections(TranslateTo translateTo, FileData nestedFileData,
251 NodeTemplate substitutionNodeTemplate,
253 ContrailPortToNetResourceConnection linker =
254 new ContrailPortToNetResourceConnection(this, translateTo, nestedFileData,
255 substitutionNodeTemplate, nodeType);