Spring boot, Kotlin version upgrades
[ccsdk/cds.git] / ms / blueprintsprocessor / modules / services / workflow-service / src / main / kotlin / org / onap / ccsdk / cds / blueprintsprocessor / services / workflow / BluePrintWorkflowExecutionServiceImpl.kt
index 8ae128d..8a699d8 100644 (file)
@@ -16,6 +16,7 @@
 
 package org.onap.ccsdk.cds.blueprintsprocessor.services.workflow
 
+import com.fasterxml.jackson.databind.JsonNode
 import org.onap.ccsdk.cds.blueprintsprocessor.core.api.data.ExecutionServiceInput
 import org.onap.ccsdk.cds.blueprintsprocessor.core.api.data.ExecutionServiceOutput
 import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintConstants
@@ -30,45 +31,63 @@ import org.springframework.stereotype.Service
 @Service("bluePrintWorkflowExecutionService")
 open class BluePrintWorkflowExecutionServiceImpl(
     private val componentWorkflowExecutionService: ComponentWorkflowExecutionService,
-    private val dgWorkflowExecutionService: DGWorkflowExecutionService
+    private val dgWorkflowExecutionService: DGWorkflowExecutionService,
+    private val imperativeWorkflowExecutionService: ImperativeWorkflowExecutionService
 ) : BluePrintWorkflowExecutionService<ExecutionServiceInput, ExecutionServiceOutput> {
 
     private val log = LoggerFactory.getLogger(BluePrintWorkflowExecutionServiceImpl::class.java)!!
 
-    override suspend fun executeBluePrintWorkflow(bluePrintRuntimeService: BluePrintRuntimeService<*>,
-                                                  executionServiceInput: ExecutionServiceInput,
-                                                  properties: MutableMap<String, Any>): ExecutionServiceOutput {
+    override suspend fun executeBluePrintWorkflow(
+        bluePrintRuntimeService: BluePrintRuntimeService<*>,
+        executionServiceInput: ExecutionServiceInput,
+        properties: MutableMap<String, Any>
+    ): ExecutionServiceOutput {
 
         val bluePrintContext = bluePrintRuntimeService.bluePrintContext()
 
         val workflowName = executionServiceInput.actionIdentifiers.actionName
 
         // Assign Workflow inputs
+        // check if request structure exists
+        if (!executionServiceInput.payload.has("$workflowName-request")) {
+            throw BluePrintProcessorException("Input request missing the expected '$workflowName-request' block!")
+        }
         val input = executionServiceInput.payload.get("$workflowName-request")
         bluePrintRuntimeService.assignWorkflowInputs(workflowName, input)
 
-        // Get the DG Node Template
-        val nodeTemplateName = bluePrintContext.workflowFirstStepNodeTemplate(workflowName)
+        val workflow = bluePrintContext.workflowByName(workflowName)
 
-        val derivedFrom = bluePrintContext.nodeTemplateNodeType(nodeTemplateName).derivedFrom
+        val steps = workflow.steps ?: throw BluePrintProcessorException("could't get steps for workflow($workflowName)")
 
-        log.info("Executing workflow($workflowName) NodeTemplate($nodeTemplateName), derived from($derivedFrom)")
+        /** If workflow has multiple steps, then it is imperative workflow */
+        val executionServiceOutput: ExecutionServiceOutput = if (steps.size > 1) {
+            imperativeWorkflowExecutionService
+                .executeBluePrintWorkflow(bluePrintRuntimeService, executionServiceInput, properties)
+        } else {
+            // Get the DG Node Template
+            val nodeTemplateName = bluePrintContext.workflowFirstStepNodeTemplate(workflowName)
 
-        val executionServiceOutput: ExecutionServiceOutput = when {
-            derivedFrom.startsWith(BluePrintConstants.MODEL_TYPE_NODE_COMPONENT, true) -> {
-                componentWorkflowExecutionService
-                    .executeBluePrintWorkflow(bluePrintRuntimeService, executionServiceInput, properties)
-            }
-            derivedFrom.startsWith(BluePrintConstants.MODEL_TYPE_NODE_WORKFLOW, true) -> {
-                dgWorkflowExecutionService
-                    .executeBluePrintWorkflow(bluePrintRuntimeService, executionServiceInput, properties)
-            }
-            else -> {
-                throw BluePrintProcessorException("couldn't execute workflow($workflowName) step mapped " +
-                        "to node template($nodeTemplateName) derived from($derivedFrom)")
+            val derivedFrom = bluePrintContext.nodeTemplateNodeType(nodeTemplateName).derivedFrom
+
+            log.info("Executing workflow($workflowName) NodeTemplate($nodeTemplateName), derived from($derivedFrom)")
+            /** Return ExecutionServiceOutput based on DG node or Component Node */
+            when {
+                derivedFrom.startsWith(BluePrintConstants.MODEL_TYPE_NODE_COMPONENT, true) -> {
+                    componentWorkflowExecutionService
+                        .executeBluePrintWorkflow(bluePrintRuntimeService, executionServiceInput, properties)
+                }
+                derivedFrom.startsWith(BluePrintConstants.MODEL_TYPE_NODE_WORKFLOW, true) -> {
+                    dgWorkflowExecutionService
+                        .executeBluePrintWorkflow(bluePrintRuntimeService, executionServiceInput, properties)
+                }
+                else -> {
+                    throw BluePrintProcessorException(
+                        "couldn't execute workflow($workflowName) step mapped " +
+                                "to node template($nodeTemplateName) derived from($derivedFrom)"
+                    )
+                }
             }
         }
-
         executionServiceOutput.commonHeader = executionServiceInput.commonHeader
         executionServiceOutput.actionIdentifiers = executionServiceInput.actionIdentifiers
         // Resolve Workflow Outputs
@@ -76,8 +95,7 @@ open class BluePrintWorkflowExecutionServiceImpl(
 
         // Set the Response Payload
         executionServiceOutput.payload = JacksonUtils.objectMapper.createObjectNode()
-        executionServiceOutput.payload.set("$workflowName-response", workflowOutputs.asObjectNode())
+        executionServiceOutput.payload.set<JsonNode>("$workflowName-response", workflowOutputs.asObjectNode())
         return executionServiceOutput
     }
-
-}
\ No newline at end of file
+}