Fix incorrect error handling for resolveWorkflowOutputs 78/109678/1
authorJozsef Csongvai <jozsef.csongvai@bell.ca>
Tue, 30 Jun 2020 10:59:43 +0000 (06:59 -0400)
committerJozsef Csongvai <jozsef.csongvai@bell.ca>
Tue, 30 Jun 2020 11:43:54 +0000 (07:43 -0400)
Issue-ID: CCSDK-2504
Change-Id: Ie910e47bb97be2db4f4a4e94653e5ae474a78c0d
Signed-off-by: Jozsef Csongvai <jozsef.csongvai@bell.ca>
ms/blueprintsprocessor/modules/services/workflow-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/workflow/BluePrintWorkflowExecutionServiceImpl.kt
ms/blueprintsprocessor/modules/services/workflow-service/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/workflow/BluePrintWorkflowExecutionServiceImplTest.kt

index 8a699d8..2403480 100644 (file)
@@ -90,12 +90,22 @@ open class BluePrintWorkflowExecutionServiceImpl(
         }
         executionServiceOutput.commonHeader = executionServiceInput.commonHeader
         executionServiceOutput.actionIdentifiers = executionServiceInput.actionIdentifiers
+
         // Resolve Workflow Outputs
-        val workflowOutputs = bluePrintRuntimeService.resolveWorkflowOutputs(workflowName)
+        var workflowOutputs: MutableMap<String, JsonNode>? = null
+        try {
+            workflowOutputs = bluePrintRuntimeService.resolveWorkflowOutputs(workflowName)
+        } catch (e: RuntimeException) {
+            log.error("Failed to resolve outputs for workflow: $workflowName", e)
+            e.message?.let { bluePrintRuntimeService.getBluePrintError().errors.add(it) }
+        }
 
         // Set the Response Payload
         executionServiceOutput.payload = JacksonUtils.objectMapper.createObjectNode()
-        executionServiceOutput.payload.set<JsonNode>("$workflowName-response", workflowOutputs.asObjectNode())
+        executionServiceOutput.payload.set<JsonNode>(
+                "$workflowName-response",
+                workflowOutputs?.asObjectNode() ?: JacksonUtils.objectMapper.createObjectNode()
+        )
         return executionServiceOutput
     }
 }
index 90b7200..47fbe10 100644 (file)
 
 package org.onap.ccsdk.cds.blueprintsprocessor.services.workflow
 
+import com.fasterxml.jackson.databind.JsonNode
+import com.fasterxml.jackson.databind.node.ObjectNode
 import io.mockk.every
+import io.mockk.mockk
 import io.mockk.mockkObject
 import io.mockk.unmockkAll
 import kotlinx.coroutines.runBlocking
@@ -24,20 +27,29 @@ import org.junit.After
 import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
+import org.onap.ccsdk.cds.blueprintsprocessor.core.api.data.ActionIdentifiers
+import org.onap.ccsdk.cds.blueprintsprocessor.core.api.data.CommonHeader
 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.service.BluePrintClusterService
 import org.onap.ccsdk.cds.blueprintsprocessor.services.workflow.mock.MockComponentFunction
 import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintConstants
+import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintError
 import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintProcessorException
+import org.onap.ccsdk.cds.controllerblueprints.core.asJsonType
+import org.onap.ccsdk.cds.controllerblueprints.core.data.Step
+import org.onap.ccsdk.cds.controllerblueprints.core.data.Workflow
 import org.onap.ccsdk.cds.controllerblueprints.core.interfaces.BluePrintWorkflowExecutionService
+import org.onap.ccsdk.cds.controllerblueprints.core.service.BluePrintContext
 import org.onap.ccsdk.cds.controllerblueprints.core.service.BluePrintDependencyService
+import org.onap.ccsdk.cds.controllerblueprints.core.service.BluePrintRuntimeService
 import org.onap.ccsdk.cds.controllerblueprints.core.utils.BluePrintMetadataUtils
 import org.onap.ccsdk.cds.controllerblueprints.core.utils.JacksonUtils
 import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.boot.test.mock.mockito.MockBean
 import org.springframework.test.context.ContextConfiguration
 import org.springframework.test.context.junit4.SpringRunner
+import java.lang.RuntimeException
 import kotlin.test.assertEquals
 import kotlin.test.assertFailsWith
 import kotlin.test.assertNotNull
@@ -131,4 +143,42 @@ class BluePrintWorkflowExecutionServiceImplTest {
             }
         }
     }
+
+    @Test
+    fun `Should handle errors from resolve workflow output`() {
+        val imperativeWorkflowExecutionService: ImperativeWorkflowExecutionService = mockk()
+        val bluePrintWorkflowExecutionServiceImpl = BluePrintWorkflowExecutionServiceImpl(
+                mockk(), mockk(), imperativeWorkflowExecutionService)
+        val bluePrintRuntimeService: BluePrintRuntimeService<MutableMap<String, JsonNode>> = mockk()
+        val bluePrintContext: BluePrintContext = mockk()
+        val executionServiceInput = ExecutionServiceInput().apply {
+            this.actionIdentifiers = ActionIdentifiers().apply { this.actionName = "config-assign" }
+            this.commonHeader = CommonHeader()
+            this.payload = """{"config-assign-request": {}}""".asJsonType() as ObjectNode
+        }
+        val workflow = Workflow().apply {
+            this.steps = mutableMapOf("one" to Step(), "two" to Step())
+        }
+        val blueprintError = BluePrintError()
+
+        every { bluePrintRuntimeService.bluePrintContext() } returns bluePrintContext
+        every { bluePrintRuntimeService.assignWorkflowInputs(any(), any()) } returns Unit
+        every { bluePrintContext.workflowByName(any()) } returns workflow
+        every {
+            bluePrintRuntimeService.resolveWorkflowOutputs(any())
+        } throws RuntimeException("failed to resolve property...")
+        every {
+            runBlocking {
+                imperativeWorkflowExecutionService.executeBluePrintWorkflow(any(), any(), any())
+            }
+        } returns ExecutionServiceOutput()
+        every { bluePrintRuntimeService.getBluePrintError() } returns blueprintError
+
+        runBlocking {
+            val output = bluePrintWorkflowExecutionServiceImpl.executeBluePrintWorkflow(
+                    bluePrintRuntimeService, executionServiceInput, mutableMapOf())
+            assertEquals("failed to resolve property...", blueprintError.errors[0])
+            assertEquals("""{"config-assign-response":{}}""".asJsonType(), output.payload)
+        }
+    }
 }