Controller Blueprints MS
[ccsdk/cds.git] / ms / controllerblueprints / modules / resource-dict / src / main / java / org / onap / ccsdk / apps / controllerblueprints / resource / dict / validator / ResourceAssignmentValidator.java
1 /*\r
2  * Copyright © 2017-2018 AT&T Intellectual Property.\r
3  *\r
4  * Licensed under the Apache License, Version 2.0 (the "License");\r
5  * you may not use this file except in compliance with the License.\r
6  * You may obtain a copy of the License at\r
7  *\r
8  *     http://www.apache.org/licenses/LICENSE-2.0\r
9  *\r
10  * Unless required by applicable law or agreed to in writing, software\r
11  * distributed under the License is distributed on an "AS IS" BASIS,\r
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
13  * See the License for the specific language governing permissions and\r
14  * limitations under the License.\r
15  */\r
16 \r
17 package org.onap.ccsdk.apps.controllerblueprints.resource.dict.validator;\r
18 \r
19 import org.apache.commons.lang3.StringUtils;\r
20 import org.apache.commons.lang3.text.StrBuilder;\r
21 import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintException;\r
22 import org.onap.ccsdk.apps.controllerblueprints.core.ConfigModelConstant;\r
23 import org.onap.ccsdk.apps.controllerblueprints.core.data.CapabilityAssignment;\r
24 import org.onap.ccsdk.apps.controllerblueprints.core.data.NodeTemplate;\r
25 import org.onap.ccsdk.apps.controllerblueprints.core.utils.JacksonUtils;\r
26 import org.onap.ccsdk.apps.controllerblueprints.core.utils.TopologicalSortingUtils;\r
27 import org.onap.ccsdk.apps.controllerblueprints.resource.dict.ResourceAssignment;\r
28 import org.slf4j.Logger;\r
29 import org.slf4j.LoggerFactory;\r
30 \r
31 import java.util.*;\r
32 /**\r
33  *\r
34  * ResourceAssignmentValidator.java Purpose:\r
35  * @author Brinda Santh\r
36  */\r
37 public class ResourceAssignmentValidator {\r
38     private static final Logger log = LoggerFactory.getLogger(ResourceAssignmentValidator.class);\r
39     private List<ResourceAssignment> assignments;\r
40     private Map<String, ResourceAssignment> resourceAssignmentMap = new HashMap();\r
41     private StrBuilder validationMessage = new StrBuilder();\r
42 \r
43     public ResourceAssignmentValidator(List<ResourceAssignment> assignments) {\r
44         this.assignments = assignments;\r
45     }\r
46 \r
47     public ResourceAssignmentValidator(NodeTemplate nodeTemplate) throws BluePrintException {\r
48 \r
49         if (nodeTemplate != null && nodeTemplate.getCapabilities() != null) {\r
50             CapabilityAssignment capabilityAssignment =\r
51                     nodeTemplate.getCapabilities().get(ConfigModelConstant.CAPABILITY_PROPERTY_MAPPING);\r
52             if (capabilityAssignment != null && capabilityAssignment.getProperties() != null) {\r
53                 Object mappingObject =\r
54                         capabilityAssignment.getProperties().get(ConfigModelConstant.CAPABILITY_PROPERTY_MAPPING);\r
55                 if (mappingObject != null) {\r
56                     String mappingContent = JacksonUtils.getJson(mappingObject);\r
57                     if (StringUtils.isNotBlank(mappingContent)) {\r
58                         this.assignments =\r
59                                 JacksonUtils.getListFromJson(mappingContent, ResourceAssignment.class);\r
60                     } else {\r
61                         validationMessage\r
62                                 .appendln(String.format("Failed to transform Mapping Content (%s) ", mappingContent));\r
63                         throw new BluePrintException(\r
64                                 String.format("Failed to transform Mapping Content (%s) ", mappingContent));\r
65                     }\r
66                 }\r
67             }\r
68         }\r
69     }\r
70 \r
71     /**\r
72      * This is a validateResourceAssignment to validate the Topology Template\r
73      *\r
74      * @return boolean\r
75      * @throws BluePrintException\r
76      */\r
77     public boolean validateResourceAssignment() throws BluePrintException {\r
78         if (assignments != null && !assignments.isEmpty()) {\r
79             validateDuplicateDictionaryKeys();\r
80             validateCyclicDependency();\r
81             if (validationMessage.length() > 0) {\r
82                 throw new BluePrintException("Resource Assignment Validation :" + validationMessage.toString());\r
83             }\r
84         }\r
85         return true;\r
86     }\r
87 \r
88     @SuppressWarnings("squid:S3776")\r
89     private void validateDuplicateDictionaryKeys() {\r
90         this.assignments.forEach(resourceMapping -> {\r
91             if (resourceMapping != null) {\r
92                 if (!resourceAssignmentMap.containsKey(resourceMapping.getName())) {\r
93                     resourceAssignmentMap.put(resourceMapping.getName(), resourceMapping);\r
94                 } else {\r
95                     validationMessage.appendln(String.format("Duplicate Assignment Template Key (%s) is Present",\r
96                             resourceMapping.getName()));\r
97                 }\r
98             }\r
99         });\r
100 \r
101         if (!assignments.isEmpty()) {\r
102             Set<String> uniqueSet = new HashSet<>();\r
103             for (ResourceAssignment resourceAssignment : assignments) {\r
104                 if (resourceAssignment != null) {\r
105                     boolean added = uniqueSet.add(resourceAssignment.getDictionaryName());\r
106                     if (!added) {\r
107                         validationMessage.appendln(\r
108                                 String.format("Duplicate Assignment Dictionary Key (%s) present with Template Key (%s)",\r
109                                         resourceAssignment.getDictionaryName(), resourceAssignment.getName()));\r
110                     }\r
111                 }\r
112             }\r
113         }\r
114     }\r
115 \r
116     private void validateCyclicDependency() {\r
117         TopologicalSortingUtils<ResourceAssignment> topologySorting = new TopologicalSortingUtils<>();\r
118         this.resourceAssignmentMap.forEach((mappingKey, mapping) -> {\r
119             if (mapping != null) {\r
120                 if (mapping.getDependencies() != null && !mapping.getDependencies().isEmpty()) {\r
121                     for (String dependency : mapping.getDependencies()) {\r
122                         topologySorting.add(resourceAssignmentMap.get(dependency), mapping);\r
123                     }\r
124                 } else {\r
125                     topologySorting.add(null, mapping);\r
126                 }\r
127             }\r
128         });\r
129 \r
130         if (!topologySorting.isDag()) {\r
131             String graph = getTopologicalGraph(topologySorting);\r
132             validationMessage.appendln("Cyclic Dependency :" + graph);\r
133         }\r
134     }\r
135 \r
136 \r
137     public String getTopologicalGraph(TopologicalSortingUtils<ResourceAssignment> topologySorting) {\r
138         StringBuilder s = new StringBuilder();\r
139         if (topologySorting != null) {\r
140             Map<ResourceAssignment, List<ResourceAssignment>> neighbors = topologySorting.getNeighbors();\r
141 \r
142             neighbors.forEach((v, vs) -> {\r
143                 if (v == null) {\r
144                     s.append("\n    * -> [");\r
145                     List<ResourceAssignment> links = vs;\r
146                     for (ResourceAssignment resourceAssignment : links) {\r
147                         s.append("(" + resourceAssignment.getDictionaryName() + ":" + resourceAssignment.getName()\r
148                                 + "),");\r
149                     }\r
150                     s.append("]");\r
151                 } else {\r
152                     s.append("\n    (" + v.getDictionaryName() + ":" + v.getName() + ") -> [");\r
153                     List<ResourceAssignment> links = vs;\r
154                     for (ResourceAssignment resourceAssignment : links) {\r
155                         s.append("(" + resourceAssignment.getDictionaryName() + ":" + resourceAssignment.getName()\r
156                                 + "),");\r
157                     }\r
158                     s.append("]");\r
159                 }\r
160             });\r
161         }\r
162         return s.toString();\r
163     }\r
164 }\r