Create new VSP, onboard from TOSCA file - UI
[sdc.git] / openecomp-be / lib / openecomp-tosca-converter-lib / openecomp-tosca-converter-core / src / test / java / org / openecomp / core / converter / impl / ToscaConverterImplTest.java
1 package org.openecomp.core.converter.impl;
2
3 import org.apache.commons.collections.CollectionUtils;
4 import org.junit.Test;
5 import org.openecomp.core.converter.ToscaConverter;
6 import org.openecomp.core.impl.ToscaConverterImpl;
7 import org.openecomp.core.utilities.file.FileContentHandler;
8 import org.openecomp.core.utilities.file.FileUtils;
9 import org.openecomp.sdc.tosca.datatypes.ToscaServiceModel;
10 import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate;
11 import org.openecomp.sdc.tosca.datatypes.model.RequirementAssignment;
12 import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate;
13 import org.openecomp.sdc.tosca.services.ToscaExtensionYamlUtil;
14 import org.openecomp.sdc.tosca.services.YamlUtil;
15
16 import java.io.File;
17 import java.io.FileInputStream;
18 import java.io.FileNotFoundException;
19 import java.io.IOException;
20 import java.io.InputStream;
21 import java.net.URL;
22 import java.nio.file.NotDirectoryException;
23 import java.util.ArrayList;
24 import java.util.HashMap;
25 import java.util.List;
26 import java.util.ListIterator;
27 import java.util.Map;
28 import java.util.Objects;
29
30 import static org.junit.Assert.assertEquals;
31 import static org.openecomp.core.converter.datatypes.Constants.globalStName;
32 import static org.openecomp.core.converter.datatypes.Constants.mainStName;
33
34 public class ToscaConverterImplTest {
35
36   private static ToscaConverter toscaConverter = new ToscaConverterImpl();
37   private static String inputFilesPath;
38   private static String outputFilesPath;
39   private static Map<String, ServiceTemplate> expectedOutserviceTemplates;
40
41
42   @Test
43   public void testConvertMainSt() throws IOException {
44     inputFilesPath = "/mock/toscaConverter/convertMainSt/in";
45     outputFilesPath = "/mock/toscaConverter/convertMainSt/out";
46
47     FileContentHandler fileContentHandler =
48         createFileContentHandlerFromInput(inputFilesPath);
49
50     expectedOutserviceTemplates = new HashMap<>();
51     loadServiceTemplates(outputFilesPath, new ToscaExtensionYamlUtil(),
52         expectedOutserviceTemplates);
53
54     ToscaServiceModel toscaServiceModel = toscaConverter.convert(fileContentHandler);
55     ServiceTemplate mainSt = toscaServiceModel.getServiceTemplates().get(mainStName);
56
57     checkSTResults(expectedOutserviceTemplates, null, mainSt);
58   }
59
60
61
62   private FileContentHandler createFileContentHandlerFromInput(String inputFilesPath)
63       throws IOException {
64     URL inputFilesUrl = this.getClass().getResource(inputFilesPath);
65     String path = inputFilesUrl.getPath();
66     File directory = new File(path);
67     File[] listFiles = directory.listFiles();
68
69     FileContentHandler fileContentHandler = new FileContentHandler();
70     insertFilesIntoFileContentHandler(listFiles, fileContentHandler);
71     return fileContentHandler;
72   }
73
74   private void insertFilesIntoFileContentHandler(File[] listFiles,
75                                                  FileContentHandler fileContentHandler)
76       throws IOException {
77     byte[] fileContent;
78     if(CollectionUtils.isEmpty(fileContentHandler.getFileList())) {
79       fileContentHandler.setFiles(new HashMap<>());
80     }
81
82     for (File file : listFiles) {
83       if(!file.isDirectory()) {
84         try (FileInputStream fis = new FileInputStream(file)) {
85           fileContent = FileUtils.toByteArray(fis);
86           fileContentHandler.addFile(file.getPath(), fileContent);
87         }
88       }else{
89         File[] currFileList = file.listFiles();
90         insertFilesIntoFileContentHandler(currFileList, fileContentHandler);
91       }
92
93     }
94   }
95
96   private void checkSTResults(
97       Map<String, ServiceTemplate> expectedOutserviceTemplates,
98       ServiceTemplate gloablSubstitutionServiceTemplate, ServiceTemplate mainServiceTemplate) {
99     YamlUtil yamlUtil = new YamlUtil();
100     if (Objects.nonNull(gloablSubstitutionServiceTemplate)) {
101       assertEquals("difference global substitution service template: ",
102           yamlUtil.objectToYaml(expectedOutserviceTemplates.get(globalStName)),
103           yamlUtil.objectToYaml(gloablSubstitutionServiceTemplate));
104     }
105     if (Objects.nonNull(mainServiceTemplate)) {
106       assertEquals("difference main service template: ",
107           yamlUtil.objectToYaml(expectedOutserviceTemplates.get(mainStName)),
108           yamlUtil.objectToYaml(mainServiceTemplate));
109     }
110   }
111
112   public static void loadServiceTemplates(String serviceTemplatesPath,
113                                           ToscaExtensionYamlUtil toscaExtensionYamlUtil,
114                                           Map<String, ServiceTemplate> serviceTemplates)
115       throws IOException {
116     URL urlFile = ToscaConverterImplTest.class.getResource(serviceTemplatesPath);
117     if (urlFile != null) {
118       File pathFile = new File(urlFile.getFile());
119       File[] files = pathFile.listFiles();
120       if (files != null) {
121         addServiceTemplateFiles(serviceTemplates, files, toscaExtensionYamlUtil);
122       } else {
123         throw new NotDirectoryException(serviceTemplatesPath);
124       }
125     } else {
126       throw new NotDirectoryException(serviceTemplatesPath);
127     }
128   }
129
130   private static void addServiceTemplateFiles(Map<String, ServiceTemplate> serviceTemplates,
131                                               File[] files,
132                                               ToscaExtensionYamlUtil toscaExtensionYamlUtil)
133       throws IOException {
134     for (File file : files) {
135       try (InputStream yamlFile = new FileInputStream(file)) {
136         ServiceTemplate serviceTemplateFromYaml =
137             toscaExtensionYamlUtil.yamlToObject(yamlFile, ServiceTemplate.class);
138         createConcreteRequirementObjectsInServiceTemplate(serviceTemplateFromYaml, toscaExtensionYamlUtil);
139         serviceTemplates.put(file.getName(), serviceTemplateFromYaml);
140         try {
141           yamlFile.close();
142         } catch (IOException ignore) {
143         }
144       } catch (FileNotFoundException e) {
145         throw e;
146       } catch (IOException e) {
147         throw e;
148       }
149     }
150   }
151
152   private static void createConcreteRequirementObjectsInServiceTemplate(ServiceTemplate
153                                                                             serviceTemplateFromYaml,
154                                                                         ToscaExtensionYamlUtil
155                                                                             toscaExtensionYamlUtil) {
156
157     if (serviceTemplateFromYaml == null
158         || serviceTemplateFromYaml.getTopology_template() == null
159         || serviceTemplateFromYaml.getTopology_template().getNode_templates() == null) {
160       return;
161     }
162
163     //Creating concrete objects
164     Map<String, NodeTemplate> nodeTemplates =
165         serviceTemplateFromYaml.getTopology_template().getNode_templates();
166     for (Map.Entry<String, NodeTemplate> entry : nodeTemplates.entrySet()) {
167       NodeTemplate nodeTemplate = entry.getValue();
168       List<Map<String, RequirementAssignment>> requirements = nodeTemplate.getRequirements();
169       List<Map<String, RequirementAssignment>> concreteRequirementList = new ArrayList<>();
170       if (requirements != null) {
171         ListIterator<Map<String, RequirementAssignment>> reqListIterator = requirements
172             .listIterator();
173         while (reqListIterator.hasNext()){
174           Map<String, RequirementAssignment> requirement = reqListIterator.next();
175           Map<String, RequirementAssignment> concreteRequirement = new HashMap<>();
176           for (Map.Entry<String, RequirementAssignment> reqEntry : requirement.entrySet()) {
177             RequirementAssignment requirementAssignment = (toscaExtensionYamlUtil
178                 .yamlToObject(toscaExtensionYamlUtil.objectToYaml(reqEntry.getValue()),
179                     RequirementAssignment.class));
180             concreteRequirement.put(reqEntry.getKey(), requirementAssignment);
181             concreteRequirementList.add(concreteRequirement);
182             reqListIterator.remove();
183           }
184         }
185         requirements.clear();
186         requirements.addAll(concreteRequirementList);
187         nodeTemplate.setRequirements(requirements);
188       }
189       System.out.println();
190       //toscaExtensionYamlUtil.yamlToObject(nodeTemplate, NodeTemplate.class);
191     }
192   }
193 }