diff options
author | sreeja gattagouni <sg00744975@techmahindra.com> | 2022-09-09 16:16:30 +0530 |
---|---|---|
committer | Lukasz Rajewski <lukasz.rajewski@t-mobile.pl> | 2022-10-03 19:50:00 +0000 |
commit | 5fd0452387ccff6995c19ec5eeb7866328e34cbc (patch) | |
tree | cffde0504b98e9ff22a46c279211bb665417ec91 /bpmn/so-bpmn-tasks/src/main/java | |
parent | e4ae66db0d0e1bcfd19ef875491a236519be515d (diff) |
Rollback Scenario for recursive orchestration
-Child Services may fail in any of the BB's while creation of composite services, to handle in efficient manner, it is complied with existing rollback logic.
-In case of Child Services >1 , when Workflow fails, the instantiated child remains in COMPLETED status, thus rollback changes ensure that such services are Deleted by triggering DeleteChildSvcBB.
-Parent Service is ROLLED-BACK in case of any child service failing in the workflow. Instantiated child services are Deleted from AAI as well.
Issue-ID: SO-3982
Change-ID:I73f97f986a817d423f92f8d922dcd9647b8a2503
Signed-off-by: sreeja gattagouni <sg00744975@techmahindra.com>
Diffstat (limited to 'bpmn/so-bpmn-tasks/src/main/java')
-rw-r--r-- | bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/service/composition/DeleteChildServiceBB.java | 115 |
1 files changed, 113 insertions, 2 deletions
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/service/composition/DeleteChildServiceBB.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/service/composition/DeleteChildServiceBB.java index 52d1b68ccd..9a2da2a748 100644 --- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/service/composition/DeleteChildServiceBB.java +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/service/composition/DeleteChildServiceBB.java @@ -16,6 +16,15 @@ package org.onap.so.bpmn.infrastructure.service.composition; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.UUID; +import org.onap.aai.domain.yang.ComposedResource; +import org.onap.aai.domain.yang.RelatedToProperty; +import org.onap.aai.domain.yang.Relationship; +import org.onap.aai.domain.yang.RelationshipData; import org.onap.aai.domain.yang.ServiceInstance; import org.onap.aaiclient.client.aai.AAIResourcesClient; import org.onap.aaiclient.client.aai.entities.uri.AAIUriFactory; @@ -35,8 +44,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import java.util.Map; -import java.util.UUID; import static org.onap.so.bpmn.infrastructure.service.composition.ServiceCompositionConstants.CHILD_SVC_INSTANCE_ID; 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; @@ -44,9 +51,13 @@ import static org.onap.so.bpmn.infrastructure.service.composition.ServiceComposi import static org.onap.so.bpmn.infrastructure.service.composition.ServiceCompositionConstants.CHILD_SVC_REQ_PAYLOAD; + @Component public class DeleteChildServiceBB { + private static final String ROLLBACK_TARGET_STATE = "rollbackTargetState"; + private static final String REQUEST_ACTION = "requestAction"; + public static final String CHILD_SVC_REQ_STATUS = "CHILD_SVC_REQ_STATUS"; @Autowired protected ExceptionBuilder exceptionBuilder; @@ -57,6 +68,7 @@ public class DeleteChildServiceBB { private final Logger log = LoggerFactory.getLogger(this.getClass()); + public void buildRequest(final BuildingBlockExecution buildingBlockExecution) { log.info("Building Delete Service Request"); Map<ResourceKey, String> lookupMap = buildingBlockExecution.getLookupMap(); @@ -90,6 +102,105 @@ public class DeleteChildServiceBB { buildingBlockExecution.setVariable(CHILD_SVC_REQ_PAYLOAD, sir); } + + public void setRequestAction(final BuildingBlockExecution buildingBlockExecution) { + String action = buildingBlockExecution.getGeneralBuildingBlock().getRequestContext().getAction(); + buildingBlockExecution.setVariable(REQUEST_ACTION, action); + } + + public void checkIfChildInstantiated(final BuildingBlockExecution buildingBlockExecution) { + try { + Map<ResourceKey, String> lookupMap = buildingBlockExecution.getLookupMap(); + + String parentServiceInstanceId = buildingBlockExecution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID); + + String childSvcInstanceName = lookupMap.get(ResourceKey.CHILD_SERVICE_INSTANCE_NAME); + + ServiceInstance parentInstanceAAI = + aaiResourcesClient.get(ServiceInstance.class, + AAIUriFactory.createResourceUri( + AAIFluentTypeBuilder.Types.SERVICE_INSTANCE.getFragment(parentServiceInstanceId)) + .depth(Depth.TWO)) + .orElse(null); + + + + if (parentInstanceAAI.getComposedResources() != null) { + List<ComposedResource> composedResources = + parentInstanceAAI.getComposedResources().getComposedResource(); + + + + List<List<Relationship>> relationship = new ArrayList<>(); + for (ComposedResource composedResource : composedResources) { + if (composedResource.getRelationshipList() != null) { + relationship.add(composedResource.getRelationshipList().getRelationship()); + } + } + + List<List<RelationshipData>> relationshipData = new ArrayList<>(); + List<List<RelatedToProperty>> relatedToProperties = new ArrayList<>(); + + for (int i = 0; i < relationship.size(); i++) { + for (Relationship relationshipList : relationship.get(i)) { + relatedToProperties.add(relationshipList.getRelatedToProperty()); + relationshipData.add(relationshipList.getRelationshipData()); + } + } + + + String childInstanceId = null; + for (int i = 0; i < relationship.size(); i++) { + for (RelatedToProperty relatedToProperty1 : relatedToProperties.get(i)) { + if (relatedToProperty1.getPropertyValue().equalsIgnoreCase(childSvcInstanceName)) { + for (RelationshipData relationshipData1 : relationshipData.get(i)) { + if (relationshipData1.getRelationshipKey() + .equals("service-instance.service-instance-id")) { + childInstanceId = relationshipData1.getRelationshipValue(); + break; + } + } + } + } + } + if (childInstanceId != null) { + lookupMap.put(ResourceKey.CHILD_SERVICE_INSTANCE_ID, childInstanceId); + buildingBlockExecution.setVariable(ROLLBACK_TARGET_STATE, "Rollback"); + buildingBlockExecution.setVariable(REQUEST_ACTION, "createInstance"); + } else { + buildingBlockExecution.setVariable(REQUEST_ACTION, "createInstance"); + buildingBlockExecution.setVariable(CHILD_SVC_REQ_STATUS, "fail"); + } + } else { + buildingBlockExecution.setVariable(REQUEST_ACTION, "createInstance"); + buildingBlockExecution.setVariable(CHILD_SVC_REQ_STATUS, "fail"); + } + } catch (Exception e) { + exceptionBuilder.buildAndThrowWorkflowException(buildingBlockExecution, 10005, e.getMessage(), + ONAPComponents.SO); + } + } + + public void buildRequestRollBack(final BuildingBlockExecution buildingBlockExecution) { + try { + log.info("buildRequestRollBack Create Service Request"); + Map<ResourceKey, String> lookupMap = buildingBlockExecution.getLookupMap(); + String childSvcInstanceName = lookupMap.get(ResourceKey.CHILD_SERVICE_INSTANCE_NAME); + String childSvcInstanceId = lookupMap.get(ResourceKey.CHILD_SERVICE_INSTANCE_ID); + Objects.requireNonNull(childSvcInstanceName, "Child service instance name is required"); + + ServiceInstancesRequest sir = ChildServiceRequestBuilder + .getInstance(buildingBlockExecution, childSvcInstanceName) + .setParentRequestId( + buildingBlockExecution.getGeneralBuildingBlock().getRequestContext().getMsoRequestId()) + .setChildSvcInstanceId(childSvcInstanceId).setCorrelationId(UUID.randomUUID().toString()).build(); + buildingBlockExecution.setVariable(CHILD_SVC_REQ_PAYLOAD, sir); + } catch (Exception e) { + exceptionBuilder.buildAndThrowWorkflowException(buildingBlockExecution, 10002, e.getMessage(), + ONAPComponents.SO); + } + } + public void sendRequest(final BuildingBlockExecution buildingBlockExecution) { try { ServiceInstancesRequest sir = buildingBlockExecution.getVariable(CHILD_SVC_REQ_PAYLOAD); |