2  * ============LICENSE_START=======================================================
\r 
   4  * ================================================================================
\r 
   5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
\r 
   6  * ================================================================================
\r 
   7  * Licensed under the Apache License, Version 2.0 (the "License");
\r 
   8  * you may not use this file except in compliance with the License.
\r 
   9  * You may obtain a copy of the License at
\r 
  11  *      http://www.apache.org/licenses/LICENSE-2.0
\r 
  13  * Unless required by applicable law or agreed to in writing, software
\r 
  14  * distributed under the License is distributed on an "AS IS" BASIS,
\r 
  15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\r 
  16  * See the License for the specific language governing permissions and
\r 
  17  * limitations under the License.
\r 
  18  * ============LICENSE_END=========================================================
\r 
  21 package org.openecomp.mso.bpmn.infrastructure.scripts;
\r 
  23 import groovy.json.JsonSlurper
\r 
  25 import java.util.concurrent.ExecutionException;
\r 
  27 import org.springframework.web.util.UriUtils
\r 
  28 import org.camunda.bpm.engine.delegate.BpmnError
\r 
  29 import org.camunda.bpm.engine.runtime.Execution
\r 
  30 import org.apache.commons.lang3.*
\r 
  31 import org.openecomp.mso.bpmn.common.scripts.AaiUtil;
\r 
  32 import org.openecomp.mso.bpmn.common.scripts.AbstractServiceTaskProcessor;
\r 
  33 import org.openecomp.mso.bpmn.common.scripts.ExceptionUtil;
\r 
  34 import org.openecomp.mso.bpmn.common.scripts.VidUtils;
\r 
  35 import org.openecomp.mso.bpmn.core.WorkflowException
\r 
  36 import org.openecomp.mso.rest.APIResponse
\r 
  39  * This groovy class supports the <class>DeleteVfModuleVolume.bpmn</class> process.
