From 1e3c281b0ae601b3c1bed4ba52fc5cb9ae0b0f7a Mon Sep 17 00:00:00 2001 From: Jozsef Csongvai Date: Fri, 26 Nov 2021 17:24:42 -0500 Subject: [PATCH] Enable CreateChildServiceBB for Service-Macro-Create Issue-ID: SO-3811 Signed-off-by: Jozsef Csongvai Change-Id: I7979082a9f145a84f6f03cf2c44e9ccbca198c5a --- .../main/resources/db/migration/R__MacroData.sql | 48 ++++---- .../entities/WorkflowResourceIds.java | 21 ++++ .../servicedecomposition/tasks/BBInputSetup.java | 2 + .../bpmn/process/WorkflowActionBBTest.java | 1 + .../tasks/ExecuteBuildingBlockBuilder.java | 15 ++- .../workflow/tasks/WorkflowAction.java | 39 ++++-- .../workflow/tasks/WorkflowActionBBFailure.java | 21 ++++ .../workflow/tasks/WorkflowActionBBTasks.java | 17 +++ .../workflow/tasks/WorkflowActionConstants.java | 1 + .../tasks/ebb/loader/ServiceEBBLoader.java | 6 +- .../ebb/loader/UserParamsServiceTraversal.java | 13 ++ .../tasks/WorkflowActionBBFailureTest.java | 133 +++++++++++++++++++++ 12 files changed, 284 insertions(+), 33 deletions(-) diff --git a/adapters/mso-catalog-db-adapter/src/main/resources/db/migration/R__MacroData.sql b/adapters/mso-catalog-db-adapter/src/main/resources/db/migration/R__MacroData.sql index 3b95ffef0a..6b552b3fdd 100644 --- a/adapters/mso-catalog-db-adapter/src/main/resources/db/migration/R__MacroData.sql +++ b/adapters/mso-catalog-db-adapter/src/main/resources/db/migration/R__MacroData.sql @@ -69,27 +69,28 @@ INSERT INTO orchestration_flow_reference(COMPOSITE_ACTION, SEQ_NO, FLOW_NAME, SC ('Service-Macro-Unassign', '4', 'UnassignNetworkBB', NULL, NULL, 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Unassign' and CLOUD_OWNER = 'DEFAULT')), ('Service-Macro-Unassign', '5', 'UnassignServiceInstanceBB', NULL, NULL, 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Unassign' and CLOUD_OWNER = 'DEFAULT')), ('Service-Macro-Create', '1', 'AssignServiceInstanceBB', NULL, NULL, 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')), -('Service-Macro-Create', '2', 'CreateNetworkCollectionBB', NULL, NULL,1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')), -('Service-Macro-Create', '3', 'AssignNetworkBB', NULL, NULL, 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')), -('Service-Macro-Create', '4', 'AssignVnfBB', NULL, NULL, 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')), -('Service-Macro-Create', '5', 'AssignVolumeGroupBB', NULL, NULL, 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')), -('Service-Macro-Create', '6', 'AssignVfModuleBB', NULL, NULL, 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')), -('Service-Macro-Create', '7', 'ControllerExecutionBB', 'vnf', 'config-assign', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')), -('Service-Macro-Create', '8', 'AssignPnfBB', NULL, NULL, 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')), -('Service-Macro-Create', '9', 'WaitForPnfReadyBB', NULL, NULL, 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')), -('Service-Macro-Create', '10', 'ControllerExecutionBB', 'pnf', 'config-assign', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')), -('Service-Macro-Create', '11', 'ControllerExecutionBB', 'pnf', 'config-deploy', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')), -('Service-Macro-Create', '12', 'ActivatePnfBB', NULL, NULL, 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')), -('Service-Macro-Create', '13', 'CreateNetworkBB', NULL, NULL, 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')), -('Service-Macro-Create', '14', 'ActivateNetworkBB', NULL, NULL, 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')), -('Service-Macro-Create', '15', 'CreateVolumeGroupBB', NULL, NULL, 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')), -('Service-Macro-Create', '16', 'ActivateVolumeGroupBB', NULL, NULL, 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')), -('Service-Macro-Create', '17', 'CreateVfModuleBB', NULL, NULL, 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')), -('Service-Macro-Create', '18', 'ActivateVfModuleBB', NULL, NULL, 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')), -('Service-Macro-Create', '19', 'ControllerExecutionBB', 'vnf', 'config-deploy', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')), -('Service-Macro-Create', '20', 'ActivateVnfBB', NULL, NULL, 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')), -('Service-Macro-Create', '21', 'ActivateNetworkCollectionBB', NULL, NULL,1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')), -('Service-Macro-Create', '22', 'ActivateServiceInstanceBB', NULL, NULL, 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')), +('Service-Macro-Create', '2', 'CreateChildServiceBB', NULL, NULL,1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')), +('Service-Macro-Create', '3', 'CreateNetworkCollectionBB', NULL, NULL,1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')), +('Service-Macro-Create', '4', 'AssignNetworkBB', NULL, NULL, 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')), +('Service-Macro-Create', '5', 'AssignVnfBB', NULL, NULL, 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')), +('Service-Macro-Create', '6', 'AssignVolumeGroupBB', NULL, NULL, 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')), +('Service-Macro-Create', '7', 'AssignVfModuleBB', NULL, NULL, 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')), +('Service-Macro-Create', '8', 'ControllerExecutionBB', 'vnf', 'config-assign', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')), +('Service-Macro-Create', '9', 'AssignPnfBB', NULL, NULL, 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')), +('Service-Macro-Create', '10', 'WaitForPnfReadyBB', NULL, NULL, 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')), +('Service-Macro-Create', '11', 'ControllerExecutionBB', 'pnf', 'config-assign', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')), +('Service-Macro-Create', '12', 'ControllerExecutionBB', 'pnf', 'config-deploy', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')), +('Service-Macro-Create', '13', 'ActivatePnfBB', NULL, NULL, 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')), +('Service-Macro-Create', '14', 'CreateNetworkBB', NULL, NULL, 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')), +('Service-Macro-Create', '15', 'ActivateNetworkBB', NULL, NULL, 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')), +('Service-Macro-Create', '16', 'CreateVolumeGroupBB', NULL, NULL, 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')), +('Service-Macro-Create', '17', 'ActivateVolumeGroupBB', NULL, NULL, 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')), +('Service-Macro-Create', '18', 'CreateVfModuleBB', NULL, NULL, 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')), +('Service-Macro-Create', '19', 'ActivateVfModuleBB', NULL, NULL, 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')), +('Service-Macro-Create', '20', 'ControllerExecutionBB', 'vnf', 'config-deploy', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')), +('Service-Macro-Create', '21', 'ActivateVnfBB', NULL, NULL, 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')), +('Service-Macro-Create', '22', 'ActivateNetworkCollectionBB', NULL, NULL,1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')), +('Service-Macro-Create', '23', 'ActivateServiceInstanceBB', NULL, NULL, 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')), ('Service-Macro-Delete', '1', 'DeactivateVfModuleBB', NULL, NULL, 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Delete' and CLOUD_OWNER = 'DEFAULT')), ('Service-Macro-Delete', '2', 'DeleteVfModuleBB', NULL, NULL, 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Delete' and CLOUD_OWNER = 'DEFAULT')), ('Service-Macro-Delete', '3', 'DeactivateVolumeGroupBB', NULL, NULL, 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Delete' and CLOUD_OWNER = 'DEFAULT')), @@ -320,7 +321,8 @@ VALUES ('VNFHealthCheckActivity','*','*','*','*','Manual','Abort','*', '*'), ('VNFConfigModifyActivity','*','*','*','*','Manual','Abort','*', '*'), ('VNFUnsetInMaintFlagActivity','*','*','*','*','Manual','Abort','*', '*'), -('VNFUnsetClosedLoopDisabledActivity','*','*','*','*','Manual','Abort','*', '*'); +('VNFUnsetClosedLoopDisabledActivity','*','*','*','*','Manual','Abort','*', '*'), +('CreateChildServiceBB', '*', '*', '*', '*', 'Rollback', 'Abort', '*', '*'); INSERT INTO building_block_detail (building_block_name, resource_type, target_action) VALUES @@ -361,6 +363,8 @@ VALUES ('CreateVfModuleBB', 'VF_MODULE', 'CREATE'), ('CreateNetworkBB', 'NETWORK', 'CREATE'), ('CreateNetworkCollectionBB', 'NETWORK_COLLECTION', 'CREATE'), +('CreateChildServiceBB', 'NO_VALIDATE', 'CUSTOM'), +('DeleteChildServiceBB', 'NO_VALIDATE', 'CUSTOM'), ('DeleteVolumeGroupBB', 'VOLUME_GROUP', 'DELETE'), ('DeleteVfModuleBB', 'VF_MODULE', 'DELETE'), diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/entities/WorkflowResourceIds.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/entities/WorkflowResourceIds.java index 5df7c60f74..cfcc1f9f3b 100644 --- a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/entities/WorkflowResourceIds.java +++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/entities/WorkflowResourceIds.java @@ -42,6 +42,9 @@ public class WorkflowResourceIds implements Serializable { private String instanceGroupId; private String vnfInstanceName; private String vfModuleInstanceName; + private String childServiceInstanceId; + private String childServiceInstanceName; + public WorkflowResourceIds() { @@ -58,6 +61,8 @@ public class WorkflowResourceIds implements Serializable { this.networkCollectionId = workflowResourceIds.networkCollectionId; this.configurationId = workflowResourceIds.configurationId; this.instanceGroupId = workflowResourceIds.instanceGroupId; + this.childServiceInstanceId = workflowResourceIds.childServiceInstanceId; + this.childServiceInstanceName = workflowResourceIds.childServiceInstanceName; } @@ -157,4 +162,20 @@ public class WorkflowResourceIds implements Serializable { public void setVfModuleInstanceName(String vfModuleInstanceName) { this.vfModuleInstanceName = vfModuleInstanceName; } + + public String getChildServiceInstanceId() { + return childServiceInstanceId; + } + + public void setChildServiceInstanceId(String childServiceInstanceId) { + this.childServiceInstanceId = childServiceInstanceId; + } + + public String getChildServiceInstanceName() { + return childServiceInstanceName; + } + + public void setChildServiceInstanceName(String childServiceInstanceName) { + this.childServiceInstanceName = childServiceInstanceName; + } } diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetup.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetup.java index d39da5ee37..a38eb8c3a7 100644 --- a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetup.java +++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetup.java @@ -262,6 +262,8 @@ public class BBInputSetup implements JavaDelegate { lookupKeyMap.put(ResourceKey.INSTANCE_GROUP_ID, workflowResourceIds.getInstanceGroupId()); lookupKeyMap.put(ResourceKey.VNF_INSTANCE_NAME, workflowResourceIds.getVnfInstanceName()); lookupKeyMap.put(ResourceKey.VF_MODULE_INSTANCE_NAME, workflowResourceIds.getVfModuleInstanceName()); + lookupKeyMap.put(ResourceKey.CHILD_SERVICE_INSTANCE_ID, workflowResourceIds.getChildServiceInstanceId()); + lookupKeyMap.put(ResourceKey.CHILD_SERVICE_INSTANCE_NAME, workflowResourceIds.getChildServiceInstanceName()); } protected GeneralBuildingBlock getGBBALaCarteNonService(ExecuteBuildingBlock executeBB, diff --git a/bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/process/WorkflowActionBBTest.java b/bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/process/WorkflowActionBBTest.java index f492326b0c..6c732a1edb 100644 --- a/bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/process/WorkflowActionBBTest.java +++ b/bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/process/WorkflowActionBBTest.java @@ -106,6 +106,7 @@ public class WorkflowActionBBTest extends BaseBPMNTest { } + @Test public void retrieveBBExecutionListerrorHandling() throws Exception { variables.put("isTopLevelFlow", true); diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ExecuteBuildingBlockBuilder.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ExecuteBuildingBlockBuilder.java index 920369784e..b0182c1b00 100755 --- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ExecuteBuildingBlockBuilder.java +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ExecuteBuildingBlockBuilder.java @@ -109,13 +109,22 @@ public class ExecuteBuildingBlockBuilder { String requestId, String apiVersion, String resourceId, String requestAction, String vnfType, WorkflowResourceIds workflowResourceIds, RequestDetails requestDetails, boolean replaceVnf) { List flowsToExecute = new ArrayList<>(); - if (orchFlow.getFlowName().contains(SERVICE) || (orchFlow.getFlowName().contains(CONTROLLER) + if (orchFlow.getFlowName().contains(CHILD_SERVICE)) { + if (WorkflowType.SERVICE.equals(resource.getResourceType()) && resource.hasParent()) { + addBuildingBlockToExecuteBBList(flowsToExecute, resource, WorkflowType.SERVICE, orchFlow, requestId, + apiVersion, resourceId, requestAction, vnfType, workflowResourceIds, requestDetails, false, + false); + } + } else if (orchFlow.getFlowName().contains(SERVICE) || (orchFlow.getFlowName().contains(CONTROLLER) && (SERVICE).equalsIgnoreCase(orchFlow.getBpmnScope()))) { if (!replaceVnf) { workflowResourceIds.setServiceInstanceId(resourceId); } - addBuildingBlockToExecuteBBList(flowsToExecute, resource, WorkflowType.SERVICE, orchFlow, requestId, - apiVersion, resourceId, requestAction, vnfType, workflowResourceIds, requestDetails, false, false); + if (!resource.hasParent()) { + addBuildingBlockToExecuteBBList(flowsToExecute, resource, WorkflowType.SERVICE, orchFlow, requestId, + apiVersion, resourceId, requestAction, vnfType, workflowResourceIds, requestDetails, false, + false); + } } else if (orchFlow.getFlowName().contains(VNF) || (orchFlow.getFlowName().contains(CONTROLLER) && (VNF).equalsIgnoreCase(orchFlow.getBpmnScope()))) { addBuildingBlockToExecuteBBList(flowsToExecute, resource, WorkflowType.VNF, orchFlow, requestId, apiVersion, diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowAction.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowAction.java index 10cea171ce..ef0fbc850e 100755 --- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowAction.java +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowAction.java @@ -28,6 +28,8 @@ package org.onap.so.bpmn.infrastructure.workflow.tasks; +import static org.onap.so.bpmn.infrastructure.service.composition.ServiceCompositionConstants.IS_CHILD_PROCESS; +import static org.onap.so.bpmn.infrastructure.service.composition.ServiceCompositionConstants.PARENT_CORRELATION_ID; import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.ASSIGN_INSTANCE; import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.CONTROLLER; import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.CREATE_INSTANCE; @@ -96,6 +98,7 @@ import org.springframework.core.env.Environment; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import com.fasterxml.jackson.databind.ObjectMapper; +import org.onap.so.serviceinstancebeans.InstanceDirection; @Component public class WorkflowAction { @@ -347,6 +350,19 @@ public class WorkflowAction { log += ", Action: " + block.getBuildingBlock().getBpmnAction(); logger.info(log); } + + RelatedInstanceList[] instanceList = sIRequest.getRequestDetails().getRelatedInstanceList(); + execution.setVariable(IS_CHILD_PROCESS, Boolean.FALSE); + if (instanceList != null) { + for (RelatedInstanceList relatedInstanceList : instanceList) { + RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance(); + if (InstanceDirection.source.equals(relatedInstance.getInstanceDirection())) { + execution.setVariable(IS_CHILD_PROCESS, Boolean.TRUE); + execution.setVariable(PARENT_CORRELATION_ID, requestDetails.getRequestInfo().getCorrelator()); + } + } + } + // By default, enable homing at VNF level for CREATE_INSTANCE and ASSIGNINSTANCE if (resourceType == WorkflowType.SERVICE && (requestAction.equals(CREATE_INSTANCE) || requestAction.equals(ASSIGN_INSTANCE)) @@ -698,8 +714,9 @@ public class WorkflowAction { private void generateResourceIds(List flowsToExecute, List resourceList, String serviceInstanceId) { Map resourceInstanceIds = new HashMap<>(); - Arrays.stream(WorkflowType.values()).filter(type -> !type.equals(WorkflowType.SERVICE)) - .forEach(type -> resourceList.stream().filter(resource -> type.equals(resource.getResourceType())) + Arrays.stream(WorkflowType.values()) + .forEach(type -> resourceList.stream() + .filter(resource -> resource.hasParent() && type.equals(resource.getResourceType())) .forEach(resource -> updateWorkflowResourceIds(flowsToExecute, type, resource, null, resource.getVirtualLinkKey(), serviceInstanceId, resourceInstanceIds))); } @@ -727,13 +744,19 @@ public class WorkflowAction { WorkflowResourceIds workflowResourceIds = new WorkflowResourceIds(); workflowResourceIds.setServiceInstanceId(serviceInstanceId); Resource parent = resource.getParent(); - if (parent != null && resourceInstanceIds.containsKey(parent)) { + if (resource.hasParent() && resourceInstanceIds.containsKey(parent)) { WorkflowResourceIdsUtils.setResourceIdByWorkflowType(workflowResourceIds, parent.getResourceType(), resourceInstanceIds.get(parent)); } - WorkflowResourceIdsUtils.setInstanceNameByWorkflowType(workflowResourceIds, resourceType, - resource.getInstanceName()); - WorkflowResourceIdsUtils.setResourceIdByWorkflowType(workflowResourceIds, resourceType, resourceId); + if (resource.hasParent() && WorkflowType.SERVICE.equals(resourceType) + && WorkflowType.SERVICE.equals(parent.getResourceType())) { + workflowResourceIds.setChildServiceInstanceId(resourceId); + workflowResourceIds.setChildServiceInstanceName(resource.getInstanceName()); + } else { + WorkflowResourceIdsUtils.setInstanceNameByWorkflowType(workflowResourceIds, resourceType, + resource.getInstanceName()); + WorkflowResourceIdsUtils.setResourceIdByWorkflowType(workflowResourceIds, resourceType, resourceId); + } ebb.setWorkflowResourceIds(workflowResourceIds); assignedFlows.add(flowName + action); } @@ -749,7 +772,9 @@ public class WorkflowAction { private boolean isFlowAssignable(Set assignedFlows, ExecuteBuildingBlock ebb, WorkflowType resourceType, String assignedFlowName) { - String id = WorkflowResourceIdsUtils.getResourceIdByWorkflowType(ebb.getWorkflowResourceIds(), resourceType); + String id = WorkflowType.SERVICE.equals(resourceType) + ? StringUtils.defaultString(ebb.getWorkflowResourceIds().getChildServiceInstanceId()) + : WorkflowResourceIdsUtils.getResourceIdByWorkflowType(ebb.getWorkflowResourceIds(), resourceType); return !assignedFlows.contains(assignedFlowName) && id.isEmpty(); } diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionBBFailure.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionBBFailure.java index 8d9e020f67..38fe6a3157 100644 --- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionBBFailure.java +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionBBFailure.java @@ -35,6 +35,12 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import static org.onap.so.bpmn.infrastructure.service.composition.ServiceCompositionConstants.CHILD_SVC_REQ_CORRELATION_ID; +import static org.onap.so.bpmn.infrastructure.service.composition.ServiceCompositionConstants.CHILD_SVC_REQ_ERROR; +import static org.onap.so.bpmn.infrastructure.service.composition.ServiceCompositionConstants.CHILD_SVC_REQ_MESSAGE_NAME; +import static org.onap.so.bpmn.infrastructure.service.composition.ServiceCompositionConstants.CHILD_SVC_REQ_STATUS; +import static org.onap.so.bpmn.infrastructure.service.composition.ServiceCompositionConstants.IS_CHILD_PROCESS; +import static org.onap.so.bpmn.infrastructure.service.composition.ServiceCompositionConstants.PARENT_CORRELATION_ID; @Component public class WorkflowActionBBFailure { @@ -44,6 +50,7 @@ public class WorkflowActionBBFailure { private static final String DELETE_FABRIC_CONFIGURATION_FLOW = "DeleteFabricConfigurationBB"; private static final Logger logger = LoggerFactory.getLogger(WorkflowActionBBFailure.class); public static final String ROLLBACK_TARGET_STATE = "rollbackTargetState"; + @Autowired private RequestsDbClient requestDbclient; @Autowired @@ -83,6 +90,7 @@ public class WorkflowActionBBFailure { InfraActiveRequests request = requestDbclient.getInfraActiveRequestbyRequestId(requestId); String rollbackErrorMsg = ""; String errorMsg = ""; + String childErrorMessage = ""; Boolean rollbackCompletedSuccessfully = (Boolean) execution.getVariable("isRollbackComplete"); Boolean isRollbackFailure = (Boolean) execution.getVariable("isRollback"); ExecuteBuildingBlock ebb = (ExecuteBuildingBlock) execution.getVariable("buildingBlock"); @@ -94,6 +102,7 @@ public class WorkflowActionBBFailure { if (rollbackCompletedSuccessfully) { rollbackErrorMsg = "Rollback has been completed successfully."; + childErrorMessage = rollbackErrorMsg; request.setRollbackStatusMessage(rollbackErrorMsg); execution.setVariable("RollbackErrorMessage", rollbackErrorMsg); String rollbackTargetState = (String) execution.getVariable(ROLLBACK_TARGET_STATE); @@ -116,6 +125,7 @@ public class WorkflowActionBBFailure { } else { rollbackErrorMsg = "Failed to determine rollback error message."; } + childErrorMessage = rollbackErrorMsg; request.setRollbackStatusMessage(rollbackErrorMsg); execution.setVariable("RollbackErrorMessage", rollbackErrorMsg); request.setRequestStatus(Status.FAILED.toString()); @@ -126,6 +136,7 @@ public class WorkflowActionBBFailure { } else { errorMsg = "Failed to determine error message"; } + childErrorMessage = errorMsg; request.setStatusMessage(errorMsg); execution.setVariable("ErrorMessage", errorMsg); String handlingCode = (String) execution.getVariable("handlingCode"); @@ -146,6 +157,16 @@ public class WorkflowActionBBFailure { execution.setVariable("flowStatus", flowStatus); } + if (Boolean.TRUE.equals(execution.getVariable(IS_CHILD_PROCESS))) { + String parentCorrelationId = (String) execution.getVariable(PARENT_CORRELATION_ID); + logger.info("Child service creation failed. Sending message to parent with correlationId: " + + parentCorrelationId); + execution.getProcessEngineServices().getRuntimeService() + .createMessageCorrelation(CHILD_SVC_REQ_MESSAGE_NAME) + .setVariable(CHILD_SVC_REQ_STATUS, "FAILED").setVariable(CHILD_SVC_REQ_ERROR, childErrorMessage) + .processInstanceVariableEquals(CHILD_SVC_REQ_CORRELATION_ID, parentCorrelationId).correlate(); + } + request.setProgress(Long.valueOf(100)); request.setLastModifiedBy("CamundaBPMN"); request.setEndTime(new Timestamp(System.currentTimeMillis())); diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionBBTasks.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionBBTasks.java index b76cf1eb5f..dda217fc79 100644 --- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionBBTasks.java +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionBBTasks.java @@ -65,6 +65,12 @@ import org.springframework.core.env.Environment; import org.springframework.stereotype.Component; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import static org.onap.so.bpmn.infrastructure.service.composition.ServiceCompositionConstants.CHILD_SVC_REQ_ERROR; +import static org.onap.so.bpmn.infrastructure.service.composition.ServiceCompositionConstants.CHILD_SVC_REQ_MESSAGE_NAME; +import static org.onap.so.bpmn.infrastructure.service.composition.ServiceCompositionConstants.CHILD_SVC_REQ_STATUS; +import static org.onap.so.bpmn.infrastructure.service.composition.ServiceCompositionConstants.IS_CHILD_PROCESS; +import static org.onap.so.bpmn.infrastructure.service.composition.ServiceCompositionConstants.CHILD_SVC_REQ_CORRELATION_ID; +import static org.onap.so.bpmn.infrastructure.service.composition.ServiceCompositionConstants.PARENT_CORRELATION_ID; @Component public class WorkflowActionBBTasks { @@ -231,6 +237,17 @@ public class WorkflowActionBBTasks { final boolean aLaCarte = (boolean) execution.getVariable(BBConstants.G_ALACARTE); final String resourceName = (String) execution.getVariable("resourceName"); String statusMessage = (String) execution.getVariable("StatusMessage"); + + if (Boolean.TRUE.equals(execution.getVariable(IS_CHILD_PROCESS))) { + String parentCorrelationId = (String) execution.getVariable(PARENT_CORRELATION_ID); + logger.info("Child service request completed. Sending message to parent process with correlationId: " + + parentCorrelationId); + execution.getProcessEngineServices().getRuntimeService() + .createMessageCorrelation(CHILD_SVC_REQ_MESSAGE_NAME) + .setVariable(CHILD_SVC_REQ_STATUS, "COMPLETED").setVariable(CHILD_SVC_REQ_ERROR, "") + .processInstanceVariableEquals(CHILD_SVC_REQ_CORRELATION_ID, parentCorrelationId).correlate(); + } + String macroAction; if (statusMessage == null) { if (aLaCarte) { diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionConstants.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionConstants.java index a41613982d..7bbc9f3739 100755 --- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionConstants.java +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionConstants.java @@ -34,6 +34,7 @@ public final class WorkflowActionConstants { public static final String ACTIVATE_INSTANCE = "activateInstance"; public static final String ASSIGN_INSTANCE = "assignInstance"; + public static final String CHILD_SERVICE = "ChildService"; public static final String CONFIGURATION = "Configuration"; public static final String CONTROLLER = "Controller"; public static final String CREATE_INSTANCE = "createInstance"; diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ebb/loader/ServiceEBBLoader.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ebb/loader/ServiceEBBLoader.java index b5ad8d8c03..79e801b740 100644 --- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ebb/loader/ServiceEBBLoader.java +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ebb/loader/ServiceEBBLoader.java @@ -133,7 +133,7 @@ public class ServiceEBBLoader { resourceList = userParamsServiceTraversal.getResourceListFromUserParams(execution, userParams, serviceInstanceId, requestAction); } - if (!foundRelated(resourceList)) { + if (!isComposedService(resourceList) && !foundRelated(resourceList)) { traverseCatalogDbService(execution, sIRequest, resourceList, aaiResourceIds); } } else if ((ACTIVATE_INSTANCE.equalsIgnoreCase(requestAction) @@ -190,6 +190,10 @@ public class ServiceEBBLoader { || containsWorkflowType(resourceList, WorkflowType.NETWORKCOLLECTION)); } + public boolean isComposedService(List resourceList) { + return resourceList.stream().anyMatch(s -> s.getResourceType() == WorkflowType.SERVICE && s.hasParent()); + } + public void traverseAAIService(DelegateExecution execution, List resourceList, String resourceId, List> aaiResourceIds) { try { diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ebb/loader/UserParamsServiceTraversal.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ebb/loader/UserParamsServiceTraversal.java index c383b4a73a..074aa9e5a1 100644 --- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ebb/loader/UserParamsServiceTraversal.java +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ebb/loader/UserParamsServiceTraversal.java @@ -94,6 +94,9 @@ public class UserParamsServiceTraversal { Resource serviceResource = new Resource(WorkflowType.SERVICE, validate.getModelInfo().getModelVersionId(), false, null); resourceList.add(serviceResource); + if (validate.getResources().getServices() != null) { + setResourceListForChildServices(execution, resourceList, serviceResource, validate); + } if (validate.getResources().getVnfs() != null) { setResourceListForVnfs(execution, resourceList, serviceResource, validate); } @@ -107,6 +110,16 @@ public class UserParamsServiceTraversal { return resourceList; } + private void setResourceListForChildServices(DelegateExecution execution, List resourceList, + Resource serviceResource, Service validate) { + for (Service childService : validate.getResources().getServices()) { + Resource childServiceResource = new Resource(WorkflowType.SERVICE, + childService.getModelInfo().getModelVersionId(), false, serviceResource); + childServiceResource.setInstanceName(childService.getInstanceName()); + resourceList.add(childServiceResource); + } + } + private void setResourceListForVnfs(DelegateExecution execution, List resourceList, Resource serviceResource, Service validate) { for (Vnfs vnf : validate.getResources().getVnfs()) { diff --git a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionBBFailureTest.java b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionBBFailureTest.java index 7f44c97f59..cedaef0bfd 100644 --- a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionBBFailureTest.java +++ b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionBBFailureTest.java @@ -26,9 +26,20 @@ import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.isA; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import static org.onap.so.bpmn.infrastructure.service.composition.ServiceCompositionConstants.CHILD_SVC_REQ_CORRELATION_ID; +import static org.onap.so.bpmn.infrastructure.service.composition.ServiceCompositionConstants.CHILD_SVC_REQ_ERROR; +import static org.onap.so.bpmn.infrastructure.service.composition.ServiceCompositionConstants.CHILD_SVC_REQ_STATUS; +import static org.onap.so.bpmn.infrastructure.service.composition.ServiceCompositionConstants.IS_CHILD_PROCESS; +import static org.onap.so.bpmn.infrastructure.service.composition.ServiceCompositionConstants.PARENT_CORRELATION_ID; + import java.sql.Timestamp; +import org.camunda.bpm.engine.ProcessEngineServices; +import org.camunda.bpm.engine.RuntimeService; import org.camunda.bpm.engine.delegate.DelegateExecution; +import org.camunda.bpm.engine.runtime.MessageCorrelationBuilder; import org.camunda.bpm.extension.mockito.delegate.DelegateExecutionFake; import org.junit.Before; import org.junit.Rule; @@ -271,4 +282,126 @@ public class WorkflowActionBBFailureTest extends BaseTaskTest { Mockito.verify(reqMock, Mockito.times(1)).setLastModifiedBy("CamundaBPMN"); Mockito.verify(reqMock, Mockito.times(1)).setEndTime(any(Timestamp.class)); } + + @Test + public void invokeSendMessageForChildServiceRollBackCompletedSuccessfully() { + String parentCorrelationId = "parentCorrelationId"; + DelegateExecution mockExecution = Mockito.mock(DelegateExecution.class); + ProcessEngineServices processEngineServices = mock(ProcessEngineServices.class); + RuntimeService runtimeService = mock(RuntimeService.class); + MessageCorrelationBuilder messageCorrelationBuilder = mock(MessageCorrelationBuilder.class); + when(processEngineServices.getRuntimeService()).thenReturn(runtimeService); + when(runtimeService.createMessageCorrelation(anyString())).thenReturn(messageCorrelationBuilder); + when(messageCorrelationBuilder.setVariable(CHILD_SVC_REQ_STATUS, "FAILED")) + .thenReturn(messageCorrelationBuilder); + when(messageCorrelationBuilder.setVariable(CHILD_SVC_REQ_ERROR, "Rollback has been completed successfully.")) + .thenReturn(messageCorrelationBuilder); + when(messageCorrelationBuilder.processInstanceVariableEquals(CHILD_SVC_REQ_CORRELATION_ID, parentCorrelationId)) + .thenReturn(messageCorrelationBuilder); + + when(mockExecution.getVariable(PARENT_CORRELATION_ID)).thenReturn(parentCorrelationId); + when(mockExecution.getVariable("mso-request-id")).thenReturn("123"); + when(mockExecution.getVariable("isRollbackComplete")).thenReturn(true); + when(mockExecution.getVariable("isRollback")).thenReturn(true); + when(mockExecution.getVariable(IS_CHILD_PROCESS)).thenReturn(true); + + when(mockExecution.getProcessEngineServices()).thenReturn(processEngineServices); + + InfraActiveRequests req = new InfraActiveRequests(); + WorkflowException wfe = new WorkflowException("processKey123", 1, "error in rollback"); + when(mockExecution.getVariable("WorkflowException")).thenReturn(wfe); + doReturn(req).when(requestsDbClient).getInfraActiveRequestbyRequestId("123"); + doNothing().when(requestsDbClient).updateInfraActiveRequests(isA(InfraActiveRequests.class)); + workflowActionBBFailure.updateRequestStatusToFailed(mockExecution); + + verify(messageCorrelationBuilder).setVariable(CHILD_SVC_REQ_STATUS, "FAILED"); + verify(messageCorrelationBuilder).setVariable(CHILD_SVC_REQ_ERROR, + "Rollback has been completed successfully."); + verify(messageCorrelationBuilder).processInstanceVariableEquals(CHILD_SVC_REQ_CORRELATION_ID, + parentCorrelationId); + } + + @Test + public void invokeSendMessageForChildServiceRollBackFailure() { + String parentCorrelationId = "parentCorrelationId"; + DelegateExecution mockExecution = Mockito.mock(DelegateExecution.class); + ProcessEngineServices processEngineServices = mock(ProcessEngineServices.class); + RuntimeService runtimeService = mock(RuntimeService.class); + MessageCorrelationBuilder messageCorrelationBuilder = mock(MessageCorrelationBuilder.class); + when(processEngineServices.getRuntimeService()).thenReturn(runtimeService); + when(runtimeService.createMessageCorrelation(anyString())).thenReturn(messageCorrelationBuilder); + when(messageCorrelationBuilder.setVariable(CHILD_SVC_REQ_STATUS, "FAILED")) + .thenReturn(messageCorrelationBuilder); + when(messageCorrelationBuilder.setVariable(CHILD_SVC_REQ_ERROR, "error in rollback")) + .thenReturn(messageCorrelationBuilder); + when(messageCorrelationBuilder.processInstanceVariableEquals(PARENT_CORRELATION_ID, parentCorrelationId)) + .thenReturn(messageCorrelationBuilder); + + when(mockExecution.getVariable(PARENT_CORRELATION_ID)).thenReturn(parentCorrelationId); + when(mockExecution.getVariable("mso-request-id")).thenReturn("123"); + when(mockExecution.getVariable("isRollbackComplete")).thenReturn(false); + when(mockExecution.getVariable("isRollback")).thenReturn(true); + when(mockExecution.getVariable(IS_CHILD_PROCESS)).thenReturn(true); + + when(mockExecution.getProcessEngineServices()).thenReturn(processEngineServices); + + InfraActiveRequests req = new InfraActiveRequests(); + doReturn(req).when(requestsDbClient).getInfraActiveRequestbyRequestId("123"); + doNothing().when(requestsDbClient).updateInfraActiveRequests(isA(InfraActiveRequests.class)); + workflowActionBBFailure.updateRequestStatusToFailed(mockExecution); + + verify(messageCorrelationBuilder).setVariable(CHILD_SVC_REQ_STATUS, "FAILED"); + verify(messageCorrelationBuilder).setVariable(CHILD_SVC_REQ_ERROR, + "Failed to determine rollback error message."); + + WorkflowException wfe = new WorkflowException("processKey123", 1, "error in rollback"); + when(mockExecution.getVariable("WorkflowException")).thenReturn(wfe); + workflowActionBBFailure.updateRequestStatusToFailed(mockExecution); + verify(messageCorrelationBuilder).setVariable(CHILD_SVC_REQ_ERROR, "error in rollback"); + verify(messageCorrelationBuilder).processInstanceVariableEquals(CHILD_SVC_REQ_CORRELATION_ID, + parentCorrelationId); + } + + @Test + public void invokeSendMessageForChildServiceNoRollBack() { + String parentCorrelationId = "parentCorrelationId"; + DelegateExecution mockExecution = Mockito.mock(DelegateExecution.class); + ProcessEngineServices processEngineServices = mock(ProcessEngineServices.class); + RuntimeService runtimeService = mock(RuntimeService.class); + MessageCorrelationBuilder messageCorrelationBuilder = mock(MessageCorrelationBuilder.class); + when(processEngineServices.getRuntimeService()).thenReturn(runtimeService); + when(runtimeService.createMessageCorrelation(anyString())).thenReturn(messageCorrelationBuilder); + when(messageCorrelationBuilder.setVariable(CHILD_SVC_REQ_STATUS, "FAILED")) + .thenReturn(messageCorrelationBuilder); + when(messageCorrelationBuilder.setVariable(CHILD_SVC_REQ_ERROR, "error in rollback")) + .thenReturn(messageCorrelationBuilder); + when(messageCorrelationBuilder.processInstanceVariableEquals(PARENT_CORRELATION_ID, parentCorrelationId)) + .thenReturn(messageCorrelationBuilder); + + when(mockExecution.getVariable(PARENT_CORRELATION_ID)).thenReturn(parentCorrelationId); + when(mockExecution.getVariable("mso-request-id")).thenReturn("123"); + when(mockExecution.getVariable("isRollbackComplete")).thenReturn(false); + when(mockExecution.getVariable("isRollback")).thenReturn(false); + when(mockExecution.getVariable(IS_CHILD_PROCESS)).thenReturn(true); + + when(mockExecution.getProcessEngineServices()).thenReturn(processEngineServices); + + InfraActiveRequests req = new InfraActiveRequests(); + doReturn(req).when(requestsDbClient).getInfraActiveRequestbyRequestId("123"); + doNothing().when(requestsDbClient).updateInfraActiveRequests(isA(InfraActiveRequests.class)); + workflowActionBBFailure.updateRequestStatusToFailed(mockExecution); + + verify(messageCorrelationBuilder).setVariable(CHILD_SVC_REQ_STATUS, "FAILED"); + verify(messageCorrelationBuilder).setVariable(CHILD_SVC_REQ_ERROR, "Failed to determine error message"); + + WorkflowException wfe = new WorkflowException("processKey123", 1, "error in rollback"); + when(mockExecution.getVariable("WorkflowException")).thenReturn(wfe); + workflowActionBBFailure.updateRequestStatusToFailed(mockExecution); + verify(messageCorrelationBuilder).setVariable(CHILD_SVC_REQ_ERROR, "error in rollback"); + verify(messageCorrelationBuilder).processInstanceVariableEquals(CHILD_SVC_REQ_CORRELATION_ID, + parentCorrelationId); + } + + + } -- 2.16.6