Rollback Scenario for recursive orchestration
[so.git] / bpmn / so-bpmn-tasks / src / main / java / org / onap / so / bpmn / infrastructure / service / composition / DeleteChildServiceBB.java
index 52d1b68..9a2da2a 100644 (file)
 
 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);