2 * Copyright © 2017-2018 AT&T Intellectual Property.
3 * Modifications Copyright © 2018-2019 IBM, Bell Canada.
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
18 package org.onap.ccsdk.cds.controllerblueprints.core.service
21 import com.fasterxml.jackson.databind.JsonNode
22 import com.fasterxml.jackson.databind.node.NullNode
23 import com.fasterxml.jackson.databind.node.ObjectNode
24 import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
25 import org.onap.ccsdk.cds.controllerblueprints.core.*
26 import org.onap.ccsdk.cds.controllerblueprints.core.data.ArtifactDefinition
27 import org.onap.ccsdk.cds.controllerblueprints.core.data.NodeTemplate
28 import org.onap.ccsdk.cds.controllerblueprints.core.data.PropertyDefinition
29 import org.onap.ccsdk.cds.controllerblueprints.core.utils.BluePrintMetadataUtils
30 import org.slf4j.LoggerFactory
33 interface BluePrintRuntimeService<T> {
37 fun bluePrintContext(): BluePrintContext
39 fun getExecutionContext(): T
41 fun setExecutionContext(executionContext: T)
43 fun put(key: String, value: JsonNode)
45 fun get(key: String): JsonNode?
47 fun check(key: String): Boolean
51 fun getAsString(key: String): String?
53 fun getAsBoolean(key: String): Boolean?
55 fun getAsInt(key: String): Int?
57 fun getAsDouble(key: String): Double?
59 fun getBluePrintError(): BluePrintError
61 fun setBluePrintError(bluePrintError: BluePrintError)
63 fun loadEnvironments(type: String, fileName: String)
65 fun resolveNodeTemplatePropertyAssignments(nodeTemplateName: String,
66 propertyDefinitions: MutableMap<String, PropertyDefinition>,
67 propertyAssignments: MutableMap<String, JsonNode>): MutableMap<String, JsonNode>
69 fun resolvePropertyDefinitions(name: String, propertyDefinitions: MutableMap<String, PropertyDefinition>)
70 : MutableMap<String, JsonNode>
72 fun resolvePropertyAssignments(name: String, propertyAssignments: MutableMap<String, JsonNode>)
73 : MutableMap<String, JsonNode>
75 fun resolveNodeTemplateProperties(nodeTemplateName: String): MutableMap<String, JsonNode>
77 fun resolveNodeTemplateCapabilityProperties(nodeTemplateName: String, capabilityName: String): MutableMap<String,
80 fun resolveNodeTemplateInterfaceOperationInputs(nodeTemplateName: String, interfaceName: String,
81 operationName: String): MutableMap<String, JsonNode>
83 fun resolveNodeTemplateInterfaceOperationOutputs(nodeTemplateName: String, interfaceName: String,
84 operationName: String): MutableMap<String, JsonNode>
86 fun resolveNodeTemplateArtifact(nodeTemplateName: String, artifactName: String): String
88 fun resolveNodeTemplateArtifactDefinition(nodeTemplateName: String, artifactName: String): ArtifactDefinition
90 fun resolveDSLExpression(dslPropertyName: String): JsonNode
92 fun setInputValue(propertyName: String, propertyDefinition: PropertyDefinition, value: JsonNode)
94 fun setWorkflowInputValue(workflowName: String, propertyName: String, propertyDefinition: PropertyDefinition,
97 fun setNodeTemplatePropertyValue(nodeTemplateName: String, propertyName: String, value: JsonNode)
99 fun setNodeTemplateAttributeValue(nodeTemplateName: String, attributeName: String, value: JsonNode)
101 fun setNodeTemplateOperationPropertyValue(nodeTemplateName: String, interfaceName: String,
102 operationName: String, propertyName: String, value: JsonNode)
104 fun setNodeTemplateOperationInputValue(nodeTemplateName: String, interfaceName: String,
105 operationName: String, propertyName: String, value: JsonNode)
107 fun setNodeTemplateOperationOutputValue(nodeTemplateName: String, interfaceName: String,
108 operationName: String, propertyName: String, value: JsonNode)
110 fun getInputValue(propertyName: String): JsonNode
112 fun getNodeTemplateOperationOutputValue(nodeTemplateName: String, interfaceName: String,
113 operationName: String, propertyName: String): JsonNode
115 fun getNodeTemplatePropertyValue(nodeTemplateName: String, propertyName: String): JsonNode?
117 fun getNodeTemplateAttributeValue(nodeTemplateName: String, attributeName: String): JsonNode?
119 fun assignInputs(jsonNode: JsonNode)
121 fun assignWorkflowInputs(workflowName: String, jsonNode: JsonNode)
123 fun resolveWorkflowOutputs(workflowName: String): MutableMap<String, JsonNode>
125 fun getJsonForNodeTemplateAttributeProperties(nodeTemplateName: String, keys: List<String>): JsonNode
131 * @author Brinda Santh
133 open class DefaultBluePrintRuntimeService(private var id: String, private var bluePrintContext: BluePrintContext)
134 : BluePrintRuntimeService<MutableMap<String, JsonNode>> {
137 private val log = LoggerFactory.getLogger(BluePrintRuntimeService::class.toString())
139 private var store: MutableMap<String, JsonNode> = hashMapOf()
141 private var bluePrintError = BluePrintError()
145 * Load Blueprint Environments Properties
147 val absoluteEnvFilePath = bluePrintContext.rootPath.plus(File.separator)
148 .plus(BluePrintConstants.TOSCA_ENVIRONMENTS_DIR)
149 loadEnvironments(BluePrintConstants.PROPERTY_BPP, absoluteEnvFilePath)
153 override fun id(): String {
157 override fun bluePrintContext(): BluePrintContext {
158 return bluePrintContext
161 override fun getExecutionContext(): MutableMap<String, JsonNode> {
165 @Suppress("UNCHECKED_CAST")
166 override fun setExecutionContext(executionContext: MutableMap<String, JsonNode>) {
167 this.store = executionContext
170 override fun put(key: String, value: JsonNode) {
174 override fun get(key: String): JsonNode {
175 return store[key] ?: throw BluePrintProcessorException("failed to get execution property($key)")
178 override fun check(key: String): Boolean {
179 return store.containsKey(key)
182 override fun cleanRuntime() {
186 private fun getJsonNode(key: String): JsonNode {
190 override fun getAsString(key: String): String? {
191 return get(key).asText()
194 override fun getAsBoolean(key: String): Boolean? {
195 return get(key).asBoolean()
198 override fun getAsInt(key: String): Int? {
199 return get(key).asInt()
202 override fun getAsDouble(key: String): Double? {
203 return get(key).asDouble()
206 override fun getBluePrintError(): BluePrintError {
207 return this.bluePrintError
210 override fun setBluePrintError(bluePrintError: BluePrintError) {
211 this.bluePrintError = bluePrintError
214 override fun loadEnvironments(type: String, fileName: String) {
215 BluePrintMetadataUtils.environmentFileProperties(fileName).forEach { key, value ->
216 setNodeTemplateAttributeValue(type, key.toString(), value.asJsonType())
221 * Resolve any property assignments for the node
223 override fun resolveNodeTemplatePropertyAssignments(nodeTemplateName: String,
224 propertyDefinitions: MutableMap<String, PropertyDefinition>,
225 propertyAssignments: MutableMap<String, JsonNode>)
226 : MutableMap<String, JsonNode> {
228 val propertyAssignmentValue: MutableMap<String, JsonNode> = hashMapOf()
230 propertyDefinitions.forEach { (nodeTypePropertyName, nodeTypeProperty) ->
231 // Get the Express or Value for the Node Template
232 val propertyAssignment: JsonNode? = propertyAssignments[nodeTypePropertyName]
234 var resolvedValue: JsonNode = NullNode.getInstance()
235 if (propertyAssignment != null) {
236 // Resolve the Expressing
237 val propertyAssignmentExpression = PropertyAssignmentService(this)
238 resolvedValue = propertyAssignmentExpression.resolveAssignmentExpression(nodeTemplateName,
239 nodeTypePropertyName, propertyAssignment)
242 // Set default value if null
243 if (resolvedValue is NullNode) {
244 nodeTypeProperty.defaultValue?.let { resolvedValue = nodeTypeProperty.defaultValue!! }
247 // Set for Return of method
248 propertyAssignmentValue[nodeTypePropertyName] = resolvedValue
250 return propertyAssignmentValue
253 override fun resolvePropertyDefinitions(name: String, propertyDefinitions: MutableMap<String, PropertyDefinition>)
254 : MutableMap<String, JsonNode> {
255 val propertyAssignmentValue: MutableMap<String, JsonNode> = hashMapOf()
257 propertyDefinitions.forEach { propertyName, propertyDefinition ->
258 val propertyAssignmentExpression = PropertyAssignmentService(this)
259 val expression = propertyDefinition.value ?: propertyDefinition.defaultValue
260 if (expression != null) {
261 propertyAssignmentValue[propertyName] = propertyAssignmentExpression.resolveAssignmentExpression(name,
262 propertyName, expression)
265 return propertyAssignmentValue
268 override fun resolvePropertyAssignments(name: String, propertyAssignments: MutableMap<String, JsonNode>)
269 : MutableMap<String, JsonNode> {
271 val propertyAssignmentValue: MutableMap<String, JsonNode> = hashMapOf()
273 propertyAssignments.forEach { propertyName, propertyExpression ->
274 val propertyAssignmentExpression = PropertyAssignmentService(this)
275 propertyAssignmentValue[propertyName] = propertyAssignmentExpression.resolveAssignmentExpression(name,
276 propertyName, propertyExpression)
278 return propertyAssignmentValue
281 override fun resolveNodeTemplateProperties(nodeTemplateName: String): MutableMap<String, JsonNode> {
282 log.info("resolveNodeTemplatePropertyValues for node template ({})", nodeTemplateName)
284 val nodeTemplate: NodeTemplate = bluePrintContext.nodeTemplateByName(nodeTemplateName)
286 val propertyAssignments: MutableMap<String, JsonNode> = nodeTemplate.properties!!
288 // Get the Node Type Definitions
289 val nodeTypePropertieDefinitions: MutableMap<String, PropertyDefinition> = bluePrintContext
290 .nodeTypeChainedProperties(nodeTemplate.type)!!
293 * Resolve the NodeTemplate Property Assignment Values.
295 return resolveNodeTemplatePropertyAssignments(nodeTemplateName, nodeTypePropertieDefinitions,
299 override fun resolveNodeTemplateCapabilityProperties(nodeTemplateName: String, capabilityName: String):
300 MutableMap<String, JsonNode> {
301 log.info("resolveNodeTemplateCapabilityProperties for node template($nodeTemplateName) capability " +
303 val nodeTemplate: NodeTemplate = bluePrintContext.nodeTemplateByName(nodeTemplateName)
305 val propertyAssignments = nodeTemplate.capabilities?.get(capabilityName)?.properties ?: hashMapOf()
307 val propertyDefinitions = bluePrintContext.nodeTemplateNodeType(nodeTemplateName)
308 .capabilities?.get(capabilityName)?.properties ?: hashMapOf()
311 * Resolve the Capability Property Assignment Values.
313 return resolveNodeTemplatePropertyAssignments(nodeTemplateName, propertyDefinitions,
317 override fun resolveNodeTemplateInterfaceOperationInputs(nodeTemplateName: String,
318 interfaceName: String,
319 operationName: String): MutableMap<String, JsonNode> {
320 log.info("resolveNodeTemplateInterfaceOperationInputs for node template ($nodeTemplateName),interface name " +
321 "($interfaceName), operationName($operationName)")
323 val propertyAssignments: MutableMap<String, JsonNode> =
324 bluePrintContext.nodeTemplateInterfaceOperationInputs(nodeTemplateName, interfaceName, operationName)
327 val nodeTypeName = bluePrintContext.nodeTemplateByName(nodeTemplateName).type
329 val nodeTypeInterfaceOperationInputs: MutableMap<String, PropertyDefinition> =
330 bluePrintContext.nodeTypeInterfaceOperationInputs(nodeTypeName, interfaceName, operationName)
333 log.info("input definition for node template ($nodeTemplateName), values ($propertyAssignments)")
336 * Resolve the Property Input Assignment Values.
338 return resolveNodeTemplatePropertyAssignments(nodeTemplateName, nodeTypeInterfaceOperationInputs,
344 override fun resolveNodeTemplateInterfaceOperationOutputs(nodeTemplateName: String,
345 interfaceName: String,
346 operationName: String): MutableMap<String, JsonNode> {
347 log.info("resolveNodeTemplateInterfaceOperationOutputs for node template ($nodeTemplateName),interface name " +
348 "($interfaceName), operationName($operationName)")
350 val propertyAssignments: MutableMap<String, JsonNode> =
351 bluePrintContext.nodeTemplateInterfaceOperationOutputs(nodeTemplateName, interfaceName, operationName)
354 val nodeTypeName = bluePrintContext.nodeTemplateByName(nodeTemplateName).type
356 val nodeTypeInterfaceOperationOutputs: MutableMap<String, PropertyDefinition> =
357 bluePrintContext.nodeTypeInterfaceOperationOutputs(nodeTypeName, interfaceName, operationName)
360 * Resolve the Property Output Assignment Values.
362 val propertyAssignmentValue = resolveNodeTemplatePropertyAssignments(nodeTemplateName,
363 nodeTypeInterfaceOperationOutputs, propertyAssignments)
365 // Store operation output values into context
366 propertyAssignmentValue.forEach { key, value ->
367 setNodeTemplateOperationOutputValue(nodeTemplateName, interfaceName, operationName, key, value)
369 return propertyAssignmentValue
372 override fun resolveNodeTemplateArtifact(nodeTemplateName: String, artifactName: String): String {
373 val artifactDefinition: ArtifactDefinition =
374 resolveNodeTemplateArtifactDefinition(nodeTemplateName, artifactName)
375 val propertyAssignmentExpression = PropertyAssignmentService(this)
376 return propertyAssignmentExpression.artifactContent(artifactDefinition)
379 override fun resolveNodeTemplateArtifactDefinition(nodeTemplateName: String,
380 artifactName: String): ArtifactDefinition {
381 val nodeTemplate = bluePrintContext.nodeTemplateByName(nodeTemplateName)
383 return nodeTemplate.artifacts?.get(artifactName)
384 ?: throw BluePrintProcessorException("failed to get artifact definition($artifactName) from the node " +
390 * Read the DSL Property reference, If there is any expression, then resolve those expression and return as Json
393 override fun resolveDSLExpression(dslPropertyName: String): JsonNode {
394 val propertyAssignments = bluePrintContext.dslPropertiesByName(dslPropertyName)
395 return if (BluePrintExpressionService.checkContainsExpression(propertyAssignments)
396 && propertyAssignments is ObjectNode) {
398 val rootKeyMap = propertyAssignments.rootFieldsToMap()
399 val propertyAssignmentValue: MutableMap<String, JsonNode> = hashMapOf()
400 rootKeyMap.forEach { propertyName, propertyValue ->
401 val propertyAssignmentExpression = PropertyAssignmentService(this)
402 propertyAssignmentValue[propertyName] = propertyAssignmentExpression
403 .resolveAssignmentExpression("DSL", propertyName, propertyValue)
405 propertyAssignmentValue.asJsonNode()
411 override fun setInputValue(propertyName: String, propertyDefinition: PropertyDefinition, value: JsonNode) {
412 val path = StringBuilder(BluePrintConstants.PATH_INPUTS)
413 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()
414 log.trace("setting input path ({}), values ({})", path, value)
418 override fun setWorkflowInputValue(workflowName: String, propertyName: String,
419 propertyDefinition: PropertyDefinition, value: JsonNode) {
420 val path: String = StringBuilder(BluePrintConstants.PATH_NODE_WORKFLOWS)
421 .append(BluePrintConstants.PATH_DIVIDER).append(workflowName)
422 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_INPUTS)
423 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_PROPERTIES)
424 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()
428 override fun setNodeTemplatePropertyValue(nodeTemplateName: String, propertyName: String, value: JsonNode) {
430 val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES)
431 .append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)
432 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_PROPERTIES)
433 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()
437 override fun setNodeTemplateAttributeValue(nodeTemplateName: String, attributeName: String, value: JsonNode) {
439 val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES)
440 .append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)
441 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_ATTRIBUTES)
442 .append(BluePrintConstants.PATH_DIVIDER).append(attributeName).toString()
446 override fun setNodeTemplateOperationPropertyValue(nodeTemplateName: String, interfaceName: String,
447 operationName: String, propertyName: String,
449 val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES)
450 .append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)
451 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_INTERFACES)
452 .append(BluePrintConstants.PATH_DIVIDER).append(interfaceName)
453 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_OPERATIONS)
454 .append(BluePrintConstants.PATH_DIVIDER).append(operationName)
455 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_PROPERTIES)
456 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()
457 log.trace("setting operation property path ({}), values ({})", path, value)
461 override fun setNodeTemplateOperationInputValue(nodeTemplateName: String, interfaceName: String,
462 operationName: String, propertyName: String,
464 val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES)
465 .append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)
466 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_INTERFACES)
467 .append(BluePrintConstants.PATH_DIVIDER).append(interfaceName)
468 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_OPERATIONS)
469 .append(BluePrintConstants.PATH_DIVIDER).append(operationName)
470 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_INPUTS)
471 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_PROPERTIES)
472 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()
476 override fun setNodeTemplateOperationOutputValue(nodeTemplateName: String, interfaceName: String,
477 operationName: String, propertyName: String,
479 val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES)
480 .append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)
481 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_INTERFACES)
482 .append(BluePrintConstants.PATH_DIVIDER).append(interfaceName)
483 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_OPERATIONS)
484 .append(BluePrintConstants.PATH_DIVIDER).append(operationName)
485 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_OUTPUTS)
486 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_PROPERTIES)
487 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()
492 override fun getInputValue(propertyName: String): JsonNode {
493 val path = StringBuilder(BluePrintConstants.PATH_INPUTS)
494 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()
495 return getJsonNode(path)
498 override fun getNodeTemplateOperationOutputValue(nodeTemplateName: String, interfaceName: String,
499 operationName: String, propertyName: String): JsonNode {
500 val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES)
501 .append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)
502 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_INTERFACES)
503 .append(BluePrintConstants.PATH_DIVIDER).append(interfaceName)
504 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_OPERATIONS)
505 .append(BluePrintConstants.PATH_DIVIDER).append(operationName)
506 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_OUTPUTS)
507 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_PROPERTIES)
508 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()
509 return getJsonNode(path)
512 override fun getNodeTemplatePropertyValue(nodeTemplateName: String, propertyName: String): JsonNode {
513 val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES)
514 .append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)
515 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_PROPERTIES)
516 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()
517 return getJsonNode(path)
520 override fun getNodeTemplateAttributeValue(nodeTemplateName: String, attributeName: String): JsonNode {
521 val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES)
522 .append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)
523 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_ATTRIBUTES)
524 .append(BluePrintConstants.PATH_DIVIDER).append(attributeName).toString()
525 return getJsonNode(path)
528 override fun assignInputs(jsonNode: JsonNode) {
529 log.info("assignInputs from input JSON ({})", jsonNode.toString())
530 bluePrintContext.inputs()?.forEach { propertyName, property ->
531 val valueNode: JsonNode = jsonNode.at(BluePrintConstants.PATH_DIVIDER + propertyName)
532 ?: NullNode.getInstance()
533 setInputValue(propertyName, property, valueNode)
537 override fun assignWorkflowInputs(workflowName: String, jsonNode: JsonNode) {
538 log.info("assign workflow {} input value ({})", workflowName, jsonNode.toString())
540 val dynamicInputPropertiesName = "$workflowName-properties"
542 bluePrintContext.workflowByName(workflowName).inputs?.forEach { propertyName, property ->
543 if (propertyName != dynamicInputPropertiesName) {
544 val valueNode: JsonNode = jsonNode
545 .at(BluePrintConstants.PATH_DIVIDER + propertyName).returnNullIfMissing()
546 ?: property.defaultValue
547 ?: NullNode.getInstance()
548 setInputValue(propertyName, property, valueNode)
551 // Load Dynamic data Types
552 val workflowDynamicInputs: JsonNode? = jsonNode.get(dynamicInputPropertiesName)
554 workflowDynamicInputs?.let {
555 bluePrintContext.dataTypeByName("dt-$dynamicInputPropertiesName")
556 ?.properties?.forEach { propertyName, property ->
557 val valueNode: JsonNode =
558 workflowDynamicInputs
559 .at(BluePrintConstants.PATH_DIVIDER + propertyName).returnNullIfMissing()
560 ?: property.defaultValue
561 ?: NullNode.getInstance()
562 setInputValue(propertyName, property, valueNode)
568 override fun resolveWorkflowOutputs(workflowName: String): MutableMap<String, JsonNode> {
569 log.info("resolveWorkflowOutputs for workflow($workflowName)")
570 val outputs = bluePrintContext.workflowByName(workflowName).outputs ?: mutableMapOf()
571 return resolvePropertyDefinitions("WORKFLOW", outputs)
574 override fun getJsonForNodeTemplateAttributeProperties(nodeTemplateName: String, keys: List<String>): JsonNode {
576 val jsonNode: ObjectNode = jacksonObjectMapper().createObjectNode()
577 val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES)
578 .append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)
579 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_ATTRIBUTES)
580 .append(BluePrintConstants.PATH_DIVIDER).toString()
584 val key = it.replace(path, "")
585 if (keys.contains(key)) {
586 val value = store[it] as JsonNode
587 jsonNode.set(key, value)