b85fb0279592336419e16aa51149fc307d047d62
[sdc.git] /
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.core.utilities.file.FileUtils;
24 import org.openecomp.sdc.heat.datatypes.manifest.FileData;
25 import org.openecomp.sdc.logging.api.Logger;
26 import org.openecomp.sdc.logging.api.LoggerFactory;
27 import org.openecomp.sdc.tosca.datatypes.ToscaNodeType;
28 import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate;
29 import org.openecomp.sdc.tosca.datatypes.model.NodeType;
30 import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate;
31 import org.openecomp.sdc.tosca.services.DataModelUtil;
32 import org.openecomp.sdc.tosca.services.ToscaUtil;
33 import org.openecomp.sdc.tosca.services.impl.ToscaAnalyzerServiceImpl;
34 import org.openecomp.sdc.translator.datatypes.heattotosca.TranslationContext;
35 import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo;
36 import org.openecomp.sdc.translator.services.heattotosca.ConsolidationDataUtil;
37 import org.openecomp.sdc.translator.services.heattotosca.Constants;
38 import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil;
39 import org.openecomp.sdc.translator.services.heattotosca.TranslationService;
40
41 public class ResourceTranslationNestedImpl extends ResourceTranslationBase {
42
43   protected static Logger logger =
44       (Logger) LoggerFactory.getLogger(ResourceTranslationNestedImpl.class);
45
46   @Override
47   public void translate(TranslateTo translateTo) {
48     TranslationContext context = translateTo.getContext();
49     FileData nestedFileData =
50         HeatToToscaUtil.getFileData(translateTo.getResource().getType(), context);
51     if (nestedFileData == null) {
52       logger.warn("Nested File '" + translateTo.getResource().getType()
53           + "' is not exist, therefore, the nested resource with the ID '"
54           + translateTo.getResourceId() + "' will be ignored in TOSCA translation");
55       return;
56     }
57     String templateName = FileUtils.getFileWithoutExtention(translateTo.getResource().getType());
58     String substitutionNodeTypeKey = ToscaNodeType.ABSTRACT_NODE_TYPE_PREFIX + "heat."
59         + templateName;
60
61     if (!context.getTranslatedServiceTemplates()
62         .containsKey(translateTo.getResource().getType())) {
63
64       //substitution service template
65       ServiceTemplate nestedSubstitutionServiceTemplate =
66           createSubstitutionServiceTemplate(translateTo, nestedFileData, templateName);
67
68       //global substitution service template
69       ServiceTemplate globalSubstitutionServiceTemplate = new HeatToToscaUtil()
70           .fetchGlobalSubstitutionServiceTemplate(translateTo.getServiceTemplate(),
71               context);
72
73       //substitution node type
74       NodeType substitutionNodeType = new ToscaAnalyzerServiceImpl()
75           .createInitSubstitutionNodeType(nestedSubstitutionServiceTemplate,
76               ToscaNodeType.ABSTRACT_SUBSTITUTE);
77       DataModelUtil.addNodeType(globalSubstitutionServiceTemplate, substitutionNodeTypeKey,
78           substitutionNodeType);
79       //substitution mapping
80       HeatToToscaUtil
81           .handleSubstitutionMapping(context, substitutionNodeTypeKey,
82               nestedSubstitutionServiceTemplate, substitutionNodeType);
83
84       //add new nested service template
85       context.getTranslatedServiceTemplates()
86           .put(translateTo.getResource().getType(), nestedSubstitutionServiceTemplate);
87     }
88
89     ServiceTemplate substitutionServiceTemplate = context.getTranslatedServiceTemplates()
90         .get(translateTo.getResource().getType());
91
92     if(DataModelUtil.isNodeTemplateSectionMissingFromServiceTemplate(substitutionServiceTemplate)){
93       handleSubstitutionServiceTemplateWithoutNodeTemplates(
94           templateName, translateTo);
95       return;
96     }
97     NodeTemplate substitutionNodeTemplate =
98         HeatToToscaUtil.createAbstractSubstitutionNodeTemplate(translateTo, templateName,
99             substitutionNodeTypeKey);
100     manageSubstitutionNodeTemplateConnectionPoint(translateTo, nestedFileData,
101         substitutionNodeTemplate, substitutionNodeTypeKey);
102     DataModelUtil.addNodeTemplate(translateTo.getServiceTemplate(), translateTo.getTranslatedId(),
103         substitutionNodeTemplate);
104
105     //Add nested node template id to consolidation data
106     ConsolidationDataUtil.updateNestedNodeTemplateId(translateTo);
107   }
108
109   private void handleSubstitutionServiceTemplateWithoutNodeTemplates(String templateName,
110                                                                      TranslateTo translateTo) {
111     translateTo.getContext().addServiceTemplateWithoutNodeTemplates(templateName);
112     translateTo.getContext()
113         .addNestedNodeTemplateIdPointsToStWithoutNodeTemplates(translateTo.getTranslatedId());
114     translateTo.getContext().getTranslatedServiceTemplates().remove(translateTo.getResource().getType());
115   }
116
117   private ServiceTemplate createSubstitutionServiceTemplate(TranslateTo translateTo,
118                                                             FileData nestedFileData,
119                                                             String templateName) {
120     ServiceTemplate nestedSubstitutionServiceTemplate =
121         HeatToToscaUtil.createInitSubstitutionServiceTemplate(templateName);
122     translateTo.getContext()
123         .addNestedHeatFileName(ToscaUtil.getServiceTemplateFileName(templateName),
124             translateTo.getResource().getType());
125     new TranslationService().translateHeatFile(nestedSubstitutionServiceTemplate, nestedFileData,
126         translateTo.getContext());
127     return nestedSubstitutionServiceTemplate;
128   }
129
130
131   private void manageSubstitutionNodeTemplateConnectionPoint(TranslateTo translateTo,
132                                                              FileData nestedFileData,
133                                                              NodeTemplate substitutionNodeTemplate,
134                                                              String substitutionNodeTypeId) {
135     ServiceTemplate globalSubstitutionTemplate =
136         translateTo.getContext().getTranslatedServiceTemplates()
137             .get(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME);
138     NodeType nodeType = globalSubstitutionTemplate.getNode_types().get(substitutionNodeTypeId);
139     handlePortToNetConnections(translateTo, nestedFileData, substitutionNodeTemplate, nodeType);
140     handleSecurityRulesToPortConnections(translateTo, nestedFileData, substitutionNodeTemplate,
141         nodeType);
142     handleNovaToVolConnection(translateTo, nestedFileData, substitutionNodeTemplate, nodeType);
143     handleContrailV2VmInterfaceToNetworkConnection(translateTo, nestedFileData,
144         substitutionNodeTemplate, nodeType);
145     handleContrailPortToNetConnections(translateTo, nestedFileData, substitutionNodeTemplate,
146         nodeType);
147     handleVlanSubInterfaceToInterfaceConnections(translateTo, nestedFileData,
148         substitutionNodeTemplate, nodeType);
149   }
150
151   private void handleVlanSubInterfaceToInterfaceConnections(TranslateTo translateTo,
152                                                             FileData nestedFileData,
153                                                             NodeTemplate substitutionNodeTemplate,
154                                                             NodeType nodeType) {
155     ContrailV2VlanToInterfaceResourceConnection linker =
156         new ContrailV2VlanToInterfaceResourceConnection(this, translateTo, nestedFileData,
157             substitutionNodeTemplate, nodeType);
158     linker.connect();
159   }
160
161
162   private void handleContrailV2VmInterfaceToNetworkConnection(TranslateTo translateTo,
163                                                               FileData nestedFileData,
164                                                               NodeTemplate substitutionNodeTemplate,
165                                                               NodeType nodeType) {
166     ContrailV2VmInterfaceToNetResourceConnection linker =
167         new ContrailV2VmInterfaceToNetResourceConnection(this, translateTo, nestedFileData,
168             substitutionNodeTemplate, nodeType);
169     linker.connect();
170   }
171
172   private void handleNovaToVolConnection(TranslateTo translateTo, FileData nestedFileData,
173                                          NodeTemplate substitutionNodeTemplate, NodeType nodeType) {
174     NovaToVolResourceConnection linker =
175         new NovaToVolResourceConnection(this, translateTo, nestedFileData, substitutionNodeTemplate,
176             nodeType);
177     linker.connect();
178   }
179
180   private void handleSecurityRulesToPortConnections(TranslateTo translateTo,
181                                                     FileData nestedFileData,
182                                                     NodeTemplate substitutionNodeTemplate,
183                                                     NodeType nodeType) {
184     SecurityRulesToPortResourceConnection linker =
185         new SecurityRulesToPortResourceConnection(this, translateTo, nestedFileData,
186             substitutionNodeTemplate, nodeType);
187     linker.connect();
188   }
189
190   private void handlePortToNetConnections(TranslateTo translateTo, FileData nestedFileData,
191                                           NodeTemplate substitutionNodeTemplate,
192                                           NodeType nodeType) {
193     PortToNetResourceConnection linker =
194         new PortToNetResourceConnection(this, translateTo, nestedFileData, substitutionNodeTemplate,
195             nodeType);
196     linker.connect();
197   }
198
199   private void handleContrailPortToNetConnections(TranslateTo translateTo, FileData nestedFileData,
200                                                   NodeTemplate substitutionNodeTemplate,
201                                                   NodeType nodeType) {
202     ContrailPortToNetResourceConnection linker =
203         new ContrailPortToNetResourceConnection(this, translateTo, nestedFileData,
204             substitutionNodeTemplate, nodeType);
205     linker.connect();
206   }
207
208 }