1793253822d3f4297445a8556e289f3ab544ad93
[vfc/nfvo/catalog.git] /
1 /**\r
2  * Copyright 2016 [ZTE] and others.\r
3  *\r
4  * Licensed under the Apache License, Version 2.0 (the "License");\r
5  * you may not use this file except in compliance with the License.\r
6  * You may obtain a copy of the License at\r
7  *\r
8  *     http://www.apache.org/licenses/LICENSE-2.0\r
9  *\r
10  * Unless required by applicable law or agreed to in writing, software\r
11  * distributed under the License is distributed on an "AS IS" BASIS,\r
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
13  * See the License for the specific language governing permissions and\r
14  * limitations under the License.\r
15  */\r
16 package org.openo.commontosca.catalog.model.parser;\r
17 \r
18 import java.io.BufferedInputStream;\r
19 import java.io.BufferedReader;\r
20 import java.io.File;\r
21 import java.io.FileInputStream;\r
22 import java.io.IOException;\r
23 import java.io.InputStream;\r
24 import java.io.InputStreamReader;\r
25 import java.util.ArrayList;\r
26 import java.util.HashMap;\r
27 import java.util.List;\r
28 import java.util.Map;\r
29 import java.util.zip.ZipEntry;\r
30 import java.util.zip.ZipFile;\r
31 import java.util.zip.ZipInputStream;\r
32 \r
33 import org.openo.commontosca.catalog.db.exception.CatalogResourceException;\r
34 import org.openo.commontosca.catalog.db.resource.TemplateManager;\r
35 import org.openo.commontosca.catalog.entity.response.CsarFileUriResponse;\r
36 import org.openo.commontosca.catalog.model.common.TemplateDataHelper;\r
37 import org.openo.commontosca.catalog.model.entity.InputParameter;\r
38 import org.openo.commontosca.catalog.model.entity.RelationShip;\r
39 import org.openo.commontosca.catalog.model.entity.ServiceTemplate;\r
40 import org.openo.commontosca.catalog.model.entity.ServiceTemplateOperation;\r
41 import org.openo.commontosca.catalog.model.entity.SubstitutionMapping;\r
42 import org.openo.commontosca.catalog.model.parser.yaml.entity.ParseYamlResult;\r
43 import org.openo.commontosca.catalog.wrapper.PackageWrapper;\r
44 import org.openo.commontosca.catalog.common.ToolUtil;\r
45 import org.openo.commontosca.catalog.model.entity.EnumDataType;\r
46 import org.openo.commontosca.catalog.model.entity.NodeTemplate;\r
47 import org.openo.commontosca.catalog.model.parser.yaml.YamlParseServiceConsumer;\r
48 import org.openo.commontosca.catalog.model.parser.yaml.entity.EnumYamlServiceTemplateInfo;\r
49 import org.openo.commontosca.catalog.model.parser.yaml.entity.ParseYamlRequestParemeter;\r
50 \r
51 public class ToscaYamlModelParser extends AbstractModelParser{\r
52 \r
53     private static final Object TOSCA_META_FIELD_ENTRY_DEFINITIONS = "Entry-Definitions";\r
54 \r
55     /**\r
56      * \r
57      */\r
58     @Override\r
59     public String parse(String packageId, String fileLocation)\r
60             throws CatalogResourceException {\r
61         ParseYamlResult result = YamlParseServiceConsumer.getServiceTemplates(comboRequest(fileLocation));\r
62 \r
63         Map<String, String> toscaMeta = parseToscaMeta(fileLocation);\r
64         String stFileName = toscaMeta.get(TOSCA_META_FIELD_ENTRY_DEFINITIONS);\r
65         CsarFileUriResponse stDownloadUri = PackageWrapper.getInstance()\r
66                 .getCsarFileDownloadUri(packageId, stFileName);\r
67 \r
68         ServiceTemplate st = parseServiceTemplate(packageId, result,\r
69                 stDownloadUri.getDownloadUri());\r
70         List<NodeTemplate> ntList = parseNodeTemplates(packageId,\r
71                 st.getServiceTemplateId(), result);\r
72         st.setType(getTemplateType(result, ntList).toString());\r
73 \r
74         TemplateManager.getInstance().addServiceTemplate(\r
75                 TemplateDataHelper.convert2TemplateData(st,\r
76                         ToolUtil.toJson(result), ntList));\r
77 \r
78         SubstitutionMapping stm = parseSubstitutionMapping(\r
79                 st.getServiceTemplateId(), result);\r
80         if (stm != null) {\r
81             TemplateManager.getInstance().addServiceTemplateMapping(\r
82                     TemplateDataHelper.convert2TemplateMappingData(stm));\r
83         }\r
84 \r
85         return st.getServiceTemplateId();\r
86     }\r
87 \r
88     /**\r
89      * @param fileLocation\r
90      * @return\r
91      * @throws CatalogResourceException\r
92      */\r
93     @SuppressWarnings("resource")\r
94     private Map<String, String> parseToscaMeta(String fileLocation)\r
95             throws CatalogResourceException {\r
96         Map<String, String> toscaMeta = new HashMap<>();\r
97 \r
98         ZipInputStream zin = null;\r
99         BufferedReader br = null;\r
100         try {\r
101             InputStream in = new BufferedInputStream(new FileInputStream(\r
102                     fileLocation));\r
103             zin = new ZipInputStream(in);\r
104             ZipEntry ze;\r
105             while ((ze = zin.getNextEntry()) != null) {\r
106                 if (("TOSCA-Metadata" + File.separator + "TOSCA.meta")\r
107                         .equals(ze.getName())\r
108                         || "TOSCA-Metadata/TOSCA.meta".equals(ze.getName())) {\r
109                     ZipFile zf = new ZipFile(fileLocation);\r
110                     br = new BufferedReader(new InputStreamReader(\r
111                             zf.getInputStream(ze)));\r
112                     String line;\r
113                     String[] tmps;\r
114                     while ((line = br.readLine()) != null) {\r
115                         if (line.indexOf(":") > 0) {\r
116                             tmps = line.split(":");\r
117                             toscaMeta.put(tmps[0].trim(), tmps[1].trim());\r
118                         }\r
119                     }\r
120 \r
121                     return toscaMeta;\r
122                 }\r
123             }\r
124 \r
125         } catch (IOException e) {\r
126             throw new CatalogResourceException("Parse Tosca Meta Fail.", e);\r
127         } finally {\r
128             closeStreamAndReader(zin, br);\r
129         }\r
130 \r
131         return toscaMeta;\r
132     }\r
133 \r
134     private void closeStreamAndReader(ZipInputStream zin, BufferedReader br) {\r
135         if (br != null) {\r
136             try {\r
137                 br.close();\r
138             } catch (IOException e) {\r
139             }\r
140         }\r
141         if (zin != null) {\r
142             try {\r
143                 zin.closeEntry();\r
144             } catch (IOException e) {\r
145             }\r
146         }\r
147     }\r
148 \r
149     private ParseYamlRequestParemeter comboRequest(String fileLocation) {\r
150         ParseYamlRequestParemeter request = new ParseYamlRequestParemeter();\r
151         request.setPath(fileLocation);\r
152         return request;\r
153     }\r
154 \r
155     /**\r
156      * @param serviceTemplateId\r
157      * @param result\r
158      * @return\r
159      */\r
160     private SubstitutionMapping parseSubstitutionMapping(\r
161             String serviceTemplateId, ParseYamlResult result) {\r
162         String type = getSubstitutionMappingType(result);\r
163         if (ToolUtil.isTrimedEmptyString(type)) {\r
164             return null;\r
165         }\r
166 \r
167         ParseYamlResult.TopologyTemplate.SubstitutionMapping stm = result\r
168                 .getTopologyTemplate().getSubstitutionMappings();\r
169         return new SubstitutionMapping(serviceTemplateId, type,\r
170                 stm.getRequirementList(), stm.getCapabilityList());\r
171     }\r
172 \r
173     private ServiceTemplate parseServiceTemplate(String packageId,\r
174             ParseYamlResult result, String stDownloadUri) {\r
175         ServiceTemplate st = new ServiceTemplate();\r
176 \r
177         st.setServiceTemplateId(ToolUtil.generateId());\r
178         st.setTemplateName(result.getMetadata().get(\r
179                 EnumYamlServiceTemplateInfo.ID.getName()));\r
180         st.setVendor(result.getMetadata().get(\r
181                 EnumYamlServiceTemplateInfo.PROVIDER.getName()));\r
182         st.setVersion(result.getMetadata().get(\r
183                 EnumYamlServiceTemplateInfo.VERSION.getName()));\r
184         st.setCsarid(packageId);\r
185         st.setDownloadUri(stDownloadUri);\r
186         st.setInputs(parseInputs(result));\r
187         ServiceTemplateOperation[] operations = parseOperations(result\r
188                 .getPlanList());\r
189         st.setOperations(operations);\r
190         return st;\r
191     }\r
192 \r
193     /**\r
194      * @param planList\r
195      * @return\r
196      */\r
197     private ServiceTemplateOperation[] parseOperations(List<ParseYamlResult.Plan> planList) {\r
198         if (planList == null || planList.isEmpty()) {\r
199             return new ServiceTemplateOperation[0];\r
200         }\r
201 \r
202         List<ServiceTemplateOperation> opList = new ArrayList<>();\r
203         for (ParseYamlResult.Plan plan : planList) {\r
204             ServiceTemplateOperation op = new ServiceTemplateOperation();\r
205             op.setName(plan.getName());\r
206             op.setDescription(plan.getDescription());\r
207             String processId = null; // TODO\r
208             op.setProcessId(processId);\r
209             InputParameter[] inputs = parsePlanInputs(plan.getInputList());\r
210             op.setInputs(inputs);\r
211 \r
212             opList.add(op);\r
213 \r
214         }\r
215         return opList.toArray(new ServiceTemplateOperation[0]);\r
216     }\r
217 \r
218     /**\r
219      * @param inputList\r
220      * @return\r
221      */\r
222     private InputParameter[] parsePlanInputs(List<ParseYamlResult.Plan.PlanValue.PlanInput> inputList) {\r
223         if (inputList == null || inputList.isEmpty()) {\r
224             return new InputParameter[0];\r
225         }\r
226 \r
227         List<InputParameter> retList = new ArrayList<>();\r
228         for (ParseYamlResult.Plan.PlanValue.PlanInput input : inputList) {\r
229             retList.add(new InputParameter(input.getName(),\r
230                     getEnumDataType(input.getType()), input.getDescription(),\r
231                     input.getDefault(), input.isRequired()));\r
232         }\r
233         return retList.toArray(new InputParameter[0]);\r
234     }\r
235 \r
236     private InputParameter[] parseInputs(ParseYamlResult result) {\r
237         List<ParseYamlResult.TopologyTemplate.Input> inputList = result.getTopologyTemplate().getInputs();\r
238         if(inputList == null){\r
239             return null;\r
240         }\r
241         ArrayList<InputParameter> retList = new ArrayList<InputParameter>();\r
242         for(ParseYamlResult.TopologyTemplate.Input input : inputList){\r
243             retList.add(new InputParameter(input.getName(),\r
244                     getEnumDataType(input.getType()), input.getDescription(),\r
245                     input.getDefault(), input.isRequired()));\r
246         }\r
247         return retList.toArray(new InputParameter[0]);\r
248     }\r
249 \r
250     /**\r
251      * @param type\r
252      * @return\r
253      */\r
254     private EnumDataType getEnumDataType(String type) {\r
255         if (EnumDataType.INTEGER.toString().equalsIgnoreCase(type)) {\r
256             return EnumDataType.INTEGER;\r
257         }\r
258 \r
259         if (EnumDataType.FLOAT.toString().equalsIgnoreCase(type)) {\r
260             return EnumDataType.FLOAT;\r
261         }\r
262 \r
263         if (EnumDataType.BOOLEAN.toString().equalsIgnoreCase(type)) {\r
264             return EnumDataType.BOOLEAN;\r
265         }\r
266 \r
267         return EnumDataType.STRING;\r
268     }\r
269 \r
270     /**\r
271      * @param csarId\r
272      * @param templateId\r
273      * @param result\r
274      * @return\r
275      */\r
276     private List<NodeTemplate> parseNodeTemplates(String csarId,\r
277             String templateId, ParseYamlResult result) {\r
278         List<ParseYamlResult.TopologyTemplate.NodeTemplate> nodetemplateList = result.getTopologyTemplate().getNodeTemplates();\r
279         if(nodetemplateList == null){\r
280             return null;\r
281         }\r
282         \r
283         List<NodeTemplate> retList = new ArrayList<>();\r
284         for (ParseYamlResult.TopologyTemplate.NodeTemplate nodeTemplate : nodetemplateList) {\r
285             NodeTemplate ret = new NodeTemplate();\r
286             ret.setId(nodeTemplate.getName());\r
287             ret.setName(nodeTemplate.getName());\r
288             ret.setType(nodeTemplate.getNodeType());\r
289             ret.setProperties(nodeTemplate.getPropertyList());\r
290             List<RelationShip> relationShipList = parseNodeTemplateRelationShip(nodeTemplate\r
291                     .getRelationships());\r
292             ret.setRelationShips(relationShipList);\r
293 \r
294             retList.add(ret);\r
295         }\r
296 \r
297         return retList;\r
298     }\r
299     \r
300     \r
301     private List<RelationShip> parseNodeTemplateRelationShip(\r
302             List<ParseYamlResult.TopologyTemplate.NodeTemplate.Relationship> relationshipList) {\r
303         List<RelationShip> retList = new ArrayList<>();\r
304 \r
305         if (relationshipList == null) {\r
306             return retList;\r
307         }\r
308 \r
309         for (ParseYamlResult.TopologyTemplate.NodeTemplate.Relationship relationship : relationshipList) {\r
310             RelationShip ret = new RelationShip();\r
311             ret.setSourceNodeId(relationship.getSourceNodeName());\r
312             ret.setSourceNodeName(relationship.getSourceNodeName());\r
313             ret.setTargetNodeId(relationship.getTargetNodeName());\r
314             ret.setTargetNodeName(relationship.getTargetNodeName());\r
315             ret.setType(relationship.getType());\r
316             retList.add(ret);\r
317         }\r
318 \r
319         return retList;\r
320     }\r
321     \r
322     private EnumTemplateType getTemplateType(ParseYamlResult result,\r
323             List<NodeTemplate> ntList) {\r
324         String type = getSubstitutionMappingType(result);\r
325         if (isNSType(type)) {\r
326             return EnumTemplateType.NS;\r
327         }\r
328         \r
329         if (isVNFType(type)) {\r
330             return EnumTemplateType.VNF;\r
331         }\r
332 \r
333         return getTemplateTypeFromNodeTemplates(ntList);\r
334     }\r
335 \r
336     private String getSubstitutionMappingType(ParseYamlResult result) {\r
337         if (result.getTopologyTemplate().getSubstitutionMappings() == null) {\r
338             return null;\r
339         }\r
340         return result.getTopologyTemplate().getSubstitutionMappings()\r
341                 .getNode_type();\r
342     }\r
343 \r
344     /**\r
345      * @param ntList\r
346      * @return\r
347      */\r
348     private EnumTemplateType getTemplateTypeFromNodeTemplates(\r
349             List<NodeTemplate> ntList) {\r
350         for (NodeTemplate nt : ntList) {\r
351             if (isNSType(nt.getType()) || isVNFType(nt.getType())) {\r
352                 return EnumTemplateType.NS;\r
353             }\r
354         }\r
355 \r
356         return EnumTemplateType.VNF;\r
357     }\r
358 \r
359     private boolean isVNFType(String type) {\r
360         if (ToolUtil.isTrimedEmptyString(type)) {\r
361             return false;\r
362         }\r
363         return type.toUpperCase().contains(".VNF");\r
364     }\r
365 \r
366     private boolean isNSType(String type) {\r
367         if (ToolUtil.isTrimedEmptyString(type)) {\r
368             return false;\r
369         }\r
370         return type.toUpperCase().contains(".NS");\r
371     }\r
372 }\r