2 * Copyright 2016 [ZTE] and others.
\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
8 * http://www.apache.org/licenses/LICENSE-2.0
\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
16 package org.openo.commontosca.catalog.model.parser;
\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
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
51 public class ToscaYamlModelParser extends AbstractModelParser{
\r
53 private static final Object TOSCA_META_FIELD_ENTRY_DEFINITIONS = "Entry-Definitions";
\r
59 public String parse(String packageId, String fileLocation)
\r
60 throws CatalogResourceException {
\r
61 ParseYamlResult result = YamlParseServiceConsumer.getServiceTemplates(comboRequest(fileLocation));
\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
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
74 TemplateManager.getInstance().addServiceTemplate(
\r
75 TemplateDataHelper.convert2TemplateData(st,
\r
76 ToolUtil.toJson(result), ntList));
\r
78 SubstitutionMapping stm = parseSubstitutionMapping(
\r
79 st.getServiceTemplateId(), result);
\r
81 TemplateManager.getInstance().addServiceTemplateMapping(
\r
82 TemplateDataHelper.convert2TemplateMappingData(stm));
\r
85 return st.getServiceTemplateId();
\r
89 * @param fileLocation
\r
91 * @throws CatalogResourceException
\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
98 ZipInputStream zin = null;
\r
99 BufferedReader br = null;
\r
101 InputStream in = new BufferedInputStream(new FileInputStream(
\r
103 zin = new ZipInputStream(in);
\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
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
125 } catch (IOException e) {
\r
126 throw new CatalogResourceException("Parse Tosca Meta Fail.", e);
\r
128 closeStreamAndReader(zin, br);
\r
134 private void closeStreamAndReader(ZipInputStream zin, BufferedReader br) {
\r
138 } catch (IOException e) {
\r
144 } catch (IOException e) {
\r
149 private ParseYamlRequestParemeter comboRequest(String fileLocation) {
\r
150 ParseYamlRequestParemeter request = new ParseYamlRequestParemeter();
\r
151 request.setPath(fileLocation);
\r
156 * @param serviceTemplateId
\r
160 private SubstitutionMapping parseSubstitutionMapping(
\r
161 String serviceTemplateId, ParseYamlResult result) {
\r
162 String type = getSubstitutionMappingType(result);
\r
163 if (ToolUtil.isTrimedEmptyString(type)) {
\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
173 private ServiceTemplate parseServiceTemplate(String packageId,
\r
174 ParseYamlResult result, String stDownloadUri) {
\r
175 ServiceTemplate st = new ServiceTemplate();
\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
189 st.setOperations(operations);
\r
197 private ServiceTemplateOperation[] parseOperations(List<ParseYamlResult.Plan> planList) {
\r
198 if (planList == null || planList.isEmpty()) {
\r
199 return new ServiceTemplateOperation[0];
\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
215 return opList.toArray(new ServiceTemplateOperation[0]);
\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
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
233 return retList.toArray(new InputParameter[0]);
\r
236 private InputParameter[] parseInputs(ParseYamlResult result) {
\r
237 List<ParseYamlResult.TopologyTemplate.Input> inputList = result.getTopologyTemplate().getInputs();
\r
238 if(inputList == null){
\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
247 return retList.toArray(new InputParameter[0]);
\r
254 private EnumDataType getEnumDataType(String type) {
\r
255 if (EnumDataType.INTEGER.toString().equalsIgnoreCase(type)) {
\r
256 return EnumDataType.INTEGER;
\r
259 if (EnumDataType.FLOAT.toString().equalsIgnoreCase(type)) {
\r
260 return EnumDataType.FLOAT;
\r
263 if (EnumDataType.BOOLEAN.toString().equalsIgnoreCase(type)) {
\r
264 return EnumDataType.BOOLEAN;
\r
267 return EnumDataType.STRING;
\r
272 * @param templateId
\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
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
301 private List<RelationShip> parseNodeTemplateRelationShip(
\r
302 List<ParseYamlResult.TopologyTemplate.NodeTemplate.Relationship> relationshipList) {
\r
303 List<RelationShip> retList = new ArrayList<>();
\r
305 if (relationshipList == null) {
\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
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
329 if (isVNFType(type)) {
\r
330 return EnumTemplateType.VNF;
\r
333 return getTemplateTypeFromNodeTemplates(ntList);
\r
336 private String getSubstitutionMappingType(ParseYamlResult result) {
\r
337 if (result.getTopologyTemplate().getSubstitutionMappings() == null) {
\r
340 return result.getTopologyTemplate().getSubstitutionMappings()
\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
356 return EnumTemplateType.VNF;
\r
359 private boolean isVNFType(String type) {
\r
360 if (ToolUtil.isTrimedEmptyString(type)) {
\r
363 return type.toUpperCase().contains(".VNF");
\r
366 private boolean isNSType(String type) {
\r
367 if (ToolUtil.isTrimedEmptyString(type)) {
\r
370 return type.toUpperCase().contains(".NS");
\r