Enable CreateChildServiceBB for Service-Macro-Create 53/125953/1
authorJozsef Csongvai <jozsef.csongvai@bell.ca>
Fri, 26 Nov 2021 22:24:42 +0000 (17:24 -0500)
committerJozsef Csongvai <jozsef.csongvai@bell.ca>
Fri, 26 Nov 2021 22:24:42 +0000 (17:24 -0500)
Issue-ID: SO-3811
Signed-off-by: Jozsef Csongvai <jozsef.csongvai@bell.ca>
Change-Id: I7979082a9f145a84f6f03cf2c44e9ccbca198c5a

12 files changed:
adapters/mso-catalog-db-adapter/src/main/resources/db/migration/R__MacroData.sql
bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/entities/WorkflowResourceIds.java
bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetup.java
bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/process/WorkflowActionBBTest.java
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ExecuteBuildingBlockBuilder.java
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowAction.java
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionBBFailure.java
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionBBTasks.java
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionConstants.java
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ebb/loader/ServiceEBBLoader.java
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ebb/loader/UserParamsServiceTraversal.java
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionBBFailureTest.java

index 3b95ffe..6b552b3 100644 (file)
@@ -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'),
index 5df7c60..cfcc1f9 100644 (file)
@@ -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;
+    }
 }
index d39da5e..a38eb8c 100644 (file)
@@ -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,
index 9203697..b0182c1 100755 (executable)
@@ -109,13 +109,22 @@ public class ExecuteBuildingBlockBuilder {
             String requestId, String apiVersion, String resourceId, String requestAction, String vnfType,
             WorkflowResourceIds workflowResourceIds, RequestDetails requestDetails, boolean replaceVnf) {
         List<ExecuteBuildingBlock> 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,
index 10cea17..ef0fbc8 100755 (executable)
@@ -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<ExecuteBuildingBlock> flowsToExecute, List<Resource> resourceList,
             String serviceInstanceId) {
         Map<Resource, String> 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<String> 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();
     }
 
index 8d9e020..38fe6a3 100644 (file)
@@ -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()));
index b76cf1e..dda217f 100644 (file)
@@ -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) {
index a416139..7bbc9f3 100755 (executable)
@@ -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";
index b5ad8d8..79e801b 100644 (file)
@@ -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<Resource> resourceList) {
+        return resourceList.stream().anyMatch(s -> s.getResourceType() == WorkflowType.SERVICE && s.hasParent());
+    }
+
     public void traverseAAIService(DelegateExecution execution, List<Resource> resourceList, String resourceId,
             List<Pair<WorkflowType, String>> aaiResourceIds) {
         try {
index c383b4a..074aa9e 100644 (file)
@@ -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<Resource> 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<Resource> resourceList,
             Resource serviceResource, Service validate) {
         for (Vnfs vnf : validate.getResources().getVnfs()) {
index 7f44c97..cedaef0 100644 (file)
@@ -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);
+    }
+
+
+
 }