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 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;
62 import java.io.BufferedInputStream;
64 import java.io.FileInputStream;
65 import java.io.FileOutputStream;
66 import java.io.IOException;
68 import java.util.Collection;
69 import java.util.HashMap;
70 import java.util.HashSet;
71 import java.util.List;
74 import java.util.zip.ZipEntry;
75 import java.util.zip.ZipInputStream;
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;
91 public class BaseResourceTranslationTest {
93 protected String inputFilesPath;
94 protected String outputFilesPath;
95 protected TranslationContext translationContext;
97 private String zipFilename = "VSP.zip";
98 private TranslationService translationService;
99 private File translatedZipFile;
101 private Map<String, byte[]> expectedResultMap = new HashMap<>();
102 private Set<String> expectedResultFileNameSet = new HashSet<>();
104 private final String MANIFEST_NAME = SdcCommon.MANIFEST_NAME;
105 private String validationFilename = "validationOutput.json";
107 protected static TestFeatureManager manager;
110 public static void enableForwarderFeature(){
111 manager = new TestFeatureManager(ToggleableFeature.class);
112 if (!ToggleableFeature.FORWARDER_CAPABILITY.isActive()) {
113 manager.enable(ToggleableFeature.FORWARDER_CAPABILITY);
119 public static void disableForwarderFeature() {
120 manager.disable(ToggleableFeature.FORWARDER_CAPABILITY);
122 TestFeatureManagerProvider.setFeatureManager(null);
126 public void setUp() throws IOException {
127 initTranslatorAndTranslate();
130 protected void initTranslatorAndTranslate() throws IOException {
131 translationService = new TranslationService();
132 translationContext = new TranslationContext();
133 translatedZipFile = translateZipFile();
136 protected void testTranslation() throws IOException {
138 URL url = BaseResourceTranslationTest.class.getResource(outputFilesPath);
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));
151 try (FileInputStream fis = new FileInputStream(translatedZipFile);
152 ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis))) {
158 while ((entry = zis.getNextEntry()) != null) {
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);
167 expectedResultFileNameSet.remove(name);
170 if (expectedResultFileNameSet.isEmpty()) {
171 expectedResultFileNameSet.forEach(System.out::println);
174 assertEquals(0, expectedResultFileNameSet.size());
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(
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());
193 File file = new File(path + "/" + zipFilename);
194 file.createNewFile();
196 try (FileOutputStream fos = new FileOutputStream(file)) {
197 ToscaFileOutputService toscaFileOutputService = new ToscaFileOutputServiceCsarImpl();
199 toscaFileOutputService.createOutputFile(translatorOutput.getToscaServiceModel(), null));
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())));
211 return sb.toString();
214 private String getErrorList(List<ErrorMessage> errors) {
215 StringBuilder sb = new StringBuilder();
217 error -> sb.append(error.getMessage()).append("[").append(error.getLevel()).append("]")
218 .append(System.lineSeparator()));
219 return sb.toString();
222 public void addFilesToTranslator(TranslationContext translationContext, String path)
224 File manifestFile = new File(path);
225 File[] files = manifestFile.listFiles();
228 Assert.assertNotNull("manifest files is empty", files);
230 for (File file : files) {
232 try (FileInputStream fis = new FileInputStream(file)) {
234 fileContent = FileUtils.toByteArray(fis);
236 if (file.getName().equals(MANIFEST_NAME)) {
237 addManifest(translationContext, MANIFEST_NAME, fileContent);
239 if (!file.getName().equals(zipFilename) && (!file.getName().equals(validationFilename))) {
240 addFile(translationContext, file.getName(), fileContent);
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
259 public static void addFile(TranslationContext translationContext,
260 String name, byte[] content) {
261 translationContext.addFile(name, content);
264 private static void addFilesFromManifestToTranslationContextManifestFilesMap(TranslationContext
265 translationContext, List<FileData> fileDataListFromManifest) {
266 for (FileData fileFromManfiest : fileDataListFromManifest) {
267 translationContext.addManifestFile(fileFromManfiest.getFile(), fileFromManfiest.getType());
271 public void validateNodeTemplateIdInNestedConsolidationData(){
272 ConsolidationData consolidationData = translationContext.getConsolidationData();
273 Map<String, ServiceTemplate> expectedServiceTemplateModels = TestUtils.getServiceTemplates
275 Assert.assertNotNull(consolidationData);
276 validateNestedConsolidationDataNodeTemplateIds(consolidationData,expectedServiceTemplateModels);
279 public void validateComputeTemplateConsolidationData(ConsolidationDataValidationType
282 ConsolidationData consolidationData = translationContext.getConsolidationData();
283 Map<String, ServiceTemplate> expectedServiceTemplateModels = TestUtils.getServiceTemplates
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);
304 Collection<String> computeNodeTemplateIds = typeComputeConsolidationData
305 .getAllComputeNodeTemplateIds();
306 Assert.assertNotNull(computeNodeTemplateIds);
307 Assert.assertNotEquals(computeNodeTemplateIds.size(), 0);
309 for(String computeNodeTemplateId : computeNodeTemplateIds) {
310 ComputeTemplateConsolidationData computeTemplateConsolidationData =
311 typeComputeConsolidationData.getComputeTemplateConsolidationData
312 (computeNodeTemplateId);
313 switch(validationType){
315 validateGroupsInConsolidationData(computeNodeTemplateId,
316 computeTemplateConsolidationData, expectedServiceTemplate);
319 validatePortsInConsolidationData(computeNodeTemplateId,
320 computeTemplateConsolidationData,
321 expectedServiceTemplate);
323 case VALIDATE_VOLUME:
324 validateVolumeInConsolidationData(computeNodeTemplateId,
325 computeTemplateConsolidationData, expectedServiceTemplate, testName);
327 case VALIDATE_CONNECTIVITY:
328 validateComputeConnectivityIn(computeTemplateConsolidationData,
329 expectedServiceTemplate);
330 validateComputeConnectivityOut(computeNodeTemplateId,computeTemplateConsolidationData,
331 expectedServiceTemplate);
333 case VALIDATE_DEPENDS_ON:
334 validateDependsOnInConsolidationData(computeNodeTemplateId,
335 computeTemplateConsolidationData,
336 expectedServiceTemplate, testName);
344 public void validateGetAttribute(String testName){
345 Map<String, ServiceTemplate> expectedServiceTemplateModels = TestUtils.getServiceTemplates
347 validateGetAttr(translationContext,expectedServiceTemplateModels,testName);
350 public void validateNestedTemplateConsolidationData(String testName){
351 validateNestedConsolidationData(translationContext, testName);
354 public void validatePortTemplateConsolidationData(ConsolidationDataValidationType
357 ConsolidationData consolidationData = translationContext.getConsolidationData();
358 Map<String, ServiceTemplate> expectedServiceTemplateModels = TestUtils.getServiceTemplates
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);
373 Set<String> portNodeTemplateIds = filePortConsolidationData.getAllPortNodeTemplateIds();
374 Assert.assertNotNull(portNodeTemplateIds);
375 Assert.assertNotEquals(portNodeTemplateIds.size(), 0);
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);