Pass on MDCContext to imperative workflow

Issue-ID: CCSDK-3032
Change-Id: Id62ab38064d5d3b1a24db674804d710ca407940e
Signed-off-by: Jozsef Csongvai <jozsef.csongvai@bell.ca>
diff --git a/ms/blueprintsprocessor/modules/blueprints/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/service/BluePrintWorkflowService.kt b/ms/blueprintsprocessor/modules/blueprints/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/service/BluePrintWorkflowService.kt
index 98e5e5a..f3e4e59 100644
--- a/ms/blueprintsprocessor/modules/blueprints/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/service/BluePrintWorkflowService.kt
+++ b/ms/blueprintsprocessor/modules/blueprints/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/service/BluePrintWorkflowService.kt
@@ -103,7 +103,7 @@
 
     var exceptions: MutableList<Exception> = arrayListOf()
 
-    final override val coroutineContext: CoroutineContext
+    override val coroutineContext: CoroutineContext
         get() = job + CoroutineName("Wf")
 
     fun cancel() {
diff --git a/ms/blueprintsprocessor/modules/services/workflow-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/workflow/ImperativeWorkflowExecutionService.kt b/ms/blueprintsprocessor/modules/services/workflow-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/workflow/ImperativeWorkflowExecutionService.kt
index 0146358..464ae8d 100644
--- a/ms/blueprintsprocessor/modules/services/workflow-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/workflow/ImperativeWorkflowExecutionService.kt
+++ b/ms/blueprintsprocessor/modules/services/workflow-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/workflow/ImperativeWorkflowExecutionService.kt
@@ -17,12 +17,14 @@
 package org.onap.ccsdk.cds.blueprintsprocessor.services.workflow
 
 import kotlinx.coroutines.CompletableDeferred
+import kotlinx.coroutines.coroutineScope
 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.blueprintsprocessor.core.api.data.Status
 import org.onap.ccsdk.cds.controllerblueprints.common.api.EventType
 import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintConstants
 import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintProcessorException
+import org.onap.ccsdk.cds.controllerblueprints.core.MDCContext
 import org.onap.ccsdk.cds.controllerblueprints.core.asGraph
 import org.onap.ccsdk.cds.controllerblueprints.core.checkNotEmpty
 import org.onap.ccsdk.cds.controllerblueprints.core.data.EdgeLabel
@@ -35,6 +37,7 @@
 import org.onap.ccsdk.cds.controllerblueprints.core.service.NodeSkipMessage
 import org.onap.ccsdk.cds.controllerblueprints.core.service.WorkflowExecuteMessage
 import org.springframework.stereotype.Service
+import kotlin.coroutines.CoroutineContext
 
 @Service("imperativeWorkflowExecutionService")
 class ImperativeWorkflowExecutionService(
@@ -54,14 +57,21 @@
 
         val graph = bluePrintContext.workflowByName(workflowName).asGraph()
 
-        return ImperativeBluePrintWorkflowService(nodeTemplateExecutionService)
-            .executeWorkflow(graph, bluePrintRuntimeService, executionServiceInput)
+        return coroutineScope {
+            ImperativeBluePrintWorkflowService(
+                nodeTemplateExecutionService,
+                this.coroutineContext[MDCContext]
+            )
+        }.let { it.executeWorkflow(graph, bluePrintRuntimeService, executionServiceInput) }
     }
 }
 
-open class ImperativeBluePrintWorkflowService(private val nodeTemplateExecutionService: NodeTemplateExecutionService) :
+open class ImperativeBluePrintWorkflowService(private val nodeTemplateExecutionService: NodeTemplateExecutionService, private val mdcContext: CoroutineContext?) :
     AbstractBluePrintWorkFlowService<ExecutionServiceInput, ExecutionServiceOutput>() {
 
+    final override val coroutineContext: CoroutineContext
+        get() = mdcContext?.let { super.coroutineContext + it } ?: super.coroutineContext
+
     val log = logger(ImperativeBluePrintWorkflowService::class)
 
     lateinit var bluePrintRuntimeService: BluePrintRuntimeService<*>