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.
16 package org.openecomp.sdc.validation.impl.validators;
18 import java.io.InputStream;
19 import java.util.Collection;
20 import java.util.HashSet;
21 import java.util.List;
23 import java.util.Objects;
24 import java.util.Optional;
26 import org.apache.commons.collections4.CollectionUtils;
27 import org.apache.commons.collections4.MapUtils;
28 import org.onap.sdc.tosca.services.YamlUtil;
29 import org.openecomp.core.validation.ErrorMessageCode;
30 import org.openecomp.core.validation.errors.ErrorMessagesFormatBuilder;
31 import org.openecomp.core.validation.types.GlobalValidationContext;
32 import org.openecomp.sdc.common.errors.Messages;
33 import org.openecomp.sdc.datatypes.error.ErrorLevel;
34 import org.openecomp.sdc.heat.datatypes.DefinedHeatParameterTypes;
35 import org.openecomp.sdc.heat.datatypes.manifest.FileData;
36 import org.openecomp.sdc.heat.datatypes.manifest.ManifestContent;
37 import org.openecomp.sdc.heat.datatypes.model.Environment;
38 import org.openecomp.sdc.heat.datatypes.model.HeatOrchestrationTemplate;
39 import org.openecomp.sdc.heat.datatypes.model.HeatPseudoParameters;
40 import org.openecomp.sdc.heat.datatypes.model.Output;
41 import org.openecomp.sdc.heat.datatypes.model.Parameter;
42 import org.openecomp.sdc.heat.datatypes.model.Resource;
43 import org.openecomp.sdc.heat.datatypes.model.ResourceReferenceFunctions;
44 import org.openecomp.sdc.heat.services.HeatStructureUtil;
45 import org.openecomp.sdc.heat.services.manifest.ManifestUtil;
46 import org.openecomp.sdc.logging.api.Logger;
47 import org.openecomp.sdc.logging.api.LoggerFactory;
48 import org.openecomp.sdc.validation.Validator;
49 import org.openecomp.sdc.validation.impl.util.HeatValidationService;
50 import org.openecomp.sdc.validation.util.ValidationUtil;
52 public class HeatValidator implements Validator {
54 // The Artifacts generated by SDC - not allowed to be in HEAT
55 static final String VF_LICENSE_MODEL_XML = "vf-license-model.xml";
56 static final String VENDOR_LICENSE_MODEL_XML = "vendor-license-model.xml";
57 static final String HEAT_META = "HEAT.meta";
58 private static final Logger LOGGER = LoggerFactory.getLogger(HeatValidator.class);
59 private static final ErrorMessageCode ERROR_CODE_HOT_1 = new ErrorMessageCode("HOT1");
60 private static final ErrorMessageCode ERROR_CODE_HOT_2 = new ErrorMessageCode("HOT2");
61 private static final ErrorMessageCode ERROR_CODE_HOT_3 = new ErrorMessageCode("HOT3");
62 private static final ErrorMessageCode ERROR_CODE_HOT_4 = new ErrorMessageCode("HOT4");
63 private static final ErrorMessageCode ERROR_CODE_HOT_5 = new ErrorMessageCode("HOT5");
64 private static final ErrorMessageCode ERROR_CODE_HOT_6 = new ErrorMessageCode("HOT6");
65 private static final ErrorMessageCode ERROR_CODE_HOT_7 = new ErrorMessageCode("HOT7");
66 private static final ErrorMessageCode ERROR_CODE_HOT_8 = new ErrorMessageCode("HOT8");
67 private static final ErrorMessageCode ERROR_CODE_HOT_9 = new ErrorMessageCode("HOT9");
68 private static final ErrorMessageCode ERROR_CODE_HOT_10 = new ErrorMessageCode("HOT10");
69 private static final ErrorMessageCode ERROR_CODE_HOT_11 = new ErrorMessageCode("HOT11");
70 private static final ErrorMessageCode ERROR_CODE_HOT_12 = new ErrorMessageCode("HOT12");
71 private static final ErrorMessageCode ERROR_CODE_HOT_13 = new ErrorMessageCode("HOT13");
72 private static final ErrorMessageCode ERROR_CODE_HOT_14 = new ErrorMessageCode("HOT14");
73 private static final ErrorMessageCode ERROR_CODE_HOT_15 = new ErrorMessageCode("HOT15");
74 private static final ErrorMessageCode ERROR_CODE_HOT_16 = new ErrorMessageCode("HOT16");
75 private static final ErrorMessageCode ERROR_CODE_HOT_17 = new ErrorMessageCode("HOT17");
76 private static final ErrorMessageCode ERROR_CODE_HOT_18 = new ErrorMessageCode("HOT18");
77 private static final Set<String> GENERATED_ARTIFACTS;
80 GENERATED_ARTIFACTS = getGeneratedArtifactNames();
83 private static void validateAllRequiredArtifactsExist(String fileName, HeatOrchestrationTemplate heatOrchestrationTemplate, Set<String> artifacts,
84 GlobalValidationContext globalContext) {
85 Collection<Resource> resourcesValues =
86 heatOrchestrationTemplate.getResources() == null ? null : heatOrchestrationTemplate.getResources().values();
87 if (CollectionUtils.isNotEmpty(resourcesValues)) {
88 for (Resource resource : resourcesValues) {
89 Collection<Object> properties = resource.getProperties() == null ? null : resource.getProperties().values();
90 validatePropertiesForAllRequiredArtifactsExist(properties, fileName, artifacts, globalContext);
95 private static void validatePropertiesForAllRequiredArtifactsExist(Collection<Object> properties, String fileName, Set<String> artifacts,
96 GlobalValidationContext globalContext) {
97 if (CollectionUtils.isNotEmpty(properties)) {
98 for (Object property : properties) {
99 if (property instanceof Map) {
100 globalContext.setMessageCode(ERROR_CODE_HOT_14);
101 Set<String> artifactNames = HeatStructureUtil
102 .getReferencedValuesByFunctionName(fileName, ResourceReferenceFunctions.GET_FILE.getFunction(), property, globalContext);
103 artifacts.addAll(artifactNames);
104 globalContext.setMessageCode(ERROR_CODE_HOT_15);
105 HeatValidationService.checkArtifactsExistence(fileName, artifactNames, globalContext);
112 private static void validateAllResourceReferencesExist(String fileName,
113 HeatOrchestrationTemplate
114 heatOrchestrationTemplate,
115 GlobalValidationContext globalContext) {
116 Set<String> resourcesNames = heatOrchestrationTemplate.getResources() == null ? null
117 : heatOrchestrationTemplate.getResources().keySet();
118 Collection<Resource> resourcesValues = heatOrchestrationTemplate.getResources() == null ? null
119 : heatOrchestrationTemplate.getResources().values();
120 Collection<Output> outputsValues = heatOrchestrationTemplate.getOutputs() == null ? null
121 : heatOrchestrationTemplate.getOutputs().values();
122 checkResourceExistenceFromResourcesMap(fileName, resourcesNames, resourcesValues,
124 checkResourceExistenceFromResourcesMap(fileName, resourcesNames, outputsValues,
128 private static void checkResourceExistenceFromResourcesMap(String fileName,
129 Set<String> resourcesNames,
130 Collection<?> valuesToSearchIn,
131 GlobalValidationContext globalContext) {
132 if (CollectionUtils.isNotEmpty(valuesToSearchIn)) {
133 for (Object value : valuesToSearchIn) {
134 if (value instanceof Resource) {
135 extractResourceProperty(fileName, resourcesNames, globalContext,
137 } else if (value instanceof Output) {
138 Output output = (Output) value;
139 Object outputsValue = output.getValue();
140 handleReferencedResources(fileName, outputsValue, resourcesNames,
147 private static void extractResourceProperty(String fileName, Set<String> resourcesNames,
148 GlobalValidationContext globalContext,
150 Collection<Object> resourcePropertiesValues =
151 value.getProperties() == null ? null : value.getProperties()
153 if (CollectionUtils.isNotEmpty(resourcePropertiesValues)) {
154 for (Object propertyValue : resourcePropertiesValues) {
155 handleReferencedResources(fileName, propertyValue, resourcesNames,
161 private static void handleReferencedResources(String fileName, Object valueToSearchReferencesIn,
162 Set<String> resourcesNames,
163 GlobalValidationContext globalContext) {
164 globalContext.setMessageCode(ERROR_CODE_HOT_13);
165 Set<String> referencedResourcesNames = HeatStructureUtil
166 .getReferencedValuesByFunctionName(fileName,
167 ResourceReferenceFunctions.GET_RESOURCE.getFunction(),
168 valueToSearchReferencesIn, globalContext);
169 if (CollectionUtils.isNotEmpty(referencedResourcesNames)) {
170 checkIfResourceReferenceExist(fileName, resourcesNames, referencedResourcesNames,
175 private static void checkIfResourceReferenceExist(String fileName,
176 Set<String> referencedResourcesNames,
177 Set<String> referencedResources,
178 GlobalValidationContext globalContext) {
179 referencedResources.stream()
180 .filter(referencedResource -> !referencedResourcesNames
181 .contains(referencedResource))
182 .forEach(referencedResource ->
183 globalContext.addMessage(fileName,
184 ErrorLevel.ERROR, ErrorMessagesFormatBuilder
185 .getErrorWithParameters(ERROR_CODE_HOT_16, Messages
186 .REFERENCED_RESOURCE_NOT_FOUND.getErrorMessage(), referencedResource)));
190 private static void validateGetParamPointToParameter(String fileName, HeatOrchestrationTemplate heatOrchestrationTemplate,
191 GlobalValidationContext globalContext) {
192 Set<String> parametersNames = heatOrchestrationTemplate.getParameters() == null ? null : heatOrchestrationTemplate.getParameters().keySet();
193 Map<String, Resource> resourcesMap = heatOrchestrationTemplate.getResources();
194 if (CollectionUtils.isNotEmpty(parametersNames) && MapUtils.isNotEmpty(resourcesMap)) {
195 for (Map.Entry<String, Resource> resourceEntry : resourcesMap.entrySet()) {
196 Resource resource = resourceEntry.getValue();
197 Map<String, Object> properties = resource.getProperties();
198 validatePropertiesForGetParamPointToParameter(properties, fileName, parametersNames, resourceEntry, globalContext);
203 private static void validatePropertiesForGetParamPointToParameter(Map<String, Object> properties, String fileName, Set<String> parametersNames,
204 Map.Entry<String, Resource> resourceEntry,
205 GlobalValidationContext globalContext) {
206 if (MapUtils.isNotEmpty(properties)) {
207 Collection<Object> propertiesValues = properties.values();
208 if (CollectionUtils.isNotEmpty(propertiesValues)) {
209 for (Object propertyObject : propertiesValues) {
210 Set<String> referencedParameterNames = HeatStructureUtil
211 .getReferencedValuesByFunctionName(fileName, "get_param", propertyObject, globalContext);
212 validateReferenceParams(fileName, resourceEntry.getKey(), parametersNames, referencedParameterNames, globalContext);
218 private static void validateReferenceParams(String fileName, String resourceName, Set<String> parametersNamesFromFile,
219 Set<String> referencedParametersNames, GlobalValidationContext globalContext) {
220 for (String parameterName : referencedParametersNames) {
221 if (!isHeatPseudoParameter(parameterName) && !parametersNamesFromFile.contains(parameterName)) {
222 globalContext.addMessage(fileName, ErrorLevel.ERROR, ErrorMessagesFormatBuilder
223 .getErrorWithParameters(ERROR_CODE_HOT_1, Messages.REFERENCED_PARAMETER_NOT_FOUND.getErrorMessage(), parameterName,
229 private static boolean isHeatPseudoParameter(String parameterName) {
230 return HeatPseudoParameters.getPseudoParameterNames().contains(parameterName);
234 private static void validateGetAttr(String fileName,
235 HeatOrchestrationTemplate heatOrchestrationTemplate,
236 GlobalValidationContext globalContext) {
237 Map<String, Output> outputMap;
238 outputMap = heatOrchestrationTemplate.getOutputs();
240 if (MapUtils.isNotEmpty(outputMap)) {
241 loopOverOutputMapAndValidateGetAttrFromNested(fileName, outputMap,
242 heatOrchestrationTemplate, globalContext);
246 private static void loopOverOutputMapAndValidateGetAttrFromNested(String fileName,
247 Map<String, Output> outputMap,
248 HeatOrchestrationTemplate
249 heatOrchestrationTemplate,
250 GlobalValidationContext
252 for (Output output : outputMap.values()) {
253 Object outputValue = output.getValue();
254 if (outputValue instanceof Map) {
255 Map<String, Object> outputValueMap = (Map<String, Object>) outputValue;
256 List<String> getAttrValue =
257 (List<String>) outputValueMap.get(
258 ResourceReferenceFunctions.GET_ATTR.getFunction());
259 handleGetAttrValueList(getAttrValue, fileName, heatOrchestrationTemplate,
266 private static void handleGetAttrValueList(List<String> getAttrValue, String fileName,
267 HeatOrchestrationTemplate heatOrchestrationTemplate,
268 GlobalValidationContext globalContext) {
269 if (!CollectionUtils.isEmpty(getAttrValue)) {
270 String resourceName = getAttrValue.get(0);
271 String attNameObject = getAttrValue.get(1);
272 if (attNameObject == null) {
275 String attName = getAttrValue.get(1);
276 String resourceType =
277 getResourceTypeFromResourcesMap(resourceName, heatOrchestrationTemplate);
279 if (Objects.nonNull(resourceType)
280 && HeatValidationService.isNestedResource(resourceType)) {
281 handleGetAttrNestedResource(fileName, globalContext, resourceName, attName,
287 private static void handleGetAttrNestedResource(String fileName,
288 GlobalValidationContext globalContext,
289 String resourceName, String attName,
290 String resourceType) {
291 Map<String, Output> nestedOutputMap;
292 HeatOrchestrationTemplate nestedHeatOrchestrationTemplate;
294 Optional<InputStream> fileContent = globalContext.getFileContent(resourceType);
295 if (fileContent.isPresent()) {
296 nestedHeatOrchestrationTemplate =
297 new YamlUtil().yamlToObject(fileContent.get(), HeatOrchestrationTemplate.class);
299 throw new Exception("The file '" + resourceType + "' has no content");
301 } catch (Exception exception) {
302 LOGGER.error("Invalid yaml file", exception);
305 nestedOutputMap = nestedHeatOrchestrationTemplate.getOutputs();
307 if (MapUtils.isEmpty(nestedOutputMap) || !nestedOutputMap.containsKey(attName)) {
308 globalContext.addMessage(fileName, ErrorLevel.ERROR, ErrorMessagesFormatBuilder
309 .getErrorWithParameters(ERROR_CODE_HOT_17, Messages
310 .GET_ATTR_NOT_FOUND.getErrorMessage(),
311 attName, resourceName));
315 private static String getResourceTypeFromResourcesMap(String resourceName,
316 HeatOrchestrationTemplate
317 heatOrchestrationTemplate) {
318 Resource resource = heatOrchestrationTemplate.getResources().get(resourceName);
319 if (Objects.nonNull(resource)) {
320 return resource.getType();
326 /* validation 17 + */
327 private static void validateEnvFile(String fileName, String envFileName, HeatOrchestrationTemplate heatOrchestrationTemplate,
328 GlobalValidationContext globalContext) {
329 Environment envContent;
330 if (!envFileName.contains(".env")) {
331 globalContext.addMessage(envFileName, ErrorLevel.ERROR, ErrorMessagesFormatBuilder
332 .getErrorWithParameters(ERROR_CODE_HOT_2, Messages.WRONG_ENV_FILE_EXTENSION.getErrorMessage(), envFileName));
334 envContent = HeatValidationService.validateEnvContent(fileName, envFileName, globalContext);
335 if (envContent != null) {
336 validateEnvContentIsSubSetOfHeatParameters(envFileName, envContent, globalContext, heatOrchestrationTemplate);
337 validateEnvParametersMatchDefinedHeatParameterTypes(envFileName, envContent, globalContext, heatOrchestrationTemplate);
341 private static void validateEnvContentIsSubSetOfHeatParameters(String envFile, Environment envContent, GlobalValidationContext globalContext,
342 HeatOrchestrationTemplate heatOrchestrationTemplate) {
343 Set<String> parametersNames = heatOrchestrationTemplate.getParameters() == null ? null : heatOrchestrationTemplate.getParameters().keySet();
344 if (MapUtils.isNotEmpty(envContent.getParameters())) {
345 if (CollectionUtils.isNotEmpty(parametersNames)) {
346 for (Map.Entry<String, Object> envEntry : envContent.getParameters().entrySet()) {
347 validateEnvEntryForvalidateEnvContentIsSubSetOfHeatParameters(envEntry, parametersNames, envFile, globalContext);
350 for (Map.Entry<String, Object> envEntry : envContent.getParameters().entrySet()) {
351 globalContext.addMessage(envFile, ErrorLevel.ERROR, ErrorMessagesFormatBuilder
352 .getErrorWithParameters(ERROR_CODE_HOT_3, Messages.ENV_INCLUDES_PARAMETER_NOT_IN_HEAT.getErrorMessage(), envFile,
359 private static void validateEnvEntryForvalidateEnvContentIsSubSetOfHeatParameters(Map.Entry<String, Object> envEntry, Set<String> parametersNames,
360 String envFile, GlobalValidationContext globalContext) {
361 String envParameter = envEntry.getKey();
362 if (parametersNames != null && !parametersNames.contains(envParameter)) {
363 globalContext.addMessage(envFile, ErrorLevel.ERROR, ErrorMessagesFormatBuilder
364 .getErrorWithParameters(ERROR_CODE_HOT_3, Messages.ENV_INCLUDES_PARAMETER_NOT_IN_HEAT.getErrorMessage(), envFile, envParameter));
368 private static void validateParameterDefaultTypeAlignWithType(String fileName, HeatOrchestrationTemplate heatOrchestrationTemplate,
369 GlobalValidationContext globalContext) {
370 Map<String, Parameter> parametersMap = heatOrchestrationTemplate.getParameters();
371 if (MapUtils.isNotEmpty(parametersMap)) {
372 for (Map.Entry<String, Parameter> parameterEntry : parametersMap.entrySet()) {
373 validateParameterEntryForParameterDefaultTypeAlignWithType(parameterEntry, fileName, globalContext);
378 private static void validateParameterEntryForParameterDefaultTypeAlignWithType(Map.Entry<String, Parameter> parameterEntry, String fileName,
379 GlobalValidationContext globalContext) {
380 Parameter parameter = parameterEntry.getValue();
381 String parameterType = parameter.getType();
382 Object parameterDefault = parameter.get_default();
383 if (parameterDefault != null && parameterType != null) {
384 boolean isValueMatchDefault = DefinedHeatParameterTypes.isValueIsFromGivenType(parameterDefault, parameterType);
385 if (!isValueMatchDefault) {
386 globalContext.addMessage(fileName, ErrorLevel.ERROR, ErrorMessagesFormatBuilder
387 .getErrorWithParameters(ERROR_CODE_HOT_4, Messages.PARAMETER_DEFAULT_VALUE_NOT_ALIGN_WITH_TYPE.getErrorMessage(),
388 parameterEntry.getKey(), parameterType));
393 private static void validateEnvParametersMatchDefinedHeatParameterTypes(String envFile, Environment envContent,
394 GlobalValidationContext globalContext,
395 HeatOrchestrationTemplate heatOrchestrationTemplate) {
396 Map<String, Parameter> heatParameters = heatOrchestrationTemplate.getParameters();
397 if (MapUtils.isNotEmpty(heatParameters) && MapUtils.isNotEmpty(envContent.getParameters())) {
398 validateEnvEntryForEnvParametersMatchDefinedHeatParameterTypes(envContent, heatParameters, envFile, globalContext);
402 private static void validateEnvEntryForEnvParametersMatchDefinedHeatParameterTypes(Environment envContent, Map<String, Parameter> heatParameters,
403 String envFile, GlobalValidationContext globalContext) {
404 for (Map.Entry<String, Object> envEntry : envContent.getParameters().entrySet()) {
405 String parameterName = envEntry.getKey();
406 Object parameterEnvValue = envEntry.getValue();
407 Parameter parameterFromHeatFile = heatParameters.get(parameterName);
408 if (parameterFromHeatFile != null) {
409 String parameterType = parameterFromHeatFile.getType();
410 if (!DefinedHeatParameterTypes.isEmptyValueInEnv(parameterEnvValue) && !DefinedHeatParameterTypes
411 .isValueIsFromGivenType(parameterEnvValue, parameterType)) {
412 globalContext.addMessage(envFile, ErrorLevel.ERROR, ErrorMessagesFormatBuilder
413 .getErrorWithParameters(ERROR_CODE_HOT_5, Messages.PARAMETER_ENV_VALUE_NOT_ALIGN_WITH_TYPE.getErrorMessage(), parameterName));
419 private static Set<String> getGeneratedArtifactNames() {
420 Set<String> predefinedArtifactNames = new HashSet<>();
421 predefinedArtifactNames.add(VF_LICENSE_MODEL_XML);
422 predefinedArtifactNames.add(VENDOR_LICENSE_MODEL_XML);
423 predefinedArtifactNames.add(HEAT_META);
424 return predefinedArtifactNames;
427 @SuppressWarnings("unchecked")
428 private static void checkResourceDependsOn(String fileName, Resource resource, Set<String> resourcesNames,
429 GlobalValidationContext globalContext) {
430 Object dependencies = resource.getDepends_on();
431 if (dependencies instanceof Collection) {
432 ((Collection<String>) dependencies).stream().filter(resourceId -> !resourcesNames.contains(resourceId)).forEach(
433 resourceId -> globalContext.addMessage(fileName, ErrorLevel.ERROR, ErrorMessagesFormatBuilder
434 .getErrorWithParameters(ERROR_CODE_HOT_7, Messages.MISSING_RESOURCE_IN_DEPENDS_ON.getErrorMessage(), resourceId)));
435 } else if (dependencies instanceof String && !resourcesNames.contains(dependencies)) {
436 globalContext.addMessage(fileName, ErrorLevel.ERROR, ErrorMessagesFormatBuilder
437 .getErrorWithParameters(ERROR_CODE_HOT_8, Messages.MISSING_RESOURCE_IN_DEPENDS_ON.getErrorMessage(), String.valueOf(dependencies)));
442 public void validate(GlobalValidationContext globalContext) {
443 ManifestContent manifestContent;
445 manifestContent = ValidationUtil.validateManifest(globalContext);
446 } catch (Exception exception) {
447 LOGGER.error("Failed to validate manifest file", exception);
450 Map<String, FileData.Type> fileTypeMap = ManifestUtil.getFileTypeMap(manifestContent);
451 Map<String, FileData> fileEnvMap = ManifestUtil.getFileAndItsEnv(manifestContent);
452 Set<String> artifacts = new HashSet<>();
453 globalContext.getFiles().stream().filter(fileName -> FileData.isHeatFile(fileTypeMap.get(fileName))).forEach(
454 fileName -> validate(fileName, fileEnvMap.get(fileName) == null ? null : fileEnvMap.get(fileName).getFile(), artifacts, globalContext));
455 Set<String> manifestArtifacts = ManifestUtil.getArtifacts(manifestContent);
456 globalContext.getFiles().stream().filter(fileName -> isManifestArtifact(manifestArtifacts, fileName) && isNotArtifact(artifacts, fileName))
457 .forEach(fileName -> {
458 globalContext.addMessage(fileName, ErrorLevel.WARNING,
459 ErrorMessagesFormatBuilder.getErrorWithParameters(ERROR_CODE_HOT_11, Messages.ARTIFACT_FILE_NOT_REFERENCED.getErrorMessage()));
460 validateGeneratedArtifact(fileName, globalContext);
464 private void validateGeneratedArtifact(String fileName, GlobalValidationContext globalContext) {
465 if (GENERATED_ARTIFACTS.contains(fileName)) {
466 globalContext.addMessage(fileName, ErrorLevel.ERROR,
467 ErrorMessagesFormatBuilder.getErrorWithParameters(ERROR_CODE_HOT_18, Messages.GENERATED_ARTIFACT_IN_USE.getErrorMessage(), fileName));
471 private boolean isManifestArtifact(Set<String> manifestArtifacts, String fileName) {
472 return manifestArtifacts.contains(fileName);
475 private boolean isNotArtifact(Set<String> artifacts, String fileName) {
476 return !artifacts.contains(fileName);
479 private void validate(String fileName, String envFileName, Set<String> artifacts, GlobalValidationContext globalContext) {
480 globalContext.setMessageCode(ERROR_CODE_HOT_12);
481 HeatOrchestrationTemplate heatOrchestrationTemplate = ValidationUtil.checkHeatOrchestrationPreCondition(fileName, globalContext);
482 if (heatOrchestrationTemplate != null) {
483 if (!(fileName.contains(".yaml") || fileName.contains(".yml"))) {
484 globalContext.addMessage(fileName, ErrorLevel.ERROR, ErrorMessagesFormatBuilder
485 .getErrorWithParameters(ERROR_CODE_HOT_6, Messages.WRONG_HEAT_FILE_EXTENSION.getErrorMessage(), fileName));
487 validateHeatBaseStructure(fileName, heatOrchestrationTemplate, globalContext);
488 validateParameterDefaultTypeAlignWithType(fileName, heatOrchestrationTemplate, globalContext);
489 validateAllResourceReferencesExist(fileName, heatOrchestrationTemplate, globalContext);
490 validateResourceDependsOn(fileName, heatOrchestrationTemplate, globalContext);
491 validateGetParamPointToParameter(fileName, heatOrchestrationTemplate, globalContext);
492 validateGetAttr(fileName, heatOrchestrationTemplate, globalContext);
493 validateAllRequiredArtifactsExist(fileName, heatOrchestrationTemplate, artifacts, globalContext);
494 if (envFileName != null) {
495 validateEnvFile(fileName, envFileName, heatOrchestrationTemplate, globalContext);
500 private void validateResourceDependsOn(String fileName, HeatOrchestrationTemplate heatOrchestrationTemplate,
501 GlobalValidationContext globalContext) {
502 Map<String, Resource> resourcesMap = heatOrchestrationTemplate.getResources();
503 if (MapUtils.isEmpty(resourcesMap)) {
506 Set<String> resourcesNames = resourcesMap.keySet();
507 resourcesMap.entrySet().stream().forEach(entry -> checkResourceDependsOn(fileName, entry.getValue(), resourcesNames, globalContext));
510 private void validateHeatBaseStructure(String fileName, HeatOrchestrationTemplate heatOrchestrationTemplate,
511 GlobalValidationContext globalContext) {
512 if (heatOrchestrationTemplate.getHeat_template_version() == null) {
513 globalContext.addMessage(fileName, ErrorLevel.ERROR, ErrorMessagesFormatBuilder
514 .getErrorWithParameters(ERROR_CODE_HOT_9, Messages.INVALID_HEAT_FORMAT_REASON.getErrorMessage(), "missing template version"));
516 if (heatOrchestrationTemplate.getResources() == null || heatOrchestrationTemplate.getResources().size() == 0) {
517 globalContext.addMessage(fileName, ErrorLevel.WARNING, ErrorMessagesFormatBuilder
518 .getErrorWithParameters(ERROR_CODE_HOT_10, Messages.INVALID_HEAT_FORMAT_REASON.getErrorMessage(),
519 "The heat file does not contain any resources"));