2 * ============LICENSE_START=======================================================
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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=========================================================
21 package org.openecomp.sdc.translator.services.heattotosca.impl.resourcetranslation;
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.validateSubstituteMappingInConsolidationData;
34 import static org.openecomp.sdc.translator.services.heattotosca.buildconsolidationdata.ConsolidationDataTestUtil.validateVolumeInConsolidationData;
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;
70 import java.io.BufferedInputStream;
72 import java.io.FileInputStream;
73 import java.io.FileOutputStream;
74 import java.io.IOException;
76 import java.util.HashMap;
77 import java.util.HashSet;
78 import java.util.List;
81 import java.util.zip.ZipEntry;
82 import java.util.zip.ZipInputStream;
85 public class BaseResourceTranslationTest {
87 protected String inputFilesPath;
88 protected String outputFilesPath;
89 protected TranslationContext translationContext;
91 private String zipFilename = "VSP.zip";
92 private TranslationService translationService;
93 private File translatedZipFile;
95 private Map<String, byte[]> expectedResultMap = new HashMap<>();
96 private Set<String> expectedResultFileNameSet = new HashSet<>();
98 private final String MANIFEST_NAME = SdcCommon.MANIFEST_NAME;
99 private String validationFilename = "validationOutput.json";
102 public void setUp() throws IOException {
103 initTranslatorAndTranslate();
106 protected void initTranslatorAndTranslate() throws IOException {
107 translationService = new TranslationService();
108 translationContext = new TranslationContext();
109 translatedZipFile = translateZipFile();
112 protected void testTranslation() throws IOException {
114 URL url = BaseResourceTranslationTest.class.getResource(outputFilesPath);
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));
127 try (FileInputStream fis = new FileInputStream(translatedZipFile);
128 ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis))) {
134 while ((entry = zis.getNextEntry()) != null) {
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);
143 expectedResultFileNameSet.remove(name);
146 if (expectedResultFileNameSet.isEmpty()) {
147 expectedResultFileNameSet.forEach(System.out::println);
150 assertEquals(0, expectedResultFileNameSet.size());
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(
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());
169 File file = new File(path + "/" + zipFilename);
170 file.createNewFile();
172 try (FileOutputStream fos = new FileOutputStream(file)) {
173 ToscaFileOutputService toscaFileOutputService = new ToscaFileOutputServiceCsarImpl();
175 toscaFileOutputService.createOutputFile(translatorOutput.getToscaServiceModel(), null));
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())));
187 return sb.toString();
190 private String getErrorList(List<ErrorMessage> errors) {
191 StringBuilder sb = new StringBuilder();
193 error -> sb.append(error.getMessage()).append("[").append(error.getLevel()).append("]")
194 .append(System.lineSeparator()));
195 return sb.toString();
198 public void addFilesToTranslator(TranslationContext translationContext, String path)
200 File manifestFile = new File(path);
201 File[] files = manifestFile.listFiles();
204 Assert.assertNotNull("manifest files is empty", files);
206 for (File file : files) {
208 try (FileInputStream fis = new FileInputStream(file)) {
210 fileContent = FileUtils.toByteArray(fis);
212 if (file.getName().equals(MANIFEST_NAME)) {
213 addManifest(translationContext, MANIFEST_NAME, fileContent);
215 if (!file.getName().equals(zipFilename) && (!file.getName().equals(validationFilename))) {
216 addFile(translationContext, file.getName(), fileContent);
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
235 public static void addFile(TranslationContext translationContext,
236 String name, byte[] content) {
237 translationContext.addFile(name, content);
240 private static void addFilesFromManifestToTranslationContextManifestFilesMap(TranslationContext
241 translationContext, List<FileData> fileDataListFromManifest) {
242 for (FileData fileFromManfiest : fileDataListFromManifest) {
243 translationContext.addManifestFile(fileFromManfiest.getFile(), fileFromManfiest.getType());
247 public void validateSubsMappingInConsolidationData(){
248 ConsolidationData consolidationData = translationContext.getConsolidationData();
249 Map<String, ServiceTemplate> expectedServiceTemplateModels = TestUtils.getServiceTemplates
251 Assert.assertNotNull(consolidationData);
252 validateSubstituteMappingInConsolidationData(consolidationData,expectedServiceTemplateModels);
255 public void validateComputeTemplateConsolidationData(ConsolidationDataValidationType
258 ConsolidationData consolidationData = translationContext.getConsolidationData();
259 Map<String, ServiceTemplate> expectedServiceTemplateModels = TestUtils.getServiceTemplates
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);
280 Set<String> computeNodeTemplateIds = typeComputeConsolidationData
281 .getAllComputeNodeTemplateIds();
282 Assert.assertNotNull(computeNodeTemplateIds);
283 Assert.assertNotEquals(computeNodeTemplateIds.size(), 0);
285 for(String computeNodeTemplateId : computeNodeTemplateIds) {
286 ComputeTemplateConsolidationData computeTemplateConsolidationData =
287 typeComputeConsolidationData.getComputeTemplateConsolidationData
288 (computeNodeTemplateId);
289 switch(validationType){
291 validateGroupsInConsolidationData(computeNodeTemplateId,
292 computeTemplateConsolidationData, expectedServiceTemplate);
295 validatePortsInConsolidationData(computeNodeTemplateId,
296 computeTemplateConsolidationData,
297 expectedServiceTemplate);
299 case VALIDATE_VOLUME:
300 validateVolumeInConsolidationData(computeNodeTemplateId,
301 computeTemplateConsolidationData, expectedServiceTemplate, testName);
303 case VALIDATE_CONNECTIVITY:
304 validateComputeConnectivityIn(computeTemplateConsolidationData,
305 expectedServiceTemplate);
306 validateComputeConnectivityOut(computeNodeTemplateId,computeTemplateConsolidationData,
307 expectedServiceTemplate);
309 case VALIDATE_DEPENDS_ON:
310 validateDependsOnInConsolidationData(computeNodeTemplateId,
311 computeTemplateConsolidationData,
312 expectedServiceTemplate, testName);
320 public void validateGetAttribute(String testName){
321 Map<String, ServiceTemplate> expectedServiceTemplateModels = TestUtils.getServiceTemplates
323 validateGetAttr(translationContext,expectedServiceTemplateModels,testName);
326 public void validateNestedTemplateConsolidationData(String testName){
327 validateNestedConsolidationData(translationContext, testName);
330 public void validatePortTemplateConsolidationData(ConsolidationDataValidationType
333 ConsolidationData consolidationData = translationContext.getConsolidationData();
334 Map<String, ServiceTemplate> expectedServiceTemplateModels = TestUtils.getServiceTemplates
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);
349 Set<String> portNodeTemplateIds = filePortConsolidationData.getAllPortNodeTemplateIds();
350 Assert.assertNotNull(portNodeTemplateIds);
351 Assert.assertNotEquals(portNodeTemplateIds.size(), 0);
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);