ce0bceeea7387f782401ceb6a0e31fb4fc6d5cf1
[ccsdk/cds.git] /
1 /*\r
2  * Copyright © 2017-2018 AT&T Intellectual Property.\r
3  * Modifications Copyright © 2018 IBM.\r
4  *\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
8  *\r
9  *     http://www.apache.org/licenses/LICENSE-2.0\r
10  *\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
16  */\r
17 \r
18 package org.onap.ccsdk.apps.controllerblueprints.core.service\r
19 \r
20 \r
21 import com.fasterxml.jackson.databind.JsonNode\r
22 import com.fasterxml.jackson.databind.node.NullNode\r
23 import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintConstants\r
24 import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintException\r
25 import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintProcessorException\r
26 import org.onap.ccsdk.apps.controllerblueprints.core.data.ArtifactDefinition\r
27 import org.onap.ccsdk.apps.controllerblueprints.core.data.NodeTemplate\r
28 import org.onap.ccsdk.apps.controllerblueprints.core.data.PropertyDefinition\r
29 import org.onap.ccsdk.apps.controllerblueprints.core.utils.JacksonUtils\r
30 import com.att.eelf.configuration.EELFLogger\r
31 import com.att.eelf.configuration.EELFManager\r
32 /**\r
33  *\r
34  *\r
35  * @author Brinda Santh\r
36  */\r
37 open class BluePrintRuntimeService(var bluePrintContext: BluePrintContext, var context: MutableMap<String, Any> = hashMapOf()) {\r
38 \r
39     private val log: EELFLogger = EELFManager.getInstance().getLogger(BluePrintRuntimeService::class.toString())\r
40 \r
41     /*\r
42         Get the Node Type Definition for the Node Template, Then iterate Node Type Properties and resolve the expressing\r
43      */\r
44     open fun resolveNodeTemplateProperties(nodeTemplateName: String): MutableMap<String, Any?> {\r
45         log.info("resolveNodeTemplatePropertyValues for node template ({})", nodeTemplateName)\r
46         val propertyAssignmentValue: MutableMap<String, Any?> = hashMapOf()\r
47 \r
48         val nodeTemplate: NodeTemplate = bluePrintContext.nodeTemplateByName(nodeTemplateName)\r
49 \r
50         val propertyAssignments: MutableMap<String, Any?> =\r
51                 nodeTemplate.properties as MutableMap<String, Any?>\r
52 \r
53         // Get the Node Type Definitions\r
54         val nodeTypeProperties: MutableMap<String, PropertyDefinition> =\r
55                 bluePrintContext.nodeTypeChainedProperties(nodeTemplate.type)!!\r
56 \r
57         // Iterate Node Type Properties\r
58         nodeTypeProperties.forEach { nodeTypePropertyName, nodeTypeProperty ->\r
59             // Get the Express or Value for the Node Template\r
60             val propertyAssignment: Any? = propertyAssignments[nodeTypePropertyName]\r
61 \r
62             var resolvedValue: JsonNode = NullNode.getInstance()\r
63             if (propertyAssignment != null) {\r
64                 // Resolve the Expressing\r
65                 val propertyAssignmentExpression = PropertyAssignmentService(context, this)\r
66                 resolvedValue = propertyAssignmentExpression.resolveAssignmentExpression(nodeTemplateName, nodeTypePropertyName, propertyAssignment)\r
67             } else {\r
68                 // Assign default value to the Operation\r
69                 nodeTypeProperty.defaultValue?.let { defaultValue ->\r
70                     resolvedValue = defaultValue\r
71                 }\r
72             }\r
73             // Set for Return of method\r
74             propertyAssignmentValue[nodeTypePropertyName] = resolvedValue\r
75         }\r
76         log.info("resolved property definition for node template ({}), values ({})", nodeTemplateName, propertyAssignmentValue)\r
77         return propertyAssignmentValue\r
78     }\r
79 \r
80     open fun resolveNodeTemplateInterfaceOperationInputs(nodeTemplateName: String,\r
81                                                     interfaceName: String, operationName: String): MutableMap<String, Any?> {\r
82         log.info("nodeTemplateInterfaceOperationInputsResolvedExpression for node template ({}),interface name ({}), " +\r
83                 "operationName({})", nodeTemplateName, interfaceName, operationName)\r
84 \r
85         val propertyAssignmentValue: MutableMap<String, Any?> = hashMapOf()\r
86 \r
87         val propertyAssignments: MutableMap<String, Any> =\r
88                 bluePrintContext.nodeTemplateInterfaceOperationInputs(nodeTemplateName, interfaceName, operationName) as? MutableMap<String, Any>\r
89                         ?: throw BluePrintException(String.format("failed to get input definitions for node template (%s), " +\r
90                                 "interface name (%s), operationName(%s)", nodeTemplateName, interfaceName, operationName))\r
91 \r
92         val nodeTypeName = bluePrintContext.nodeTemplateByName(nodeTemplateName).type\r
93 \r
94         val nodeTypeInterfaceOperationInputs: MutableMap<String, PropertyDefinition> =\r
95                 bluePrintContext.nodeTypeInterfaceOperationInputs(nodeTypeName, interfaceName, operationName)\r
96                         ?: throw BluePrintException(String.format("failed to get input definitions for node type (%s), " +\r
97                                 "interface name (%s), operationName(%s)", nodeTypeName, interfaceName, operationName))\r
98 \r
99         log.info("input definition for node template ({}), values ({})", nodeTemplateName, propertyAssignments)\r
100 \r
101         // Iterate Node Type Properties\r
102         nodeTypeInterfaceOperationInputs.forEach { nodeTypePropertyName, nodeTypeProperty ->\r
103             // Get the Express or Value for the Node Template\r
104             val propertyAssignment: Any? = propertyAssignments[nodeTypePropertyName]\r
105 \r
106             var resolvedValue: JsonNode = NullNode.getInstance()\r
107             if (propertyAssignment != null) {\r
108                 // Resolve the Expressing\r
109                 val propertyAssignmentExpression = PropertyAssignmentService(context, this)\r
110                 resolvedValue = propertyAssignmentExpression.resolveAssignmentExpression(nodeTemplateName, nodeTypePropertyName, propertyAssignment)\r
111             } else {\r
112                 // Assign default value to the Operation\r
113                 nodeTypeProperty.defaultValue?.let {\r
114                     resolvedValue = JacksonUtils.jsonNodeFromObject(nodeTypeProperty.defaultValue!!)\r
115                 }\r
116             }\r
117             // Set for Return of method\r
118             propertyAssignmentValue[nodeTypePropertyName] = resolvedValue\r
119         }\r
120         log.info("resolved input assignments for node template ({}), values ({})", nodeTemplateName, propertyAssignmentValue)\r
121 \r
122         return propertyAssignmentValue\r
123     }\r
124 \r
125 \r
126     open fun resolveNodeTemplateInterfaceOperationOutputs(nodeTemplateName: String,\r
127                                                      interfaceName: String, operationName: String, componentContext: MutableMap<String, Any?>) {\r
128         log.info("nodeTemplateInterfaceOperationInputsResolvedExpression for node template ({}),interface name ({}), " +\r
129                 "operationName({})", nodeTemplateName, interfaceName, operationName)\r
130 \r
131         val nodeTypeName = bluePrintContext.nodeTemplateByName(nodeTemplateName).type\r
132 \r
133         val nodeTypeInterfaceOperationOutputs: MutableMap<String, PropertyDefinition> =\r
134                 bluePrintContext.nodeTypeInterfaceOperationOutputs(nodeTypeName, interfaceName, operationName)\r
135                         ?: throw BluePrintException(String.format("failed to get input definitions for node type (%s), " +\r
136                                 "interface name (%s), operationName(%s)", nodeTypeName, interfaceName, operationName))\r
137 \r
138         // Iterate Node Type Properties\r
139         nodeTypeInterfaceOperationOutputs.forEach { nodeTypePropertyName, nodeTypeProperty ->\r
140 \r
141             val operationOutputPropertyName: String = StringBuilder().append(nodeTemplateName)\r
142                     .append(".").append(interfaceName)\r
143                     .append(".").append(operationName)\r
144                     .append(".").append(nodeTypePropertyName).toString()\r
145             // Get the Value from component context\r
146             val resolvedValue: JsonNode = componentContext[operationOutputPropertyName] as? JsonNode\r
147                     ?: NullNode.getInstance()\r
148             // Store  operation output values into context\r
149             setNodeTemplateOperationPropertyValue(nodeTemplateName, interfaceName, operationName, nodeTypePropertyName, resolvedValue)\r
150             log.debug("resolved output assignments for node template ({}), property name ({}), value ({})", nodeTemplateName, nodeTypePropertyName, resolvedValue)\r
151         }\r
152     }\r
153 \r
154     open fun resolveNodeTemplateArtifact(nodeTemplateName: String,\r
155                                     artifactName: String): String {\r
156         val nodeTemplate = bluePrintContext.nodeTemplateByName(nodeTemplateName)\r
157 \r
158         val artifactDefinition: ArtifactDefinition = nodeTemplate.artifacts?.get(artifactName)\r
159                 ?: throw BluePrintProcessorException(String.format("failed to get artifat definition {} from the node template"\r
160                         , artifactName))\r
161         val propertyAssignmentExpression = PropertyAssignmentService(context, this)\r
162         return propertyAssignmentExpression.artifactContent(artifactDefinition)\r
163     }\r
164 \r
165 \r
166     open fun setInputValue(propertyName: String, propertyDefinition: PropertyDefinition, value: JsonNode) {\r
167         val path = StringBuilder(BluePrintConstants.PATH_INPUTS)\r
168                 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()\r
169         log.trace("setting input path ({}), values ({})", path, value)\r
170         context[path] = value\r
171     }\r
172 \r
173     open fun setWorkflowInputValue(workflowName: String, propertyName: String, value: JsonNode) {\r
174         val path: String = StringBuilder(BluePrintConstants.PATH_NODE_WORKFLOWS).append(BluePrintConstants.PATH_DIVIDER).append(workflowName)\r
175                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_INPUTS)\r
176                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_PROPERTIES)\r
177                 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()\r
178         context[path] = value\r
179     }\r
180 \r
181     open fun setNodeTemplatePropertyValue(nodeTemplateName: String, propertyName: String, value: JsonNode) {\r
182 \r
183         val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES).append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)\r
184                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_PROPERTIES)\r
185                 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()\r
186         context[path] = value\r
187     }\r
188 \r
189     open fun setNodeTemplateOperationPropertyValue(nodeTemplateName: String, interfaceName: String, operationName: String, propertyName: String,\r
190                                               value: JsonNode) {\r
191         val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES).append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)\r
192                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_INTERFACES).append(BluePrintConstants.PATH_DIVIDER).append(interfaceName)\r
193                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_OPERATIONS).append(BluePrintConstants.PATH_DIVIDER).append(operationName)\r
194                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_PROPERTIES)\r
195                 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()\r
196         log.trace("setting operation property path ({}), values ({})", path, value)\r
197         context[path] = value\r
198     }\r
199 \r
200     open fun setNodeTemplateOperationInputValue(nodeTemplateName: String, interfaceName: String, operationName: String, propertyName: String,\r
201                                            value: JsonNode) {\r
202         val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES).append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)\r
203                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_INTERFACES).append(interfaceName)\r
204                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_OPERATIONS).append(operationName)\r
205                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_INPUTS)\r
206                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_PROPERTIES)\r
207                 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()\r
208         context[path] = value\r
209     }\r
210 \r
211     open fun setNodeTemplateOperationOutputValue(nodeTemplateName: String, interfaceName: String, operationName: String, propertyName: String,\r
212                                             value: JsonNode) {\r
213         val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES).append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)\r
214                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_INTERFACES).append(interfaceName)\r
215                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_OPERATIONS).append(operationName)\r
216                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_OUTPUTS)\r
217                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_PROPERTIES)\r
218                 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()\r
219         context[path] = value\r
220     }\r
221 \r
222 \r
223     open fun getInputValue(propertyName: String): JsonNode {\r
224         val path = StringBuilder(BluePrintConstants.PATH_INPUTS)\r
225                 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()\r
226         return context[path] as? JsonNode ?: NullNode.instance\r
227     }\r
228 \r
229     open fun getNodeTemplateOperationOutputValue(nodeTemplateName: String, interfaceName: String, operationName: String, propertyName: String): JsonNode {\r
230         val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES).append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)\r
231                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_INTERFACES).append(BluePrintConstants.PATH_DIVIDER).append(interfaceName)\r
232                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_OPERATIONS).append(BluePrintConstants.PATH_DIVIDER).append(operationName)\r
233                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_PROPERTIES)\r
234                 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()\r
235         return context[path] as JsonNode\r
236     }\r
237 \r
238     open fun getPropertyValue(nodeTemplateName: String, propertyName: String): JsonNode? {\r
239         val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES).append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)\r
240                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_PROPERTIES)\r
241                 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()\r
242         return context[path] as JsonNode\r
243     }\r
244 \r
245     open fun getRequirementPropertyValue(nodeTemplateName: String, requirementName: String, propertyName: String): JsonNode? {\r
246         val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES).append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)\r
247                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_REQUIREMENTS).append(requirementName)\r
248                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_PROPERTIES)\r
249                 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()\r
250         return context[path] as JsonNode\r
251     }\r
252 \r
253     open fun getCapabilityPropertyValue(nodeTemplateName: String, capabilityName: String, propertyName: String): JsonNode? {\r
254         val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES).append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)\r
255                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_CAPABILITIES).append(capabilityName)\r
256                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_PROPERTIES)\r
257                 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()\r
258         return context[path] as JsonNode\r
259     }\r
260 \r
261     open fun assignInputs(jsonNode: JsonNode) {\r
262         log.info("assignInputs from input JSON ({})", jsonNode.toString())\r
263         bluePrintContext.inputs?.forEach { propertyName, property ->\r
264             val valueNode: JsonNode = jsonNode.at(BluePrintConstants.PATH_DIVIDER + propertyName)\r
265                     ?: NullNode.getInstance()\r
266             setInputValue(propertyName, property, valueNode)\r
267         }\r
268     }\r
269 \r
270     open fun assignWorkflowInputs(workflowName: String, jsonNode: JsonNode) {\r
271         log.info("assign workflow {} input value ({})", workflowName, jsonNode.toString())\r
272         bluePrintContext.workflowByName(workflowName)?.inputs?.forEach { propertyName, property ->\r
273             val valueNode: JsonNode = jsonNode.at(BluePrintConstants.PATH_DIVIDER + propertyName)\r
274                     ?: NullNode.getInstance()\r
275             setWorkflowInputValue(workflowName, propertyName, valueNode)\r
276         }\r
277     }\r
278 }