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