2 * Copyright © 2017-2018 AT&T Intellectual Property.
\r
3 * Modifications Copyright © 2018 IBM.
\r
5 * Licensed under the Apache License, Version 2.0 (the "License");
\r
6 * you may not use this file except in compliance with the License.
\r
7 * You may obtain a copy of the License at
\r
9 * http://www.apache.org/licenses/LICENSE-2.0
\r
11 * Unless required by applicable law or agreed to in writing, software
\r
12 * distributed under the License is distributed on an "AS IS" BASIS,
\r
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\r
14 * See the License for the specific language governing permissions and
\r
15 * limitations under the License.
\r
18 package org.onap.ccsdk.config.model.validator;
\r
20 import java.util.HashMap;
\r
21 import java.util.Map;
\r
22 import org.apache.commons.lang3.StringUtils;
\r
23 import org.onap.ccsdk.config.model.ConfigModelConstant;
\r
24 import org.onap.ccsdk.config.model.ConfigModelException;
\r
25 import org.onap.ccsdk.config.model.data.DataType;
\r
26 import org.onap.ccsdk.config.model.data.NodeTemplate;
\r
27 import org.onap.ccsdk.config.model.data.NodeType;
\r
28 import org.onap.ccsdk.config.model.data.PropertyDefinition;
\r
29 import org.onap.ccsdk.config.model.data.RequirementAssignment;
\r
30 import org.onap.ccsdk.config.model.data.ServiceTemplate;
\r
31 import org.onap.ccsdk.config.model.data.TopologyTemplate;
\r
32 import com.att.eelf.configuration.EELFLogger;
\r
33 import com.att.eelf.configuration.EELFManager;
\r
36 * TopologyTemplateValidator.java Purpose: Provide Configuration Generator TopologyTemplateValidator
\r
40 public class TopologyTemplateValidator {
\r
41 private static EELFLogger logger = EELFManager.getInstance().getLogger(TopologyTemplateValidator.class);
\r
42 private StringBuilder message;
\r
43 private Map<String, DataType> stDataTypes;
\r
44 private Map<String, NodeType> stNodeTypes;
\r
45 private Map<String, NodeTemplate> stNodeTemplates;
\r
46 private ServiceTemplate serviceTemplate;
\r
47 private PropertyDefinitionValidator propertyDefinitionValidator;
\r
50 * This is a TopologyTemplateValidator
\r
52 * @param serviceTemplate
\r
53 * @throws ConfigModelException
\r
55 public TopologyTemplateValidator(ServiceTemplate serviceTemplate, StringBuilder message) {
\r
56 this.serviceTemplate = serviceTemplate;
\r
57 this.message = message;
\r
58 propertyDefinitionValidator = new PropertyDefinitionValidator(this.message);
\r
59 stDataTypes = new HashMap<>();
\r
60 stNodeTypes = new HashMap<>();
\r
61 stNodeTemplates = new HashMap<>();
\r
65 private void loadInitial() {
\r
66 if (serviceTemplate != null) {
\r
68 if (serviceTemplate.getDataTypes() != null) {
\r
69 serviceTemplate.getDataTypes().forEach((dataTypeKey, dataType) -> {
\r
70 stDataTypes.put(dataTypeKey, dataType);
\r
71 logger.trace("Data Type ({}) loaded successfully.", dataTypeKey);
\r
75 if (serviceTemplate.getNodeTypes() != null) {
\r
76 serviceTemplate.getNodeTypes().forEach((nodeTypeKey, nodeType) -> {
\r
77 stNodeTypes.put(nodeTypeKey, nodeType);
\r
78 logger.trace("Node Type ({}) loaded successfully.", nodeTypeKey);
\r
82 if (serviceTemplate.getTopologyTemplate() != null) {
\r
83 TopologyTemplate topologyTemplate = serviceTemplate.getTopologyTemplate();
\r
85 if (topologyTemplate.getNodeTemplates() != null) {
\r
86 topologyTemplate.getNodeTemplates().forEach((nodeTemplateKey, nodeTemplate) -> {
\r
87 stNodeTemplates.put(nodeTemplateKey, nodeTemplate);
\r
88 logger.trace("Node Template ({}) Type loaded successfully.", nodeTemplateKey);
\r
97 * This is a validateTopologyTemplate to validate the Topology Template
\r
100 * @throws ConfigModelException
\r
102 public boolean validateTopologyTemplate() {
\r
103 if (serviceTemplate != null && serviceTemplate.getTopologyTemplate() != null) {
\r
105 checkValidInputProperties(serviceTemplate.getTopologyTemplate().getInputs());
\r
107 validateNodeTemplates(serviceTemplate.getTopologyTemplate().getNodeTemplates());
\r
112 private boolean checkValidInputProperties(Map<String, PropertyDefinition> properties) {
\r
113 if (properties != null) {
\r
114 message.append("\n Validation topology template input properties :");
\r
115 propertyDefinitionValidator.validatePropertyDefinition(stDataTypes, properties);
\r
120 @SuppressWarnings({"squid:S00112", "squid:S3776"})
\r
121 private boolean validateNodeTemplates(Map<String, NodeTemplate> nodeTemplates) {
\r
122 if (nodeTemplates != null) {
\r
123 nodeTemplates.forEach((nodeTemplateKey, nodeTemplate) -> {
\r
124 if (nodeTemplate != null) {
\r
125 message.append("\n ##### Validation Node Template (" + nodeTemplateKey + "), of type ("
\r
126 + nodeTemplate.getType() + ")");
\r
128 String nodeTypeName = nodeTemplate.getType();
\r
129 if (!stNodeTypes.containsKey(nodeTypeName)) {
\r
130 throw new RuntimeException("Node Type (" + nodeTypeName + ")not Defined.");
\r
133 if (nodeTemplate.getRequirements() != null) {
\r
134 validateNodeTemplateRequirement(nodeTemplate.getRequirements());
\r
137 // Validate Resource Assignments
\r
138 NodeType nodeType = stNodeTypes.get(nodeTypeName);
\r
139 if (nodeType != null
\r
140 && ConfigModelConstant.MODEL_TYPE_NODE_ARTIFACT.equals(nodeType.getDerivedFrom())) {
\r
141 logger.info("Validating Resource Assignment NodeTemplate ({}).", nodeTemplateKey);
\r
142 ResourceAssignmentValidator resourceAssignmentValidator;
\r
144 resourceAssignmentValidator = new ResourceAssignmentValidator(nodeTemplate);
\r
145 resourceAssignmentValidator.validateResourceAssignment();
\r
146 } catch (ConfigModelException e) {
\r
147 throw new RuntimeException(e);
\r
157 @SuppressWarnings("squid:S00112")
\r
158 private boolean validateNodeTemplateRequirement(Map<String, RequirementAssignment> requirements) {
\r
159 if (requirements != null) {
\r
160 requirements.forEach((requirementKey, requirement) -> {
\r
161 if (requirement != null) {
\r
162 String requirementnodeTypeName = requirement.getNode();
\r
163 String capabilityName = requirement.getCapability();
\r
165 checkCapabilityPresentInNodeTemplate(requirementnodeTypeName, capabilityName);
\r
166 } catch (ConfigModelException e) {
\r
167 throw new RuntimeException(e);
\r
175 private boolean checkCapabilityPresentInNodeTemplate(String nodeTemplateName, String capabilityName)
\r
176 throws ConfigModelException {
\r
177 if (StringUtils.isNotBlank(nodeTemplateName) && StringUtils.isNotBlank(capabilityName)) {
\r
179 if (!stNodeTemplates.containsKey(nodeTemplateName)) {
\r
180 throw new ConfigModelException(nodeTemplateName + " Node Template not Defined.");
\r
182 message.append("\n Node Template (" + nodeTemplateName + ") Defined.");
\r
185 NodeTemplate relationalNodeType = stNodeTemplates.get(nodeTemplateName);
\r
187 if (relationalNodeType.getCapabilities() == null) {
\r
188 throw new ConfigModelException(
\r
189 "Node Template (" + nodeTemplateName + "), doesn't have Capability Definitions.");
\r
192 if (!relationalNodeType.getCapabilities().containsKey(capabilityName)) {
\r
193 throw new ConfigModelException("Node Type (" + nodeTemplateName + ") doesn't have (" + capabilityName
\r
194 + ") Capability Definitions.");
\r
196 message.append("\n Node Template (" + nodeTemplateName + ") has (" + capabilityName
\r
197 + ") Capability Definitions.");
\r