2 * Copyright © 2016-2017 European Support Limited
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 package org.openecomp.sdc.validation.impl.validators;
19 import org.apache.commons.collections4.CollectionUtils;
20 import org.openecomp.core.utilities.CommonMethods;
21 import org.openecomp.core.validation.ErrorMessageCode;
22 import org.openecomp.core.validation.errors.ErrorMessagesFormatBuilder;
23 import org.openecomp.core.validation.types.GlobalValidationContext;
24 import org.openecomp.sdc.common.errors.Messages;
25 import org.openecomp.sdc.common.utils.SdcCommon;
26 import org.openecomp.sdc.datatypes.error.ErrorLevel;
27 import org.openecomp.sdc.heat.datatypes.manifest.FileData;
28 import org.openecomp.sdc.heat.datatypes.manifest.ManifestContent;
29 import org.openecomp.sdc.heat.datatypes.model.HeatOrchestrationTemplate;
30 import org.openecomp.sdc.heat.datatypes.model.HeatResourcesTypes;
31 import org.openecomp.sdc.heat.datatypes.model.ResourceReferenceFunctions;
32 import org.openecomp.sdc.heat.services.HeatStructureUtil;
33 import org.openecomp.sdc.heat.services.manifest.ManifestUtil;
34 import org.openecomp.sdc.logging.api.Logger;
35 import org.openecomp.sdc.logging.api.LoggerFactory;
36 import org.openecomp.sdc.logging.context.impl.MdcDataDebugMessage;
37 import org.openecomp.sdc.logging.types.LoggerErrorDescription;
38 import org.openecomp.sdc.logging.types.LoggerTragetServiceName;
39 import org.openecomp.sdc.validation.Validator;
40 import org.openecomp.sdc.validation.util.ValidationUtil;
42 import java.util.HashSet;
46 public class SharedResourceGuideLineValidator implements Validator {
47 private static final MdcDataDebugMessage MDC_DATA_DEBUG_MESSAGE = new MdcDataDebugMessage();
48 private static final Logger LOGGER = LoggerFactory.getLogger(
49 SharedResourceGuideLineValidator.class);
50 private static final ErrorMessageCode ERROR_CODE_SRG_1 = new ErrorMessageCode("SRG1");
51 private static final ErrorMessageCode ERROR_CODE_SRG_2 = new ErrorMessageCode("SRG2");
52 private static final ErrorMessageCode ERROR_CODE_SRG_3 = new ErrorMessageCode("SRG3");
53 private static final ErrorMessageCode ERROR_CODE_SRG_4 = new ErrorMessageCode("SRG4");
54 private static final ErrorMessageCode ERROR_CODE_SRG_5 = new ErrorMessageCode("SRG5");
55 private static final ErrorMessageCode ERROR_CODE_SRG_6 = new ErrorMessageCode("SRG6");
58 public void validate(GlobalValidationContext globalContext) {
59 ManifestContent manifestContent;
61 manifestContent = ValidationUtil.validateManifest(globalContext);
62 } catch (Exception exception) {
63 LOGGER.error("Fialed to check Validation PreCondition ",exception);
67 Set<String> baseFiles = validateManifest(manifestContent, globalContext);
69 Map<String, FileData.Type> fileTypeMap = ManifestUtil.getFileTypeMap(manifestContent);
70 globalContext.getFiles().stream()
71 .filter(fileName -> FileData
72 .isHeatFile(fileTypeMap.get(fileName)))
73 .forEach(fileName -> validate(fileName,
74 fileTypeMap, baseFiles, globalContext));
79 private Set<String> validateManifest(ManifestContent manifestContent,
80 GlobalValidationContext globalContext) {
81 MDC_DATA_DEBUG_MESSAGE.debugEntryMessage("file", SdcCommon.MANIFEST_NAME);
82 Set<String> baseFiles = ManifestUtil.getBaseFiles(manifestContent);
83 if (baseFiles == null || baseFiles.isEmpty()) {
84 globalContext.addMessage(
85 SdcCommon.MANIFEST_NAME,
87 ErrorMessagesFormatBuilder
88 .getErrorWithParameters(ERROR_CODE_SRG_3,Messages
89 .MISSIN_BASE_HEAT_FILE.getErrorMessage()),
90 LoggerTragetServiceName.VALIDATE_BASE_FILE,
91 LoggerErrorDescription.MISSING_BASE_HEAT);
92 } else if (baseFiles.size() > 1) {
93 String baseFileList = getElementListAsString(baseFiles);
94 globalContext.addMessage(
95 SdcCommon.MANIFEST_NAME,
97 ErrorMessagesFormatBuilder
98 .getErrorWithParameters(ERROR_CODE_SRG_4,Messages
99 .MULTI_BASE_HEAT_FILE.getErrorMessage(),
101 LoggerTragetServiceName.VALIDATE_BASE_FILE,
102 LoggerErrorDescription.MULTI_BASE_HEAT);
104 MDC_DATA_DEBUG_MESSAGE.debugExitMessage("file", SdcCommon.MANIFEST_NAME);
108 private static String getElementListAsString(Set<String> elementCollection) {
110 + CommonMethods.collectionToCommaSeparatedString(elementCollection)
114 private void validate(String fileName, Map<String, FileData.Type> fileTypeMap,
115 Set<String> baseFiles, GlobalValidationContext globalContext) {
116 globalContext.setMessageCode(ERROR_CODE_SRG_5);
117 HeatOrchestrationTemplate
118 heatOrchestrationTemplate = ValidationUtil
119 .checkHeatOrchestrationPreCondition(fileName, globalContext);
120 if (heatOrchestrationTemplate == null) {
124 validateBaseFile(fileName, baseFiles, heatOrchestrationTemplate, globalContext);
125 validateHeatVolumeFile(fileName, fileTypeMap, heatOrchestrationTemplate, globalContext);
129 private void validateBaseFile(String fileName, Set<String> baseFiles,
130 HeatOrchestrationTemplate heatOrchestrationTemplate,
131 GlobalValidationContext globalContext) {
134 MDC_DATA_DEBUG_MESSAGE.debugEntryMessage("file", fileName);
136 if (baseFiles == null || !baseFiles.contains(fileName)) {
137 MDC_DATA_DEBUG_MESSAGE.debugExitMessage("file", fileName);
141 //if no resources exist return
142 if (heatOrchestrationTemplate.getResources() == null
143 || heatOrchestrationTemplate.getResources().size() == 0) {
144 MDC_DATA_DEBUG_MESSAGE.debugExitMessage("file", fileName);
148 Set<String> expectedExposedResources = new HashSet<>();
149 heatOrchestrationTemplate.getResources()
152 .filter(entry -> ValidationUtil.isExpectedToBeExposed(entry.getValue().getType()))
153 .forEach(entry -> expectedExposedResources.add(entry.getKey()));
154 Set<String> actualExposedResources = new HashSet<>();
156 if (heatOrchestrationTemplate.getOutputs() != null) {
157 globalContext.setMessageCode(ERROR_CODE_SRG_6);
158 heatOrchestrationTemplate.getOutputs().entrySet()
160 .filter(entry -> isPropertyValueGetResource(fileName, entry.getValue().getValue(),
162 .forEach(entry -> actualExposedResources.add(
163 getResourceIdFromPropertyValue(fileName, entry.getValue().getValue(),
166 ValidationUtil.removeExposedResourcesCalledByGetResource(fileName, actualExposedResources,
167 heatOrchestrationTemplate, globalContext);
169 actualExposedResources.forEach(expectedExposedResources::remove);
171 if (CollectionUtils.isNotEmpty(expectedExposedResources)) {
172 expectedExposedResources
174 .forEach(name -> globalContext.addMessage(
176 ErrorLevel.WARNING, ErrorMessagesFormatBuilder
177 .getErrorWithParameters(ERROR_CODE_SRG_1,Messages
178 .RESOURCE_NOT_DEFINED_IN_OUTPUT.getErrorMessage(),
180 LoggerTragetServiceName.VALIDATE_BASE_FILE,
181 LoggerErrorDescription.RESOURCE_NOT_DEFINED_AS_OUTPUT));
184 MDC_DATA_DEBUG_MESSAGE.debugExitMessage("file", fileName);
187 private void validateHeatVolumeFile(String fileName, Map<String, FileData.Type> fileTypeMap,
188 HeatOrchestrationTemplate heatOrchestrationTemplate,
189 GlobalValidationContext globalContext) {
192 MDC_DATA_DEBUG_MESSAGE.debugEntryMessage("file", fileName);
194 //if not heat volume return
195 if (!fileTypeMap.get(fileName).equals(FileData.Type.HEAT_VOL)) {
196 MDC_DATA_DEBUG_MESSAGE.debugExitMessage("file", fileName);
200 //if no resources exist return
201 if (heatOrchestrationTemplate.getResources() == null
202 || heatOrchestrationTemplate.getResources().size() == 0) {
203 MDC_DATA_DEBUG_MESSAGE.debugExitMessage("file", fileName);
207 Set<String> expectedExposedResources = new HashSet<>();
208 Set<String> actualExposedResources = new HashSet<>();
209 heatOrchestrationTemplate.getResources()
212 .filter(entry -> entry.getValue().getType()
213 .equals(HeatResourcesTypes.CINDER_VOLUME_RESOURCE_TYPE.getHeatResource()))
214 .forEach(entry -> expectedExposedResources.add(entry.getKey()));
216 if (heatOrchestrationTemplate.getOutputs() != null) {
217 globalContext.setMessageCode(ERROR_CODE_SRG_6);
218 heatOrchestrationTemplate.getOutputs().entrySet()
220 .filter(entry -> isPropertyValueGetResource(fileName, entry.getValue().getValue(),
222 .forEach(entry -> actualExposedResources.add(
223 getResourceIdFromPropertyValue(fileName, entry.getValue().getValue(),
227 actualExposedResources.forEach(expectedExposedResources::remove);
229 if (CollectionUtils.isNotEmpty(expectedExposedResources)) {
230 expectedExposedResources
232 .forEach(name -> globalContext.addMessage(
234 ErrorLevel.WARNING, ErrorMessagesFormatBuilder
235 .getErrorWithParameters(ERROR_CODE_SRG_2,Messages
236 .VOLUME_HEAT_NOT_EXPOSED.getErrorMessage(), name),
237 LoggerTragetServiceName.VALIDATE_VOLUME_FILE,
238 LoggerErrorDescription.VOLUME_FILE_NOT_EXPOSED));
241 MDC_DATA_DEBUG_MESSAGE.debugExitMessage("file", fileName);
245 private boolean isPropertyValueGetResource(String filename, Object value,
246 GlobalValidationContext globalContext) {
247 Set<String> referenceValues = HeatStructureUtil.getReferencedValuesByFunctionName(filename,
248 ResourceReferenceFunctions.GET_RESOURCE.getFunction(), value, globalContext);
249 return referenceValues != null && (CollectionUtils.isNotEmpty(referenceValues));
252 private String getResourceIdFromPropertyValue(String filename, Object value,
253 GlobalValidationContext globalContext) {
254 Set<String> referenceValues = HeatStructureUtil.getReferencedValuesByFunctionName(filename,
255 ResourceReferenceFunctions.GET_RESOURCE.getFunction(), value, globalContext);
256 if (referenceValues != null && CollectionUtils.isNotEmpty(referenceValues)) {
257 return (String) referenceValues.toArray()[0];