[SDC] Onboarding 1710 rebase.
[sdc.git] / openecomp-be / lib / openecomp-sdc-translator-lib / openecomp-sdc-translator-core / src / test / java / org / openecomp / sdc / translator / services / heattotosca / impl / resourcetranslation / BaseResourceTranslationTest.java
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 static org.junit.Assert.assertEquals;
24 import static org.openecomp.sdc.translator.services.heattotosca.buildconsolidationdata.ConsolidationDataTestUtil.validateComputeConnectivityIn;
25 import static org.openecomp.sdc.translator.services.heattotosca.buildconsolidationdata.ConsolidationDataTestUtil.validateComputeConnectivityOut;
26 import static org.openecomp.sdc.translator.services.heattotosca.buildconsolidationdata.ConsolidationDataTestUtil.validateDependsOnInConsolidationData;
27 import static org.openecomp.sdc.translator.services.heattotosca.buildconsolidationdata.ConsolidationDataTestUtil.validateGetAttr;
28 import static org.openecomp.sdc.translator.services.heattotosca.buildconsolidationdata.ConsolidationDataTestUtil.validateGroupsInConsolidationData;
29 import static org.openecomp.sdc.translator.services.heattotosca.buildconsolidationdata.ConsolidationDataTestUtil.validateNestedConsolidationData;
30 import static org.openecomp.sdc.translator.services.heattotosca.buildconsolidationdata.ConsolidationDataTestUtil.validatePortConnectivityIn;
31 import static org.openecomp.sdc.translator.services.heattotosca.buildconsolidationdata.ConsolidationDataTestUtil.validatePortConnectivityOut;
32 import static org.openecomp.sdc.translator.services.heattotosca.buildconsolidationdata.ConsolidationDataTestUtil.validatePortsInConsolidationData;
33 import static org.openecomp.sdc.translator.services.heattotosca.buildconsolidationdata.ConsolidationDataTestUtil.validateNestedConsolidationDataNodeTemplateIds;
34 import static org.openecomp.sdc.translator.services.heattotosca.buildconsolidationdata.ConsolidationDataTestUtil.validateVolumeInConsolidationData;
35
36 import org.apache.commons.collections4.MapUtils;
37 import org.junit.Assert;
38 import org.junit.Before;
39 import org.openecomp.core.translator.datatypes.TranslatorOutput;
40 import org.openecomp.core.utilities.file.FileUtils;
41 import org.openecomp.core.utilities.json.JsonUtil;
42 import org.openecomp.core.validation.util.MessageContainerUtil;
43 import org.openecomp.sdc.common.errors.CoreException;
44 import org.openecomp.sdc.common.errors.ErrorCategory;
45 import org.openecomp.sdc.common.errors.ErrorCode;
46 import org.openecomp.sdc.common.utils.SdcCommon;
47 import org.openecomp.sdc.datatypes.error.ErrorLevel;
48 import org.openecomp.sdc.datatypes.error.ErrorMessage;
49 import org.openecomp.sdc.heat.datatypes.manifest.FileData;
50 import org.openecomp.sdc.heat.datatypes.manifest.ManifestContent;
51 import org.openecomp.sdc.heat.datatypes.manifest.ManifestFile;
52 import org.openecomp.sdc.logging.context.impl.MdcDataErrorMessage;
53 import org.openecomp.sdc.logging.types.LoggerConstants;
54 import org.openecomp.sdc.logging.types.LoggerErrorCode;
55 import org.openecomp.sdc.logging.types.LoggerTragetServiceName;
56 import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate;
57 import org.openecomp.sdc.tosca.services.ToscaFileOutputService;
58 import org.openecomp.sdc.tosca.services.impl.ToscaFileOutputServiceCsarImpl;
59 import org.openecomp.sdc.translator.TestUtils;
60 import org.openecomp.sdc.translator.datatypes.heattotosca.TranslationContext;
61 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.ComputeTemplateConsolidationData;
62 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.ConsolidationData;
63 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.FileComputeConsolidationData;
64 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.FilePortConsolidationData;
65 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.PortTemplateConsolidationData;
66 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.TypeComputeConsolidationData;
67 import org.openecomp.sdc.translator.services.heattotosca.TranslationService;
68 import org.openecomp.sdc.translator.services.heattotosca.buildconsolidationdata.ConsolidationDataValidationType;
69
70 import java.io.BufferedInputStream;
71 import java.io.File;
72 import java.io.FileInputStream;
73 import java.io.FileOutputStream;
74 import java.io.IOException;
75 import java.net.URL;
76 import java.util.HashMap;
77 import java.util.HashSet;
78 import java.util.List;
79 import java.util.Map;
80 import java.util.Set;
81 import java.util.zip.ZipEntry;
82 import java.util.zip.ZipInputStream;
83
84
85 public class BaseResourceTranslationTest {
86
87   protected String inputFilesPath;
88   protected String outputFilesPath;
89   protected TranslationContext translationContext;
90
91   private String zipFilename = "VSP.zip";
92   private TranslationService translationService;
93   private File translatedZipFile;
94
95   private Map<String, byte[]> expectedResultMap = new HashMap<>();
96   private Set<String> expectedResultFileNameSet = new HashSet<>();
97
98   private final String MANIFEST_NAME = SdcCommon.MANIFEST_NAME;
99   private String validationFilename = "validationOutput.json";
100
101   @Before
102   public void setUp() throws IOException {
103     initTranslatorAndTranslate();
104   }
105
106   protected void initTranslatorAndTranslate() throws IOException {
107     translationService = new TranslationService();
108     translationContext = new TranslationContext();
109     translatedZipFile = translateZipFile();
110   }
111
112   protected void testTranslation() throws IOException {
113
114     URL url = BaseResourceTranslationTest.class.getResource(outputFilesPath);
115
116     String path = url.getPath();
117     File pathFile = new File(path);
118     File[] files = pathFile.listFiles();
119     Assert.assertNotNull("manifest files is empty", files);
120     for (File expectedFile : files) {
121       expectedResultFileNameSet.add(expectedFile.getName());
122       try (FileInputStream input = new FileInputStream(expectedFile)) {
123         expectedResultMap.put(expectedFile.getName(), FileUtils.toByteArray(input));
124       }
125     }
126
127     try (FileInputStream fis = new FileInputStream(translatedZipFile);
128          ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis))) {
129       ZipEntry entry;
130       String name;
131       String expected;
132       String actual;
133
134       while ((entry = zis.getNextEntry()) != null) {
135
136         name = entry.getName()
137             .substring(entry.getName().lastIndexOf(File.separator) + 1, entry.getName().length());
138         if (expectedResultFileNameSet.contains(name)) {
139           expected = new String(expectedResultMap.get(name)).trim().replace("\r", "");
140           actual = new String(FileUtils.toByteArray(zis)).trim().replace("\r", "");
141           assertEquals("difference in file: " + name, expected, actual);
142
143           expectedResultFileNameSet.remove(name);
144         }
145       }
146       if (expectedResultFileNameSet.isEmpty()) {
147         expectedResultFileNameSet.forEach(System.out::println);
148       }
149     }
150     assertEquals(0, expectedResultFileNameSet.size());
151   }
152
153   private File translateZipFile() throws IOException {
154     URL inputFilesUrl = this.getClass().getResource(inputFilesPath);
155     String path = inputFilesUrl.getPath();
156     addFilesToTranslator(translationContext, path);
157     TranslatorOutput translatorOutput = translationService.translateHeatFiles(translationContext);
158     Assert.assertNotNull(translatorOutput);
159     if (MapUtils.isNotEmpty(translatorOutput.getErrorMessages()) && MapUtils.isNotEmpty(
160         MessageContainerUtil
161             .getMessageByLevel(ErrorLevel.ERROR, translatorOutput.getErrorMessages()))) {
162       MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
163           LoggerTragetServiceName.VALIDATE_HEAT_BEFORE_TRANSLATE, ErrorLevel.ERROR.name(),
164           LoggerErrorCode.DATA_ERROR.getErrorCode(), "Can't translate HEAT file");
165       throw new CoreException((new ErrorCode.ErrorCodeBuilder()).withMessage(
166           "Error in validation " + getErrorAsString(translatorOutput.getErrorMessages()))
167           .withId("Validation Error").withCategory(ErrorCategory.APPLICATION).build());
168     }
169     File file = new File(path + "/" + zipFilename);
170     file.createNewFile();
171
172     try (FileOutputStream fos = new FileOutputStream(file)) {
173       ToscaFileOutputService toscaFileOutputService = new ToscaFileOutputServiceCsarImpl();
174       fos.write(
175           toscaFileOutputService.createOutputFile(translatorOutput.getToscaServiceModel(), null));
176     }
177
178     return file;
179   }
180
181   private String getErrorAsString(Map<String, List<ErrorMessage>> errorMessages) {
182     StringBuilder sb = new StringBuilder();
183     errorMessages.entrySet().forEach(
184         entry -> sb.append("File:").append(entry.getKey()).append(System.lineSeparator())
185             .append(getErrorList(entry.getValue())));
186
187     return sb.toString();
188   }
189
190   private String getErrorList(List<ErrorMessage> errors) {
191     StringBuilder sb = new StringBuilder();
192     errors.forEach(
193         error -> sb.append(error.getMessage()).append("[").append(error.getLevel()).append("]")
194             .append(System.lineSeparator()));
195     return sb.toString();
196   }
197
198   public void addFilesToTranslator(TranslationContext translationContext, String path)
199       throws IOException {
200     File manifestFile = new File(path);
201     File[] files = manifestFile.listFiles();
202     byte[] fileContent;
203
204     Assert.assertNotNull("manifest files is empty", files);
205
206     for (File file : files) {
207
208       try (FileInputStream fis = new FileInputStream(file)) {
209
210         fileContent = FileUtils.toByteArray(fis);
211
212         if (file.getName().equals(MANIFEST_NAME)) {
213           addManifest(translationContext, MANIFEST_NAME, fileContent);
214         } else {
215           if (!file.getName().equals(zipFilename) && (!file.getName().equals(validationFilename))) {
216             addFile(translationContext, file.getName(), fileContent);
217           }
218         }
219       }
220     }
221   }
222
223   public static void addManifest(TranslationContext translationContext,
224                                  String name, byte[] content) {
225     ManifestContent manifestData = JsonUtil.json2Object(new String(content), ManifestContent.class);
226     ManifestFile manifest = new ManifestFile();
227     manifest.setName(name);
228     manifest.setContent(manifestData);
229     translationContext.setManifest(manifest);
230     translationContext.addFile(name, content);
231     addFilesFromManifestToTranslationContextManifestFilesMap(translationContext, manifestData
232         .getData());
233   }
234
235   public static void addFile(TranslationContext translationContext,
236                              String name, byte[] content) {
237     translationContext.addFile(name, content);
238   }
239
240   private static void addFilesFromManifestToTranslationContextManifestFilesMap(TranslationContext
241                                                                                    translationContext, List<FileData> fileDataListFromManifest) {
242     for (FileData fileFromManfiest : fileDataListFromManifest) {
243       translationContext.addManifestFile(fileFromManfiest.getFile(), fileFromManfiest.getType());
244     }
245   }
246
247   public void validateNodeTemplateIdInNestedConsolidationData(){
248     ConsolidationData consolidationData = translationContext.getConsolidationData();
249     Map<String, ServiceTemplate> expectedServiceTemplateModels = TestUtils.getServiceTemplates
250         (expectedResultMap);
251     Assert.assertNotNull(consolidationData);
252     validateNestedConsolidationDataNodeTemplateIds(consolidationData,expectedServiceTemplateModels);
253   }
254
255   public void validateComputeTemplateConsolidationData(ConsolidationDataValidationType
256                                                            validationType,
257                                                        String testName) {
258     ConsolidationData consolidationData = translationContext.getConsolidationData();
259     Map<String, ServiceTemplate> expectedServiceTemplateModels = TestUtils.getServiceTemplates
260         (expectedResultMap);
261     Assert.assertNotNull(consolidationData);
262     Assert.assertNotNull(consolidationData.getComputeConsolidationData());
263     Set<String> serviceTemplateFileNames = consolidationData.getComputeConsolidationData()
264         .getAllServiceTemplateFileNames();
265     Assert.assertNotNull(serviceTemplateFileNames);
266     for(String serviceTemplateName : serviceTemplateFileNames){
267       Assert.assertTrue(expectedServiceTemplateModels.containsKey(serviceTemplateName));
268       ServiceTemplate expectedServiceTemplate = expectedServiceTemplateModels.get
269           (serviceTemplateName);
270       FileComputeConsolidationData fileComputeConsolidationData = consolidationData
271           .getComputeConsolidationData().getFileComputeConsolidationData(serviceTemplateName);
272       Assert.assertNotNull(fileComputeConsolidationData);
273       Set<String> computeTypes = fileComputeConsolidationData.getAllComputeTypes();
274       Assert.assertNotNull(computeTypes);
275       for(String computeType : computeTypes) {
276         TypeComputeConsolidationData typeComputeConsolidationData = fileComputeConsolidationData
277             .getTypeComputeConsolidationData(computeType);
278         Assert.assertNotNull(typeComputeConsolidationData);
279
280         Set<String> computeNodeTemplateIds = typeComputeConsolidationData
281             .getAllComputeNodeTemplateIds();
282         Assert.assertNotNull(computeNodeTemplateIds);
283         Assert.assertNotEquals(computeNodeTemplateIds.size(), 0);
284
285         for(String computeNodeTemplateId : computeNodeTemplateIds) {
286           ComputeTemplateConsolidationData computeTemplateConsolidationData =
287               typeComputeConsolidationData.getComputeTemplateConsolidationData
288                   (computeNodeTemplateId);
289           switch(validationType){
290             case VALIDATE_GROUP:
291               validateGroupsInConsolidationData(computeNodeTemplateId,
292                   computeTemplateConsolidationData, expectedServiceTemplate);
293               break;
294             case VALIDATE_PORT:
295               validatePortsInConsolidationData(computeNodeTemplateId,
296                   computeTemplateConsolidationData,
297                   expectedServiceTemplate);
298               break;
299             case VALIDATE_VOLUME:
300               validateVolumeInConsolidationData(computeNodeTemplateId,
301                   computeTemplateConsolidationData, expectedServiceTemplate, testName);
302               break;
303             case VALIDATE_CONNECTIVITY:
304               validateComputeConnectivityIn(computeTemplateConsolidationData,
305                   expectedServiceTemplate);
306               validateComputeConnectivityOut(computeNodeTemplateId,computeTemplateConsolidationData,
307                   expectedServiceTemplate);
308               break;
309             case VALIDATE_DEPENDS_ON:
310               validateDependsOnInConsolidationData(computeNodeTemplateId,
311                   computeTemplateConsolidationData,
312                   expectedServiceTemplate, testName);
313               break;
314           }
315         }
316       }
317     }
318   }
319
320   public void validateGetAttribute(String testName){
321     Map<String, ServiceTemplate> expectedServiceTemplateModels = TestUtils.getServiceTemplates
322         (expectedResultMap);
323     validateGetAttr(translationContext,expectedServiceTemplateModels,testName);
324   }
325
326   public void validateNestedTemplateConsolidationData(String testName){
327     validateNestedConsolidationData(translationContext, testName);
328   }
329
330   public void validatePortTemplateConsolidationData(ConsolidationDataValidationType
331                                                         validationType,
332                                                     String testName) {
333     ConsolidationData consolidationData = translationContext.getConsolidationData();
334     Map<String, ServiceTemplate> expectedServiceTemplateModels = TestUtils.getServiceTemplates
335         (expectedResultMap);
336     Assert.assertNotNull(consolidationData);
337     Assert.assertNotNull(consolidationData.getPortConsolidationData());
338     Set<String> serviceTemplateFileNames = consolidationData.getPortConsolidationData()
339         .getAllServiceTemplateFileNames();
340     Assert.assertNotNull(serviceTemplateFileNames);
341     for(String serviceTemplateName : serviceTemplateFileNames){
342       Assert.assertTrue(expectedServiceTemplateModels.containsKey(serviceTemplateName));
343       ServiceTemplate expectedServiceTemplate = expectedServiceTemplateModels.get
344           (serviceTemplateName);
345       FilePortConsolidationData filePortConsolidationData = consolidationData
346           .getPortConsolidationData().getFilePortConsolidationData(serviceTemplateName);
347       Assert.assertNotNull(filePortConsolidationData);
348
349       Set<String> portNodeTemplateIds = filePortConsolidationData.getAllPortNodeTemplateIds();
350       Assert.assertNotNull(portNodeTemplateIds);
351       Assert.assertNotEquals(portNodeTemplateIds.size(), 0);
352
353       for(String portNodeTemplateId : portNodeTemplateIds) {
354         PortTemplateConsolidationData portTemplateConsolidationData =
355             filePortConsolidationData.getPortTemplateConsolidationData(portNodeTemplateId);
356         switch(validationType){
357           case VALIDATE_CONNECTIVITY:
358             validatePortConnectivityIn(portTemplateConsolidationData,expectedServiceTemplate);
359             validatePortConnectivityOut(portNodeTemplateId, portTemplateConsolidationData,
360                 expectedServiceTemplate);
361             break;
362         }
363       }
364     }
365   }
366 }