2  * ============LICENSE_START=======================================================
 
   4  * ================================================================================
 
   5  * Copyright (C) 2018 Huawei Technologies Co., Ltd. All rights reserved.
 
   6  * ================================================================================
 
   7  * Modifications Copyright (c) 2019 Samsung
 
   8  * ================================================================================
 
   9  * Licensed under the Apache License, Version 2.0 (the "License");
 
  10  * you may not use this file except in compliance with the License.
 
  11  * You may obtain a copy of the License at
 
  13  *      http://www.apache.org/licenses/LICENSE-2.0
 
  15  * Unless required by applicable law or agreed to in writing, software
 
  16  * distributed under the License is distributed on an "AS IS" BASIS,
 
  17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  18  * See the License for the specific language governing permissions and
 
  19  * limitations under the License.
 
  20  * ============LICENSE_END=========================================================
 
  23 package org.onap.so.bpmn.infrastructure.scripts
 
  25 import org.apache.commons.lang3.*
 
  26 import org.camunda.bpm.engine.delegate.BpmnError
 
  27 import org.camunda.bpm.engine.delegate.DelegateExecution
 
  28 import org.onap.aai.domain.yang.AllottedResource
 
  29 import org.onap.aai.domain.yang.Relationship
 
  30 import org.onap.aai.domain.yang.RelationshipData
 
  31 import org.onap.so.bpmn.common.recipe.ResourceInput
 
  32 import org.onap.so.bpmn.common.resource.ResourceRequestBuilder
 
  33 import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
 
  34 import org.onap.so.bpmn.common.scripts.ExceptionUtil
 
  35 import org.onap.so.bpmn.common.scripts.MsoUtils
 
  36 import org.onap.so.bpmn.common.scripts.SDNCAdapterUtils
 
  37 import org.onap.so.bpmn.core.domain.ModelInfo
 
  38 import org.onap.so.bpmn.core.domain.ResourceType
 
  39 import org.onap.so.bpmn.core.json.JsonUtils
 
  40 import org.onap.so.bpmn.core.UrnPropertiesReader
 
  41 import org.onap.aaiclient.client.aai.AAIObjectType
 
  42 import org.onap.aaiclient.client.aai.AAIResourcesClient
 
  43 import org.onap.aaiclient.client.aai.entities.AAIResultWrapper
 
  44 import org.onap.aaiclient.client.aai.entities.uri.AAIResourceUri
 
  45 import org.onap.aaiclient.client.aai.entities.uri.AAIUriFactory
 
  46 import org.slf4j.Logger
 
  47 import org.slf4j.LoggerFactory
 
  49 import javax.ws.rs.NotFoundException
 
  51 import static org.apache.commons.lang3.StringUtils.*
 
  54  * This groovy class supports the <class>DeleteSDNCCNetworkResource.bpmn</class> process.
 
  55  * flow for SDNC Network Resource 
 
  57 public class DeleteSDNCNetworkResource extends AbstractServiceTaskProcessor {
 
  58     private static final Logger logger = LoggerFactory.getLogger( DeleteSDNCNetworkResource.class);
 
  60     String Prefix="DELSDNCRES_"
 
  62     ExceptionUtil exceptionUtil = new ExceptionUtil()
 
  64     JsonUtils jsonUtil = new JsonUtils()
 
  66     SDNCAdapterUtils sdncAdapterUtils = new SDNCAdapterUtils()
 
  68     MsoUtils msoUtils = new MsoUtils()
 
  70     void preProcessRequest(DelegateExecution execution){
 
  71         logger.info(" ***** Started preProcessRequest *****")
 
  74             //get bpmn inputs from resource request.
 
  75             String requestId = execution.getVariable("mso-request-id")
 
  76             String requestAction = execution.getVariable("requestAction")
 
  77             logger.info("The requestAction is: " + requestAction)
 
  78             String recipeParamsFromRequest = execution.getVariable("recipeParams")
 
  79             logger.info("The recipeParams is: " + recipeParamsFromRequest)
 
  80             String resourceInput = execution.getVariable("resourceInput")
 
  81             logger.info("The resourceInput is: " + resourceInput)
 
  82             //Get ResourceInput Object
 
  83             ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(resourceInput, ResourceInput.class)
 
  84             execution.setVariable(Prefix + "resourceInput", resourceInputObj)
 
  86             //Deal with recipeParams
 
  87             String recipeParamsFromWf = execution.getVariable("recipeParamXsd")
 
  88             String resourceModelName = resourceInputObj.getResourceModelInfo().getModelName()
 
  89             String resourceInstanceId = resourceInputObj.getResourceInstancenUuid()
 
  90             String globalCustomerId = resourceInputObj.getGlobalSubscriberId()
 
  91             String serviceType = resourceInputObj.getServiceType()
 
  92             String serviceInstanceId = resourceInputObj.getServiceInstanceId()
 
  94             // fetch parent instance id for allotted resources
 
  95             String modelType = resourceInputObj.getResourceModelInfo().getModelType()
 
  97             // sdwanvpnattachment or sotnvpnattachment
 
  98                 case "ALLOTTED_RESOURCE":
 
  99                     String parentServiceId = fetchParentServiceInstance(globalCustomerId, serviceType, serviceInstanceId, resourceInstanceId)
 
 100                     if (null != parentServiceId) {
 
 101                         execution.setVariable("allotedParentServiceInstanceId", parentServiceId)
 
 103                         logger.warn("Alloted Resource ParentServiceInstanceId not found in AAI response for allotedId: " + resourceInstanceId)
 
 110             //For sdnc requestAction default is "NetworkInstance"
 
 111             String operationType = "Network"
 
 112             if(!StringUtils.isBlank(recipeParamsFromRequest) && "null" != recipeParamsFromRequest){
 
 113                 //the operationType from worflow(first node) is second priority.
 
 114                 operationType = jsonUtil.getJsonValue(recipeParamsFromRequest, "operationType")
 
 116             if(!StringUtils.isBlank(recipeParamsFromWf)){
 
 117                 //the operationType from worflow(first node) is highest priority.
 
 118                 operationType = jsonUtil.getJsonValue(recipeParamsFromWf, "operationType")
 
 120             String operationTypeFromConfig = UrnPropertiesReader.getVariable("resource-config." + resourceInputObj.resourceModelInfo.getModelName() + ".operation-type")
 
 121             if (StringUtils.isNotEmpty(operationTypeFromConfig)) {
 
 122                 // highest priority if operation type configured
 
 123                 operationType = operationTypeFromConfig
 
 127             //For sdnc, generate svc_action and request_action
 
 128             String sdnc_svcAction = "delete"
 
 129             String sdnc_requestAction = StringUtils.capitalize(sdnc_svcAction) + operationType + "Instance"
 
 130             String isActivateRequired = UrnPropertiesReader.getVariable("resource-config." + resourceInputObj.resourceModelInfo.getModelName() + ".activation-required")
 
 131             execution.setVariable("isActivateRequired", isActivateRequired)
 
 132             execution.setVariable(Prefix + "svcAction", sdnc_svcAction)
 
 133             execution.setVariable(Prefix + "requestAction", sdnc_requestAction)
 
 134             execution.setVariable(Prefix + "serviceInstanceId", resourceInputObj.getServiceInstanceId())
 
 135             execution.setVariable("mso-request-id", requestId)
 
 136             execution.setVariable("mso-service-instance-id", resourceInputObj.getServiceInstanceId())
 
 137         } catch (BpmnError e) {
 
 139         } catch (Exception ex){
 
 140             String msg = "Exception in preProcessRequest " + ex.getMessage()
 
 142             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
 
 144         logger.info(" ***** Exit preProcessRequest *****")
 
 147     private String fetchParentServiceInstance(String globalCustId, String serviceType, String serviceInstanceId, String allotedResourceId ) {
 
 148         logger.trace("Entered fetchParentServiceInstance")
 
 150             String parentServiceId = "";
 
 151             AAIResourcesClient resourceClient = new AAIResourcesClient();
 
 152             AAIResourceUri serviceInstanceUri = AAIUriFactory.createResourceUri(AAIObjectType.ALLOTTED_RESOURCE, globalCustId, serviceType, serviceInstanceId, allotedResourceId)
 
 153             AAIResultWrapper aaiResult = resourceClient.get(serviceInstanceUri, NotFoundException.class)
 
 154             Optional<AllottedResource> si = aaiResult.asBean(AllottedResource.class)
 
 155             if((si.present) && (null != si.get().getRelationshipList()) && (null != si.get().getRelationshipList().getRelationship())) {
 
 156                 logger.debug("SI Data relationship-list exists")
 
 157                 List<Relationship> relationshipList = si.get().getRelationshipList().getRelationship()
 
 158                 for (Relationship relationship : relationshipList) {
 
 159                     String rt = relationship.getRelatedTo()
 
 160                     List<RelationshipData> rl_datas = relationship.getRelationshipData()
 
 161                     if(rt.equals("service-instance") ){
 
 162                         for (RelationshipData rl_data : rl_datas) {
 
 163                             String eKey = rl_data.getRelationshipKey()
 
 164                             String eValue = rl_data.getRelationshipValue()
 
 165                             if(eKey.equals("service-instance.service-instance-id") && (!eValue.equals(serviceInstanceId))){
 
 173             logger.trace("Exited fetchParentServiceInstance")
 
 175             logger.debug("Error occured within deleteServiceInstance method: " + e)
 
 176             exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Error occured during deleteServiceInstance from aai")
 
 182      * Pre Process the BPMN Flow Request
 
 184      * generate the nsOperationKey
 
 185      * generate the nsParameters
 
 187      void prepareSDNCRequest (DelegateExecution execution) {
 
 188         logger.info(" ***** Started prepareSDNCRequest *****")
 
 192             String sdnc_svcAction = execution.getVariable(Prefix + "svcAction")
 
 193             String sdnc_requestAction = execution.getVariable(Prefix + "requestAction")
 
 194             String sdncCallback = execution.getVariable("URN_mso_workflow_sdncadapter_callback")
 
 195             String deleteNetworkInput = execution.getVariable(Prefix + "networkRequest")
 
 197             String hdrRequestId = execution.getVariable("mso-request-id")
 
 198             String serviceInstanceId = execution.getVariable(Prefix + "serviceInstanceId")
 
 199             String source = execution.getVariable("source")
 
 200             String sdnc_service_id = execution.getVariable(Prefix + "sdncServiceId")
 
 201             String resourceInput = execution.getVariable(Prefix + "resourceInput")
 
 202             logger.info("The resourceInput is: " + resourceInput)
 
 203             String allotedParentServiceInstanceId = execution.getVariable("allotedParentServiceInstanceId")
 
 204             ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(resourceInput, ResourceInput.class)
 
 205             String serviceType = resourceInputObj.getServiceType()
 
 206             String serviceModelInvariantUuid = resourceInputObj.getServiceModelInfo().getModelInvariantUuid()
 
 207             String serviceModelUuid = resourceInputObj.getServiceModelInfo().getModelUuid()
 
 208             String serviceModelVersion = resourceInputObj.getServiceModelInfo().getModelVersion()
 
 209             String serviceModelName = resourceInputObj.getServiceModelInfo().getModelName()
 
 210             String globalCustomerId = resourceInputObj.getGlobalSubscriberId()
 
 211             String modelInvariantUuid = resourceInputObj.getResourceModelInfo().getModelInvariantUuid();
 
 212             String modelCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
 
 213             String modelUuid = resourceInputObj.getResourceModelInfo().getModelUuid()
 
 214             String modelName = resourceInputObj.getResourceModelInfo().getModelName()
 
 215             String modelVersion = resourceInputObj.getResourceModelInfo().getModelVersion()
 
 216             String resourceInstnaceId = resourceInputObj.getResourceInstancenUuid()
 
 217             String modelType = resourceInputObj.getResourceModelInfo().getModelType()
 
 219             // 1. prepare assign topology via SDNC Adapter SUBFLOW call
 
 220             String sdncTopologyDeleteRequest = ""
 
 224                                     if(modelName.contains("UNI") && "MDONS_OTN".equals(serviceType)){
 
 225                                                 String serviceInstanceName = resourceInputObj.getResourceInstanceName()
 
 226                                                 sdncTopologyDeleteRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
 
 227                                                               xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1" 
 
 228                                                               xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
 
 229                                  <sdncadapter:RequestHeader>
 
 230                                     <sdncadapter:RequestId>${MsoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
 
 231                                     <sdncadapter:SvcInstanceId>${MsoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
 
 232                                     <sdncadapter:SvcAction>${MsoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
 
 233                                     <sdncadapter:SvcOperation>optical-service-delete</sdncadapter:SvcOperation>
 
 234                                     <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
 
 235                                     <sdncadapter:MsoAction>opticalservice</sdncadapter:MsoAction>
 
 236                                  </sdncadapter:RequestHeader>
 
 237                                  <sdncadapterworkflow:SDNCRequestData>
 
 238                                  <request-id>${msoUtils.xmlEscape(serviceInstanceId)}</request-id>
 
 241                                          <name>service-name</name>
 
 242                                                                                  <value>${msoUtils.xmlEscape(serviceInstanceName)}</value>
 
 245                                 </sdncadapterworkflow:SDNCRequestData>
 
 246                              </aetgt:SDNCAdapterWorkflowRequest>""".trim()
 
 248                     sdncTopologyDeleteRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
 
 249                                                               xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1" 
 
 250                                                               xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
 
 251                                  <sdncadapter:RequestHeader>
 
 252                                     <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
 
 253                                     <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
 
 254                                     <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
 
 255                                     <sdncadapter:SvcOperation>vnf-topology-operation</sdncadapter:SvcOperation>
 
 256                                     <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
 
 257                                     <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
 
 258                                  </sdncadapter:RequestHeader>
 
 259                                  <sdncadapterworkflow:SDNCRequestData>
 
 260                                      <request-information>
 
 261                                         <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
 
 262                                         <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
 
 263                                         <source>${msoUtils.xmlEscape(source)}</source>
 
 264                                         <notification-url></notification-url>
 
 265                                         <order-number></order-number>
 
 266                                         <order-version></order-version>
 
 267                                      </request-information>
 
 268                                      <service-information>
 
 269                                         <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
 
 270                                         <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
 
 271                                         <onap-model-information>
 
 272                                              <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
 
 273                                              <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
 
 274                                              <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
 
 275                                              <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
 
 276                                         </onap-model-information>
 
 277                                         <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
 
 278                                         <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
 
 279                                         <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
 
 280                                      </service-information>
 
 282                                         <vnf-id>$resourceInstnaceId</vnf-id>
 
 283                                         <vnf-type></vnf-type>
 
 284                                         <onap-model-information>
 
 285                                              <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
 
 286                                              <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
 
 287                                              <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
 
 288                                              <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
 
 289                                              <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
 
 290                                         </onap-model-information>
 
 293                                          <vnf-input-parameters>
 
 294                                          </vnf-input-parameters>
 
 295                                          <request-version></request-version>
 
 296                                          <vnf-name></vnf-name>
 
 300                                 </sdncadapterworkflow:SDNCRequestData>
 
 301                              </aetgt:SDNCAdapterWorkflowRequest>""".trim()
 
 305                     //When a new resource creation request reaches SO, the parent resources information needs to be provided
 
 306                     //while creating the child resource.
 
 307                     String vnfid = resourceInputObj.getVnfId()
 
 308                     ModelInfo vfModelInfo = resourceInputObj.getVfModelInfo()
 
 309                     String vnfmodelInvariantUuid = vfModelInfo.getModelInvariantUuid()
 
 310                     String vnfmodelCustomizationUuid = vfModelInfo.getModelCustomizationUuid()
 
 311                     String vnfmodelUuid = vfModelInfo.getModelUuid()
 
 312                     String vnfmodelVersion = vfModelInfo.getModelVersion()
 
 313                     String vnfmodelName = vfModelInfo.getModelName()
 
 315                     sdncTopologyDeleteRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1" 
 
 316                                                         xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1" 
 
 317                                                         xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
 
 318                                   <sdncadapter:RequestHeader>
 
 319                                     <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
 
 320                                     <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
 
 321                                     <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
 
 322                                     <sdncadapter:SvcOperation>vf-module-topology-operation</sdncadapter:SvcOperation>
 
 323                                     <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
 
 324                                     <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
 
 325                                   </sdncadapter:RequestHeader>
 
 326                                   <sdncadapterworkflow:SDNCRequestData>
 
 327                                     <request-information>
 
 328                                       <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
 
 329                                       <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
 
 330                                       <source>${msoUtils.xmlEscape(source)}</source>
 
 331                                       <notification-url></notification-url>
 
 332                                       <order-number></order-number>
 
 333                                       <order-version></order-version>
 
 334                                     </request-information>
 
 335                                     <service-information>
 
 336                                       <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
 
 337                                       <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
 
 338                                       <onap-model-information>
 
 339                                         <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
 
 340                                         <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
 
 341                                         <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
 
 342                                         <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
 
 343                                       </onap-model-information>
 
 344                                       <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
 
 345                                       <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
 
 346                                       <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
 
 347                                     </service-information>
 
 349                                       <vnf-id>$vnfid</vnf-id>
 
 350                                       <vnf-type></vnf-type>
 
 351                                       <onap-model-information>
 
 352                                         <model-invariant-uuid>${msoUtils.xmlEscape(vnfmodelInvariantUuid)}</model-invariant-uuid>
 
 353                                         <model-customization-uuid>${msoUtils.xmlEscape(vnfmodelCustomizationUuid)}</model-customization-uuid>
 
 354                                         <model-uuid>${msoUtils.xmlEscape(vnfmodelUuid)}</model-uuid>
 
 355                                         <model-version>${msoUtils.xmlEscape(vnfmodelVersion)}</model-version>
 
 356                                         <model-name>${msoUtils.xmlEscape(vnfmodelName)}</model-name>
 
 357                                       </onap-model-information>
 
 359                                     <vf-module-information>
 
 360                                       <vf-module-id>$resourceInstnaceId</vf-module-id>
 
 361                                       <vf-module-type></vf-module-type>
 
 362                                       <from-preload>false</from-preload>
 
 363                                       <onap-model-information>
 
 364                                         <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
 
 365                                         <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
 
 366                                         <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
 
 367                                         <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
 
 368                                         <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
 
 369                                       </onap-model-information>
 
 370                                     </vf-module-information>
 
 371                                     <vf-module-request-input>
 
 372                                       <vf-module-input-parameters>
 
 373                                       </vf-module-input-parameters>
 
 374                                     </vf-module-request-input>
 
 375                                   </sdncadapterworkflow:SDNCRequestData>
 
 376                                 </aetgt:SDNCAdapterWorkflowRequest>""".trim()
 
 379                 // sdwanvpnattachment or sotnvpnattachment
 
 380                 case "ALLOTTED_RESOURCE" :
 
 381                     sdncTopologyDeleteRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
 
 382                                                               xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1" 
 
 383                                                               xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
 
 384                                  <sdncadapter:RequestHeader>
 
 385                                     <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
 
 386                                     <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
 
 387                                     <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
 
 388                                     <sdncadapter:SvcOperation>connection-attachment-topology-operation</sdncadapter:SvcOperation>
 
 389                                     <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
 
 390                                     <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
 
 391                                  </sdncadapter:RequestHeader>
 
 392                                  <sdncadapterworkflow:SDNCRequestData>
 
 393                                      <request-information>
 
 394                                         <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
 
 395                                         <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
 
 396                                         <source>${msoUtils.xmlEscape(source)}</source>
 
 397                                         <notification-url></notification-url>
 
 398                                         <order-number></order-number>
 
 399                                         <order-version></order-version>
 
 400                                      </request-information>
 
 401                                      <service-information>
 
 402                                         <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
 
 403                                         <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
 
 404                                         <onap-model-information>
 
 405                                              <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
 
 406                                              <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
 
 407                                              <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
 
 408                                              <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
 
 409                                         </onap-model-information>
 
 410                                         <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
 
 411                                         <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
 
 412                                         <subscriber-name></subscriber-name>
 
 413                                      </service-information>
 
 414                                      <allotted-resource-information>
 
 415                                         <allotted-resource-id>$resourceInstnaceId</allotted-resource-id>
 
 416                                         <allotted-resource-type></allotted-resource-type>
 
 417                                         <parent-service-instance-id>$allotedParentServiceInstanceId</parent-service-instance-id>
 
 418                                         <onap-model-information>
 
 419                                              <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
 
 420                                              <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
 
 421                                              <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
 
 422                                              <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
 
 423                                              <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
 
 424                                         </onap-model-information>
 
 425                                      </allotted-resource-information>
 
 426                                      <connection-attachment-request-input>
 
 427                                      </connection-attachment-request-input>
 
 428                                 </sdncadapterworkflow:SDNCRequestData>
 
 429                              </aetgt:SDNCAdapterWorkflowRequest>""".trim()
 
 433                 // for SDWANConnectivity and SOTNConnectivity:
 
 435                     sdncTopologyDeleteRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
 
 436                                                               xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1" 
 
 437                                                               xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
 
 438                                  <sdncadapter:RequestHeader>
 
 439                                     <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
 
 440                                     <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
 
 441                                     <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
 
 442                                     <sdncadapter:SvcOperation>network-topology-operation</sdncadapter:SvcOperation>
 
 443                                     <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
 
 444                                     <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
 
 445                                  </sdncadapter:RequestHeader>
 
 446                                  <sdncadapterworkflow:SDNCRequestData>
 
 447                                      <request-information>
 
 448                                         <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
 
 449                                         <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
 
 450                                         <source>${msoUtils.xmlEscape(source)}</source>
 
 451                                         <notification-url></notification-url>
 
 452                                         <order-number></order-number>
 
 453                                         <order-version></order-version>
 
 454                                      </request-information>
 
 455                                      <service-information>
 
 456                                         <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
 
 457                                         <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
 
 458                                         <onap-model-information>
 
 459                                              <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
 
 460                                              <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
 
 461                                              <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
 
 462                                              <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
 
 463                                         </onap-model-information>
 
 464                                         <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
 
 465                                         <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
 
 466                                      </service-information>
 
 467                                      <network-information>
 
 468                                         <network-id>$resourceInstnaceId</network-id>
 
 469                                         <onap-model-information>
 
 470                                              <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
 
 471                                              <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
 
 472                                              <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
 
 473                                              <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
 
 474                                              <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
 
 475                                         </onap-model-information>
 
 476                                      </network-information>
 
 477                                      <network-request-input>
 
 478                                        <network-input-parameters></network-input-parameters>
 
 479                                      </network-request-input>
 
 480                                 </sdncadapterworkflow:SDNCRequestData>
 
 481                              </aetgt:SDNCAdapterWorkflowRequest>""".trim()
 
 484             String sdncTopologyDeleteRequesAsString = utils.formatXml(sdncTopologyDeleteRequest)
 
 485             execution.setVariable("sdncAdapterWorkflowRequest", sdncTopologyDeleteRequesAsString)
 
 486             logger.info("sdncAdapterWorkflowRequest - " + "\n" +  sdncTopologyDeleteRequesAsString)
 
 488         } catch (Exception ex) {
 
 489             String exceptionMessage = " Bpmn error encountered in DeleteSDNCCNetworkResource flow. prepareSDNCRequest() - " + ex.getMessage()
 
 490             logger.debug( exceptionMessage)
 
 491             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
 
 494         logger.info(" ***** Exit prepareSDNCRequest *****")
 
 497     private void setProgressUpdateVariables(DelegateExecution execution, String body) {
 
 498         def dbAdapterEndpoint = UrnPropertiesReader.getVariable("mso.adapters.openecomp.db.endpoint", execution)
 
 499         execution.setVariable("CVFMI_dbAdapterEndpoint", dbAdapterEndpoint)
 
 500         execution.setVariable("CVFMI_updateResOperStatusRequest", body)
 
 503     void prepareUpdateBeforeDeleteSDNCResource(DelegateExecution execution) {
 
 504         logger.debug(" *** prepareUpdateBeforeDeleteSDNCResource *** ")
 
 505         String resourceInput = execution.getVariable(Prefix + "resourceInput");
 
 506         ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(resourceInput, ResourceInput.class)
 
 507         String operType = resourceInputObj.getOperationType()
 
 508         String resourceCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
 
 509         String serviceInstanceId = resourceInputObj.getServiceInstanceId()
 
 510         String operationId = resourceInputObj.getOperationId()
 
 511         String progress = "20"
 
 512         String status = "processing"
 
 513         String statusDescription = "SDCN resource delete invoked"
 
 515         //String operationId = execution.getVariable("operationId")
 
 518                 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
 
 519                         xmlns:ns="http://org.onap.so/requestsdb">
 
 522                     <ns:updateResourceOperationStatus>
 
 523                                <operType>${msoUtils.xmlEscape(operType)}</operType>
 
 524                                <operationId>${msoUtils.xmlEscape(operationId)}</operationId>
 
 525                                <progress>${msoUtils.xmlEscape(progress)}</progress>
 
 526                                <resourceTemplateUUID>${msoUtils.xmlEscape(resourceCustomizationUuid)}</resourceTemplateUUID>
 
 527                                <serviceId>${msoUtils.xmlEscape(serviceInstanceId)}</serviceId>
 
 528                                <status>${msoUtils.xmlEscape(status)}</status>
 
 529                                <statusDescription>${msoUtils.xmlEscape(statusDescription)}</statusDescription>
 
 530                     </ns:updateResourceOperationStatus>
 
 532                 </soapenv:Envelope>""";
 
 534         setProgressUpdateVariables(execution, body)
 
 535         logger.debug(" ***** Exit prepareUpdateBeforeDeleteSDNCResource *****")
 
 539     void prepareUpdateAfterDeleteSDNCResource(DelegateExecution execution) {
 
 540         logger.debug(" *** prepareUpdateAfterDeleteSDNCResource *** ")
 
 541         String resourceInput = execution.getVariable(Prefix + "resourceInput");
 
 542         ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(resourceInput, ResourceInput.class)
 
 543         String operType = resourceInputObj.getOperationType()
 
 544         String resourceCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
 
 545         String serviceInstanceId = resourceInputObj.getServiceInstanceId()
 
 546         String operationId = resourceInputObj.getOperationId()
 
 547         String progress = "100"
 
 548         String status = "finished"
 
 549         String statusDescription = "SDCN resource delete and deactivation completed"
 
 551         //String operationId = execution.getVariable("operationId")
 
 554                 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
 
 555                         xmlns:ns="http://org.onap.so/requestsdb">
 
 558                     <ns:updateResourceOperationStatus>
 
 559                                <operType>${msoUtils.xmlEscape(operType)}</operType>
 
 560                                <operationId>${msoUtils.xmlEscape(operationId)}</operationId>
 
 561                                <progress>${msoUtils.xmlEscape(progress)}</progress>
 
 562                                <resourceTemplateUUID>${msoUtils.xmlEscape(resourceCustomizationUuid)}</resourceTemplateUUID>
 
 563                                <serviceId>${msoUtils.xmlEscape(serviceInstanceId)}</serviceId>
 
 564                                <status>${msoUtils.xmlEscape(status)}</status>
 
 565                                <statusDescription>${msoUtils.xmlEscape(statusDescription)}</statusDescription>
 
 566                     </ns:updateResourceOperationStatus>
 
 568                 </soapenv:Envelope>""";
 
 570         setProgressUpdateVariables(execution, body)
 
 571         logger.debug(" ***** Exit prepareUpdateAfterDeleteSDNCResource *****")
 
 574     void postDeleteSDNCCall(DelegateExecution execution){
 
 575         logger.info(" ***** Started postDeleteSDNCCall *****")
 
 576         String responseCode = execution.getVariable(Prefix + "sdncDeleteReturnCode")
 
 577         String responseObj = execution.getVariable(Prefix + "SuccessIndicator")
 
 579         logger.info("response from sdnc, response code :" + responseCode + "  response object :" + responseObj)
 
 580         logger.info(" ***** Exit postDeleteSDNCCall *****")
 
 583     void sendSyncResponse (DelegateExecution execution) {
 
 584         logger.debug( " *** sendSyncResponse *** ")
 
 587             String operationStatus = "finished"
 
 588             // RESTResponse for main flow
 
 589             String resourceOperationResp = """{"operationStatus":"${operationStatus}"}""".trim()
 
 590             logger.debug( " sendSyncResponse to APIH:" + "\n" + resourceOperationResp)
 
 591             sendWorkflowResponse(execution, 202, resourceOperationResp)
 
 592             execution.setVariable("sentSyncResponse", true)
 
 594         } catch (Exception ex) {
 
 595             String msg = "Exception in sendSyncResponse:" + ex.getMessage()
 
 597             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
 
 599         logger.debug(" ***** Exit sendSyncResponse *****")