1 package org.openecomp.sdc.validation.impl.validators;
3 import org.apache.commons.collections4.CollectionUtils;
4 import org.openecomp.sdc.validation.Validator;
5 import org.openecomp.core.validation.errors.ErrorMessagesFormatBuilder;
6 import org.openecomp.core.validation.types.GlobalValidationContext;
7 import org.openecomp.sdc.common.errors.Messages;
8 import org.openecomp.sdc.datatypes.error.ErrorLevel;
9 import org.openecomp.sdc.heat.datatypes.manifest.FileData;
10 import org.openecomp.sdc.heat.datatypes.manifest.ManifestContent;
11 import org.openecomp.sdc.heat.datatypes.model.HeatOrchestrationTemplate;
12 import org.openecomp.sdc.heat.datatypes.model.HeatResourcesTypes;
13 import org.openecomp.sdc.heat.datatypes.model.ResourceReferenceFunctions;
14 import org.openecomp.sdc.heat.services.HeatStructureUtil;
15 import org.openecomp.sdc.heat.services.manifest.ManifestUtil;
16 import org.openecomp.sdc.logging.context.impl.MdcDataDebugMessage;
17 import org.openecomp.sdc.logging.types.LoggerErrorDescription;
18 import org.openecomp.sdc.logging.types.LoggerTragetServiceName;
19 import org.openecomp.sdc.validation.util.ValidationUtil;
21 import java.util.HashSet;
26 * Created by TALIO on 2/15/2017.
28 public class SharedResourceGuideLineValidator implements Validator {
29 public static MdcDataDebugMessage mdcDataDebugMessage = new MdcDataDebugMessage();
32 public void validate(GlobalValidationContext globalContext) {
33 ManifestContent manifestContent;
35 manifestContent = ValidationUtil.checkValidationPreCondition(globalContext);
36 } catch (Exception exception) {
40 Set<String> baseFiles = ValidationUtil.validateManifest(manifestContent, globalContext);
42 Map<String, FileData.Type> fileTypeMap = ManifestUtil.getFileTypeMap(manifestContent);
43 Map<String, FileData> fileEnvMap = ManifestUtil.getFileAndItsEnv(manifestContent);
44 globalContext.getFiles().stream()
45 .filter(fileName -> FileData
46 .isHeatFile(fileTypeMap.get(fileName)))
47 .forEach(fileName -> validate(fileName,
48 fileEnvMap.get(fileName) != null ? fileEnvMap.get(fileName).getFile() : null,
49 fileTypeMap, baseFiles, globalContext));
54 private void validate(String fileName, String envFileName, Map<String, FileData.Type> fileTypeMap,
55 Set<String> baseFiles, GlobalValidationContext globalContext) {
56 HeatOrchestrationTemplate
57 heatOrchestrationTemplate = ValidationUtil.checkHeatOrchestrationPreCondition(fileName, globalContext);
58 if (heatOrchestrationTemplate == null) {
62 validateBaseFile(fileName, baseFiles, heatOrchestrationTemplate, globalContext);
63 validateHeatVolumeFile(fileName, fileTypeMap, heatOrchestrationTemplate, globalContext);
67 private void validateBaseFile(String fileName, Set<String> baseFiles,
68 HeatOrchestrationTemplate heatOrchestrationTemplate,
69 GlobalValidationContext globalContext) {
72 mdcDataDebugMessage.debugEntryMessage("file", fileName);
74 if (baseFiles == null || !baseFiles.contains(fileName)) {
75 mdcDataDebugMessage.debugExitMessage("file", fileName);
79 //if no resources exist return
80 if (heatOrchestrationTemplate.getResources() == null
81 || heatOrchestrationTemplate.getResources().size() == 0) {
82 mdcDataDebugMessage.debugExitMessage("file", fileName);
86 Set<String> expectedExposedResources = new HashSet<>();
87 Set<String> actualExposedResources = new HashSet<>();
88 heatOrchestrationTemplate.getResources()
91 .filter(entry -> ValidationUtil.isExpectedToBeExposed(entry.getValue().getType()))
92 .forEach(entry -> expectedExposedResources.add(entry.getKey()));
94 if (heatOrchestrationTemplate.getOutputs() != null) {
96 heatOrchestrationTemplate.getOutputs().entrySet()
98 .filter(entry -> isPropertyValueGetResource(fileName, entry.getValue().getValue(),
100 .forEach(entry -> actualExposedResources.add(
101 getResourceIdFromPropertyValue(fileName, entry.getValue().getValue(),
105 ValidationUtil.removeExposedResourcesCalledByGetResource(fileName, actualExposedResources,
106 heatOrchestrationTemplate, globalContext);
108 actualExposedResources.forEach(expectedExposedResources::remove);
110 if (expectedExposedResources.size() > 0) {
111 expectedExposedResources
113 .forEach(name -> globalContext.addMessage(
115 ErrorLevel.WARNING, ErrorMessagesFormatBuilder
116 .getErrorWithParameters(Messages.RESOURCE_NOT_DEFINED_IN_OUTPUT.getErrorMessage(),
118 LoggerTragetServiceName.VALIDATE_BASE_FILE,
119 LoggerErrorDescription.RESOURCE_NOT_DEFINED_AS_OUTPUT));
122 mdcDataDebugMessage.debugExitMessage("file", fileName);
125 private void validateHeatVolumeFile(String fileName, Map<String, FileData.Type> fileTypeMap,
126 HeatOrchestrationTemplate heatOrchestrationTemplate,
127 GlobalValidationContext globalContext) {
130 mdcDataDebugMessage.debugEntryMessage("file", fileName);
132 //if not heat volume return
133 if (!fileTypeMap.get(fileName).equals(FileData.Type.HEAT_VOL)) {
134 mdcDataDebugMessage.debugExitMessage("file", fileName);
138 //if no resources exist return
139 if (heatOrchestrationTemplate.getResources() == null
140 || heatOrchestrationTemplate.getResources().size() == 0) {
141 mdcDataDebugMessage.debugExitMessage("file", fileName);
145 Set<String> expectedExposedResources = new HashSet<>();
146 Set<String> actualExposedResources = new HashSet<>();
147 heatOrchestrationTemplate.getResources()
150 .filter(entry -> entry.getValue().getType()
151 .equals(HeatResourcesTypes.CINDER_VOLUME_RESOURCE_TYPE.getHeatResource()))
152 .forEach(entry -> expectedExposedResources.add(entry.getKey()));
154 if (heatOrchestrationTemplate.getOutputs() != null) {
156 heatOrchestrationTemplate.getOutputs().entrySet()
158 .filter(entry -> isPropertyValueGetResource(fileName, entry.getValue().getValue(),
160 .forEach(entry -> actualExposedResources.add(
161 getResourceIdFromPropertyValue(fileName, entry.getValue().getValue(),
165 actualExposedResources.forEach(expectedExposedResources::remove);
167 if (expectedExposedResources.size() > 0) {
168 expectedExposedResources
170 .forEach(name -> globalContext.addMessage(
172 ErrorLevel.WARNING, ErrorMessagesFormatBuilder
173 .getErrorWithParameters(Messages.VOLUME_HEAT_NOT_EXPOSED.getErrorMessage(), name),
174 LoggerTragetServiceName.VALIDATE_VOLUME_FILE,
175 LoggerErrorDescription.VOLUME_FILE_NOT_EXPOSED));
178 mdcDataDebugMessage.debugExitMessage("file", fileName);
182 private boolean isPropertyValueGetResource(String filename, Object value,
183 GlobalValidationContext globalContext) {
184 Set<String> referenceValues = HeatStructureUtil.getReferencedValuesByFunctionName(filename,
185 ResourceReferenceFunctions.GET_RESOURCE.getFunction(), value, globalContext);
186 return referenceValues != null && (referenceValues.size() > 0);
189 private String getResourceIdFromPropertyValue(String filename, Object value,
190 GlobalValidationContext globalContext) {
191 Set<String> referenceValues = HeatStructureUtil.getReferencedValuesByFunctionName(filename,
192 ResourceReferenceFunctions.GET_RESOURCE.getFunction(), value, globalContext);
193 if (referenceValues != null && CollectionUtils.isNotEmpty(referenceValues)) {
194 return (String) referenceValues.toArray()[0];