Merge "Update .gitreview with onap URL"
[so.git] / bpmn / MSOInfrastructureBPMN / src / main / groovy / org / openecomp / mso / bpmn / infrastructure / scripts / UpdateVfModuleVolumeInfraV1.groovy
index 2f716f5..ffe122a 100644 (file)
-/*-
- * ============LICENSE_START=======================================================
- * OPENECOMP - MSO
- * ================================================================================
- * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
- * ================================================================================
- * 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.openecomp.mso.bpmn.infrastructure.scripts
-
-import groovy.json.JsonSlurper
-
-import java.util.concurrent.ExecutionException;
-
-import org.camunda.bpm.engine.delegate.BpmnError
-import org.camunda.bpm.engine.runtime.Execution
-import org.apache.commons.lang3.*
-import org.springframework.web.util.UriUtils
-import org.openecomp.mso.bpmn.common.scripts.AaiUtil;
-import org.openecomp.mso.bpmn.common.scripts.ExceptionUtil;
-import org.openecomp.mso.bpmn.common.scripts.VfModuleBase;
-import org.openecomp.mso.bpmn.common.scripts.VidUtils;
-import org.openecomp.mso.bpmn.core.WorkflowException
-import org.openecomp.mso.rest.APIResponse
-import org.openecomp.mso.rest.RESTClient
-import org.openecomp.mso.rest.RESTConfig
-
-class UpdateVfModuleVolumeInfraV1 extends VfModuleBase {
-       
-       /**
-        * Initialize the flow's variables.
-        * 
-        * @param execution The flow's execution instance.
-        */
-       private void initProcessVariables(Execution execution) {
-               execution.setVariable('prefix', 'UPDVfModVol_')
-               execution.setVariable('UPDVfModVol_Request', null)
-               execution.setVariable('UPDVfModVol_requestInfo', null)
-               execution.setVariable('UPDVfModVol_requestId', null)
-               execution.setVariable('UPDVfModVol_source', null)
-               execution.setVariable('UPDVfModVol_volumeInputs', null)
-               execution.setVariable('UPDVfModVol_volumeGroupId', null)
-               execution.setVariable('UPDVfModVol_vnfType', null)
-               execution.setVariable('UPDVfModVol_serviceId', null)
-               execution.setVariable('UPDVfModVol_aicCloudRegion', null)
-               execution.setVariable('UPDVfModVol_tenantId', null)
-               execution.setVariable('UPDVfModVol_volumeParams', null)
-               execution.setVariable('UPDVfModVol_volumeGroupHeatStackId', null)
-               execution.setVariable('UPDVfModVol_volumeGroupTenantId', null)
-               execution.setVariable('UpdateVfModuleVolumeSuccessIndicator', false)
-       }
-       
-
-       /**
-        * Perform initial processing, such as request validation, initialization of variables, etc.
-        * * @param execution
-        */
-       public void preProcessRequest (Execution execution) {
-               def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
-               preProcessRequest(execution, isDebugEnabled)
-       }
-       
-       public void preProcessRequest(Execution execution, isDebugLogEnabled) {
-
-               initProcessVariables(execution)
-               String jsonRequest = validateRequest(execution)
-               
-               def request = ""
-               
-               try {
-                       def jsonSlurper = new JsonSlurper()
-                       Map reqMap = jsonSlurper.parseText(jsonRequest)
-                       
-                       def serviceInstanceId = execution.getVariable('serviceInstanceId')
-                       def volumeGroupId = execution.getVariable('volumeGroupId')
-                       //def vnfId = execution.getVariable('vnfId')
-                       
-                       def vidUtils = new VidUtils(this)
-                       request = vidUtils.createXmlVolumeRequest(reqMap, 'UPDATE_VF_MODULE_VOL', serviceInstanceId, volumeGroupId)
-                       
-                       execution.setVariable('UPDVfModVol_Request', request)
-                       execution.setVariable("UPDVfModVol_isVidRequest", true)
-                       
-                       //need to get persona-model-id aka model-invariantId to use later to validate vf-module relation in AAI
-                       
-                       def modelInvariantId = reqMap.requestDetails.modelInfo.modelInvariantId ?: ''
-                       execution.setVariable('UPDVfModVol_modelInvariantId', modelInvariantId)
-               
-                       utils.log("DEBUG", "XML request:\n" + request, isDebugLogEnabled)
-               }
-               catch(groovy.json.JsonException je) {
-                       utils.log("DEBUG", " Request is in XML format.", isDebugLogEnabled)
-                       // assume request is in XML format - proceed as usual to process XML request
-               }
-               
-               def requestId = execution.getVariable('mso-request-id')
-               
-               def requestInfo = getRequiredNodeXml(execution, request, 'request-info')
-               execution.setVariable('UPDVfModVol_requestInfo', requestInfo)
-               execution.setVariable('UPDVfModVol_requestId', requestId)
-               //execution.setVariable('UPDVfModVol_requestId', getRequiredNodeText(execution, requestInfo, 'request-id'))
-               execution.setVariable('UPDVfModVol_source', getNodeTextForce(requestInfo, 'source'))
-               
-               def volumeInputs = getRequiredNodeXml(execution, request, 'volume-inputs')
-               execution.setVariable('UPDVfModVol_volumeInputs', volumeInputs)
-               execution.setVariable('UPDVfModVol_volumeGroupId', getRequiredNodeText(execution, volumeInputs, 'volume-group-id'))
-               execution.setVariable('UPDVfModVol_vnfType', getRequiredNodeText(execution, volumeInputs, 'vnf-type'))
-               execution.setVariable('UPDVfModVol_vnfVersion', getRequiredNodeText(execution, volumeInputs, 'asdc-service-model-version'))
-               execution.setVariable('UPDVfModVol_serviceId', getRequiredNodeText(execution, volumeInputs, 'service-id'))
-               execution.setVariable('UPDVfModVol_aicCloudRegion', getRequiredNodeText(execution, volumeInputs, 'aic-cloud-region'))
-               execution.setVariable('UPDVfModVol_tenantId', getRequiredNodeText(execution, volumeInputs, 'tenant-id'))
-               //execution.setVariable('UPDVfModVol_modelCustomizationId', getRequiredNodeText(execution, volumeInputs, 'model-customization-id'))
-
-               try {
-                       // Catalog DB headers Authorization
-                       String basicAuthValueDB = execution.getVariable("URN_mso_adapters_db_auth")
-                       utils.log("DEBUG", " Obtained BasicAuth userid password for Catalog DB adapter: " + basicAuthValueDB, isDebugLogEnabled)
-                       
-                       def encodedString = utils.getBasicAuth(basicAuthValueDB, execution.getVariable("URN_mso_msoKey"))
-                       execution.setVariable("BasicAuthHeaderValueDB",encodedString)
-               } catch (IOException ex) {
-                       String dataErrorMessage = " Unable to encode Catalog DB user/password string - " + ex.getMessage()
-                       utils.log("DEBUG", dataErrorMessage, isDebugLogEnabled)
-                       exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage)
-               }
-               def volumeParams = utils.getNodeXml(request, 'volume-params')
-               execution.setVariable('UPDVfModVol_volumeParams', volumeParams)
-       }
-
-       /**
-        * Prepare and send the synchronous response.
-        * 
-        * @param execution The flow's execution instance.
-        */
-       public void sendSynchResponse(Execution execution, isDebugLogEnabled) {
-
-               def requestInfo = execution.getVariable('UPDVfModVol_requestInfo')
-               def requestId = execution.getVariable('UPDVfModVol_requestId')
-               def source = execution.getVariable('UPDVfModVol_source')
-               def progress = getNodeTextForce(requestInfo, 'progress')
-               if (progress.isEmpty()) {
-                       progress = '0'
-               }
-               def startTime = getNodeTextForce(requestInfo, 'start-time')
-               if (startTime.isEmpty()) {
-                       startTime = System.currentTimeMillis()
-               }
-               def volumeInputs = execution.getVariable('UPDVfModVol_volumeInputs')
-               
-               String xmlSyncResponse = """
-                       <volume-request xmlns="http://org.openecomp/mso/infra/vnf-request/v1">
-                               <request-info>
-                                       <request-id>${requestId}</request-id>
-                                       <action>UPDATE_VF_MODULE_VOL</action>
-                                       <request-status>IN_PROGRESS</request-status>
-                                       <progress>${progress}</progress>
-                                       <start-time>${startTime}</start-time>
-                                       <source>${source}</source>
-                               </request-info>
-                               ${volumeInputs}
-                       </volume-request>
-               """
-
-               def syncResponse = ''
-               def isVidRequest = execution.getVariable('UPDVfModVol_isVidRequest')
-               
-               if(isVidRequest) {
-                       def volumeGroupId = execution.getVariable('volumeGroupId')
-                       syncResponse = """{"requestReferences":{"instanceId":"${volumeGroupId}","requestId":"${requestId}"}}""".trim()
-               } 
-               else {
-                       syncResponse = utils.formatXml(xmlSyncResponse)
-               }
-               
-               logDebug('Sync response: ' + syncResponse, isDebugLogEnabled)
-               execution.setVariable('UPDVfModVol_syncResponseSent', true)
-               sendWorkflowResponse(execution, 200, syncResponse)
-       }
-       
-       /**
-        * Prepare a Request for querying AAI for Volume Group information using the
-        * Volume Group Id and Aic Cloud Region.
-        * @param execution The flow's execution instance.
-        */
-       public void queryAAIForVolumeGroup(Execution execution, isDebugLogEnabled) {
-
-               def volumeGroupId = execution.getVariable('UPDVfModVol_volumeGroupId')
-               def aicCloudRegion = execution.getVariable('UPDVfModVol_aicCloudRegion')
-
-               AaiUtil aaiUtil = new AaiUtil(this)
-               String aaiEndpoint = aaiUtil.getCloudInfrastructureCloudRegionEndpoint(execution)
-               String queryAAIVolumeGroupRequest = aaiEndpoint + '/' + URLEncoder.encode(aicCloudRegion, "UTF-8") + "/volume-groups/volume-group/" + UriUtils.encode(volumeGroupId, "UTF-8")
-               
-               utils.logAudit('Query AAI volume group by ID: ' + queryAAIVolumeGroupRequest)
-               logDebug('Query AAI volume group by ID: ' + queryAAIVolumeGroupRequest, isDebugLogEnabled)
-               
-               APIResponse response = aaiUtil.executeAAIGetCall(execution, queryAAIVolumeGroupRequest)
-               
-               String returnCode = response.getStatusCode()
-               String aaiResponseAsString = response.getResponseBodyAsString()
-               aaiResponseAsString = StringEscapeUtils.unescapeXml(aaiResponseAsString)
-               
-               utils.logAudit("AAI query volume group by id return code: " + returnCode)
-               utils.logAudit("AAI query volume group by id response: " + aaiResponseAsString)
-               
-               logDebug("AAI Volume Group return code: " + returnCode, isDebugLogEnabled)
-               logDebug("AAI Volume Group response: " + aaiResponseAsString, isDebugLogEnabled)
-               
-               ExceptionUtil exceptionUtil = new ExceptionUtil()
-               
-               if ((returnCode == '200') || (returnCode == '204')) {
-                       
-                       execution.setVariable('UPDVfModVol_aaiVolumeGroupResponse', aaiResponseAsString)
-                       //def heatStackId = getNodeTextForce(aaiResponseAsString, 'heat-stack-id')
-                       //execution.setVariable('UPDVfModVol_volumeGroupHeatStackId', heatStackId)
-                       
-                       def volumeGroupTenantId = getTenantIdFromVolumeGroup(aaiResponseAsString)
-                       if (volumeGroupTenantId == null) {
-                               exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Could not find Tenant Id element in Volume Group with Volume Group Id " + volumeGroupId
-                                       + ", AIC Cloud Region " + aicCloudRegion)
-                       }
-                       execution.setVariable('UPDVfModVol_volumeGroupTenantId', volumeGroupTenantId)
-                       logDebug("Received Tenant Id " + volumeGroupTenantId + " from AAI for Volume Group with Volume Group Id " + volumeGroupId + ", AIC Cloud Region " + aicCloudRegion, isDebugLogEnabled)
-
-                       def relatedVfModuleLink = getRelatedVfModuleRelatedLink(aaiResponseAsString)
-                       logDebug("Related VF Module link: " + relatedVfModuleLink, isDebugLogEnabled)
-                       execution.setVariable('UPDVfModVol_relatedVfModuleLink', relatedVfModuleLink)
-                       
-               } 
-               else if (returnCode == '404') {
-                       exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Volume Group " + volumeGroupId + " not found at AAI")
-               } 
-               else {
-                       WorkflowException aWorkflowException = exceptionUtil.MapAAIExceptionToWorkflowException(aaiResponseAsString, execution)
-                       throw new BpmnError("MSOWorkflowException")
-               }
-       }
-       
-       /**
-        * Query AAI service instance
-        * @param execution
-        * @param isDebugEnabled
-        */
-       public void queryAAIForGenericVnf(Execution execution, isDebugEnabled) {
-               
-               def vnfId = execution.getVariable('vnfId')
-               
-               AaiUtil aaiUtil = new AaiUtil(this)
-               String aaiEndpoint = aaiUtil.getNetworkGenericVnfEndpoint(execution)
-               def String queryAAIRequest = aaiEndpoint + "/" + UriUtils.encode(vnfId, "UTF-8")
-               
-               utils.logAudit("AAI query generic vnf request: " + queryAAIRequest)
-               
-               APIResponse response = aaiUtil.executeAAIGetCall(execution, queryAAIRequest)
-               
-               String returnCode = response.getStatusCode()
-               String aaiResponseAsString = response.getResponseBodyAsString()
-               aaiResponseAsString = StringEscapeUtils.unescapeXml(aaiResponseAsString)
-               
-               utils.logAudit("AAI query generic vnf return code: " + returnCode)
-               utils.logAudit("AAI query generic vnf response: " + aaiResponseAsString)
-
-               ExceptionUtil exceptionUtil = new ExceptionUtil()
-               
-               if (returnCode=='200') {
-                       utils.log("DEBUG", 'Generic vnf ' + vnfId + ' found in AAI.', isDebugEnabled)
-                       execution.setVariable('UPDVfModVol_AAIQueryGenericVfnResponse', aaiResponseAsString)
-               } else {
-                       if (returnCode=='404') {
-                               def message = 'Generic vnf ' + vnfId + ' was not found in AAI. Return code: 404.'
-                               utils.log("DEBUG", message, isDebugEnabled)
-                               exceptionUtil.buildAndThrowWorkflowException(execution, 2500, message)
-                       } else {
-                               WorkflowException aWorkflowException = exceptionUtil.MapAAIExceptionToWorkflowException(aaiResponseAsString, execution)
-                               throw new BpmnError("MSOWorkflowException")
-                       }
-               }
-       }
-       
-       /**
-        * Query AAI for VF Module using vf-module-id
-        * @param execution
-        * @param isDebugLogEnabled
-        */
-       public void queryAAIForVfModule(Execution execution, isDebugLogEnabled) {
-               
-                       AaiUtil aaiUtil = new AaiUtil(this)
-                       String queryAAIVfModuleRequest = execution.getVariable('UPDVfModVol_relatedVfModuleLink')
-                       execution.setVariable('UPDVfModVol_personaModelId', '')
-                       
-                       utils.logAudit('Query AAI VF Module: ' + queryAAIVfModuleRequest)
-                       logDebug('Query AAI VF Module: ' + queryAAIVfModuleRequest, isDebugLogEnabled)
-                       
-                       APIResponse response = aaiUtil.executeAAIGetCall(execution, queryAAIVfModuleRequest)
-                       
-                       String returnCode = response.getStatusCode()
-                       String aaiResponseAsString = response.getResponseBodyAsString()
-                       aaiResponseAsString = StringEscapeUtils.unescapeXml(aaiResponseAsString)
-                       
-                       utils.logAudit("AAI query vf-module: " + returnCode)
-                       utils.logAudit("AAI query vf-module response: " + aaiResponseAsString)
-                       
-                       logDebug("AAI query vf-module:: " + returnCode, isDebugLogEnabled)
-                       logDebug("AAI query vf-module response: " + aaiResponseAsString, isDebugLogEnabled)
-                       
-                       ExceptionUtil exceptionUtil = new ExceptionUtil()
-                       
-                       if ((returnCode == '200') || (returnCode == '204')) {
-                               def personaModelId =  utils.getNodeText1(aaiResponseAsString, 'persona-model-id')
-                               execution.setVariable('UPDVfModVol_personaModelId', personaModelId)
-                       }
-                       else if (returnCode == '404') {
-                               exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "VF Module not found at AAI")
-                       }
-                       else {
-                               WorkflowException aWorkflowException = exceptionUtil.MapAAIExceptionToWorkflowException(aaiResponseAsString, execution)
-                               throw new BpmnError("MSOWorkflowException")
-                       }
-               }
-       /**
-        * 
-        */
-       public String getRelatedVfModuleRelatedLink(xml) {
-               def list = new XmlSlurper().parseText(xml)
-               def vfModuleRelationship = list.'**'.find { node -> node.'related-to'.text() == 'vf-module'     }
-               return vfModuleRelationship?.'related-link'?.text() ?: ''
-       }
-       
-       /**
-        * Prepare a Request for invoking the VnfAdapterRest subflow to do
-        * a Volume Group update.
-        *
-        * @param execution The flow's execution instance.
-        */
-       public void prepVnfAdapterRest(Execution execution, isDebugLogEnabled) {
-               
-               def aicCloudRegion = execution.getVariable('UPDVfModVol_aicCloudRegion')
-               def tenantId = execution.getVariable('UPDVfModVol_tenantId')
-               def volumeGroupId = execution.getVariable('UPDVfModVol_volumeGroupId')
-               
-               def aaiVolumeGroupResponse = execution.getVariable('UPDVfModVol_aaiVolumeGroupResponse')
-               def volumeGroupHeatStackId = getNodeTextForce(aaiVolumeGroupResponse, 'heat-stack-id')
-               def volumeGroupName = getNodeTextForce(aaiVolumeGroupResponse, 'volume-group-name')
-               def modelCustomizationId = getNodeTextForce(aaiVolumeGroupResponse, 'vf-module-persona-model-customization-id')
-               
-               def vnfType = execution.getVariable('UPDVfModVol_vnfType')
-               def vnfVersion = execution.getVariable('UPDVfModVol_vnfVersion')
-               
-               def aaiGenericVnfResponse = execution.getVariable('UPDVfModVol_AAIQueryGenericVfnResponse')
-               def vnfId = utils.getNodeText1(aaiGenericVnfResponse, 'vnf-id')
-               def vnfName = utils.getNodeText1(aaiGenericVnfResponse, 'vnf-name')
-
-               
-               def volumeParamsXml = execution.getVariable('UPDVfModVol_volumeParams')
-               def volumeGroupParams = transformVolumeParamsToEntries(volumeParamsXml)
-               
-               def requestId = execution.getVariable('UPDVfModVol_requestId')
-               def serviceId = execution.getVariable('UPDVfModVol_serviceId')
-               
-               def messageId = execution.getVariable('mso-request-id') + '-' + System.currentTimeMillis()
-               def notificationUrl = createCallbackURL(execution, "VNFAResponse", messageId)
-               def useQualifiedHostName = execution.getVariable("URN_mso_use_qualified_host")
-               if ('true'.equals(useQualifiedHostName)) {
-                               notificationUrl = utils.getQualifiedHostNameForCallback(notificationUrl)
-               }
-
-               String vnfAdapterRestRequest = """
-                       <updateVolumeGroupRequest>
-                               <cloudSiteId>${aicCloudRegion}</cloudSiteId>
-                               <tenantId>${tenantId}</tenantId>
-                               <vnfId>${vnfId}</vnfId>
-                               <vnfName>${vnfName}</vnfName>
-                               <volumeGroupId>${volumeGroupId}</volumeGroupId>
-                               <volumeGroupName>${volumeGroupName}</volumeGroupName>
-                               <volumeGroupStackId>${volumeGroupHeatStackId}</volumeGroupStackId>
-                               <vnfType>${vnfType}</vnfType>
-                               <vnfVersion>${vnfVersion}</vnfVersion>
-                               <vfModuleType></vfModuleType>
-                               <modelCustomizationUuid>${modelCustomizationId}</modelCustomizationUuid>
-                               <volumeGroupParams>
-                                       <entry>
-                                               <key>vnf_id</key>
-                                               <value>${vnfId}</value>
-                                       </entry>
-                                       <entry>
-                                               <key>vnf_name</key>
-                                               <value>${vnfName}</value>
-                                       </entry>
-                                       <entry>
-                                               <key>vf_module_id</key>
-                                               <value>${volumeGroupId}</value>
-                                       </entry>
-                                       <entry>
-                                               <key>vf_module_name</key>
-                                               <value>${volumeGroupName}</value>
-                                       </entry>
-                                       ${volumeGroupParams}
-                           </volumeGroupParams>
-                               <skipAAI>true</skipAAI>
-                           <msoRequest>
-                               <requestId>${requestId}</requestId>
-                               <serviceInstanceId>${serviceId}</serviceInstanceId>
-                           </msoRequest>
-                           <messageId>${messageId}</messageId>
-                           <notificationUrl>${notificationUrl}</notificationUrl>
-                       </updateVolumeGroupRequest>
-               """
-               vnfAdapterRestRequest = utils.formatXml(vnfAdapterRestRequest)
-               execution.setVariable('UPDVfModVol_vnfAdapterRestRequest', vnfAdapterRestRequest)
-               logDebug('Request for VNFAdapter Rest:\n' + vnfAdapterRestRequest, isDebugLogEnabled)
-       }
-       
-       /**
-        * Prepare a Request for updating the DB for this Infra request.
-        *
-        * @param execution The flow's execution instance.
-        */
-       public void prepDbInfraDbRequest(Execution execution, isDebugLogEnabled) {
-
-               def requestId = execution.getVariable('UPDVfModVol_requestId')
-               
-               String updateInfraRequest = """
-                       <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
-                                       xmlns:req="http://org.openecomp.mso/requestsdb">
-                               <soapenv:Header/>
-                               <soapenv:Body>
-                                       <req:updateInfraRequest>
-                                               <requestId>${requestId}</requestId>
-                                               <lastModifiedBy>BPEL</lastModifiedBy>
-                                               <requestStatus>COMPLETE</requestStatus>
-                                               <progress>100</progress>
-                                       </req:updateInfraRequest>
-                               </soapenv:Body>
-                       </soapenv:Envelope>
-               """
-
-               updateInfraRequest = utils.formatXml(updateInfraRequest)
-               execution.setVariable('UPDVfModVol_updateInfraRequest', updateInfraRequest)
-               logDebug('Request for Update Infra Request:\n' + updateInfraRequest, isDebugLogEnabled)
-       }
-       
-       /**
-        * Build a "CompletionHandler" request.
-        * @param execution The flow's execution instance.
-        */
-       public void prepCompletionHandlerRequest(Execution execution, requestId, action, source, isDebugLogEnabled) {
-
-               String content = """
-               <aetgt:MsoCompletionRequest xmlns:aetgt="http://org.openecomp/mso/workflow/schema/v1"
-                                       xmlns:ns="http://org.openecomp/mso/request/types/v1">
-                       <request-info xmlns="http://org.openecomp/mso/infra/vnf-request/v1">
-                               <request-id>${requestId}</request-id>
-                               <action>CREATE</action>
-                               <source>${source}</source>
-                       </request-info>
-                       <aetgt:mso-bpel-name>BPMN VF Module Volume action: UPDATE</aetgt:mso-bpel-name>
-               </aetgt:MsoCompletionRequest>           
-               """
-
-               content = utils.formatXml(content)
-               logDebug('Request for Completion Handler:\n' + content, isDebugLogEnabled)
-               execution.setVariable('UPDVfModVol_CompletionHandlerRequest', content)
-       }
-       
-
-       /**
-        * Build a "FalloutHandler" request.
-        * @param execution The flow's execution instance.
-        */
-       public void prepFalloutHandler(Execution execution, isDebugLogEnabled) {
-               
-               def requestInfo = execution.getVariable('UPDVfModVol_requestInfo')
-               
-               def WorkflowException workflowException = execution.getVariable("WorkflowException")
-               def errorResponseCode = workflowException.getErrorCode()
-               def errorResponseMsg = workflowException.getErrorMessage()
-               def encErrorResponseMsg = ""
-               if (errorResponseMsg != null) {
-                       encErrorResponseMsg = errorResponseMsg.replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;")
-               }
-
-               String content = """
-                       <sdncadapterworkflow:FalloutHandlerRequest xmlns:sdncadapterworkflow="http://org.openecomp/mso/workflow/schema/v1"
-                                       xmlns:reqtype="http://org.openecomp/mso/request/types/v1"
-                                       xmlns:msoservtypes="http://org.openecomp/mso/request/types/v1"
-                                       xmlns:structuredtypes="http://org.openecomp/mso/structured/types/v1">
-                               ${requestInfo}
-                               <sdncadapterworkflow:WorkflowException>
-                                       <sdncadapterworkflow:ErrorMessage>${encErrorResponseMsg}</sdncadapterworkflow:ErrorMessage>
-                                       <sdncadapterworkflow:ErrorCode>${errorResponseCode}</sdncadapterworkflow:ErrorCode>
-                               </sdncadapterworkflow:WorkflowException>        
-                       </sdncadapterworkflow:FalloutHandlerRequest>
-               """
-               content = utils.formatXml(content)
-               logDebug('Request for Fallout Handler:\n' + content, isDebugLogEnabled)
-               execution.setVariable('UPDVfModVol_FalloutHandlerRequest', content)
-       }
-       
-       /**
-        * Create a WorkflowException for the error case where the Tenant Id from
-        * AAI did not match the Tenant Id in the incoming request.
-        * @param execution The flow's execution instance.
-        */
-       public void handleTenantIdMismatch(Execution execution, isDebugLogEnabled) {
-               
-               def volumeGroupId = execution.getVariable('UPDVfModVol_volumeGroupId')
-               def aicCloudRegion = execution.getVariable('UPDVfModVol_aicCloudRegion')
-               def tenantId = execution.getVariable('UPDVfModVol_tenantId')
-               def volumeGroupTenantId = execution.getVariable('UPDVfModVol_volumeGroupTenantId')
-               
-               def String errorMessage = "TenantId " + tenantId + " in incoming request does not match Tenant Id " + volumeGroupTenantId +
-                       " retrieved from AAI for Volume Group Id " + volumeGroupId + ", AIC Cloud Region " + aicCloudRegion 
-               
-               ExceptionUtil exceptionUtil = new ExceptionUtil()
-               logError('Error in UpdateVfModuleVol: ' + errorMessage)
-               exceptionUtil.buildAndThrowWorkflowException(execution, 2500, errorMessage)
-       }
-       
-       /**
-        * Create a WorkflowException for the error case where the Personal Model Id from
-        * AAI did not match the model invariant ID in the incoming request.
-        * @param execution The flow's execution instance.
-        */
-       public void handlePersonaModelIdMismatch(Execution execution, isDebugLogEnabled) {
-               
-               def modelInvariantId = execution.getVariable('UPDVfModVol_modelInvariantId')
-               def personaModelId = execution.getVariable('UPDVfModVol_personaModelId')
-               
-               def String errorMessage = "Model Invariant ID " + modelInvariantId + " in incoming request does not match persona model ID " + personaModelId +
-                       " retrieved from AAI for Volume Group Id "
-               
-               ExceptionUtil exceptionUtil = new ExceptionUtil()
-               logError('Error in UpdateVfModuleVol: ' + errorMessage)
-               exceptionUtil.buildAndThrowWorkflowException(execution, 2500, errorMessage)
-       }
-       
-}
+/*-\r
+ * ============LICENSE_START=======================================================\r
+ * OPENECOMP - MSO\r
+ * ================================================================================\r
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.\r
+ * ================================================================================\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ * \r
+ *      http://www.apache.org/licenses/LICENSE-2.0\r
+ * \r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ * ============LICENSE_END=========================================================\r
+ */\r
+\r
+package org.openecomp.mso.bpmn.infrastructure.scripts\r
+\r
+import groovy.json.JsonSlurper\r
+\r
+import java.util.concurrent.ExecutionException;\r
+\r
+import org.camunda.bpm.engine.delegate.BpmnError\r
+import org.camunda.bpm.engine.runtime.Execution\r
+import org.apache.commons.lang3.*\r
+import org.springframework.web.util.UriUtils\r
+import org.openecomp.mso.bpmn.common.scripts.AaiUtil;\r
+import org.openecomp.mso.bpmn.common.scripts.ExceptionUtil;\r
+import org.openecomp.mso.bpmn.common.scripts.VfModuleBase;\r
+import org.openecomp.mso.bpmn.common.scripts.VidUtils;\r
+import org.openecomp.mso.bpmn.core.WorkflowException\r
+import org.openecomp.mso.rest.APIResponse\r
+import org.openecomp.mso.rest.RESTClient\r
+import org.openecomp.mso.rest.RESTConfig\r
+\r
+class UpdateVfModuleVolumeInfraV1 extends VfModuleBase {\r
+       \r
+       /**\r
+        * Initialize the flow's variables.\r
+        * \r
+        * @param execution The flow's execution instance.\r
+        */\r
+       private void initProcessVariables(Execution execution) {\r
+               execution.setVariable('prefix', 'UPDVfModVol_')\r
+               execution.setVariable('UPDVfModVol_Request', null)\r
+               execution.setVariable('UPDVfModVol_requestInfo', null)\r
+               execution.setVariable('UPDVfModVol_requestId', null)\r
+               execution.setVariable('UPDVfModVol_source', null)\r
+               execution.setVariable('UPDVfModVol_volumeInputs', null)\r
+               execution.setVariable('UPDVfModVol_volumeGroupId', null)\r
+               execution.setVariable('UPDVfModVol_vnfType', null)\r
+               execution.setVariable('UPDVfModVol_serviceId', null)\r
+               execution.setVariable('UPDVfModVol_aicCloudRegion', null)\r
+               execution.setVariable('UPDVfModVol_tenantId', null)\r
+               execution.setVariable('UPDVfModVol_volumeParams', null)\r
+               execution.setVariable('UPDVfModVol_volumeGroupHeatStackId', null)\r
+               execution.setVariable('UPDVfModVol_volumeGroupTenantId', null)\r
+               execution.setVariable('UpdateVfModuleVolumeSuccessIndicator', false)\r
+       }\r
+       \r
+\r
+       /**\r
+        * Perform initial processing, such as request validation, initialization of variables, etc.\r
+        * * @param execution\r
+        */\r
+       public void preProcessRequest (Execution execution) {\r
+               def isDebugEnabled=execution.getVariable("isDebugLogEnabled")\r
+               preProcessRequest(execution, isDebugEnabled)\r
+       }\r
+       \r
+       public void preProcessRequest(Execution execution, isDebugLogEnabled) {\r
+\r
+               initProcessVariables(execution)\r
+               String jsonRequest = validateRequest(execution)\r
+               \r
+               def request = ""\r
+               \r
+               try {\r
+                       def jsonSlurper = new JsonSlurper()\r
+                       Map reqMap = jsonSlurper.parseText(jsonRequest)\r
+                       \r
+                       def serviceInstanceId = execution.getVariable('serviceInstanceId')\r
+                       def volumeGroupId = execution.getVariable('volumeGroupId')\r
+                       //def vnfId = execution.getVariable('vnfId')\r
+                       \r
+                       def vidUtils = new VidUtils(this)\r
+                       request = vidUtils.createXmlVolumeRequest(reqMap, 'UPDATE_VF_MODULE_VOL', serviceInstanceId, volumeGroupId)\r
+                       \r
+                       execution.setVariable('UPDVfModVol_Request', request)\r
+                       execution.setVariable("UPDVfModVol_isVidRequest", true)\r
+                       \r
+                       //need to get persona-model-id aka model-invariantId to use later to validate vf-module relation in AAI\r
+                       \r
+                       def modelInvariantId = reqMap.requestDetails.modelInfo.modelInvariantId ?: ''\r
+                       execution.setVariable('UPDVfModVol_modelInvariantId', modelInvariantId)\r
+               \r
+                       utils.log("DEBUG", "XML request:\n" + request, isDebugLogEnabled)\r
+               }\r
+               catch(groovy.json.JsonException je) {\r
+                       utils.log("DEBUG", " Request is in XML format.", isDebugLogEnabled)\r
+                       // assume request is in XML format - proceed as usual to process XML request\r
+               }\r
+               \r
+               def requestId = execution.getVariable('mso-request-id')\r
+               \r
+               def requestInfo = getRequiredNodeXml(execution, request, 'request-info')\r
+               execution.setVariable('UPDVfModVol_requestInfo', requestInfo)\r
+               execution.setVariable('UPDVfModVol_requestId', requestId)\r
+               //execution.setVariable('UPDVfModVol_requestId', getRequiredNodeText(execution, requestInfo, 'request-id'))\r
+               execution.setVariable('UPDVfModVol_source', getNodeTextForce(requestInfo, 'source'))\r
+               \r
+               def volumeInputs = getRequiredNodeXml(execution, request, 'volume-inputs')\r
+               execution.setVariable('UPDVfModVol_volumeInputs', volumeInputs)\r
+               execution.setVariable('UPDVfModVol_volumeGroupId', getRequiredNodeText(execution, volumeInputs, 'volume-group-id'))\r
+               execution.setVariable('UPDVfModVol_vnfType', getRequiredNodeText(execution, volumeInputs, 'vnf-type'))\r
+               execution.setVariable('UPDVfModVol_vnfVersion', getRequiredNodeText(execution, volumeInputs, 'asdc-service-model-version'))\r
+               execution.setVariable('UPDVfModVol_serviceId', utils.getNodeText1(volumeInputs, 'service-id'))\r
+               execution.setVariable('UPDVfModVol_aicCloudRegion', getRequiredNodeText(execution, volumeInputs, 'aic-cloud-region'))\r
+               execution.setVariable('UPDVfModVol_tenantId', getRequiredNodeText(execution, volumeInputs, 'tenant-id'))\r
+               //execution.setVariable('UPDVfModVol_modelCustomizationId', getRequiredNodeText(execution, volumeInputs, 'model-customization-id'))\r
+\r
+               try {\r
+                       // Catalog DB headers Authorization\r
+                       String basicAuthValueDB = execution.getVariable("URN_mso_adapters_db_auth")\r
+                       utils.log("DEBUG", " Obtained BasicAuth userid password for Catalog DB adapter: " + basicAuthValueDB, isDebugLogEnabled)\r
+                       \r
+                       def encodedString = utils.getBasicAuth(basicAuthValueDB, execution.getVariable("URN_mso_msoKey"))\r
+                       execution.setVariable("BasicAuthHeaderValueDB",encodedString)\r
+               } catch (IOException ex) {\r
+                       String dataErrorMessage = " Unable to encode Catalog DB user/password string - " + ex.getMessage()\r
+                       utils.log("DEBUG", dataErrorMessage, isDebugLogEnabled)\r
+                       exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage)\r
+               }\r
+               def volumeParams = utils.getNodeXml(request, 'volume-params')\r
+               execution.setVariable('UPDVfModVol_volumeParams', volumeParams)\r
+       }\r
+\r
+       /**\r
+        * Prepare and send the synchronous response.\r
+        * \r
+        * @param execution The flow's execution instance.\r
+        */\r
+       public void sendSynchResponse(Execution execution, isDebugLogEnabled) {\r
+\r
+               def requestInfo = execution.getVariable('UPDVfModVol_requestInfo')\r
+               def requestId = execution.getVariable('UPDVfModVol_requestId')\r
+               def source = execution.getVariable('UPDVfModVol_source')\r
+               def progress = getNodeTextForce(requestInfo, 'progress')\r
+               if (progress.isEmpty()) {\r
+                       progress = '0'\r
+               }\r
+               def startTime = getNodeTextForce(requestInfo, 'start-time')\r
+               if (startTime.isEmpty()) {\r
+                       startTime = System.currentTimeMillis()\r
+               }\r
+               def volumeInputs = execution.getVariable('UPDVfModVol_volumeInputs')\r
+               \r
+               String xmlSyncResponse = """\r
+                       <volume-request xmlns="http://org.openecomp/mso/infra/vnf-request/v1">\r
+                               <request-info>\r
+                                       <request-id>${requestId}</request-id>\r
+                                       <action>UPDATE_VF_MODULE_VOL</action>\r
+                                       <request-status>IN_PROGRESS</request-status>\r
+                                       <progress>${progress}</progress>\r
+                                       <start-time>${startTime}</start-time>\r
+                                       <source>${source}</source>\r
+                               </request-info>\r
+                               ${volumeInputs}\r
+                       </volume-request>\r
+               """\r
+\r
+               def syncResponse = ''\r
+               def isVidRequest = execution.getVariable('UPDVfModVol_isVidRequest')\r
+               \r
+               if(isVidRequest) {\r
+                       def volumeGroupId = execution.getVariable('volumeGroupId')\r
+                       syncResponse = """{"requestReferences":{"instanceId":"${volumeGroupId}","requestId":"${requestId}"}}""".trim()\r
+               } \r
+               else {\r
+                       syncResponse = utils.formatXml(xmlSyncResponse)\r
+               }\r
+               \r
+               logDebug('Sync response: ' + syncResponse, isDebugLogEnabled)\r
+               execution.setVariable('UPDVfModVol_syncResponseSent', true)\r
+               sendWorkflowResponse(execution, 200, syncResponse)\r
+       }\r
+       \r
+       /**\r
+        * Prepare a Request for querying AAI for Volume Group information using the\r
+        * Volume Group Id and Aic Cloud Region.\r
+        * @param execution The flow's execution instance.\r
+        */\r
+       public void queryAAIForVolumeGroup(Execution execution, isDebugLogEnabled) {\r
+\r
+               def volumeGroupId = execution.getVariable('UPDVfModVol_volumeGroupId')\r
+               def aicCloudRegion = execution.getVariable('UPDVfModVol_aicCloudRegion')\r
+\r
+               AaiUtil aaiUtil = new AaiUtil(this)\r
+               String aaiEndpoint = aaiUtil.getCloudInfrastructureCloudRegionEndpoint(execution)\r
+               String queryAAIVolumeGroupRequest = aaiEndpoint + '/' + URLEncoder.encode(aicCloudRegion, "UTF-8") + "/volume-groups/volume-group/" + UriUtils.encode(volumeGroupId, "UTF-8")\r
+               \r
+               utils.logAudit('Query AAI volume group by ID: ' + queryAAIVolumeGroupRequest)\r
+               logDebug('Query AAI volume group by ID: ' + queryAAIVolumeGroupRequest, isDebugLogEnabled)\r
+               \r
+               APIResponse response = aaiUtil.executeAAIGetCall(execution, queryAAIVolumeGroupRequest)\r
+               \r
+               String returnCode = response.getStatusCode()\r
+               String aaiResponseAsString = response.getResponseBodyAsString()\r
+               aaiResponseAsString = StringEscapeUtils.unescapeXml(aaiResponseAsString)\r
+               \r
+               utils.logAudit("AAI query volume group by id return code: " + returnCode)\r
+               utils.logAudit("AAI query volume group by id response: " + aaiResponseAsString)\r
+               \r
+               logDebug("AAI Volume Group return code: " + returnCode, isDebugLogEnabled)\r
+               logDebug("AAI Volume Group response: " + aaiResponseAsString, isDebugLogEnabled)\r
+               \r
+               ExceptionUtil exceptionUtil = new ExceptionUtil()\r
+               \r
+               if ((returnCode == '200') || (returnCode == '204')) {\r
+                       \r
+                       execution.setVariable('UPDVfModVol_aaiVolumeGroupResponse', aaiResponseAsString)\r
+                       //def heatStackId = getNodeTextForce(aaiResponseAsString, 'heat-stack-id')\r
+                       //execution.setVariable('UPDVfModVol_volumeGroupHeatStackId', heatStackId)\r
+                       \r
+                       def volumeGroupTenantId = getTenantIdFromVolumeGroup(aaiResponseAsString)\r
+                       if (volumeGroupTenantId == null) {\r
+                               exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Could not find Tenant Id element in Volume Group with Volume Group Id " + volumeGroupId\r
+                                       + ", AIC Cloud Region " + aicCloudRegion)\r
+                       }\r
+                       execution.setVariable('UPDVfModVol_volumeGroupTenantId', volumeGroupTenantId)\r
+                       logDebug("Received Tenant Id " + volumeGroupTenantId + " from AAI for Volume Group with Volume Group Id " + volumeGroupId + ", AIC Cloud Region " + aicCloudRegion, isDebugLogEnabled)\r
+\r
+                       def relatedVfModuleLink = getRelatedVfModuleRelatedLink(aaiResponseAsString)\r
+                       logDebug("Related VF Module link: " + relatedVfModuleLink, isDebugLogEnabled)\r
+                       execution.setVariable('UPDVfModVol_relatedVfModuleLink', relatedVfModuleLink)\r
+                       \r
+               } \r
+               else if (returnCode == '404') {\r
+                       exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Volume Group " + volumeGroupId + " not found at AAI")\r
+               } \r
+               else {\r
+                       WorkflowException aWorkflowException = exceptionUtil.MapAAIExceptionToWorkflowException(aaiResponseAsString, execution)\r
+                       throw new BpmnError("MSOWorkflowException")\r
+               }\r
+       }\r
+       \r
+       /**\r
+        * Query AAI service instance\r
+        * @param execution\r
+        * @param isDebugEnabled\r
+        */\r
+       public void queryAAIForGenericVnf(Execution execution, isDebugEnabled) {\r
+               \r
+               def vnfId = execution.getVariable('vnfId')\r
+               \r
+               AaiUtil aaiUtil = new AaiUtil(this)\r
+               String aaiEndpoint = aaiUtil.getNetworkGenericVnfEndpoint(execution)\r
+               def String queryAAIRequest = aaiEndpoint + "/" + UriUtils.encode(vnfId, "UTF-8")\r
+               \r
+               utils.logAudit("AAI query generic vnf request: " + queryAAIRequest)\r
+               \r
+               APIResponse response = aaiUtil.executeAAIGetCall(execution, queryAAIRequest)\r
+               \r
+               String returnCode = response.getStatusCode()\r
+               String aaiResponseAsString = response.getResponseBodyAsString()\r
+               aaiResponseAsString = StringEscapeUtils.unescapeXml(aaiResponseAsString)\r
+               \r
+               utils.logAudit("AAI query generic vnf return code: " + returnCode)\r
+               utils.logAudit("AAI query generic vnf response: " + aaiResponseAsString)\r
+\r
+               ExceptionUtil exceptionUtil = new ExceptionUtil()\r
+               \r
+               if (returnCode=='200') {\r
+                       utils.log("DEBUG", 'Generic vnf ' + vnfId + ' found in AAI.', isDebugEnabled)\r
+                       execution.setVariable('UPDVfModVol_AAIQueryGenericVfnResponse', aaiResponseAsString)\r
+               } else {\r
+                       if (returnCode=='404') {\r
+                               def message = 'Generic vnf ' + vnfId + ' was not found in AAI. Return code: 404.'\r
+                               utils.log("DEBUG", message, isDebugEnabled)\r
+                               exceptionUtil.buildAndThrowWorkflowException(execution, 2500, message)\r
+                       } else {\r
+                               WorkflowException aWorkflowException = exceptionUtil.MapAAIExceptionToWorkflowException(aaiResponseAsString, execution)\r
+                               throw new BpmnError("MSOWorkflowException")\r
+                       }\r
+               }\r
+       }\r
+       \r
+       /**\r
+        * Query AAI for VF Module using vf-module-id\r
+        * @param execution\r
+        * @param isDebugLogEnabled\r
+        */\r
+       public void queryAAIForVfModule(Execution execution, isDebugLogEnabled) {\r
+               \r
+                       AaiUtil aaiUtil = new AaiUtil(this)\r
+                       String queryAAIVfModuleRequest = execution.getVariable('UPDVfModVol_relatedVfModuleLink')\r
+                       execution.setVariable('UPDVfModVol_personaModelId', '')\r
+                       \r
+                       utils.logAudit('Query AAI VF Module: ' + queryAAIVfModuleRequest)\r
+                       logDebug('Query AAI VF Module: ' + queryAAIVfModuleRequest, isDebugLogEnabled)\r
+                       \r
+                       APIResponse response = aaiUtil.executeAAIGetCall(execution, queryAAIVfModuleRequest)\r
+                       \r
+                       String returnCode = response.getStatusCode()\r
+                       String aaiResponseAsString = response.getResponseBodyAsString()\r
+                       aaiResponseAsString = StringEscapeUtils.unescapeXml(aaiResponseAsString)\r
+                       \r
+                       utils.logAudit("AAI query vf-module: " + returnCode)\r
+                       utils.logAudit("AAI query vf-module response: " + aaiResponseAsString)\r
+                       \r
+                       logDebug("AAI query vf-module:: " + returnCode, isDebugLogEnabled)\r
+                       logDebug("AAI query vf-module response: " + aaiResponseAsString, isDebugLogEnabled)\r
+                       \r
+                       ExceptionUtil exceptionUtil = new ExceptionUtil()\r
+                       \r
+                       if ((returnCode == '200') || (returnCode == '204')) {\r
+                               def personaModelId =  utils.getNodeText1(aaiResponseAsString, 'persona-model-id')\r
+                               execution.setVariable('UPDVfModVol_personaModelId', personaModelId)\r
+                       }\r
+                       else if (returnCode == '404') {\r
+                               exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "VF Module not found at AAI")\r
+                       }\r
+                       else {\r
+                               WorkflowException aWorkflowException = exceptionUtil.MapAAIExceptionToWorkflowException(aaiResponseAsString, execution)\r
+                               throw new BpmnError("MSOWorkflowException")\r
+                       }\r
+               }\r
+       /**\r
+        * \r
+        */\r
+       public String getRelatedVfModuleRelatedLink(xml) {\r
+               def list = new XmlSlurper().parseText(xml)\r
+               def vfModuleRelationship = list.'**'.find { node -> node.'related-to'.text() == 'vf-module'     }\r
+               return vfModuleRelationship?.'related-link'?.text() ?: ''\r
+       }\r
+       \r
+       /**\r
+        * Prepare a Request for invoking the VnfAdapterRest subflow to do\r
+        * a Volume Group update.\r
+        *\r
+        * @param execution The flow's execution instance.\r
+        */\r
+       public void prepVnfAdapterRest(Execution execution, isDebugLogEnabled) {\r
+               \r
+               def aicCloudRegion = execution.getVariable('UPDVfModVol_aicCloudRegion')\r
+               def tenantId = execution.getVariable('UPDVfModVol_tenantId')\r
+               def volumeGroupId = execution.getVariable('UPDVfModVol_volumeGroupId')\r
+               \r
+               def aaiVolumeGroupResponse = execution.getVariable('UPDVfModVol_aaiVolumeGroupResponse')\r
+               def volumeGroupHeatStackId = getNodeTextForce(aaiVolumeGroupResponse, 'heat-stack-id')\r
+               def volumeGroupName = getNodeTextForce(aaiVolumeGroupResponse, 'volume-group-name')\r
+               def modelCustomizationId = getNodeTextForce(aaiVolumeGroupResponse, 'vf-module-persona-model-customization-id')\r
+               \r
+               def vnfType = execution.getVariable('UPDVfModVol_vnfType')\r
+               def vnfVersion = execution.getVariable('UPDVfModVol_vnfVersion')\r
+               \r
+               def aaiGenericVnfResponse = execution.getVariable('UPDVfModVol_AAIQueryGenericVfnResponse')\r
+               def vnfId = utils.getNodeText1(aaiGenericVnfResponse, 'vnf-id')\r
+               def vnfName = utils.getNodeText1(aaiGenericVnfResponse, 'vnf-name')\r
+\r
+               \r
+               def volumeParamsXml = execution.getVariable('UPDVfModVol_volumeParams')\r
+               def volumeGroupParams = transformVolumeParamsToEntries(volumeParamsXml)\r
+               \r
+               def requestId = execution.getVariable('UPDVfModVol_requestId')\r
+               def serviceId = execution.getVariable('UPDVfModVol_serviceId')\r
+               \r
+               def messageId = execution.getVariable('mso-request-id') + '-' + System.currentTimeMillis()\r
+               def notificationUrl = createCallbackURL(execution, "VNFAResponse", messageId)\r
+               def useQualifiedHostName = execution.getVariable("URN_mso_use_qualified_host")\r
+               if ('true'.equals(useQualifiedHostName)) {\r
+                               notificationUrl = utils.getQualifiedHostNameForCallback(notificationUrl)\r
+               }\r
+\r
+               String vnfAdapterRestRequest = """\r
+                       <updateVolumeGroupRequest>\r
+                               <cloudSiteId>${aicCloudRegion}</cloudSiteId>\r
+                               <tenantId>${tenantId}</tenantId>\r
+                               <vnfId>${vnfId}</vnfId>\r
+                               <vnfName>${vnfName}</vnfName>\r
+                               <volumeGroupId>${volumeGroupId}</volumeGroupId>\r
+                               <volumeGroupName>${volumeGroupName}</volumeGroupName>\r
+                               <volumeGroupStackId>${volumeGroupHeatStackId}</volumeGroupStackId>\r
+                               <vnfType>${vnfType}</vnfType>\r
+                               <vnfVersion>${vnfVersion}</vnfVersion>\r
+                               <vfModuleType></vfModuleType>\r
+                               <modelCustomizationUuid>${modelCustomizationId}</modelCustomizationUuid>\r
+                               <volumeGroupParams>\r
+                                       <entry>\r
+                                               <key>vnf_id</key>\r
+                                               <value>${vnfId}</value>\r
+                                       </entry>\r
+                                       <entry>\r
+                                               <key>vnf_name</key>\r
+                                               <value>${vnfName}</value>\r
+                                       </entry>\r
+                                       <entry>\r
+                                               <key>vf_module_id</key>\r
+                                               <value>${volumeGroupId}</value>\r
+                                       </entry>\r
+                                       <entry>\r
+                                               <key>vf_module_name</key>\r
+                                               <value>${volumeGroupName}</value>\r
+                                       </entry>\r
+                                       ${volumeGroupParams}\r
+                           </volumeGroupParams>\r
+                               <skipAAI>true</skipAAI>\r
+                           <msoRequest>\r
+                               <requestId>${requestId}</requestId>\r
+                               <serviceInstanceId>${serviceId}</serviceInstanceId>\r
+                           </msoRequest>\r
+                           <messageId>${messageId}</messageId>\r
+                           <notificationUrl>${notificationUrl}</notificationUrl>\r
+                       </updateVolumeGroupRequest>\r
+               """\r
+               vnfAdapterRestRequest = utils.formatXml(vnfAdapterRestRequest)\r
+               execution.setVariable('UPDVfModVol_vnfAdapterRestRequest', vnfAdapterRestRequest)\r
+               logDebug('Request for VNFAdapter Rest:\n' + vnfAdapterRestRequest, isDebugLogEnabled)\r
+       }\r
+       \r
+       /**\r
+        * Prepare a Request for updating the DB for this Infra request.\r
+        *\r
+        * @param execution The flow's execution instance.\r
+        */\r
+       public void prepDbInfraDbRequest(Execution execution, isDebugLogEnabled) {\r
+\r
+               def requestId = execution.getVariable('UPDVfModVol_requestId')\r
+               \r
+               String updateInfraRequest = """\r
+                       <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"\r
+                                       xmlns:req="http://org.openecomp.mso/requestsdb">\r
+                               <soapenv:Header/>\r
+                               <soapenv:Body>\r
+                                       <req:updateInfraRequest>\r
+                                               <requestId>${requestId}</requestId>\r
+                                               <lastModifiedBy>BPEL</lastModifiedBy>\r
+                                               <requestStatus>COMPLETE</requestStatus>\r
+                                               <progress>100</progress>\r
+                                       </req:updateInfraRequest>\r
+                               </soapenv:Body>\r
+                       </soapenv:Envelope>\r
+               """\r
+\r
+               updateInfraRequest = utils.formatXml(updateInfraRequest)\r
+               execution.setVariable('UPDVfModVol_updateInfraRequest', updateInfraRequest)\r
+               logDebug('Request for Update Infra Request:\n' + updateInfraRequest, isDebugLogEnabled)\r
+       }\r
+       \r
+       /**\r
+        * Build a "CompletionHandler" request.\r
+        * @param execution The flow's execution instance.\r
+        */\r
+       public void prepCompletionHandlerRequest(Execution execution, requestId, action, source, isDebugLogEnabled) {\r
+\r
+               String content = """\r
+               <aetgt:MsoCompletionRequest xmlns:aetgt="http://org.openecomp/mso/workflow/schema/v1"\r
+                                       xmlns:ns="http://org.openecomp/mso/request/types/v1">\r
+                       <request-info xmlns="http://org.openecomp/mso/infra/vnf-request/v1">\r
+                               <request-id>${requestId}</request-id>\r
+                               <action>CREATE</action>\r
+                               <source>${source}</source>\r
+                       </request-info>\r
+                       <aetgt:mso-bpel-name>BPMN VF Module Volume action: UPDATE</aetgt:mso-bpel-name>\r
+               </aetgt:MsoCompletionRequest>           \r
+               """\r
+\r
+               content = utils.formatXml(content)\r
+               logDebug('Request for Completion Handler:\n' + content, isDebugLogEnabled)\r
+               execution.setVariable('UPDVfModVol_CompletionHandlerRequest', content)\r
+       }\r
+       \r
+\r
+       /**\r
+        * Build a "FalloutHandler" request.\r
+        * @param execution The flow's execution instance.\r
+        */\r
+       public void prepFalloutHandler(Execution execution, isDebugLogEnabled) {\r
+               \r
+               def requestInfo = execution.getVariable('UPDVfModVol_requestInfo')\r
+               \r
+               def WorkflowException workflowException = execution.getVariable("WorkflowException")\r
+               def errorResponseCode = workflowException.getErrorCode()\r
+               def errorResponseMsg = workflowException.getErrorMessage()\r
+               def encErrorResponseMsg = ""\r
+               if (errorResponseMsg != null) {\r
+                       encErrorResponseMsg = errorResponseMsg.replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;")\r
+               }\r
+\r
+               String content = """\r
+                       <sdncadapterworkflow:FalloutHandlerRequest xmlns:sdncadapterworkflow="http://org.openecomp/mso/workflow/schema/v1"\r
+                                       xmlns:reqtype="http://org.openecomp/mso/request/types/v1"\r
+                                       xmlns:msoservtypes="http://org.openecomp/mso/request/types/v1"\r
+                                       xmlns:structuredtypes="http://org.openecomp/mso/structured/types/v1">\r
+                               ${requestInfo}\r
+                               <sdncadapterworkflow:WorkflowException>\r
+                                       <sdncadapterworkflow:ErrorMessage>${encErrorResponseMsg}</sdncadapterworkflow:ErrorMessage>\r
+                                       <sdncadapterworkflow:ErrorCode>${errorResponseCode}</sdncadapterworkflow:ErrorCode>\r
+                               </sdncadapterworkflow:WorkflowException>        \r
+                       </sdncadapterworkflow:FalloutHandlerRequest>\r
+               """\r
+               content = utils.formatXml(content)\r
+               logDebug('Request for Fallout Handler:\n' + content, isDebugLogEnabled)\r
+               execution.setVariable('UPDVfModVol_FalloutHandlerRequest', content)\r
+       }\r
+       \r
+       /**\r
+        * Create a WorkflowException for the error case where the Tenant Id from\r
+        * AAI did not match the Tenant Id in the incoming request.\r
+        * @param execution The flow's execution instance.\r
+        */\r
+       public void handleTenantIdMismatch(Execution execution, isDebugLogEnabled) {\r
+               \r
+               def volumeGroupId = execution.getVariable('UPDVfModVol_volumeGroupId')\r
+               def aicCloudRegion = execution.getVariable('UPDVfModVol_aicCloudRegion')\r
+               def tenantId = execution.getVariable('UPDVfModVol_tenantId')\r
+               def volumeGroupTenantId = execution.getVariable('UPDVfModVol_volumeGroupTenantId')\r
+               \r
+               def String errorMessage = "TenantId " + tenantId + " in incoming request does not match Tenant Id " + volumeGroupTenantId +\r
+                       " retrieved from AAI for Volume Group Id " + volumeGroupId + ", AIC Cloud Region " + aicCloudRegion \r
+               \r
+               ExceptionUtil exceptionUtil = new ExceptionUtil()\r
+               logError('Error in UpdateVfModuleVol: ' + errorMessage)\r
+               exceptionUtil.buildAndThrowWorkflowException(execution, 2500, errorMessage)\r
+       }\r
+       \r
+       /**\r
+        * Create a WorkflowException for the error case where the Personal Model Id from\r
+        * AAI did not match the model invariant ID in the incoming request.\r
+        * @param execution The flow's execution instance.\r
+        */\r
+       public void handlePersonaModelIdMismatch(Execution execution, isDebugLogEnabled) {\r
+               \r
+               def modelInvariantId = execution.getVariable('UPDVfModVol_modelInvariantId')\r
+               def personaModelId = execution.getVariable('UPDVfModVol_personaModelId')\r
+               \r
+               def String errorMessage = "Model Invariant ID " + modelInvariantId + " in incoming request does not match persona model ID " + personaModelId +\r
+                       " retrieved from AAI for Volume Group Id "\r
+               \r
+               ExceptionUtil exceptionUtil = new ExceptionUtil()\r
+               logError('Error in UpdateVfModuleVol: ' + errorMessage)\r
+               exceptionUtil.buildAndThrowWorkflowException(execution, 2500, errorMessage)\r
+       }\r
+       \r
+}\r