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