2 * Copyright © 2017-2018 AT&T Intellectual Property.
3 * Modifications Copyright © 2018-2019 IBM.
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 org.slf4j.LoggerFactory
22 import com.fasterxml.jackson.databind.JsonNode
23 import com.fasterxml.jackson.databind.node.NullNode
24 import com.fasterxml.jackson.databind.node.ObjectNode
25 import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
26 import org.onap.ccsdk.cds.controllerblueprints.core.*
27 import org.onap.ccsdk.cds.controllerblueprints.core.data.ArtifactDefinition
28 import org.onap.ccsdk.cds.controllerblueprints.core.data.NodeTemplate
29 import org.onap.ccsdk.cds.controllerblueprints.core.data.PropertyDefinition
30 import org.onap.ccsdk.cds.controllerblueprints.core.utils.BluePrintMetadataUtils
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, value: JsonNode)
96 fun setNodeTemplatePropertyValue(nodeTemplateName: String, propertyName: String, value: JsonNode)
98 fun setNodeTemplateAttributeValue(nodeTemplateName: String, attributeName: String, value: JsonNode)
100 fun setNodeTemplateOperationPropertyValue(nodeTemplateName: String, interfaceName: String,
101 operationName: String, propertyName: String, value: JsonNode)
103 fun setNodeTemplateOperationInputValue(nodeTemplateName: String, interfaceName: String,
104 operationName: String, propertyName: String, value: JsonNode)
106 fun setNodeTemplateOperationOutputValue(nodeTemplateName: String, interfaceName: String,
107 operationName: String, propertyName: String, value: JsonNode)
109 fun getInputValue(propertyName: String): JsonNode
111 fun getNodeTemplateOperationOutputValue(nodeTemplateName: String, interfaceName: String,
112 operationName: String, propertyName: String): JsonNode
114 fun getNodeTemplatePropertyValue(nodeTemplateName: String, propertyName: String): JsonNode?
116 fun getNodeTemplateAttributeValue(nodeTemplateName: String, attributeName: String): JsonNode?
118 fun assignInputs(jsonNode: JsonNode)
120 fun assignWorkflowInputs(workflowName: String, jsonNode: JsonNode)
122 fun resolveWorkflowOutputs(workflowName: String): MutableMap<String, JsonNode>
124 fun getJsonForNodeTemplateAttributeProperties(nodeTemplateName: String, keys: List<String>): JsonNode
130 * @author Brinda Santh
132 open class DefaultBluePrintRuntimeService(private var id: String, private var bluePrintContext: BluePrintContext)
133 : BluePrintRuntimeService<MutableMap<String, JsonNode>> {
136 private val log= LoggerFactory.getLogger(BluePrintRuntimeService::class.toString())
138 private var store: MutableMap<String, JsonNode> = hashMapOf()
140 private var bluePrintError = BluePrintError()
144 * Load Blueprint Environments Properties
146 val absoluteEnvFilePath = bluePrintContext.rootPath.plus(File.separator)
147 .plus(BluePrintConstants.TOSCA_ENVIRONMENTS_DIR)
148 loadEnvironments(BluePrintConstants.PROPERTY_BPP, absoluteEnvFilePath)
152 override fun id(): String {
156 override fun bluePrintContext(): BluePrintContext {
157 return bluePrintContext
160 override fun getExecutionContext(): MutableMap<String, JsonNode> {
164 @Suppress("UNCHECKED_CAST")
165 override fun setExecutionContext(executionContext: MutableMap<String, JsonNode>) {
166 this.store = executionContext
169 override fun put(key: String, value: JsonNode) {
173 override fun get(key: String): JsonNode {
174 return store[key] ?: throw BluePrintProcessorException("failed to get execution property($key)")
177 override fun check(key: String): Boolean {
178 return store.containsKey(key)
181 override fun cleanRuntime() {
185 private fun getJsonNode(key: String): JsonNode {
189 override fun getAsString(key: String): String? {
190 return get(key).asText()
193 override fun getAsBoolean(key: String): Boolean? {
194 return get(key).asBoolean()
197 override fun getAsInt(key: String): Int? {
198 return get(key).asInt()
201 override fun getAsDouble(key: String): Double? {
202 return get(key).asDouble()
205 override fun getBluePrintError(): BluePrintError {
206 return this.bluePrintError
209 override fun setBluePrintError(bluePrintError: BluePrintError) {
210 this.bluePrintError = bluePrintError
213 override fun loadEnvironments(type: String, fileName: String) {
214 BluePrintMetadataUtils.environmentFileProperties(fileName).forEach { key, value ->
215 setNodeTemplateAttributeValue(type, key.toString(), value.toString()
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)
241 // Assign default value to the Operation
242 nodeTypeProperty.defaultValue?.let {
243 resolvedValue = nodeTypeProperty.defaultValue!!
246 // Set for Return of method
247 propertyAssignmentValue[nodeTypePropertyName] = resolvedValue
249 return propertyAssignmentValue
252 override fun resolvePropertyDefinitions(name: String, propertyDefinitions: MutableMap<String, PropertyDefinition>)
253 : MutableMap<String, JsonNode> {
254 val propertyAssignmentValue: MutableMap<String, JsonNode> = hashMapOf()
256 propertyDefinitions.forEach { propertyName, propertyDefinition ->
257 val propertyAssignmentExpression = PropertyAssignmentService(this)
258 val expression = propertyDefinition.value ?: propertyDefinition.defaultValue
259 if (expression != null) {
260 propertyAssignmentValue[propertyName] = propertyAssignmentExpression.resolveAssignmentExpression(name,
261 propertyName, expression)
264 return propertyAssignmentValue
267 override fun resolvePropertyAssignments(name: String, propertyAssignments: MutableMap<String, JsonNode>)
268 : MutableMap<String, JsonNode> {
270 val propertyAssignmentValue: MutableMap<String, JsonNode> = hashMapOf()
272 propertyAssignments.forEach { propertyName, propertyExpression ->
273 val propertyAssignmentExpression = PropertyAssignmentService(this)
274 propertyAssignmentValue[propertyName] = propertyAssignmentExpression.resolveAssignmentExpression(name,
275 propertyName, propertyExpression)
277 return propertyAssignmentValue
280 override fun resolveNodeTemplateProperties(nodeTemplateName: String): MutableMap<String, JsonNode> {
281 log.info("resolveNodeTemplatePropertyValues for node template ({})", nodeTemplateName)
283 val nodeTemplate: NodeTemplate = bluePrintContext.nodeTemplateByName(nodeTemplateName)
285 val propertyAssignments: MutableMap<String, JsonNode> = nodeTemplate.properties!!
287 // Get the Node Type Definitions
288 val nodeTypePropertieDefinitions: MutableMap<String, PropertyDefinition> = bluePrintContext
289 .nodeTypeChainedProperties(nodeTemplate.type)!!
292 * Resolve the NodeTemplate Property Assignment Values.
294 return resolveNodeTemplatePropertyAssignments(nodeTemplateName, nodeTypePropertieDefinitions,
298 override fun resolveNodeTemplateCapabilityProperties(nodeTemplateName: String, capabilityName: String):
299 MutableMap<String, JsonNode> {
300 log.info("resolveNodeTemplateCapabilityProperties for node template($nodeTemplateName) capability " +
302 val nodeTemplate: NodeTemplate = bluePrintContext.nodeTemplateByName(nodeTemplateName)
304 val propertyAssignments = nodeTemplate.capabilities?.get(capabilityName)?.properties ?: hashMapOf()
306 val propertyDefinitions = bluePrintContext.nodeTemplateNodeType(nodeTemplateName)
307 .capabilities?.get(capabilityName)?.properties ?: hashMapOf()
310 * Resolve the Capability Property Assignment Values.
312 return resolveNodeTemplatePropertyAssignments(nodeTemplateName, propertyDefinitions,
316 override fun resolveNodeTemplateInterfaceOperationInputs(nodeTemplateName: String,
317 interfaceName: String,
318 operationName: String): MutableMap<String, JsonNode> {
319 log.info("resolveNodeTemplateInterfaceOperationInputs for node template ($nodeTemplateName),interface name " +
320 "($interfaceName), operationName($operationName)")
322 val propertyAssignments: MutableMap<String, JsonNode> =
323 bluePrintContext.nodeTemplateInterfaceOperationInputs(nodeTemplateName, interfaceName, operationName)
326 val nodeTypeName = bluePrintContext.nodeTemplateByName(nodeTemplateName).type
328 val nodeTypeInterfaceOperationInputs: MutableMap<String, PropertyDefinition> =
329 bluePrintContext.nodeTypeInterfaceOperationInputs(nodeTypeName, interfaceName, operationName)
332 log.info("input definition for node template ($nodeTemplateName), values ($propertyAssignments)")
335 * Resolve the Property Input Assignment Values.
337 return resolveNodeTemplatePropertyAssignments(nodeTemplateName, nodeTypeInterfaceOperationInputs,
343 override fun resolveNodeTemplateInterfaceOperationOutputs(nodeTemplateName: String,
344 interfaceName: String,
345 operationName: String): MutableMap<String, JsonNode> {
346 log.info("resolveNodeTemplateInterfaceOperationOutputs for node template ($nodeTemplateName),interface name " +
347 "($interfaceName), operationName($operationName)")
349 val propertyAssignments: MutableMap<String, JsonNode> =
350 bluePrintContext.nodeTemplateInterfaceOperationOutputs(nodeTemplateName, interfaceName, operationName)
353 val nodeTypeName = bluePrintContext.nodeTemplateByName(nodeTemplateName).type
355 val nodeTypeInterfaceOperationOutputs: MutableMap<String, PropertyDefinition> =
356 bluePrintContext.nodeTypeInterfaceOperationOutputs(nodeTypeName, interfaceName, operationName)
359 * Resolve the Property Output Assignment Values.
361 val propertyAssignmentValue = resolveNodeTemplatePropertyAssignments(nodeTemplateName,
362 nodeTypeInterfaceOperationOutputs, propertyAssignments)
364 // Store operation output values into context
365 propertyAssignmentValue.forEach { key, value ->
366 setNodeTemplateOperationOutputValue(nodeTemplateName, interfaceName, operationName, key, value)
368 return propertyAssignmentValue
371 override fun resolveNodeTemplateArtifact(nodeTemplateName: String, artifactName: String): String {
372 val artifactDefinition: ArtifactDefinition = resolveNodeTemplateArtifactDefinition(nodeTemplateName, artifactName)
373 val propertyAssignmentExpression = PropertyAssignmentService(this)
374 return propertyAssignmentExpression.artifactContent(artifactDefinition)
377 override fun resolveNodeTemplateArtifactDefinition(nodeTemplateName: String, artifactName: String): ArtifactDefinition {
378 val nodeTemplate = bluePrintContext.nodeTemplateByName(nodeTemplateName)
380 return nodeTemplate.artifacts?.get(artifactName)
381 ?: throw BluePrintProcessorException("failed to get artifat definition($artifactName) from the node " +
387 * Read the DSL Property reference, If there is any expression, then resolve those expression and return as Json
390 override fun resolveDSLExpression(dslPropertyName: String): JsonNode {
391 val propertyAssignments = bluePrintContext.dslPropertiesByName(dslPropertyName)
392 return if (BluePrintExpressionService.checkContainsExpression(propertyAssignments)
393 && propertyAssignments is ObjectNode) {
395 val rootKeyMap = propertyAssignments.rootFieldsToMap()
396 val propertyAssignmentValue: MutableMap<String, JsonNode> = hashMapOf()
397 rootKeyMap.forEach { propertyName, propertyValue ->
398 val propertyAssignmentExpression = PropertyAssignmentService(this)
399 propertyAssignmentValue[propertyName] = propertyAssignmentExpression
400 .resolveAssignmentExpression("DSL", propertyName, propertyValue)
402 propertyAssignmentValue.asJsonNode()
408 override fun setInputValue(propertyName: String, propertyDefinition: PropertyDefinition, value: JsonNode) {
409 val path = StringBuilder(BluePrintConstants.PATH_INPUTS)
410 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()
411 log.trace("setting input path ({}), values ({})", path, value)
415 override fun setWorkflowInputValue(workflowName: String, propertyName: String,
416 propertyDefinition: PropertyDefinition, value: JsonNode) {
417 val path: String = StringBuilder(BluePrintConstants.PATH_NODE_WORKFLOWS)
418 .append(BluePrintConstants.PATH_DIVIDER).append(workflowName)
419 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_INPUTS)
420 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_PROPERTIES)
421 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()
425 override fun setNodeTemplatePropertyValue(nodeTemplateName: String, propertyName: String, value: JsonNode) {
427 val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES)
428 .append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)
429 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_PROPERTIES)
430 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()
434 override fun setNodeTemplateAttributeValue(nodeTemplateName: String, attributeName: String, value: JsonNode) {
436 val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES)
437 .append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)
438 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_ATTRIBUTES)
439 .append(BluePrintConstants.PATH_DIVIDER).append(attributeName).toString()
443 override fun setNodeTemplateOperationPropertyValue(nodeTemplateName: String, interfaceName: String, operationName: String, propertyName: String,
445 val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES)
446 .append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)
447 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_INTERFACES)
448 .append(BluePrintConstants.PATH_DIVIDER).append(interfaceName)
449 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_OPERATIONS)
450 .append(BluePrintConstants.PATH_DIVIDER).append(operationName)
451 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_PROPERTIES)
452 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()
453 log.trace("setting operation property path ({}), values ({})", path, value)
457 override fun setNodeTemplateOperationInputValue(nodeTemplateName: String, interfaceName: String,
458 operationName: String, propertyName: String,
460 val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES)
461 .append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)
462 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_INTERFACES)
463 .append(BluePrintConstants.PATH_DIVIDER).append(interfaceName)
464 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_OPERATIONS)
465 .append(BluePrintConstants.PATH_DIVIDER).append(operationName)
466 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_INPUTS)
467 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_PROPERTIES)
468 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()
472 override fun setNodeTemplateOperationOutputValue(nodeTemplateName: String, interfaceName: String,
473 operationName: String, propertyName: String,
475 val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES)
476 .append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)
477 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_INTERFACES)
478 .append(BluePrintConstants.PATH_DIVIDER).append(interfaceName)
479 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_OPERATIONS)
480 .append(BluePrintConstants.PATH_DIVIDER).append(operationName)
481 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_OUTPUTS)
482 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_PROPERTIES)
483 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()
488 override fun getInputValue(propertyName: String): JsonNode {
489 val path = StringBuilder(BluePrintConstants.PATH_INPUTS)
490 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()
491 return getJsonNode(path)
494 override fun getNodeTemplateOperationOutputValue(nodeTemplateName: String, interfaceName: String,
495 operationName: String, propertyName: String): JsonNode {
496 val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES)
497 .append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)
498 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_INTERFACES)
499 .append(BluePrintConstants.PATH_DIVIDER).append(interfaceName)
500 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_OPERATIONS)
501 .append(BluePrintConstants.PATH_DIVIDER).append(operationName)
502 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_OUTPUTS)
503 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_PROPERTIES)
504 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()
505 return getJsonNode(path)
508 override fun getNodeTemplatePropertyValue(nodeTemplateName: String, propertyName: String): JsonNode {
509 val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES)
510 .append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)
511 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_PROPERTIES)
512 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()
513 return getJsonNode(path)
516 override fun getNodeTemplateAttributeValue(nodeTemplateName: String, attributeName: String): JsonNode {
517 val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES)
518 .append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)
519 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_ATTRIBUTES)
520 .append(BluePrintConstants.PATH_DIVIDER).append(attributeName).toString()
521 return getJsonNode(path)
524 override fun assignInputs(jsonNode: JsonNode) {
525 log.info("assignInputs from input JSON ({})", jsonNode.toString())
526 bluePrintContext.inputs()?.forEach { propertyName, property ->
527 val valueNode: JsonNode = jsonNode.at(BluePrintConstants.PATH_DIVIDER + propertyName)
528 ?: NullNode.getInstance()
529 setInputValue(propertyName, property, valueNode)
533 override fun assignWorkflowInputs(workflowName: String, jsonNode: JsonNode) {
534 log.info("assign workflow {} input value ({})", workflowName, jsonNode.toString())
536 val dynamicInputPropertiesName = "$workflowName-properties"
538 bluePrintContext.workflowByName(workflowName).inputs?.forEach { propertyName, property ->
539 if (propertyName != dynamicInputPropertiesName) {
540 val valueNode: JsonNode = jsonNode.at(BluePrintConstants.PATH_DIVIDER + propertyName)
541 ?: NullNode.getInstance()
542 setInputValue(propertyName, property, valueNode)
545 // Load Dynamic data Types
546 val workflowDynamicInputs: JsonNode? = jsonNode.get(dynamicInputPropertiesName)
548 workflowDynamicInputs?.let {
549 bluePrintContext.dataTypeByName("dt-$dynamicInputPropertiesName")?.properties?.forEach { propertyName, property ->
550 val valueNode: JsonNode = workflowDynamicInputs.at(BluePrintConstants.PATH_DIVIDER + propertyName).returnNullIfMissing()
551 ?: property.defaultValue
552 ?: NullNode.getInstance()
553 setInputValue(propertyName, property, valueNode)
559 override fun resolveWorkflowOutputs(workflowName: String): MutableMap<String, JsonNode> {
560 log.info("resolveWorkflowOutputs for workflow($workflowName)")
561 val outputs = bluePrintContext.workflowByName(workflowName).outputs ?: mutableMapOf()
562 return resolvePropertyDefinitions("WORKFLOW", outputs)
565 override fun getJsonForNodeTemplateAttributeProperties(nodeTemplateName: String, keys: List<String>): JsonNode {
567 val jsonNode: ObjectNode = jacksonObjectMapper().createObjectNode()
568 val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES)
569 .append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)
570 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_ATTRIBUTES)
571 .append(BluePrintConstants.PATH_DIVIDER).toString()
575 val key = it.replace(path, "")
576 if (keys.contains(key)) {
577 val value = store[it] as JsonNode
578 jsonNode.set(key, value)