\r 
  41 public class DeleteVfModuleVolumeInfraV1 extends AbstractServiceTaskProcessor {
\r 
  43         private XmlParser xmlParser = new XmlParser()
\r 
  45          * This method is executed during the preProcessRequest task of the <class>DeleteVfModuleVolume.bpmn</class> process.
\r 
  48         public InitializeProcessVariables(Execution execution){
\r 
  49                 execution.setVariable('prefix', 'DELVfModVol_')
\r 
  50                 execution.setVariable("DELVfModVol_volumeRequest", null)
\r 
  51                 execution.setVariable('DELVfModVol_requestInfo', null)
\r 
  52                 execution.setVariable('DELVfModVol_requestId', null)
\r 
  53                 execution.setVariable('DELVfModVol_source', null)
\r 
  54                 execution.setVariable('DELVfModVol_volumeInputs', null)
\r 
  55                 execution.setVariable('DELVfModVol_volumeOutputs', null)
\r 
  56                 execution.setVariable('DELVfModVol_volumeGroupId', null)
\r 
  57                 execution.setVariable('DELVfModVol_vnfType', null)
\r 
  58                 execution.setVariable('DELVfModVol_serviceId', null)
\r 
  59                 execution.setVariable('DELVfModVol_cloudRegion', null)
\r 
  60                 execution.setVariable('DELVfModVol_tenantId', null)
\r 
  61                 execution.setVariable('DELVfModVol_volumeParams', null)
\r 
  62                 execution.setVariable('DELVfModVol_volumeGroupHeatStackId', null)
\r 
  63                 execution.setVariable('DELVfModVol_volumeGroupTenantId', null)
\r 
  64                 execution.setVariable("DELVfModVol_queryAAIVolGrpResponse", null)
\r 
  65                 execution.setVariable('DELVfModVol_messageId', null)
\r 
  66                 execution.setVariable('DELVfModVol_deleteVnfARequest', null)
\r 
  67                 execution.setVariable('DELVfModVol_updateInfraRequest', null)
\r 
  68                 execution.setVariable('DELVfModVol_CompleteMsoProcessRequest', null)
\r 
  69                 execution.setVariable('DELVfModVol_WorkflowException', null)
\r 
  70                 execution.setVariable('DELVfModVol_TransactionSuccessIndicator', false)
\r 
  71                 execution.setVariable("DELVfModVol_isErrorMessageException", false)
\r 
  72                 execution.setVariable('DELVfModVol_syncResponseSent', false)
\r 
  76          * Perform initial processing, such as request validation, initialization of variables, etc.
\r 
  77          * * @param execution
\r 
  79         public void preProcessRequest (Execution execution) {
\r 
  80                 def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
\r 
  81                 preProcessRequest(execution, isDebugEnabled)
\r 
  85          * This method is executed during the preProcessRequest task of the <class>DeleteVfModuleVolume.bpmn</class> process.
\r 
  88         public void preProcessRequest (Execution execution, isDebugLogEnabled) {
\r 
  90                 InitializeProcessVariables(execution)
\r 
  92                 String createVolumeIncoming = validateRequest(execution)
\r 
  93                 utils.logAudit(createVolumeIncoming)
\r 
  95                 // check if request is xml or json
\r 
  97                         def jsonSlurper = new JsonSlurper()
\r 
  98                         Map reqMap = jsonSlurper.parseText(createVolumeIncoming)
\r 
  99                         utils.log("DEBUG", " Request is in JSON format.", isDebugLogEnabled)
\r 
 101                         def serviceInstanceId = execution.getVariable('serviceInstanceId')
\r 
 102                         def volumeGroupId = execution.getVariable('volumeGroupId')
\r 
 103                         def vidUtils = new VidUtils(this)
\r 
 104                         createVolumeIncoming = vidUtils.createXmlVolumeRequest(reqMap, 'DELETE_VF_MODULE_VOL', serviceInstanceId, volumeGroupId)
\r 
 105                         execution.setVariable("DELVfModVol_isVidRequest", true)
\r 
 107                 catch(groovy.json.JsonException je) {
\r 
 108                         utils.log("DEBUG", " Request is in XML format.", isDebugLogEnabled)
\r 
 109                         // assume request is in XML format - proceed as usual to process XML request
\r 
 112                 String request = utils.getNodeXml(createVolumeIncoming, "volume-request").drop(38).trim().replace("tag0:","").replace(":tag0","")
\r 
 113                 execution.setVariable("DELVfModVol_volumeRequest", request)
\r 
 115                 def requestInfo = getRequiredNodeXml(execution, request, 'request-info')
\r 
 116                 execution.setVariable('DELVfModVol_requestInfo', requestInfo)
\r 
 117                 String requestId = execution.getVariable("mso-request-id")
\r 
 118                 if (requestId == null || requestId == "") {
\r 
 119                         requestId = getRequiredNodeText(execution, requestInfo, 'request-id')
\r 
 121                 execution.setVariable('DELVfModVol_requestId', requestId)
\r 
 122                 execution.setVariable('DELVfModVol_source', getNodeTextForce(requestInfo, 'source'))
\r 
 124                 def volumeInputs = getRequiredNodeXml(execution, request, 'volume-inputs')
\r 
 125                 execution.setVariable('DELVfModVol_volumeInputs', volumeInputs)
\r 
 126                 execution.setVariable('DELVfModVol_volumeGroupId', getRequiredNodeText(execution, volumeInputs, 'volume-group-id'))
\r 
 127                 execution.setVariable('DELVfModVol_vnfType', getRequiredNodeText(execution, volumeInputs, 'vnf-type'))
\r 
 128                 execution.setVariable('DELVfModVol_serviceId', utils.getNodeText1(volumeInputs, 'service-id'))
\r 
 129                 execution.setVariable('DELVfModVol_tenantId', getRequiredNodeText(execution, volumeInputs, 'tenant-id'))
\r 
 130                 execution.setVariable('DELVfModVol_messageId', UUID.randomUUID().toString())
\r 
 131                 execution.setVariable('DELVfModVol_volumeOutputs', utils.getNodeXml(request, 'volume-outputs', false))
\r 
 132                 execution.setVariable('DELVfModVol_volumeParams', utils.getNodeXml(request, 'volume-params'))
\r 
 133                 execution.setVariable('DELVfModVol_cloudRegion', utils.getNodeText1(request, 'aic-cloud-region'))
\r 
 135                 setBasicDBAuthHeader(execution, isDebugLogEnabled)
\r 
 137                 logDebug('Request: ' + createVolumeIncoming, isDebugLogEnabled)
\r 
 140         public void sendSyncResponse (Execution execution, isDebugEnabled) {
\r 
 142                 String volumeRequest = execution.getVariable("DELVfModVol_volumeRequest")
\r 
 143                 utils.log("DEBUG", " DELVfModVol_volumeRequest - " + "\n" + volumeRequest, isDebugEnabled)
\r 
 144                 // RESTResponse (for API Handler (APIH) Reply Task)
\r 
 145                 String deleteVolumeRequest =
\r 
 146                                 """<rest:RESTResponse xmlns:rest="http://schemas.activebpel.org/REST/2007/12/01/aeREST.xsd" statusCode="200">
\r 
 147                 <rest:payload xmlns:rest="http://schemas.activebpel.org/REST/2007/12/01/aeREST.xsd"
\r 
 148                           contentType="text/xml">
\r 
 151                        </rest:RESTResponse>""".trim()
\r 
 153                 def isVidRequest = execution.getVariable('DELVfModVol_isVidRequest')
\r 
 154                 def syncResponse = ''
\r 
 157                         def serviceInstanceId = execution.getVariable('serviceInstanceId')
\r 
 158                         def volumeGroupId = execution.getVariable('volumeGroupId')
\r 
 159                         def requestId = execution.getVariable('DELVfModVol_requestId')
\r 
 160                         syncResponse = """{"requestReferences":{"instanceId":"${volumeGroupId}","requestId":"${requestId}"}}""".trim()
\r 
 163                         syncResponse = utils.formatXml(deleteVolumeRequest)
\r 
 166                 execution.setVariable('DELVfModVol_syncResponseSent', true)
\r 
 168                 sendWorkflowResponse(execution, 200, syncResponse)
\r 
 172         public void sendSyncError (Execution execution, isDebugEnabled) {
\r 
 173                 WorkflowException we = execution.getVariable('WorkflowException')
\r 
 174                 def errorCode = we?.getErrorCode()
\r 
 175                 def errorMessage = we?.getErrorMessage()
\r 
 176                 //default to 400 since only invalid request will trigger this method
\r 
 177                 sendWorkflowResponse(execution, 400, errorMessage)
\r 
 181         public void callRESTQueryAAICloudRegion (Execution execution, isDebugEnabled) {
\r 
 183                 String cloudRegion = execution.getVariable('DELVfModVol_cloudRegion')
\r 
 185                 String aai_endpoint = execution.getVariable("URN_aai_endpoint")
\r 
 186                 AaiUtil aaiUtil = new AaiUtil(this)
\r 
 187                 String aai_uri = aaiUtil.getCloudInfrastructureCloudRegionUri(execution)
\r 
 188                 String queryCloudRegionRequest = "${aai_endpoint}${aai_uri}/" + cloudRegion
\r 
 189                 utils.logAudit(queryCloudRegionRequest)
\r 
 190                 execution.setVariable("DELVfModVol_queryCloudRegionRequest", queryCloudRegionRequest)
\r 
 191                 utils.log("DEBUG", " DELVfModVol_queryCloudRegionRequest - " + "\n" + queryCloudRegionRequest, isDebugEnabled)
\r 
 193                 cloudRegion = aaiUtil.getAAICloudReqion(execution,  queryCloudRegionRequest, "PO", cloudRegion)
\r 
 195                 ExceptionUtil exceptionUtil = new ExceptionUtil()
\r 
 197                 if ((cloudRegion != "ERROR")) {
\r 
 198                         if(execution.getVariable("DELVfModVol_queryCloudRegionReturnCode") == "404"){
\r 
 199                                 execution.setVariable("DELVfModVol_aicCloudRegion", "AAIAIC25")
\r 
 201                                 execution.setVariable("DELVfModVol_aicCloudRegion", cloudRegion)
\r 
 203                         execution.setVariable("DELVfModVol_cloudRegion", cloudRegion)
\r 
 204                         execution.setVariable("DELVfModVol_isCloudRegionGood", true)
\r 
 207                         utils.log("DEBUG", "AAI Query Cloud Region Unsuccessful.", isDebugEnabled)
\r 
 208                         execution.setVariable("DELVfModVol_isCloudRegionGood", false)
\r 
 209                         exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "AAI Query Cloud Region Unsuccessful. Return Code: " + execution.getVariable("DELVfModVol_queryCloudRegionReturnCode"))
\r 
 212                 utils.log("DEBUG", " is Cloud Region Good: " + execution.getVariable("DELVfModVol_isCloudRegionGood"), isDebugEnabled)
\r 
 216          * Query volume group by id
\r 
 219         public void queryAAIForVolumeGroup(Execution execution, isDebugLogEnabled) {
\r 
 221                 ExceptionUtil exceptionUtil = new ExceptionUtil()
\r 
 223                 def volumeGroupId = execution.getVariable('DELVfModVol_volumeGroupId')
\r 
 224                 if(volumeGroupId == null) {
\r 
 225                         exceptionUtil.buildAndThrowWorkflowException(execution, 2500, 'volume-group-id is not provided in the request')
\r 
 226                         throw new Exception('volume-group-id is not provided in the request')
\r 
 228                 String cloudRegion = execution.getVariable('DELVfModVol_aicCloudRegion')
\r 
 230                 AaiUtil aaiUtil = new AaiUtil(this)
\r 
 231                 String aaiEndpoint = aaiUtil.getCloudInfrastructureCloudRegionEndpoint(execution)
\r 
 232                 String queryAAIVolumeGroupRequest = aaiEndpoint + '/' + URLEncoder.encode(cloudRegion, "UTF-8") + "/volume-groups/volume-group/" + UriUtils.encode(volumeGroupId, "UTF-8")
\r 
 234                 utils.logAudit('Query AAI volume group by ID: ' + queryAAIVolumeGroupRequest)
\r 
 235                 logDebug('Query AAI volume group by ID: ' + queryAAIVolumeGroupRequest, isDebugLogEnabled)
\r 
 237                 APIResponse response = aaiUtil.executeAAIGetCall(execution, queryAAIVolumeGroupRequest)
\r 
 239                 String returnCode = response.getStatusCode()
\r 
 240                 String aaiResponseAsString = response.getResponseBodyAsString()
\r 
 241                 aaiResponseAsString = StringEscapeUtils.unescapeXml(aaiResponseAsString)
\r 
 243                 utils.logAudit("AAI query volume group by id return code: " + returnCode)
\r 
 244                 utils.logAudit("AAI query volume group by id response: " + aaiResponseAsString)
\r 
 246                 execution.setVariable("DELVfModVol_queryAAIVolGrpResponse", aaiResponseAsString)
\r 
 248                 if (returnCode=='200' || returnCode == '204') {
\r 
 250                         def heatStackId = getNodeTextForce(aaiResponseAsString, 'heat-stack-id')
\r 
 251                         execution.setVariable('DELVfModVol_volumeGroupHeatStackId', heatStackId)
\r 
 253                         if(hasVfModuleRelationship(aaiResponseAsString)){
\r 
 254                                 utils.log("DEBUG", 'Volume Group ' + volumeGroupId + ' currently in use', isDebugLogEnabled)
\r 
 255                                 exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Volume Group ${volumeGroupId} currently in use - found vf-module relationship.")
\r 
 258                         def volumeGroupTenantId = getTenantIdFromVolumeGroup(aaiResponseAsString)
\r 
 259                         if (volumeGroupTenantId == null) {
\r 
 260                                 utils.log("DEBUG", "Could not find Tenant Id element in Volume Group with Volume Group Id ${volumeGroupId}", isDebugLogEnabled)
\r 
 261                                 exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Could not find Tenant Id element in Volume Group with Volume Group Id ${volumeGroupId}")
\r 
 264                         execution.setVariable('DELVfModVol_volumeGroupTenantId', volumeGroupTenantId)
\r 
 265                         logDebug('Received Tenant Id ' + volumeGroupTenantId + ' from AAI for Volume Group with Volume Group Id ' + volumeGroupId , isDebugLogEnabled)
\r 
 268                         if (returnCode=='404') {
\r 
 269                                 utils.log("DEBUG", "Volume Group ${volumeGroupId} not found in AAI", isDebugLogEnabled)
\r 
 270                                 exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Volume Group ${volumeGroupId} not found in AAI. Response code: 404")
\r 
 273                                 WorkflowException aWorkflowException = exceptionUtil.MapAAIExceptionToWorkflowException(aaiResponseAsString, execution)
\r 
 274                                 throw new BpmnError("MSOWorkflowException")
\r 
 280          * Extract the Tenant Id from the Volume Group information returned by AAI.
\r 
 282          * @param volumeGroupXml Volume Group XML returned by AAI.
\r 
 283          * @return the Tenant Id extracted from the Volume Group information. 'null' is returned if
\r 
 284          * the Tenant Id is missing or could not otherwise be extracted.
\r 
 286         private String getTenantIdFromVolumeGroup(String volumeGroupXml) {
\r 
 287                 def Node volumeGroupNode = xmlParser.parseText(volumeGroupXml)
\r 
 288                 def Node relationshipList = utils.getChildNode(volumeGroupNode, 'relationship-list')
\r 
 289                 if (relationshipList != null) {
\r 
 290                         def NodeList relationships = utils.getIdenticalChildren(relationshipList, 'relationship')
\r 
 291                         for (Node relationship in relationships) {
\r 
 292                                 def Node relatedTo = utils.getChildNode(relationship, 'related-to')
\r 
 293                                 if ((relatedTo != null) && (relatedTo.text().equals('tenant'))) {
\r 
 294                                         def NodeList relationshipDataList = utils.getIdenticalChildren(relationship, 'relationship-data')
\r 
 295                                         for (Node relationshipData in relationshipDataList) {
\r 
 296                                                 def Node relationshipKey = utils.getChildNode(relationshipData, 'relationship-key')
\r 
 297                                                 if ((relationshipKey != null) && (relationshipKey.text().equals('tenant.tenant-id'))) {
\r 
 298                                                         def Node relationshipValue = utils.getChildNode(relationshipData, 'relationship-value')
\r 
 299                                                         if (relationshipValue != null) {
\r 
 300                                                                 return relationshipValue.text()
\r 
 310         private boolean hasVnfRelationship(String volumeGroupXml) {
\r 
 311                 def Node volumeGroupNode = xmlParser.parseText(volumeGroupXml)
\r 
 312                 def Node relationshipList = utils.getChildNode(volumeGroupNode, 'relationship-list')
\r 
 313                 if (relationshipList != null) {
\r 
 314                         def NodeList relationships = utils.getIdenticalChildren(relationshipList, 'relationship')
\r 
 315                         for (Node relationship in relationships) {
\r 
 316                                 def Node relatedTo = utils.getChildNode(relationship, 'related-to')
\r 
 317                                 if ((relatedTo != null) && (relatedTo.text().equals('generic-vnf'))) {
\r 
 318                                         def Node relatedLink = utils.getChildNode(relationship, 'related-link')
\r 
 319                                         if (relatedLink !=null && relatedLink.text() != null){
\r 
 328         private boolean hasVfModuleRelationship(String volumeGroupXml) {
\r 
 329                 def Node volumeGroupNode = xmlParser.parseText(volumeGroupXml)
\r 
 330                 def Node relationshipList = utils.getChildNode(volumeGroupNode, 'relationship-list')
\r 
 331                 if (relationshipList != null) {
\r 
 332                         def NodeList relationships = utils.getIdenticalChildren(relationshipList, 'relationship')
\r 
 333                         for (Node relationship in relationships) {
\r 
 334                                 def Node relatedTo = utils.getChildNode(relationship, 'related-to')
\r 
 335                                 if ((relatedTo != null) && (relatedTo.text().equals('vf-module'))) {
\r 
 336                                         def Node relatedLink = utils.getChildNode(relationship, 'related-link')
\r 
 337                                         if (relatedLink !=null && relatedLink.text() != null){
\r 
 346         public void prepareVnfAdapterDeleteRequest(Execution execution, isDebugLogEnabled) {
\r 
 347                 def cloudRegion = execution.getVariable('DELVfModVol_cloudRegion')
\r 
 348                 def tenantId = execution.getVariable('DELVfModVol_tenantId')
\r 
 349                 def volumeGroupId = execution.getVariable('DELVfModVol_volumeGroupId')
\r 
 350                 def volumeGroupHeatStackId = execution.getVariable('DELVfModVol_volumeGroupHeatStackId')
\r 
 351                 def requestId = execution.getVariable('DELVfModVol_requestId')
\r 
 352                 def serviceId = execution.getVariable('DELVfModVol_serviceId')
\r 
 354                 def messageId = execution.getVariable('DELVfModVol_messageId')
\r 
 355                 def notificationUrl = createCallbackURL(execution, "VNFAResponse", messageId) 
\r 
 356                 def useQualifiedHostName = execution.getVariable("URN_mso_use_qualified_host")
\r 
 357                 if ('true'.equals(useQualifiedHostName)) {
\r 
 358                                 notificationUrl = utils.getQualifiedHostNameForCallback(notificationUrl)
\r 
 361                 String vnfAdapterRestRequest = """
\r 
 362                         <deleteVolumeGroupRequest>
\r 
 363                                 <cloudSiteId>${cloudRegion}</cloudSiteId>
\r 
 364                                 <tenantId>${tenantId}</tenantId>
\r 
 365                                 <volumeGroupId>${volumeGroupId}</volumeGroupId>
\r 
 366                                 <volumeGroupStackId>${volumeGroupHeatStackId}</volumeGroupStackId>
\r 
 367                                 <skipAAI>true</skipAAI>
\r 
 369                                 <requestId>${requestId}</requestId>
\r 
 370                                 <serviceInstanceId>${serviceId}</serviceInstanceId>
\r 
 372                             <messageId>${messageId}</messageId>
\r 
 373                             <notificationUrl>${notificationUrl}</notificationUrl>
\r 
 374                         </deleteVolumeGroupRequest>
\r 
 376                 vnfAdapterRestRequest = utils.formatXml(vnfAdapterRestRequest)
\r 
 377                 execution.setVariable('DELVfModVol_deleteVnfARequest', vnfAdapterRestRequest)
\r 
 378                 logDebug('Request for VNFAdapter Rest:\n' + vnfAdapterRestRequest, isDebugLogEnabled)
\r 
 382         public void deleteVolGrpId(Execution execution, isDebugEnabled) {
\r 
 385                 String queryAAIVolGrpIdResponse = execution.getVariable("DELVfModVol_queryAAIVolGrpResponse")
\r 
 386                 String groupId = utils.getNodeText(queryAAIVolGrpIdResponse, "volume-group-id")
\r 
 387                 String resourceVersion = utils.getNodeText(queryAAIVolGrpIdResponse, "resource-version")
\r 
 388                 String messageId = execution.getVariable('DELVfModVol_messageId')
\r 
 389                 String cloudRegion = execution.getVariable('DELVfModVol_aicCloudRegion')
\r 
 391                 AaiUtil aaiUtil = new AaiUtil(this)
\r 
 392                 String aaiEndpoint = aaiUtil.getCloudInfrastructureCloudRegionEndpoint(execution)
\r 
 393                 String deleteAAIVolumeGrpIdRequest = aaiEndpoint + '/' + URLEncoder.encode(cloudRegion, "UTF-8")  + "/volume-groups/volume-group/" +  UriUtils.encode(groupId, "UTF-8")
\r 
 395                 if(resourceVersion !=null){
\r 
 396                         deleteAAIVolumeGrpIdRequest = deleteAAIVolumeGrpIdRequest +'?resource-version=' + UriUtils.encode(resourceVersion, 'UTF-8')
\r 
 399                 utils.logAudit('Delete AAI volume group : ' + deleteAAIVolumeGrpIdRequest)
\r 
 400                 utils.log("DEBUG", "Delete AAI volume group : " + deleteAAIVolumeGrpIdRequest, isDebugEnabled)
\r 
 402                 APIResponse response = aaiUtil.executeAAIDeleteCall(execution, deleteAAIVolumeGrpIdRequest)
\r 
 404                 String returnCode = response.getStatusCode()
\r 
 405                 String aaiResponseAsString = response.getResponseBodyAsString()
\r 
 406                 aaiResponseAsString = StringEscapeUtils.unescapeXml(aaiResponseAsString)
\r 
 408                 utils.logAudit("AAI delete volume group return code: " + returnCode)
\r 
 409                 utils.logAudit("AAI delete volume group response: " + aaiResponseAsString)
\r 
 411                 ExceptionUtil exceptionUtil = new ExceptionUtil()
\r 
 412                 if (returnCode=='200' || (returnCode == '204')) {
\r 
 413                         utils.log("DEBUG", "Volume group $groupId deleted.", isDebugEnabled)
\r 
 415                         if (returnCode=='404') {
\r 
 416                                 exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Volume group $groupId not found for delete in AAI Response code: 404")
\r 
 418                                 WorkflowException aWorkflowException = exceptionUtil.MapAAIExceptionToWorkflowException(aaiResponseAsString, execution)
\r 
 419                                 throw new BpmnError("MSOWorkflowException")
\r 
 425         public void prepareDBRequest (Execution execution, isDebugLogEnabled) {
\r 
 427                 WorkflowException workflowExceptionObj = execution.getVariable("WorkflowException")
\r 
 428                 ExceptionUtil exceptionUtil = new ExceptionUtil();
\r 
 429                 def requestId = execution.getVariable('DELVfModVol_requestId')
\r 
 430                 def volOutputs = execution.getVariable('DELVfModVol_volumeOutputs')
\r 
 431                 def statusMessage = "VolumeGroup successfully deleted"
\r 
 432                 def progress = "100"
\r 
 433                 def requestStatus = "COMPLETE"
\r 
 435                 if (workflowExceptionObj != null) {
\r 
 436                         statusMessage = (workflowExceptionObj.getErrorMessage()).replace("&", "&").replace("<", "<").replace(">", ">")
\r 
 437                         execution.setVariable("DELVfModVol_WorkflowExceptionMessage", statusMessage)
\r 
 438                         execution.setVariable("DELVfModVol_WorkflowExceptionCode", workflowExceptionObj.getErrorCode())
\r 
 439                         requestStatus = "FAILURE"
\r 
 443                 String updateInfraRequest = """
\r 
 444                         <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
\r 
 445                                         xmlns:req="http://org.openecomp.mso/requestsdb">
\r 
 448                                         <req:updateInfraRequest>
\r 
 449                                                 <requestId>${requestId}</requestId>
\r 
 450                                                 <lastModifiedBy>BPMN</lastModifiedBy>
\r 
 451                                                 <statusMessage>${statusMessage}</statusMessage>
\r 
 452                                                 <requestStatus>${requestStatus}</requestStatus>
\r 
 453                                                 <progress>${progress}</progress>
\r 
 454                                                 <vnfOutputs>${volOutputs}</vnfOutputs>
\r 
 455                                         </req:updateInfraRequest>
\r 
 457                         </soapenv:Envelope>
\r 
 460                 updateInfraRequest = utils.formatXml(updateInfraRequest)
\r 
 461                 execution.setVariable('DELVfModVol_updateInfraRequest', updateInfraRequest)
\r 
 462                 logDebug('Request for Update Infra Request:\n' + updateInfraRequest, isDebugLogEnabled)
\r 
 467         public void prepareCompletionHandlerRequest (Execution execution, isDebugLogEnabled) {
\r 
 468                 def requestId = execution.getVariable("mso-request-id")
\r 
 469                 def source = execution.getVariable("DELVfModVol_source")
\r 
 471                 String msoCompletionRequest =
\r 
 472                         """<aetgt:MsoCompletionRequest xmlns:aetgt="http://org.openecomp/mso/workflow/schema/v1"
\r 
 473                                                         xmlns:ns="http://org.openecomp/mso/request/types/v1">
\r 
 474                                         <request-info xmlns="http://org.openecomp/mso/infra/vnf-request/v1">
\r 
 475                                                 <request-id>${requestId}</request-id>
\r 
 476                                                 <action>DELETE</action>
\r 
 477                                                 <source>${source}</source>
\r 
 479                                         <aetgt:status-message>Volume Group has been deleted successfully.</aetgt:status-message>
\r 
 480                                         <aetgt:mso-bpel-name>BPMN VF Module Volume action: DELETE</aetgt:mso-bpel-name>
\r 
 481                                 </aetgt:MsoCompletionRequest>"""
\r 
 483                 String xmlMsoCompletionRequest = utils.formatXml(msoCompletionRequest)
\r 
 484                 execution.setVariable('DELVfModVol_CompleteMsoProcessRequest', xmlMsoCompletionRequest)
\r 
 485                 utils.log("DEBUG", " Overall SUCCESS Response going to CompleteMsoProcess - " + "\n" + xmlMsoCompletionRequest, isDebugLogEnabled)
\r 
 491         public void prepareFalloutHandler (Execution execution, isDebugEnabled) {
\r 
 493                 execution.setVariable("DELVfModVol_Success", false)
\r 
 494                 String requestId = execution.getVariable("DELVfModVol_requestId")
\r 
 495                 String source = execution.getVariable("DELVfModVol_source")
\r 
 497                 WorkflowException workflowExceptionObj = execution.getVariable("WorkflowException")
\r 
 498                 def errorMessage = workflowExceptionObj.getErrorMessage()
\r 
 499                 def errorCode =  workflowExceptionObj.getErrorCode()
\r 
 501                 String falloutHandlerRequest =
\r 
 502                     """<aetgt:FalloutHandlerRequest xmlns:aetgt="http://org.openecomp/mso/workflow/schema/v1"
\r 
 503                                                              xmlns:ns="http://org.openecomp/mso/request/types/v1"
\r 
 504                                                              xmlns:wfsch="http://org.openecomp/mso/workflow/schema/v1">
\r 
 505                                    <request-info xmlns="http://org.openecomp/mso/infra/vnf-request/v1">
\r 
 506                                       <request-id>${requestId}</request-id>
\r 
 507                                       <action>DELETE</action>
\r 
 508                                       <source>${source}</source>
\r 
 510                                         <aetgt:WorkflowException>
\r 
 511                                       <aetgt:ErrorMessage>${errorMessage}</aetgt:ErrorMessage>
\r 
 512                                       <aetgt:ErrorCode>${errorCode}</aetgt:ErrorCode>
\r 
 513                                         </aetgt:WorkflowException>
\r 
 514                                 </aetgt:FalloutHandlerRequest>"""
\r 
 517                 String xmlHandlerRequest = utils.formatXml(falloutHandlerRequest)
\r 
 518                 utils.logAudit(xmlHandlerRequest)
\r 
 520                 execution.setVariable("DELVfModVol_FalloutHandlerRequest", xmlHandlerRequest)
\r 
 521                 utils.log("ERROR", "  Overall Error Response going to FalloutHandler: " + "\n" + xmlHandlerRequest, isDebugEnabled)
\r 
 527          * Create a WorkflowException for the error case where the Tenant Id from
\r 
 528          * AAI did not match the Tenant Id in the incoming request.
\r 
 530          * @param execution The flow's execution instance.
\r 
 532         public void handleTenantIdMismatch(Execution execution, isDebugLogEnabled) {
\r 
 534                 def volumeGroupId = execution.getVariable('DELVfModVol_volumeGroupId')
\r 
 535                 def aicCloudRegion = execution.getVariable('DELVfModVol_aicCloudRegion')
\r 
 536                 def tenantId = execution.getVariable('DELVfModVol_tenantId')
\r 
 537                 def volumeGroupTenantId = execution.getVariable('DELVfModVol_volumeGroupTenantId')
\r 
 539                 def String errorMessage = 'TenantId ' + tenantId + ' in incoming request does not match Tenant Id ' + volumeGroupTenantId +
\r 
 540                         ' retrieved from AAI for Volume Group Id ' + volumeGroupId
\r 
 542                 logError('Error in DeleteVfModuleVolume: ' + errorMessage)
\r 
 544                 ExceptionUtil exceptionUtil = new ExceptionUtil()
\r 
 545                 exceptionUtil.buildWorkflowException(execution, 5000, errorMessage)
\r