Merge "fix for SO-2696"
authorByung-Woo Jun <byung-woo.jun@est.tech>
Tue, 3 Mar 2020 18:22:19 +0000 (18:22 +0000)
committerGerrit Code Review <gerrit@onap.org>
Tue, 3 Mar 2020 18:22:19 +0000 (18:22 +0000)
bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoDeleteSliceService.groovy [new file with mode: 0644]
bpmn/so-bpmn-infrastructure-flows/src/main/resources/subprocess/DoDeleteSliceService.bpmn [new file with mode: 0644]

diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoDeleteSliceService.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoDeleteSliceService.groovy
new file mode 100644 (file)
index 0000000..7c2a2be
--- /dev/null
@@ -0,0 +1,322 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ # Copyright (c) 2019, CMCC Technologies Co., Ltd.
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License")
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ #       http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.so.bpmn.infrastructure.scripts
+
+import org.camunda.bpm.engine.delegate.BpmnError
+import org.camunda.bpm.engine.delegate.DelegateExecution
+import org.onap.aai.domain.yang.AllottedResource
+import org.onap.aai.domain.yang.AllottedResources
+import org.onap.aai.domain.yang.Relationship
+import org.onap.aai.domain.yang.ServiceInstance
+import org.onap.aai.domain.yang.SliceProfiles
+import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
+import org.onap.so.bpmn.common.scripts.ExceptionUtil
+import org.onap.so.client.aai.AAIObjectType
+import org.onap.so.client.aai.AAIResourcesClient
+import org.onap.so.client.aai.entities.AAIResultWrapper
+import org.onap.so.client.aai.entities.uri.AAIResourceUri
+import org.onap.so.client.aai.entities.uri.AAIUriFactory
+import org.slf4j.Logger
+import org.slf4j.LoggerFactory
+
+import javax.ws.rs.NotFoundException
+
+import static org.apache.commons.lang3.StringUtils.isBlank
+
+/**
+ * This groovy class supports the <class>DoDeleteSliceService.bpmn</class> process.
+ *
+ * Inputs:
+ * @param - msoRequestId
+ * @param - globalSubscriberId - O
+ * @param - subscriptionServiceType - O
+ * @param - serviceInstanceId
+ *
+ */
+class DoDeleteSliceService extends AbstractServiceTaskProcessor {
+    private final String PREFIX ="DoDeleteSliceService"
+    ExceptionUtil exceptionUtil = new ExceptionUtil()
+    private static final Logger LOGGER = LoggerFactory.getLogger( DoDeleteSliceService.class)
+
+    @Override
+    void preProcessRequest(DelegateExecution execution) {
+        LOGGER.debug(" *****${PREFIX} preProcessRequest *****")
+        String msg = ""
+
+        try {
+            //String requestId = execution.getVariable("msoRequestId")
+            execution.setVariable("prefix",PREFIX)
+
+            //Inputs
+            //requestDetails.subscriberInfo. for AAI GET & PUT
+             execution.getVariable("globalSubscriberId") ?: execution.setVariable("globalSubscriberId", "")
+
+            //requestDetails.requestParameters. for AAI PUT
+            execution.getVariable("serviceType") ?: execution.setVariable("serviceType", "")
+
+            //Generated in parent for AAI PUT
+            String serviceInstanceId = execution.getVariable("serviceInstanceId")
+            if (isBlank(serviceInstanceId)){
+                msg = "Input serviceInstanceId is null"
+                LOGGER.info(msg)
+                exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
+            }
+        } catch (BpmnError e) {
+            throw e
+        } catch (Exception ex){
+            msg = "Exception in preProcessRequest " + ex.getMessage()
+            LOGGER.error(msg)
+            exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
+        }
+        LOGGER.debug("*****${PREFIX} Exit preProcessRequest *****")
+    }
+
+    /**
+     * query E2ESliceService from AAI
+     * save snssai
+     * @param execution
+     */
+    void queryE2ESliceSeriveFromAAI(DelegateExecution execution)
+    {
+        LOGGER.trace(" *****${PREFIX} Start queryE2ESliceSeriveFromAAI *****")
+        String serviceInstanceId = execution.getVariable("serviceInstanceId")
+
+        String errorMsg = "query e2e slice service from aai failed"
+        AAIResultWrapper wrapper = queryAAI(execution, AAIObjectType.SERVICE_INSTANCE, serviceInstanceId, errorMsg)
+        Optional<ServiceInstance> si =wrapper.asBean(ServiceInstance.class)
+        if(si.isPresent())
+        {
+            String snssai = si.get()?.getEnvironmentContext()
+            execution.setVariable("snssai", snssai ?: "")
+            LOGGER.info("serviceInstanceId: ${serviceInstanceId}, snssai: ${snssai}")
+        }
+        LOGGER.trace(" *****${PREFIX} Exit queryE2ESliceSeriveFromAAI *****")
+    }
+
+    /**
+     * get allotted resource from AAI
+     * save nsi id
+     * @param execution
+     */
+    void getAllottedResFromAAI(DelegateExecution execution)
+    {
+        LOGGER.trace(" *****${PREFIX} Start getAllottedResFromAAI *****")
+        String serviceInstanceId = execution.getVariable("serviceInstanceId")
+        try
+        {
+            String errorMsg = "query allotted resource from aai failed."
+            AAIResultWrapper wrapper = queryAAI(execution, AAIObjectType.ALLOTTED_RESOURCE_ALL, serviceInstanceId, errorMsg)
+            Optional<AllottedResources> ars = wrapper?.asBean(AllottedResources.class)
+            if(ars.isPresent() && ars.get().getAllottedResource())
+            {
+                List<AllottedResource> allottedResourceList = ars.get().getAllottedResource()
+                AllottedResource ar = allottedResourceList.first()
+                String relatedLink = ar?.getRelationshipList()?.getRelationship()?.first()?.getRelatedLink()
+                String nsiId = relatedLink ? relatedLink.substring(relatedLink.lastIndexOf("/") + 1,relatedLink.length()) : ""
+                execution.setVariable("nsiId", nsiId)
+                LOGGER.info("serviceInstanceId: ${serviceInstanceId}, nsiId:${nsiId}")
+            }
+        }
+        catch(BpmnError e){
+            throw e
+        }
+        catch (Exception ex){
+            String msg = "Exception in getAllottedResFromAAI " + ex.getMessage()
+            LOGGER.error(msg)
+            exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
+        }
+        LOGGER.trace(" *****${PREFIX} Exit getAllottedResFromAAI *****")
+    }
+
+    /**
+     * get nsi service instance from aai
+     * save nssi id
+     * @param execution
+     */
+    void getNSIFromAAI(DelegateExecution execution)
+    {
+        LOGGER.trace(" *****${PREFIX} Start getNSIFromAAI *****")
+        String nsiId = execution.getVariable("nsiId")
+        try
+        {
+            String errorMsg = "query nsi from aai failed."
+            AAIResultWrapper wrapper = queryAAI(execution, AAIObjectType.SERVICE_INSTANCE, nsiId, errorMsg)
+            Optional<ServiceInstance> si =wrapper.asBean(ServiceInstance.class)
+            List<String> nssiIdList = []
+            String msg = "nsiId:${nsiId},nssiIdList:"
+            if(si.isPresent())
+            {
+                List<Relationship> relationshipList = si.get().getRelationshipList()?.getRelationship()
+                for (Relationship relationship : relationshipList)
+                {
+                    String relatedTo = relationship.getRelatedTo()
+                    if (relatedTo == "service-instance")
+                    {
+                        String relatedLink = relationship.getRelatedLink()?:""
+                        String nssiId = relatedLink ? relatedLink.substring(relatedLink.lastIndexOf("/") + 1,relatedLink.length()) : ""
+                        nssiIdList.add(nssiId)
+                        msg+="${nssiId}, "
+                    }
+                }
+            }
+            LOGGER.info(msg)
+            execution.setVariable("nssiIdList", nssiIdList)
+        }
+        catch(BpmnError e){
+            throw e
+        }
+        catch (Exception ex){
+            String msg = "Exception in getNSIFromAAI " + ex.getMessage()
+            LOGGER.error(msg)
+            exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
+        }
+        LOGGER.trace(" *****${PREFIX} Exit getNSIFromAAI *****")
+    }
+
+    /**
+     * get nssi service from AAI
+     * prepare list
+     * @param execution
+     */
+    void getNSSIListFromAAI(DelegateExecution execution)
+    {
+        LOGGER.trace("*****${PREFIX} Start getNSSIListFromAAI *****")
+        List<String> nssiIdList = execution.getVariable("nssiIdList")
+        List<ServiceInstance> nssiInstanceList = []
+        String errorMsg = "query nssi list from aai failed"
+        for(String nssiId : nssiIdList)
+        {
+            AAIResultWrapper wrapper = queryAAI(execution, AAIObjectType.SERVICE_INSTANCE, nssiId, errorMsg)
+            Optional<ServiceInstance> si =wrapper.asBean(ServiceInstance.class)
+            if(si.isPresent())
+            {
+                nssiInstanceList.add(si.get())
+            }
+        }
+        int size = nssiInstanceList.size()
+        int proportion = size >0 ?((90/size) as int) : 90
+        execution.setVariable("nssiInstanceList", nssiInstanceList)
+        execution.setVariable("currentNSSIIndex", 0)
+        execution.setVariable("proportion", proportion)
+        String msg ="nssiInstanceList size: ${nssiInstanceList.size()}, proportion:${proportion}"
+        LOGGER.info(msg)
+        LOGGER.trace(" *****${PREFIX} Exit getNSSIListFromAAI *****")
+    }
+
+    /**
+     * get current NSSI
+     * @param execution
+     */
+    void getCurrentNSSI(DelegateExecution execution)
+    {
+        LOGGER.trace(" *****${PREFIX} Start getCurrentNSSI *****")
+        List<ServiceInstance> nssiInstanceList = execution.getVariable("nssiInstanceList")
+        int currentIndex = execution.getVariable("currentNSSIIndex") as int
+        ServiceInstance nssi = nssiInstanceList?.get(currentIndex)
+        def currentNSSI = [:]
+        currentNSSI['nssiServiceInstanceId'] = nssi?.getServiceInstanceId()
+        currentNSSI['modelInvariantId'] = nssi?.getModelInvariantId()
+        currentNSSI['modelVersionId'] = nssi?.getModelVersionId()
+        currentNSSI['snssai'] = execution.getVariable("snssai") ?: ""
+        currentNSSI['nsiServiceInstanceId'] = execution.getVariable("nsiId") ?: ""
+        currentNSSI['operationId'] = execution.getVariable("operationId") ?: ""
+        currentNSSI['e2eServiceInstanceId'] = execution.getVariable("serviceInstanceId") ?: ""
+        currentNSSI['msoRequestId'] = execution.getVariable("msoRequestId") ?: ""
+        currentNSSI['globalSubscriberId'] = execution.getVariable("globalSubscriberId") ?: ""
+        currentNSSI['serviceType'] = execution.getVariable("serviceType") ?: ""
+        currentNSSI['serviceModelInfo'] = execution.getVariable("serviceModelInfo") ?: ""
+        currentNSSI['proportion'] = (execution.getVariable("proportion") as int)*(currentIndex+1)
+        execution.setVariable("currentNSSI", currentNSSI)
+        String msg = "Now we deal with nssiServiceInstanceId: ${currentNSSI['nssiServiceInstanceId']}, current Index: ${currentIndex}, current proportion:${currentNSSI['proportion']}"
+        LOGGER.info(msg)
+        LOGGER.trace(" *****${PREFIX} Exit getCurrentNSSI *****")
+    }
+
+    /**
+     * parse next nssi
+     * @param execution
+     */
+    void parseNextNSSI(DelegateExecution execution)
+    {
+        LOGGER.trace(" *****${PREFIX} Start parseNextNSSI *****")
+        if(execution.getVariable("WorkflowException") != null){
+            exceptionUtil.buildAndThrowWorkflowException(execution, 7000, "current job failure!")
+        }
+        def currentIndex = execution.getVariable("currentNSSIIndex")
+        List<ServiceInstance> nssiInstanceList = execution.getVariable("nssiInstanceList")
+        def nextIndex = ++currentIndex
+        LOGGER.info("nextIndex: ${nextIndex}")
+        if(nextIndex >= nssiInstanceList.size()){
+            execution.setVariable("isAllNSSIFinished", "true")
+        }else{
+            execution.setVariable("isAllNSSIFinished", "false")
+            execution.setVariable("currentNSSIIndex", nextIndex)
+        }
+        LOGGER.trace(" *****${PREFIX} Exit parseNextNSSI *****")
+    }
+
+
+    /**
+     * query sliceProfile from AAI
+     * save profileId
+     * @param execution
+     */
+    void querySliceProfileFromAAI(DelegateExecution execution)
+    {
+        LOGGER.trace(" *****${PREFIX} Start querySliceProfileFromAAI *****")
+        def currentNSSI = execution.getVariable("currentNSSI")
+        String nssiId = currentNSSI['nssiServiceInstanceId']
+        String errorMsg = "query slice profile failed"
+        AAIResultWrapper wrapper = queryAAI(execution, AAIObjectType.SLICE_PROFILE_ALL, nssiId, errorMsg)
+        Optional<SliceProfiles> sliceProfiles =wrapper.asBean(SliceProfiles.class)
+        if(sliceProfiles.isPresent())
+        {
+            String profileId = sliceProfiles.get().getSliceProfile()?.get(0)?.getProfileId()
+            currentNSSI['profileId'] =  profileId ?: ""
+            LOGGER.info("nssiId: ${nssiId}, profileId: ${profileId}")
+        }
+        execution.setVariable("currentNSSI", currentNSSI)
+        LOGGER.trace(" *****${PREFIX} Exit querySliceProfileFromAAI *****")
+    }
+
+    /**
+     * query AAI
+     * @param execution
+     * @param aaiObjectType
+     * @param instanceId
+     * @return AAIResultWrapper
+     */
+    private AAIResultWrapper queryAAI(DelegateExecution execution, AAIObjectType aaiObjectType, String instanceId, String errorMsg)
+    {
+        LOGGER.trace(" *****${PREFIX} Start queryAAI *****")
+        String globalSubscriberId = execution.getVariable("globalSubscriberId")
+        String serviceType = execution.getVariable("serviceType")
+
+        AAIResourcesClient resourceClient = new AAIResourcesClient()
+        AAIResourceUri resourceUri = AAIUriFactory.createResourceUri(aaiObjectType, globalSubscriberId, serviceType, instanceId)
+        if (!resourceClient.exists(resourceUri)) {
+            exceptionUtil.buildAndThrowWorkflowException(execution, 2500, errorMsg)
+        }
+        AAIResultWrapper wrapper = resourceClient.get(resourceUri, NotFoundException.class)
+        LOGGER.trace(" *****${PREFIX} Exit queryAAI *****")
+        return wrapper
+    }
+
+}
diff --git a/bpmn/so-bpmn-infrastructure-flows/src/main/resources/subprocess/DoDeleteSliceService.bpmn b/bpmn/so-bpmn-infrastructure-flows/src/main/resources/subprocess/DoDeleteSliceService.bpmn
new file mode 100644 (file)
index 0000000..5f4816e
--- /dev/null
@@ -0,0 +1,205 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" id="Definitions_1p1suc9" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="3.4.1">
+  <bpmn:process id="DoDeleteSliceServiceV1" name="DoDeleteSliceServiceV1" isExecutable="true">
+    <bpmn:startEvent id="StartEvent_1" name="start">
+      <bpmn:outgoing>SequenceFlow_0ep5het</bpmn:outgoing>
+    </bpmn:startEvent>
+    <bpmn:sequenceFlow id="SequenceFlow_0ep5het" sourceRef="StartEvent_1" targetRef="Task_0etki1p" />
+    <bpmn:sequenceFlow id="SequenceFlow_1qkgvvu" sourceRef="Task_1ujnqtj" targetRef="Task_1fqiyb4" />
+    <bpmn:sequenceFlow id="SequenceFlow_1rgfzzy" sourceRef="Task_1fqiyb4" targetRef="Task_1u755sr" />
+    <bpmn:scriptTask id="Task_1ujnqtj" name="Query Allotted Resource From AAI" scriptFormat="groovy">
+      <bpmn:incoming>SequenceFlow_029u1wr</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_1qkgvvu</bpmn:outgoing>
+      <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.*
+def ddss= new DoDeleteSliceService()
+ddss.getAllottedResFromAAI(execution)</bpmn:script>
+    </bpmn:scriptTask>
+    <bpmn:scriptTask id="Task_1fqiyb4" name="Query NSI From AAI" scriptFormat="groovy">
+      <bpmn:incoming>SequenceFlow_1qkgvvu</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_1rgfzzy</bpmn:outgoing>
+      <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.*
+def ddss= new DoDeleteSliceService()
+ddss.getNSIFromAAI(execution)</bpmn:script>
+    </bpmn:scriptTask>
+    <bpmn:scriptTask id="Task_1u755sr" name="Query NSSI List From AAI" scriptFormat="groovy">
+      <bpmn:incoming>SequenceFlow_1rgfzzy</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_05si1me</bpmn:outgoing>
+      <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.*
+def ddss= new DoDeleteSliceService()
+ddss.getNSSIListFromAAI(execution)</bpmn:script>
+    </bpmn:scriptTask>
+    <bpmn:sequenceFlow id="SequenceFlow_05si1me" sourceRef="Task_1u755sr" targetRef="Task_1iomfas" />
+    <bpmn:exclusiveGateway id="ExclusiveGateway_1ogbunu" name="Is all NSSI finished?">
+      <bpmn:incoming>SequenceFlow_15z9iio</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_1c4fjbv</bpmn:outgoing>
+      <bpmn:outgoing>SequenceFlow_0926ghe</bpmn:outgoing>
+    </bpmn:exclusiveGateway>
+    <bpmn:endEvent id="EndEvent_0jaitqv" name="End">
+      <bpmn:incoming>SequenceFlow_1c4fjbv</bpmn:incoming>
+    </bpmn:endEvent>
+    <bpmn:sequenceFlow id="SequenceFlow_1c4fjbv" name="yes" sourceRef="ExclusiveGateway_1ogbunu" targetRef="EndEvent_0jaitqv">
+      <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">#{(execution.getVariable("isAllNSSIFinished" )  == true)}</bpmn:conditionExpression>
+    </bpmn:sequenceFlow>
+    <bpmn:sequenceFlow id="SequenceFlow_01o2qpv" sourceRef="Task_1iomfas" targetRef="Task_1qqljvu" />
+    <bpmn:sequenceFlow id="SequenceFlow_0c58sw3" sourceRef="Task_1rc7mcw" targetRef="ScriptTask_159855t" />
+    <bpmn:sequenceFlow id="SequenceFlow_0926ghe" name="no" sourceRef="ExclusiveGateway_1ogbunu" targetRef="Task_1iomfas">
+      <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">#{(execution.getVariable("isAllNSSIFinished" )  == false)}</bpmn:conditionExpression>
+    </bpmn:sequenceFlow>
+    <bpmn:scriptTask id="Task_0etki1p" name="PreProcess Incoming Request" scriptFormat="groovy">
+      <bpmn:incoming>SequenceFlow_0ep5het</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_0npmman</bpmn:outgoing>
+      <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.*
+def ddss= new DoDeleteSliceService()
+ddss.preProcessRequest(execution)</bpmn:script>
+    </bpmn:scriptTask>
+    <bpmn:sequenceFlow id="SequenceFlow_0npmman" sourceRef="Task_0etki1p" targetRef="Task_13k9usx" />
+    <bpmn:scriptTask id="Task_1iomfas" name="Get Current NSSI" scriptFormat="groovy">
+      <bpmn:incoming>SequenceFlow_0926ghe</bpmn:incoming>
+      <bpmn:incoming>SequenceFlow_05si1me</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_01o2qpv</bpmn:outgoing>
+      <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.*
+def ddss= new DoDeleteSliceService()
+ddss.getCurrentNSSI(execution)</bpmn:script>
+    </bpmn:scriptTask>
+    <bpmn:scriptTask id="ScriptTask_159855t" name="Parse Next NSSI" scriptFormat="groovy">
+      <bpmn:incoming>SequenceFlow_0c58sw3</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_15z9iio</bpmn:outgoing>
+      <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.*
+def ddss= new DoDeleteSliceService()
+ddss.parseNextNSSI(execution)</bpmn:script>
+    </bpmn:scriptTask>
+    <bpmn:sequenceFlow id="SequenceFlow_15z9iio" sourceRef="ScriptTask_159855t" targetRef="ExclusiveGateway_1ogbunu" />
+    <bpmn:sequenceFlow id="SequenceFlow_0q83qg3" sourceRef="Task_1qqljvu" targetRef="Task_1rc7mcw" />
+    <bpmn:scriptTask id="Task_1qqljvu" name="Query Slice Profile From AAI" scriptFormat="groovy">
+      <bpmn:incoming>SequenceFlow_01o2qpv</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_0q83qg3</bpmn:outgoing>
+      <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.*
+def ddss= new DoDeleteSliceService()
+ddss.querySliceProfileFromAAI(execution)</bpmn:script>
+    </bpmn:scriptTask>
+    <bpmn:sequenceFlow id="SequenceFlow_029u1wr" sourceRef="Task_13k9usx" targetRef="Task_1ujnqtj" />
+    <bpmn:scriptTask id="Task_13k9usx" name="Query E2ESlice Serive From AAI" scriptFormat="groovy">
+      <bpmn:incoming>SequenceFlow_0npmman</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_029u1wr</bpmn:outgoing>
+      <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.*
+def ddss= new DoDeleteSliceService()
+ddss.queryE2ESliceSeriveFromAAI(execution)</bpmn:script>
+    </bpmn:scriptTask>
+    <bpmn:callActivity id="Task_1rc7mcw" name="Do Deallocate NSSI " calledElement="DoDeallocateNSSIV1">
+      <bpmn:extensionElements>
+        <camunda:in source="currentNSSI" target="currentNSSI" />
+        <camunda:in source="msoRequestId" target="msoRequestId" />
+        <camunda:in source="serviceModelInfo" target="serviceModelInfo" />
+        <camunda:in source="serviceInstanceId" target="serviceInstanceId" />
+        <camunda:out source="WorkflowException" target="WorkflowException" />
+      </bpmn:extensionElements>
+      <bpmn:incoming>SequenceFlow_0q83qg3</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_0c58sw3</bpmn:outgoing>
+    </bpmn:callActivity>
+  </bpmn:process>
+  <bpmndi:BPMNDiagram id="BPMNDiagram_1">
+    <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="DoDeleteSliceServiceV1">
+      <bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
+        <dc:Bounds x="152" y="122" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="159" y="165" width="22" height="14" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_0ep5het_di" bpmnElement="SequenceFlow_0ep5het">
+        <di:waypoint x="188" y="140" />
+        <di:waypoint x="270" y="140" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_1qkgvvu_di" bpmnElement="SequenceFlow_1qkgvvu">
+        <di:waypoint x="700" y="140" />
+        <di:waypoint x="750" y="140" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_1rgfzzy_di" bpmnElement="SequenceFlow_1rgfzzy">
+        <di:waypoint x="850" y="140" />
+        <di:waypoint x="900" y="140" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="ScriptTask_1bj6tw4_di" bpmnElement="Task_1ujnqtj">
+        <dc:Bounds x="600" y="100" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ScriptTask_0xgmbqj_di" bpmnElement="Task_1fqiyb4">
+        <dc:Bounds x="750" y="100" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ScriptTask_01fp1vt_di" bpmnElement="Task_1u755sr">
+        <dc:Bounds x="900" y="100" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_05si1me_di" bpmnElement="SequenceFlow_05si1me">
+        <di:waypoint x="1000" y="140" />
+        <di:waypoint x="1040" y="140" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="ExclusiveGateway_1ogbunu_di" bpmnElement="ExclusiveGateway_1ogbunu" isMarkerVisible="true">
+        <dc:Bounds x="1555" y="115" width="50" height="50" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="1560" y="85" width="52" height="27" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="EndEvent_0jaitqv_di" bpmnElement="EndEvent_0jaitqv">
+        <dc:Bounds x="1692" y="122" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="1700" y="168" width="20" height="14" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_1c4fjbv_di" bpmnElement="SequenceFlow_1c4fjbv">
+        <di:waypoint x="1605" y="140" />
+        <di:waypoint x="1692" y="140" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="1630" y="118" width="17" height="14" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_01o2qpv_di" bpmnElement="SequenceFlow_01o2qpv">
+        <di:waypoint x="1140" y="140" />
+        <di:waypoint x="1170" y="140" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_0c58sw3_di" bpmnElement="SequenceFlow_0c58sw3">
+        <di:waypoint x="1400" y="140" />
+        <di:waypoint x="1420" y="140" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_0926ghe_di" bpmnElement="SequenceFlow_0926ghe">
+        <di:waypoint x="1580" y="165" />
+        <di:waypoint x="1580" y="260" />
+        <di:waypoint x="1090" y="260" />
+        <di:waypoint x="1090" y="180" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="1329" y="242" width="13" height="14" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="ScriptTask_0icszw6_di" bpmnElement="Task_0etki1p">
+        <dc:Bounds x="270" y="100" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_0npmman_di" bpmnElement="SequenceFlow_0npmman">
+        <di:waypoint x="370" y="140" />
+        <di:waypoint x="430" y="140" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="ScriptTask_1obnwrr_di" bpmnElement="Task_1iomfas">
+        <dc:Bounds x="1040" y="100" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ScriptTask_159855t_di" bpmnElement="ScriptTask_159855t">
+        <dc:Bounds x="1420" y="100" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_15z9iio_di" bpmnElement="SequenceFlow_15z9iio">
+        <di:waypoint x="1520" y="140" />
+        <di:waypoint x="1555" y="140" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_0q83qg3_di" bpmnElement="SequenceFlow_0q83qg3">
+        <di:waypoint x="1270" y="140" />
+        <di:waypoint x="1300" y="140" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="ScriptTask_0y9ppnc_di" bpmnElement="Task_1qqljvu">
+        <dc:Bounds x="1170" y="100" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_029u1wr_di" bpmnElement="SequenceFlow_029u1wr">
+        <di:waypoint x="530" y="140" />
+        <di:waypoint x="600" y="140" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="ScriptTask_0f9rjq4_di" bpmnElement="Task_13k9usx">
+        <dc:Bounds x="430" y="100" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="CallActivity_18qkiat_di" bpmnElement="Task_1rc7mcw">
+        <dc:Bounds x="1300" y="100" width="100" height="80" />
+      </bpmndi:BPMNShape>
+    </bpmndi:BPMNPlane>
+  </bpmndi:BPMNDiagram>
+</bpmn:definitions>