From aa3f6d9d6d87d265319820eaecb77dabed010a7b Mon Sep 17 00:00:00 2001 From: Jozsef Csongvai Date: Wed, 9 Dec 2020 19:49:48 -0500 Subject: Refactoring to enable on_failure for imperative workflow BlueprintError needs to associate errors with the steps in which they occurred in order for imperative workflow to handle on_failure properly. Made stepName more accessible and corrected places where stepName was assigned to nodeTemplateName. Issue-ID: CCSDK-3219 Change-Id: I7e5805745c63558cff6be533e1b99c32ad06c3db Signed-off-by: Jozsef Csongvai (cherry picked from commit b96b44d6d7ca11dbbc3ad4bd2194df31fba5efb6) --- .../services/execution/AbstractComponentFunction.kt | 12 ++++++++---- .../services/execution/ComponentRemoteScriptExecutor.kt | 3 +-- .../services/execution/ComponentScriptExecutor.kt | 3 +-- .../execution/scripts/AbstractComponentFunctionTest.kt | 3 +++ .../workflow/BlueprintWorkflowExecutionServiceImpl.kt | 2 +- .../services/workflow/ComponentWorkflowExecutionService.kt | 4 ++-- .../services/workflow/DGWorkflowExecutionService.kt | 6 ++++++ .../services/workflow/ImperativeWorkflowExecutionService.kt | 13 ++++++++----- .../services/workflow/NodeTemplateExecutionService.kt | 6 ++++-- .../workflow/executor/ComponentExecuteNodeExecutor.kt | 5 +++-- .../workflow/BlueprintWorkflowExecutionServiceImplTest.kt | 2 +- .../services/workflow/NodeTemplateExecutionServiceTest.kt | 4 +++- 12 files changed, 41 insertions(+), 22 deletions(-) (limited to 'ms/blueprintsprocessor/modules/services') diff --git a/ms/blueprintsprocessor/modules/services/execution-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/execution/AbstractComponentFunction.kt b/ms/blueprintsprocessor/modules/services/execution-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/execution/AbstractComponentFunction.kt index c1a898582..f85b6424d 100644 --- a/ms/blueprintsprocessor/modules/services/execution-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/execution/AbstractComponentFunction.kt +++ b/ms/blueprintsprocessor/modules/services/execution-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/execution/AbstractComponentFunction.kt @@ -65,7 +65,7 @@ abstract class AbstractComponentFunction : BlueprintFunctionNode = hashMapOf() override fun getName(): String { - return stepName + return "$stepName - $nodeTemplateName" } override suspend fun prepareRequestNB(executionRequest: ExecutionServiceInput): ExecutionServiceInput { @@ -143,8 +143,12 @@ abstract class AbstractComponentFunction : BlueprintFunctionNode) { diff --git a/ms/blueprintsprocessor/modules/services/execution-service/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/execution/scripts/AbstractComponentFunctionTest.kt b/ms/blueprintsprocessor/modules/services/execution-service/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/execution/scripts/AbstractComponentFunctionTest.kt index 8440e5faa..3438821c7 100644 --- a/ms/blueprintsprocessor/modules/services/execution-service/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/execution/scripts/AbstractComponentFunctionTest.kt +++ b/ms/blueprintsprocessor/modules/services/execution-service/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/execution/scripts/AbstractComponentFunctionTest.kt @@ -41,6 +41,7 @@ import org.onap.ccsdk.cds.blueprintsprocessor.services.execution.AbstractCompone import org.onap.ccsdk.cds.blueprintsprocessor.services.execution.ComponentFunctionScriptingService import org.onap.ccsdk.cds.blueprintsprocessor.services.execution.nodeTypeComponentScriptExecutor import org.onap.ccsdk.cds.controllerblueprints.core.BlueprintConstants +import org.onap.ccsdk.cds.controllerblueprints.core.BlueprintError import org.onap.ccsdk.cds.controllerblueprints.core.BlueprintTypes import org.onap.ccsdk.cds.controllerblueprints.core.asJsonPrimitive import org.onap.ccsdk.cds.controllerblueprints.core.asJsonType @@ -90,6 +91,8 @@ class AbstractComponentFunctionTest { any(), any(), any() ) } returns Implementation() + + every { bluePrintRuntimeService.getBlueprintError() } returns BlueprintError() } @Test diff --git a/ms/blueprintsprocessor/modules/services/workflow-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/workflow/BlueprintWorkflowExecutionServiceImpl.kt b/ms/blueprintsprocessor/modules/services/workflow-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/workflow/BlueprintWorkflowExecutionServiceImpl.kt index d690235e9..5a175b056 100644 --- a/ms/blueprintsprocessor/modules/services/workflow-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/workflow/BlueprintWorkflowExecutionServiceImpl.kt +++ b/ms/blueprintsprocessor/modules/services/workflow-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/workflow/BlueprintWorkflowExecutionServiceImpl.kt @@ -97,7 +97,7 @@ open class BlueprintWorkflowExecutionServiceImpl( 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) } + e.message?.let { bluePrintRuntimeService.getBlueprintError().addError(it, "workflow") } } // Set the Response Payload diff --git a/ms/blueprintsprocessor/modules/services/workflow-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/workflow/ComponentWorkflowExecutionService.kt b/ms/blueprintsprocessor/modules/services/workflow-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/workflow/ComponentWorkflowExecutionService.kt index 330d297c2..322180893 100644 --- a/ms/blueprintsprocessor/modules/services/workflow-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/workflow/ComponentWorkflowExecutionService.kt +++ b/ms/blueprintsprocessor/modules/services/workflow-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/workflow/ComponentWorkflowExecutionService.kt @@ -38,10 +38,10 @@ open class ComponentWorkflowExecutionService(private val nodeTemplateExecutionSe // Get the DG Node Template val nodeTemplateName = bluePrintContext.workflowFirstStepNodeTemplate(workflowName) + val stepName = bluePrintContext.workflowSteps(workflowName).keys.first() return nodeTemplateExecutionService.executeNodeTemplate( - bluePrintRuntimeService, - nodeTemplateName, executionServiceInput + bluePrintRuntimeService, stepName, nodeTemplateName, executionServiceInput ) } } diff --git a/ms/blueprintsprocessor/modules/services/workflow-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/workflow/DGWorkflowExecutionService.kt b/ms/blueprintsprocessor/modules/services/workflow-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/workflow/DGWorkflowExecutionService.kt index c8d72a1a4..efcae4aee 100644 --- a/ms/blueprintsprocessor/modules/services/workflow-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/workflow/DGWorkflowExecutionService.kt +++ b/ms/blueprintsprocessor/modules/services/workflow-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/workflow/DGWorkflowExecutionService.kt @@ -19,6 +19,7 @@ package org.onap.ccsdk.cds.blueprintsprocessor.services.workflow 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.StepData import org.onap.ccsdk.cds.blueprintsprocessor.services.workflow.utils.SvcGraphUtils import org.onap.ccsdk.cds.controllerblueprints.core.interfaces.BlueprintWorkflowExecutionService import org.onap.ccsdk.cds.controllerblueprints.core.normalizedPathName @@ -45,6 +46,11 @@ open class DGWorkflowExecutionService(private val blueprintSvcLogicService: Blue // Get the DG Node Template val nodeTemplateName = bluePrintContext.workflowFirstStepNodeTemplate(workflowName) + val stepName = bluePrintContext.workflowSteps(workflowName).keys.first() + executionServiceInput.stepData = StepData().apply { + name = stepName + } + log.info("Executing workflow($workflowName) directed graph NodeTemplate($nodeTemplateName)") // Get the DG file info 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 561136a87..29019b7cc 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 @@ -114,7 +114,7 @@ open class ImperativeBlueprintWorkflowService(private val nodeTemplateExecutionS if (exceptions.isNotEmpty()) { exceptions.forEach { val errorMessage = it.message ?: "" - bluePrintRuntimeService.getBlueprintError().addError(errorMessage) + bluePrintRuntimeService.getBlueprintError().addError(errorMessage, "workflow") log.error("workflow($workflowId) exception :", it) } message = BlueprintConstants.STATUS_FAILURE @@ -160,12 +160,15 @@ open class ImperativeBlueprintWorkflowService(private val nodeTemplateExecutionS /** execute node template */ val executionServiceOutput = nodeTemplateExecutionService - .executeNodeTemplate(bluePrintRuntimeService, nodeTemplateName, nodeInput) + .executeNodeTemplate(bluePrintRuntimeService, node.id, nodeTemplateName, nodeInput) - return when (executionServiceOutput.status.message) { - BlueprintConstants.STATUS_FAILURE -> EdgeLabel.FAILURE - else -> EdgeLabel.SUCCESS + if (executionServiceOutput.status.message == BlueprintConstants.STATUS_FAILURE) { + // Clear step errors so that the workflow does not fail + bluePrintRuntimeService.getBlueprintError().stepErrors(node.id)?.clear() + return EdgeLabel.FAILURE } + + return EdgeLabel.SUCCESS } override suspend fun skipNode( diff --git a/ms/blueprintsprocessor/modules/services/workflow-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/workflow/NodeTemplateExecutionService.kt b/ms/blueprintsprocessor/modules/services/workflow-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/workflow/NodeTemplateExecutionService.kt index 1d179a1b7..ff8f5b8cf 100644 --- a/ms/blueprintsprocessor/modules/services/workflow-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/workflow/NodeTemplateExecutionService.kt +++ b/ms/blueprintsprocessor/modules/services/workflow-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/workflow/NodeTemplateExecutionService.kt @@ -37,6 +37,7 @@ open class NodeTemplateExecutionService(private val bluePrintClusterService: Blu suspend fun executeNodeTemplate( bluePrintRuntimeService: BlueprintRuntimeService<*>, + stepName: String, nodeTemplateName: String, executionServiceInput: ExecutionServiceInput ): ExecutionServiceOutput { @@ -66,7 +67,8 @@ open class NodeTemplateExecutionService(private val bluePrintClusterService: Blu // Set the Blueprint Services plugin.bluePrintRuntimeService = bluePrintRuntimeService plugin.bluePrintClusterService = bluePrintClusterService - plugin.stepName = nodeTemplateName + plugin.stepName = stepName + plugin.nodeTemplateName = nodeTemplateName // Parent request shouldn't tamper, so need to clone the request and send to the actual component. val clonedExecutionServiceInput = ExecutionServiceInput().apply { @@ -81,7 +83,7 @@ open class NodeTemplateExecutionService(private val bluePrintClusterService: Blu stepInputs[BlueprintConstants.PROPERTY_CURRENT_INTERFACE] = interfaceName.asJsonPrimitive() stepInputs[BlueprintConstants.PROPERTY_CURRENT_OPERATION] = operationName.asJsonPrimitive() val stepInputData = StepData().apply { - name = nodeTemplateName + name = stepName properties = stepInputs } clonedExecutionServiceInput.stepData = stepInputData diff --git a/ms/blueprintsprocessor/modules/services/workflow-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/workflow/executor/ComponentExecuteNodeExecutor.kt b/ms/blueprintsprocessor/modules/services/workflow-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/workflow/executor/ComponentExecuteNodeExecutor.kt index cf5955e33..2e3f78a69 100644 --- a/ms/blueprintsprocessor/modules/services/workflow-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/workflow/executor/ComponentExecuteNodeExecutor.kt +++ b/ms/blueprintsprocessor/modules/services/workflow-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/workflow/executor/ComponentExecuteNodeExecutor.kt @@ -48,10 +48,11 @@ open class ComponentExecuteNodeExecutor(private val nodeTemplateExecutionService val executionInput = ctx.getRequest() as ExecutionServiceInput + val stepName = executionInput.stepData?.name ?: nodeTemplateName + try { // Get the Request from the Context and Set to the Function Input and Invoke the function val executionOutput = nodeTemplateExecutionService.executeNodeTemplate( - ctx.getBlueprintService(), - nodeTemplateName, executionInput + ctx.getBlueprintService(), stepName, nodeTemplateName, executionInput ) ctx.setResponse(executionOutput) diff --git a/ms/blueprintsprocessor/modules/services/workflow-service/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/workflow/BlueprintWorkflowExecutionServiceImplTest.kt b/ms/blueprintsprocessor/modules/services/workflow-service/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/workflow/BlueprintWorkflowExecutionServiceImplTest.kt index 0bd1c33c9..b7087b338 100644 --- a/ms/blueprintsprocessor/modules/services/workflow-service/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/workflow/BlueprintWorkflowExecutionServiceImplTest.kt +++ b/ms/blueprintsprocessor/modules/services/workflow-service/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/workflow/BlueprintWorkflowExecutionServiceImplTest.kt @@ -178,7 +178,7 @@ class BlueprintWorkflowExecutionServiceImplTest { val output = bluePrintWorkflowExecutionServiceImpl.executeBlueprintWorkflow( bluePrintRuntimeService, executionServiceInput, mutableMapOf() ) - assertEquals("failed to resolve property...", blueprintError.errors[0]) + assertEquals("failed to resolve property...", blueprintError.allErrors()[0]) assertEquals("""{"config-assign-response":{}}""".asJsonType(), output.payload) } } diff --git a/ms/blueprintsprocessor/modules/services/workflow-service/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/workflow/NodeTemplateExecutionServiceTest.kt b/ms/blueprintsprocessor/modules/services/workflow-service/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/workflow/NodeTemplateExecutionServiceTest.kt index 70b52d053..b113987e5 100644 --- a/ms/blueprintsprocessor/modules/services/workflow-service/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/workflow/NodeTemplateExecutionServiceTest.kt +++ b/ms/blueprintsprocessor/modules/services/workflow-service/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/workflow/NodeTemplateExecutionServiceTest.kt @@ -72,10 +72,12 @@ class NodeTemplateExecutionServiceTest { val input = executionServiceInput.payload.get("resource-assignment-request") bluePrintRuntimeService.assignWorkflowInputs("resource-assignment", input) + val stepName = bluePrintRuntimeService.bluePrintContext() + .workflowSteps("resource-assignment").keys.first() val nodeTemplate = "resource-assignment" val nodeTemplateExecutionService = NodeTemplateExecutionService(bluePrintClusterService) val executionServiceOutput = nodeTemplateExecutionService - .executeNodeTemplate(bluePrintRuntimeService, nodeTemplate, executionServiceInput) + .executeNodeTemplate(bluePrintRuntimeService, stepName, nodeTemplate, executionServiceInput) assertNotNull(executionServiceOutput, "failed to get response") assertEquals( -- cgit 1.2.3-korg