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