1710 Rebase - Second Attempt
[so.git] / bpmn / MSOInfrastructureBPMN / src / main / groovy / org / openecomp / mso / bpmn / infrastructure / scripts / DoCreateVfModuleVolumeV2.groovy
-/*-
- * ============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 static org.camunda.spin.Spin.XML
-
-import org.apache.commons.lang3.*
-import org.camunda.bpm.engine.delegate.BpmnError
-import org.camunda.bpm.engine.runtime.Execution
-import org.openecomp.mso.bpmn.common.scripts.AaiUtil
-import org.openecomp.mso.bpmn.common.scripts.ExceptionUtil
-import org.openecomp.mso.bpmn.common.scripts.NetworkUtils
-import org.openecomp.mso.bpmn.common.scripts.VfModuleBase
-import org.openecomp.mso.bpmn.core.WorkflowException
-import org.openecomp.mso.rest.APIResponse
-import org.springframework.web.util.UriUtils
-
-class DoCreateVfModuleVolumeV1 extends VfModuleBase {
-       
-       String prefix='DCVFMODVOLV1_'
-       
-       
-       /**
-        * 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)
-       }
-       
-       /**
-        * Perform initial processing, such as request validation, initialization of variables, etc.
-        * @param execution
-        * @param isDebugEnabled
-        */
-       public void preProcessRequest (Execution execution, isDebugEnabled) {
-
-               execution.setVariable("prefix",prefix)
-               execution.setVariable(prefix+'SuccessIndicator', false)
-               
-       
-               // INPUT: DoCreateVfModuleVolumeV1Request, mso-request-id, volume-group-id, vnf-id, is-vid-request
-               // OUTPUT: DCVFMODVOLV1_SuccessIndicator. WorkflowException
-               
-               def volumeRequest  = getVariable(execution, 'DoCreateVfModuleVolumeV1Request')
-               if (volumeRequest != null) {
-                       execution.setVariable(prefix+'Request', volumeRequest)
-               } else {        
-                       volumeRequest  = getVariable(execution, prefix+'Request')
-                       if (volumeRequest == null) {
-                               (new ExceptionUtil()).buildAndThrowWorkflowException(execution, 2500, 'DoCreateVfModuleVolumeV1 received null request.')
-                       }
-               }
-               
-               def vnfId = execution.getVariable('vnf-id')
-               if (vnfId == null) {
-                       (new ExceptionUtil()).buildAndThrowWorkflowException(execution, 2500, 'DoCreateVfModuleVolumeV1 received null vnf-id.')
-               }
-               
-               def volumeGroupId = execution.getVariable('volume-group-id')
-               if (volumeGroupId == null) {
-                       (new ExceptionUtil()).buildAndThrowWorkflowException(execution, 2500, 'DoCreateVfModuleVolumeV1 received null volume-group-id.')
-               }
-               
-               def requestId = execution.getVariable("mso-request-id")
-               if (requestId == null || requestId == "") {
-                       requestId = utils.getNodeText1(volumeRequest, "request-id")
-               }
-
-               //def serviceId = execution.getVariable("mso-service-instance-id")
-               //if (serviceId == null || serviceId == "") {
-               def     serviceId = utils.getNodeText1(volumeRequest, "service-id")
-               //}
-               
-               def source = utils.getNodeText1(volumeRequest, "source")
-               
-               execution.setVariable(prefix+'requestId', requestId)
-               execution.setVariable(prefix+'serviceId', serviceId)
-               execution.setVariable(prefix+'source', source)
-               
-               // @TODO: for better tracking of logs, should we strip all new lines in the log message?
-               utils.logAudit('Incoming request: ' + volumeRequest)
-
-               // Rollback settings
-               NetworkUtils networkUtils = new NetworkUtils()
-               def rollbackEnabled = networkUtils.isRollbackEnabled(execution,volumeRequest)
-               execution.setVariable(prefix+"rollbackEnabled", rollbackEnabled)
-               utils.log("DEBUG", 'rollbackEnabled: ' + rollbackEnabled, isDebugEnabled)
-               
-       }
-       
-
-       /**
-        * Get cloud region
-        * @param execution
-        * @param isDebugEnabled
-        */
-       public void callRESTQueryAAICloudRegion (Execution execution, isDebugEnabled) {
-               
-               def request = execution.getVariable(prefix+'Request')
-               def cloudRegion = utils.getNodeText1(request, "aic-cloud-region")
-               utils.log("DEBUG", 'Request cloud region is: ' + cloudRegion, isDebugEnabled)
-
-               AaiUtil aaiUtil = new AaiUtil(this)
-               String aaiEndpoint = aaiUtil.getCloudInfrastructureCloudRegionEndpoint(execution)
-               String queryCloudRegionRequest = aaiEndpoint + '/' + cloudRegion
-               
-               utils.logAudit(queryCloudRegionRequest)
-
-               cloudRegion = aaiUtil.getAAICloudReqion(execution,  queryCloudRegionRequest, "PO", cloudRegion)
-
-               if ((cloudRegion != "ERROR")) {
-                       if(execution.getVariable(prefix+"queryCloudRegionReturnCode") == "404"){
-                               cloudRegion = "AAIAIC25"
-                       }
-                       execution.setVariable(prefix+"aicCloudRegion", cloudRegion)
-                       utils.log("DEBUG", "AIC Cloud Region: " + cloudRegion, isDebugEnabled)
-               } else {
-                       String errorMessage = "AAI Query Cloud Region Unsuccessful. Return Code: " + execution.getVariable(prefix+"queryCloudRegionReturnCode")
-                       utils.log("DEBUG", errorMessage, isDebugEnabled)
-                       (new ExceptionUtil()).buildAndThrowWorkflowException(execution, 2500, errorMessage)
-               }
-       }
-       
-
-       /**
-        * Query AAI volume group by name
-        * @param execution
-        * @param isDebugEnabled
-        */
-       public void callRESTQueryAAIVolGrpName(Execution execution, isDebugEnabled) {
-
-               def volumeRequest = execution.getVariable(prefix+'Request')
-               def volumeGroupName = utils.getNodeText(volumeRequest, "volume-group-name")
-               def cloudRegion = execution.getVariable(prefix+"aicCloudRegion")
-               
-               // Save volume group name
-               execution.setVariable(prefix+'volumeGroupName', volumeGroupName)
-               
-               // This is for stub testing
-               def testVolumeGroupName = execution.getVariable('test-volume-group-name')
-               if (testVolumeGroupName != null && testVolumeGroupName.length() > 0) {
-                       volumeGroupName = testVolumeGroupName
-                       //reset to null
-                       execution.setVariable('test-volume-group-name', null)
-               }
-               
-               AaiUtil aaiUtil = new AaiUtil(this)
-               String aaiEndpoint = aaiUtil.getCloudInfrastructureCloudRegionEndpoint(execution)
-               String queryAAIVolumeNameRequest = aaiEndpoint + '/' + cloudRegion + "/volume-groups" + "?volume-group-name=" + UriUtils.encode(volumeGroupName, 'UTF-8')
-
-               utils.logAudit('Query AAI volume group by name: ' + queryAAIVolumeNameRequest)
-               
-               APIResponse response = aaiUtil.executeAAIGetCall(execution, queryAAIVolumeNameRequest)
-               
-               String returnCode = response.getStatusCode()
-               String aaiResponseAsString = response.getResponseBodyAsString()
-               aaiResponseAsString = StringEscapeUtils.unescapeXml(aaiResponseAsString)
-               
-               utils.logAudit("AAI query volume group by name return code: " + returnCode)
-               utils.logAudit("AAI query volume group by name response: " + aaiResponseAsString)
-
-               ExceptionUtil exceptionUtil = new ExceptionUtil()
-
-               execution.setVariable(prefix+"queryAAIVolGrpNameResponse", aaiResponseAsString)
-               execution.setVariable(prefix+'AaiReturnCode', returnCode)
-
-               if (returnCode=='200') {
-                       // @TODO: verify error code
-                       // @TODO: create class of literals representing error codes
-                       execution.setVariable(prefix+'queryAAIVolGrpNameResponse', aaiResponseAsString)
-                       utils.log("DEBUG", "Volume Group Name $volumeGroupName exists in AAI.", isDebugEnabled)
-               } else {
-                       if (returnCode=='404') {
-                               utils.log("DEBUG", "Volume Group Name $volumeGroupName does not exist in AAI.", isDebugEnabled)
-                               exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Volume group $volumeGroupName not found in AAI. Response code: 404")
-                       } else {
-                               WorkflowException aWorkflowException = exceptionUtil.MapAAIExceptionToWorkflowException(aaiResponseAsString, execution)
-                               throw new BpmnError("MSOWorkflowException")
-                       }
-               }
-       }
-       
-
-       /**
-        * Create a WorkflowException 
-        * @param execution
-        * @param isDebugEnabled
-        */
-       public void buildWorkflowException(Execution execution, int errorCode, errorMessage, isDebugEnabled) {
-               utils.log("DEBUG", errorMessage, isDebugEnabled)
-               (new ExceptionUtil()).buildWorkflowException(execution, 2500, errorMessage)
-       }
-       
-
-       /**
-        * Create a WorkflowException
-        * @param execution
-        * @param isDebugEnabled
-        */
-       public void handleError(Execution execution, isDebugEnabled) {
-               WorkflowException we = execution.getVariable('WorkflowException')
-               if (we == null) {
-                       (new ExceptionUtil()).buildWorkflowException(execution, 2500, "Enexpected error encountered!")
-               }
-               throw new BpmnError("MSOWorkflowException")
-       }
-       
-       /**
-        * Create volume group in AAI
-        * @param execution
-        * @param isDebugEnabled
-        */
-       public void callRESTCreateAAIVolGrpName(Execution execution, isDebugEnabled) {
-
-               def volumeRequest  = execution.getVariable(prefix+'Request')
-               def vnfId = execution.getVariable('vnf-id')
-               def volumeName = utils.getNodeText(volumeRequest, "volume-group-name")
-               def modelCustomizationId = getNodeTextForce(volumeRequest, "model-customization-id")
-               
-               def cloudRegion = execution.getVariable(prefix+"aicCloudRegion")
-               def groupId = execution.getVariable('volume-group-id')
-               utils.log("DEBUG", "volume group id: " + groupId, isDebugEnabled)
-               
-               AaiUtil aaiUtil = new AaiUtil(this)
-               String aaiEndpoint = aaiUtil.getCloudInfrastructureCloudRegionEndpoint(execution)
-               String createAAIVolumeGrpNameUrlRequest = aaiEndpoint + '/' + cloudRegion + "/volume-groups/volume-group/" + UriUtils.encode(groupId, "UTF-8")
-               
-               String namespace =  aaiUtil.getNamespaceFromUri(aaiUtil.getCloudInfrastructureCloudRegionUri(execution))
-               utils.log("DEBUG", "AAI namespace is: " + namespace, isDebugEnabled)
-               
-               utils.logAudit(createAAIVolumeGrpNameUrlRequest)
-               
-               //Prepare payload (PUT)
-               def vnfType = utils.getNodeText(volumeRequest, "vnf-type")
-               def tenantId = utils.getNodeText(volumeRequest, "tenant-id")
-               
-               NetworkUtils networkUtils = new NetworkUtils()
-               String payload = networkUtils.createCloudRegionVolumeRequest(groupId, volumeName, vnfType, vnfId, tenantId, cloudRegion, namespace, modelCustomizationId)
-               String payloadXml = utils.formatXml(payload)
-               utils.logAudit(payloadXml)
-               
-               APIResponse response = aaiUtil.executeAAIPutCall(execution, createAAIVolumeGrpNameUrlRequest, payloadXml)
-                               
-               String returnCode = response.getStatusCode()
-               String aaiResponseAsString = response.getResponseBodyAsString()
-               aaiResponseAsString = StringEscapeUtils.unescapeXml(aaiResponseAsString)
-               
-               utils.logAudit("AAI create volume group return code: " + returnCode)
-               utils.logAudit("AAI create volume group response: " + aaiResponseAsString)
-
-               execution.setVariable(prefix+"createAAIVolumeGrpNameReturnCode", returnCode)
-               execution.setVariable(prefix+"createAAIVolumeGrpNameResponse", aaiResponseAsString)
-
-               ExceptionUtil exceptionUtil = new ExceptionUtil()
-               
-               if (returnCode =='201') {
-                       execution.setVariable(prefix+"isAAIRollbackNeeded", true)
-               } else {
-                       execution.setVariable(prefix+"isErrorMessageException", true)
-                       if (returnCode=='404') {
-                               // @TODO: verify return code and make static LITERAL
-                               exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Unable to create volume group in AAI. Response code: 404")
-                       } else {
-                               WorkflowException aWorkflowException = exceptionUtil.MapAAIExceptionToWorkflowException(aaiResponseAsString, execution)
-                               utils.log("DEBUG", " AAI Adapter Query Failed.  WorkflowException - " + "\n" + aWorkflowException, isDebugEnabled)
-                               throw new BpmnError("MSOWorkflowException")
-                       }
-               }
-       }
-
-       /**
-        * Prepare VNF adapter create request XML
-        * @param execution
-        */
-       public void prepareVnfAdapterCreateRequest(Execution execution, isDebugEnabled) {
-               
-               
-               def volumeRequest  = execution.getVariable(prefix+'Request')
-               def requestId = execution.getVariable(prefix+'requestId')
-               def serviceId = execution.getVariable(prefix+'serviceId')
-               
-               def aaiGenericVnfResponse = execution.getVariable(prefix+'AAIQueryGenericVfnResponse')
-               def vnfId = utils.getNodeText1(aaiGenericVnfResponse, 'vnf-id')
-               def vnfName = utils.getNodeText1(aaiGenericVnfResponse, 'vnf-name')
-               def modelCustomizationId = getNodeTextForce(volumeRequest, "model-customization-id")
-                               
-               String messageId = UUID.randomUUID()
-               utils.log("DEBUG", "messageId to be used is generated: " + messageId, isDebugEnabled)
-
-               // prepare vnf request for vnfAdapterCreateV1
-               def cloudSiteId = utils.getNodeText1(volumeRequest, 'aic-cloud-region')
-               def tenantId = utils.getNodeText1(volumeRequest, "tenant-id")
-               def vnfType = utils.getNodeText1(volumeRequest, "vnf-type")
-               def vnfVersion = utils.getNodeText1(volumeRequest, "asdc-service-model-version")
-               def vnfModuleType = utils.getNodeText1(volumeRequest, "vf-module-model-name")
-               def volumeGroupnName = utils.getNodeText1(volumeRequest, "volume-group-name")
-
-               def volumeParamsXml = utils.getNodeXml(volumeRequest, 'volume-params')
-               def volumeGroupParams = transformVolumeParamsToEntries(volumeParamsXml)
-
-               utils.log("DEBUG", "volumeGroupParams: "+ volumeGroupParams, isDebugEnabled)
-
-               String volumeGroupId = execution.getVariable('volume-group-id')
-               def notificationUrl = createCallbackURL(execution, "VNFAResponse", messageId) 
-               def useQualifiedHostName = execution.getVariable("URN_mso_use_qualified_host")
-               if ('true'.equals(useQualifiedHostName)) {
-                               notificationUrl = utils.getQualifiedHostNameForCallback(notificationUrl)
-               }
-               utils.log("DEBUG", "CreateVfModuleVolume - notificationUrl: "+ notificationUrl, isDebugEnabled)
-               
-               def backoutOnFailure = execution.getVariable("DCVFMODVOLV1_rollbackEnabled")
-               utils.log("DEBUG", "backoutOnFailure: "+ backoutOnFailure, isDebugEnabled)
-               
-               // build request
-               String vnfSubCreateWorkflowRequest =
-               """
-                       <createVolumeGroupRequest>
-                               <cloudSiteId>${cloudSiteId}</cloudSiteId>
-                               <tenantId>${tenantId}</tenantId>
-                               <vnfId>${vnfId}</vnfId>
-                               <vnfName>${vnfName}</vnfName>
-                               <volumeGroupId>${volumeGroupId}</volumeGroupId>
-                               <volumeGroupName>${volumeGroupnName}</volumeGroupName>
-                               <vnfType>${vnfType}</vnfType>
-                               <vnfVersion>${vnfVersion}</vnfVersion>
-                               <vfModuleType>${vnfModuleType}</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>${volumeGroupnName}</value>
-                                       </entry>
-                                       ${volumeGroupParams}
-                           </volumeGroupParams>
-                               <skipAAI>true</skipAAI>
-                               <backout>${backoutOnFailure}</backout>
-                               <failIfExists>true</failIfExists>
-                           <msoRequest>
-                               <requestId>${requestId}</requestId>
-                               <serviceInstanceId>${serviceId}</serviceInstanceId>
-                           </msoRequest>
-                           <messageId>${messageId}</messageId>
-                           <notificationUrl>${notificationUrl}</notificationUrl>
-                       </createVolumeGroupRequest>
-               """
-
-               String vnfSubCreateWorkflowRequestAsString = utils.formatXml(vnfSubCreateWorkflowRequest)
-               utils.logAudit(vnfSubCreateWorkflowRequestAsString)
-               utils.log('DEBUG', vnfSubCreateWorkflowRequestAsString, isDebugEnabled)
-               execution.setVariable(prefix+"createVnfARequest", vnfSubCreateWorkflowRequestAsString)
-               
-               // build rollback request for use later if needed
-               
-               String vnfSubRollbackWorkflowRequest =
-               """<rollbackVolumeGroupRequest>
-                               <cloudSiteId>${cloudSiteId}</cloudSiteId>
-                               <tenantId>${tenantId}</tenantId>
-                               <volumeGroupId>${volumeGroupId}</volumeGroupId>
-                               <skipAAI>true</skipAAI>
-                               <volumeGroupCreated>true</volumeGroupCreated>
-                           <msoRequest>
-                               <requestId>${requestId}</requestId>
-                               <serviceInstanceId>${serviceId}</serviceInstanceId>
-                           </msoRequest>
-                           <messageId>${messageId}</messageId>
-                           <notificationUrl>${notificationUrl}</notificationUrl>
-                       </rollbackVolumeGroupRequest>"""
-
-               utils.log("DEBUG", "Sub Vnf flow rollback request: vnfSubRollbackWorkflowRequest " + "\n" + vnfSubRollbackWorkflowRequest, isDebugEnabled)
-               
-               String vnfSubRollbackWorkflowRequestAsString = utils.formatXml(vnfSubRollbackWorkflowRequest)
-               execution.setVariable(prefix+"rollbackVnfARequest", vnfSubRollbackWorkflowRequestAsString)
-       }
-
-       
-
-       /**
-        * Update voulume group in AAI 
-        * @TODO: Can we re-use the create method??
-        * @param execution
-        * @param isDebugEnabled
-        */
-       public void callRESTUpdateCreatedVolGrpName(Execution execution, isDebugEnabled) {
-               
-               // get variables
-               String requeryAAIVolGrpNameResponse = execution.getVariable(prefix+"queryAAIVolGrpNameResponse")
-               String volumeGroupId = utils.getNodeText(requeryAAIVolGrpNameResponse, "volume-group-id")
-               String modelCustomizationId = getNodeTextForce(requeryAAIVolGrpNameResponse, "vf-module-persona-model-customization-id")
-               String cloudRegion = execution.getVariable(prefix+"aicCloudRegion")
-               
-               AaiUtil aaiUtil = new AaiUtil(this)
-               String aaiEndpoint = aaiUtil.getCloudInfrastructureCloudRegionEndpoint(execution)
-               String updateAAIVolumeGroupUrlRequest = aaiEndpoint + '/' + cloudRegion + "/volume-groups/volume-group/" + UriUtils.encode(volumeGroupId, 'UTF-8')
-               
-               String namespace =  aaiUtil.getNamespaceFromUri(aaiUtil.getCloudInfrastructureCloudRegionUri(execution))
-
-               utils.logAudit(updateAAIVolumeGroupUrlRequest)
-
-               //Prepare payload (PUT)
-               String createVnfAResponse = execution.getVariable(prefix+"createVnfAResponse")
-               
-               // @TODO: revisit
-               // if VID request createVnfresponse will be null, use vnf from JSON request
-               def vnfId = ""
-               if(createVnfAResponse == null || createVnfAResponse == "") {
-                       vnfId = execution.getVariable(prefix+'vnfId')
-               }
-               else {
-                       vnfId = utils.getNodeText(createVnfAResponse, "volumeGroupStackId")
-               }
-               
-               NetworkUtils networkUtils = new NetworkUtils()
-               String payload = networkUtils.updateCloudRegionVolumeRequest(requeryAAIVolGrpNameResponse, vnfId, namespace, modelCustomizationId)
-               String payloadXml = utils.formatXml(payload)
-               
-               //execution.setVariable(prefix+"updateCreatedAAIVolumeGrpNamePayloadRequest", payloadXml)
-               utils.logAudit(payload)
-               //utils.log("DEBUG", " 'payload' to Update Created VolumeGroupName - " + "\n" + payloadXml, isDebugEnabled)
-
-               APIResponse response = aaiUtil.executeAAIPutCall(execution, updateAAIVolumeGroupUrlRequest, payloadXml)
-               
-               String returnCode = response.getStatusCode()
-               String aaiResponseAsString = response.getResponseBodyAsString()
-               aaiResponseAsString = StringEscapeUtils.unescapeXml(aaiResponseAsString)
-               
-               utils.logAudit("AAI create volume group return code: " + returnCode)
-               utils.logAudit("AAI create volume group response: " + aaiResponseAsString)
-
-               ExceptionUtil exceptionUtil = new ExceptionUtil()
-
-               if (returnCode =='200') {
-                       execution.setVariable(prefix+"updateCreatedAAIVolumeGrpNameResponse", aaiResponseAsString)
-                       execution.setVariable(prefix+"isPONR", true)
-               } else {
-                       execution.setVariable(prefix+"isErrorMessageException", true)
-                       if (returnCode=='404') {
-                               // @TODO: verify return code and make static LITERAL
-                               exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Unable to update volume group in AAI. Response code: 404")
-                       } else {
-                               WorkflowException aWorkflowException = exceptionUtil.MapAAIExceptionToWorkflowException(aaiResponseAsString, execution)
-                               utils.log("DEBUG", " AAI Adapter Query Failed.  WorkflowException - " + "\n" + aWorkflowException, isDebugEnabled)
-                               throw new BpmnError("MSOWorkflowException")
-                       }
-               }
-       }
-
-       
-       /**
-        * Query AAI service instance
-        * @param execution
-        * @param isDebugEnabled
-        */
-       public void callRESTQueryAAIGenericVnf(Execution execution, isDebugEnabled) {
-               
-               def request = execution.getVariable(prefix+"Request")
-               def vnfId = execution.getVariable('vnf-id')
-               
-               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)
-
-               //utils.log("DEBUG", "AAI query generic vnf return code: " + returnCode, isDebugEnabled)
-               //utils.log("DEBUG", "AAI query generic vnf response: " + aaiResponseAsString, isDebugEnabled)
-               
-               ExceptionUtil exceptionUtil = new ExceptionUtil()
-               
-               if (returnCode=='200') {
-                       utils.log("DEBUG", 'Generic vnf ' + vnfId + ' found in AAI.', isDebugEnabled)
-                       execution.setVariable(prefix+'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")
-                       }
-               }
-       }
-
-       public void callRESTDeleteAAIVolumeGroup(Execution execution, isDebugEnabled) {
-
-               callRESTQueryAAIVolGrpName(execution, isDebugEnabled)
-               
-               def queryAaiVolumeGroupResponse = execution.getVariable(prefix+'queryAAIVolGrpNameResponse')
-               
-               def volumeGroupId = utils.getNodeText(queryAaiVolumeGroupResponse, "volume-group-id")
-               def resourceVersion = utils.getNodeText(queryAaiVolumeGroupResponse, "resource-version")
-
-               def cloudRegion = execution.getVariable(prefix+"aicCloudRegion")
-               
-               AaiUtil aaiUtil = new AaiUtil(this)
-               String aaiEndpoint = aaiUtil.getCloudInfrastructureCloudRegionEndpoint(execution)
-               String deleteAAIVolumeGrpIdRequest = aaiEndpoint + '/' + cloudRegion + "/volume-groups/volume-group" + '/' +  volumeGroupId + "?resource-version=" + UriUtils.encode(resourceVersion, "UTF-8")
-
-               utils.logAudit('Delete AAI volume group : ' + deleteAAIVolumeGrpIdRequest)
-               
-               APIResponse response = aaiUtil.executeAAIDeleteCall(execution, deleteAAIVolumeGrpIdRequest)
-               
-               String returnCode = response.getStatusCode()
-               String aaiResponseAsString = response.getResponseBodyAsString()
-               aaiResponseAsString = StringEscapeUtils.unescapeXml(aaiResponseAsString)
-               
-               utils.logAudit("AAI delete volume group return code: " + returnCode)
-               utils.logAudit("AAI delete volume group response: " + aaiResponseAsString)
-
-               ExceptionUtil exceptionUtil = new ExceptionUtil()
-
-               def volumeGroupNameFound = prefix+'volumeGroupNameFound'
-               if (returnCode=='200' || returnCode=='204' ) {
-                       utils.log("DEBUG", "Volume group $volumeGroupId deleted.", isDebugEnabled)
-               } else {
-                       if (returnCode=='404') {
-                               exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Volume group $volumeGroupId not found for delete in AAI Response code: 404")
-                       } else {
-                               WorkflowException aWorkflowException = exceptionUtil.MapAAIExceptionToWorkflowException(aaiResponseAsString, execution)
-                               throw new BpmnError("MSOWorkflowException")
-                       }
-               }
-       }
-
-       
-       
-       
-       
-       public void prepareSuccessDBRequest(Execution execution, isDebugEnabled) {
-               String requestId = execution.getVariable(prefix+'requestId')
-               String dbVnfOutputs = execution.getVariable(prefix+'volumeOutputs')
-               prepareDBRequest(execution, requestId, "VolumeGroup successfully created.", "COMPLETED", "100", dbVnfOutputs, isDebugEnabled)
-       }
-       
-       public void prepareFailDbRequest(Execution execution, isDebugEnabled) {
-               
-               WorkflowException we = execution.getVariable("WorkflowException")
-               
-               String requestId = execution.getVariable(prefix+'requestId')
-               String dbVnfOutputs = execution.getVariable(prefix+'volumeOutputs')
-               prepareDBRequest(execution, requestId, we.getErrorMessage(), "FAILURE", "", dbVnfOutputs, isDebugEnabled)
-
-       }
-       
-       
-       /**
-        * Prepare Infra DB XML Request 
-        * @param execution
-        */
-       public void prepareDBRequest (Execution execution, String requestId, String statusMessage, String requestStatus, String progress, String dbVnfOutputs, isDebugEnabled) {
-               
-               String dbRequest =
-               """<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
-                       <soapenv:Header/>
-                       <soapenv:Body>
-                               <ns:updateInfraRequest xmlns:ns="http://org.openecomp.mso/requestsdb">
-                                       <requestId>${requestId}</requestId>
-                                       <lastModifiedBy>BPMN</lastModifiedBy>
-                                       <statusMessage>${statusMessage}</statusMessage>
-                                       <responseBody></responseBody>
-                                       <requestStatus>${requestStatus}</requestStatus>
-                                       <progress>${progress}</progress>
-                                       <vnfOutputs>${dbVnfOutputs}</vnfOutputs>
-                               </ns:updateInfraRequest>
-                       </soapenv:Body>
-                  </soapenv:Envelope>"""
-
-          utils.log("DEBUG", " DB Adapter Request - " + "\n" + dbRequest, isDebugEnabled)
-          String buildDeleteDBRequestAsString = utils.formatXml(dbRequest)
-          
-          execution.setVariable(prefix+"createDBRequest", buildDeleteDBRequestAsString)
-          
-          utils.logAudit(buildDeleteDBRequestAsString)
-        }
-
-
-
-       
-       public void postProcessResponse (Execution execution, isDebugEnabled) {
-
-               String dbReturnCode = execution.getVariable(prefix+"dbReturnCode")
-               utils.log("DEBUG", "DB Update Response Code  : " + dbReturnCode, isDebugEnabled)
-               
-               String createDBResponse =  execution.getVariable(prefix+"createDBResponse")
-               utils.logAudit(createDBResponse)
-
-               String source = execution.getVariable(prefix+"source")
-               String requestId = execution.getVariable(prefix+'requestId')
-
-               String msoCompletionRequest =
-                       """<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>BPEL Volume Group action: CREATE</aetgt:mso-bpel-name>
-                               </aetgt:MsoCompletionRequest>"""
-
-               // Format Response
-               String xmlMsoCompletionRequest = utils.formatXml(msoCompletionRequest)
-               utils.logAudit(xmlMsoCompletionRequest)
-               
-               // normal path
-               if (dbReturnCode == "200") {
-                               execution.setVariable(prefix+"Success", true)
-                               execution.setVariable(prefix+"CompleteMsoProcessRequest", xmlMsoCompletionRequest)
-                               utils.log("DEBUG", " Overall SUCCESS Response going to CompleteMsoProcess - " + "\n" + xmlMsoCompletionRequest, isDebugEnabled)
-               } else {
-                               execution.setVariable(prefix+"isErrorMessageException", true)
-                               utils.log("DEBUG", " DB Update failed, code: " + dbReturnCode + ", going to Unexpected Error.", isDebugEnabled)
-               }
-       }
-
-}
+package org.openecomp.mso.bpmn.infrastructure.scripts\r
+\r
+import static org.camunda.spin.Spin.XML;\r
+import groovy.json.JsonSlurper\r
+import groovy.lang.GroovyInterceptable;\r
+import groovy.xml.XmlUtil\r
+\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.NetworkUtils\r
+import org.openecomp.mso.bpmn.common.scripts.VfModuleBase;\r
+import org.openecomp.mso.bpmn.core.RollbackData\r
+import org.openecomp.mso.bpmn.core.WorkflowException\r
+import org.openecomp.mso.bpmn.core.json.JsonUtils;\r
+import org.openecomp.mso.rest.APIResponse\r
+import org.springframework.web.util.UriUtils\r
+\r
+\r
+\r
+\r
+import java.util.UUID;\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.apache.commons.codec.binary.Base64;\r
+\r
+class DoCreateVfModuleVolumeV2 extends VfModuleBase {\r
+\r
+       String prefix='DCVFMODVOLV2_'\r
+       JsonUtils jsonUtil = new JsonUtils()\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
+               execution.setVariable("prefix",prefix)\r
+               execution.setVariable(prefix+'SuccessIndicator', false)\r
+               execution.setVariable(prefix+'isPONR', false)\r
+\r
+               displayInput(execution, isDebugLogEnabled)\r
+               setRollbackData(execution, isDebugLogEnabled)\r
+               setRollbackEnabled(execution, isDebugLogEnabled) \r
+               \r
+               \r
+               def tenantId = execution.getVariable("tenantId")\r
+               if (tenantId == null) {\r
+                       String cloudConfiguration = execution.getVariable("cloudConfiguration")\r
+                       tenantId = jsonUtil.getJsonValue(cloudConfiguration, "cloudConfiguration.tenantId")\r
+                       execution.setVariable("tenantId", tenantId)\r
+               }\r
+\r
+               def cloudSiteId = execution.getVariable("lcpCloudRegionId")\r
+               if (cloudSiteId == null) {\r
+                       String cloudConfiguration = execution.getVariable("cloudConfiguration")\r
+                       cloudSiteId = jsonUtil.getJsonValue(cloudConfiguration, "cloudConfiguration.lcpCloudRegionId")\r
+                       execution.setVariable("lcpCloudRegionId", cloudSiteId)\r
+               }\r
+\r
+               // Extract attributes from modelInfo\r
+               String vfModuleModelInfo = execution.getVariable("vfModuleModelInfo")\r
+\r
+               //modelCustomizationUuid\r
+               def modelCustomizationUuid = jsonUtil.getJsonValue(vfModuleModelInfo, "modelCustomizationUuid")\r
+               execution.setVariable("modelCustomizationId", modelCustomizationUuid)\r
+               logDebug("modelCustomizationId: " + modelCustomizationUuid, isDebugLogEnabled)\r
+               \r
+               //modelName\r
+               def modelName = jsonUtil.getJsonValue(vfModuleModelInfo, "modelName")\r
+               execution.setVariable("modelName", modelName)\r
+               logDebug("modelName: " + modelName, isDebugLogEnabled)\r
+               \r
+               // The following is used on the get Generic Service Instance call\r
+               execution.setVariable('GENGS_type', 'service-instance')\r
+       }\r
+\r
+       \r
+       /**\r
+        * Display input variables\r
+        * @param execution\r
+        * @param isDebugLogEnabled\r
+        */\r
+       public void displayInput(Execution execution, isDebugLogEnabled) {\r
+               def input = ['mso-request-id', 'msoRequestId', 'isDebugLogEnabled', 'disableRollback', 'failIfExists', 'serviceInstanceId',\r
+                       'vnfId', 'vnfName', 'tenantId', 'volumeGroupId', 'volumeGroupName', 'lcpCloudRegionId', 'vnfType', 'vfModuleModelInfo',  'asdcServiceModelVersion',\r
+                       'test-volume-group-name', 'test-volume-group-id', 'vfModuleInputParams']\r
+\r
+               logDebug('Begin input: ', isDebugLogEnabled)\r
+               input.each {\r
+                       logDebug(it + ': ' + execution.getVariable(it), isDebugLogEnabled)\r
+               }\r
+               logDebug('End input.', isDebugLogEnabled)\r
+       }\r
+       \r
+       \r
+       /**\r
+        * Define and set rollbackdata object \r
+        * @param execution\r
+        * @param isDebugEnabled\r
+        */\r
+       public void setRollbackData(Execution execution, isDebugEnabled) {\r
+               def rollbackData = execution.getVariable("rollbackData")\r
+               if (rollbackData == null) {\r
+                       rollbackData = new RollbackData()\r
+               }\r
+               def volumeGroupName = execution.getVariable('volumeGroupName')\r
+               rollbackData.put("DCVFMODULEVOL", "volumeGroupName", volumeGroupName)\r
+               execution.setVariable("rollbackData", rollbackData)\r
+       }\r
+       \r
+               \r
+       /**\r
+        * validate getServiceInstance response\r
+        * @param execution\r
+        * @param isDebugEnabled\r
+        */\r
+       public void validateGetServiceInstanceCall(Execution execution, isDebugEnabled) {\r
+               def found = execution.getVariable('GENGS_FoundIndicator')\r
+               def success = execution.getVariable('GENGS_SuccessIndicator')\r
+               def serviceInstanceId = execution.getVariable('serviceInstanceId')\r
+               utils.log("DEBUG", "getServiceInstance success: " + success, isDebugEnabled)\r
+               utils.log("DEBUG", "getServiceInstance found: " + found, isDebugEnabled)\r
+               if(!found || !success) {\r
+                       String errorMessage = "Service instance id not found in AAI: ${serviceInstanceId}."\r
+                       utils.log("DEBUG", errorMessage, isDebugEnabled)\r
+                       (new ExceptionUtil()).buildAndThrowWorkflowException(execution, 2500, errorMessage)\r
+               }\r
+               \r
+       }\r
+\r
+       /**\r
+        * Get cloud region\r
+        * @param execution\r
+        * @param isDebugEnabled\r
+        */\r
+       public void callRESTQueryAAICloudRegion (Execution execution, isDebugEnabled) {\r
+\r
+               def cloudRegion = execution.getVariable("lcpCloudRegionId")\r
+               utils.log("DEBUG", 'Request cloud region is: ' + cloudRegion, isDebugEnabled)\r
+\r
+               AaiUtil aaiUtil = new AaiUtil(this)\r
+               String aaiEndpoint = aaiUtil.getCloudInfrastructureCloudRegionEndpoint(execution)\r
+               String queryCloudRegionRequest = aaiEndpoint + '/' + cloudRegion\r
+\r
+               utils.logAudit(queryCloudRegionRequest)\r
+\r
+               cloudRegion = aaiUtil.getAAICloudReqion(execution,  queryCloudRegionRequest, "PO", cloudRegion)\r
+\r
+               def aaiCloudRegion = aaiUtil.getAAICloudReqion(execution,  queryCloudRegionRequest, "AAI", cloudRegion)\r
+               if ((aaiCloudRegion != "ERROR")) {\r
+                       execution.setVariable("lcpCloudRegionId", aaiCloudRegion)\r
+                       utils.log("DEBUG", "AIC Cloud Region for AAI: " + aaiCloudRegion, isDebugEnabled)\r
+               } else {\r
+                       String errorMessage = "AAI Query Cloud Region Unsuccessful. Return Code: " + execution.getVariable(prefix+"queryCloudRegionReturnCode")\r
+                       utils.log("DEBUG", errorMessage, isDebugEnabled)\r
+                       (new ExceptionUtil()).buildAndThrowWorkflowException(execution, 2500, errorMessage)\r
+               }\r
+               \r
+               def poCloudRegion = aaiUtil.getAAICloudReqion(execution,  queryCloudRegionRequest, "PO", cloudRegion)\r
+               if ((poCloudRegion != "ERROR")) {\r
+                       execution.setVariable("poLcpCloudRegionId", poCloudRegion)\r
+                       utils.log("DEBUG", "AIC Cloud Region for PO: " + poCloudRegion, isDebugEnabled)\r
+               } else {\r
+                       String errorMessage = "AAI Query Cloud Region Unsuccessful. Return Code: " + execution.getVariable(prefix+"queryCloudRegionReturnCode")\r
+                       utils.log("DEBUG", errorMessage, isDebugEnabled)\r
+                       (new ExceptionUtil()).buildAndThrowWorkflowException(execution, 2500, errorMessage)\r
+               }\r
+               \r
+               def rollbackData = execution.getVariable("rollbackData")\r
+               rollbackData.put("DCVFMODULEVOL", "aiccloudregion", cloudRegion)\r
+       }\r
+\r
+\r
+       /**\r
+        * Query AAI volume group by name\r
+        * @param execution\r
+        * @param isDebugEnabled\r
+        */\r
+       public void callRESTQueryAAIVolGrpName(Execution execution, isDebugEnabled) {\r
+\r
+               def volumeGroupName = execution.getVariable('volumeGroupName')\r
+               def cloudRegion = execution.getVariable('lcpCloudRegionId')\r
+\r
+               // This is for stub testing\r
+               def testVolumeGroupName = execution.getVariable('test-volume-group-name')\r
+               if (testVolumeGroupName != null && testVolumeGroupName.length() > 0) {\r
+                       volumeGroupName = testVolumeGroupName\r
+               }\r
+\r
+               AaiUtil aaiUtil = new AaiUtil(this)\r
+               String aaiEndpoint = aaiUtil.getCloudInfrastructureCloudRegionEndpoint(execution)\r
+               String queryAAIVolumeNameRequest = aaiEndpoint + '/' + cloudRegion + "/volume-groups" + "?volume-group-name=" + UriUtils.encode(volumeGroupName, 'UTF-8')\r
+\r
+               utils.logAudit('Query AAI volume group by name: ' + queryAAIVolumeNameRequest)\r
+\r
+               APIResponse response = aaiUtil.executeAAIGetCall(execution, queryAAIVolumeNameRequest)\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 name return code: " + returnCode)\r
+               utils.logAudit("AAI query volume group by name response: " + aaiResponseAsString)\r
+\r
+               ExceptionUtil exceptionUtil = new ExceptionUtil()\r
+\r
+               execution.setVariable(prefix+"queryAAIVolGrpNameResponse", aaiResponseAsString)\r
+               execution.setVariable(prefix+'AaiReturnCode', returnCode)\r
+\r
+               if (returnCode=='200') {\r
+                       execution.setVariable(prefix+'queryAAIVolGrpNameResponse', aaiResponseAsString)\r
+                       utils.log("DEBUG", "Volume Group Name $volumeGroupName exists in AAI.", isDebugEnabled)\r
+               } else {\r
+                       if (returnCode=='404') {\r
+                               utils.log("DEBUG", "Volume Group Name $volumeGroupName does not exist in AAI.", isDebugEnabled)\r
+                               exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Volume group $volumeGroupName not found in AAI. Response code: 404")\r
+                       } else {\r
+                               WorkflowException aWorkflowException = exceptionUtil.MapAAIExceptionToWorkflowException(aaiResponseAsString, execution)\r
+                               throw new BpmnError("MSOWorkflowException")\r
+                       }\r
+               }\r
+       }\r
+\r
+\r
+       /**\r
+        * Create a WorkflowException \r
+        * @param execution\r
+        * @param isDebugEnabled\r
+        */\r
+       public void buildWorkflowException(Execution execution, int errorCode, errorMessage, isDebugEnabled) {\r
+               utils.log("DEBUG", errorMessage, isDebugEnabled)\r
+               (new ExceptionUtil()).buildWorkflowException(execution, 2500, errorMessage)\r
+       }\r
+\r
+\r
+       /**\r
+        * Create a WorkflowException\r
+        * @param execution\r
+        * @param isDebugEnabled\r
+        */\r
+       public void handleError(Execution execution, isDebugEnabled) {\r
+               WorkflowException we = execution.getVariable('WorkflowException')\r
+               if (we == null) {\r
+                       (new ExceptionUtil()).buildWorkflowException(execution, 2500, "Enexpected error encountered!")\r
+               }\r
+               throw new BpmnError("MSOWorkflowException")\r
+       }\r
+\r
+       \r
+       /**\r
+        * Create volume group in AAI\r
+        * @param execution\r
+        * @param isDebugEnabled\r
+        */\r
+       public void callRESTCreateAAIVolGrpName(Execution execution, isDebugEnabled) {\r
+\r
+               def vnfId = execution.getVariable('vnfId')\r
+               def volumeGroupId = execution.getVariable('volumeGroupId')\r
+               def volumeName = execution.getVariable("volumeGroupName")\r
+               def modelCustomizationId = execution.getVariable("modelCustomizationId")\r
+               def vnfType = execution.getVariable("vnfType")\r
+               def tenantId = execution.getVariable("tenantId")\r
+               def cloudRegion = execution.getVariable('lcpCloudRegionId')\r
+               \r
+               utils.log("DEBUG", "volumeGroupId: " + volumeGroupId, isDebugEnabled)\r
+\r
+               def testGroupId = execution.getVariable('test-volume-group-id')\r
+               if (testGroupId != null && testGroupId.trim() != '') {\r
+                       utils.log("DEBUG", "test volumeGroupId is present: " + testGroupId, isDebugEnabled)\r
+                       volumeGroupId = testGroupId\r
+                       execution.setVariable("test-volume-group-name", "MSOTESTVOL101a-vSAMP12_base_vol_module-0")\r
+               }\r
+\r
+               utils.log("DEBUG", "volumeGroupId to be used: " + volumeGroupId, isDebugEnabled)\r
+\r
+               AaiUtil aaiUtil = new AaiUtil(this)\r
+               String aaiEndpoint = aaiUtil.getCloudInfrastructureCloudRegionEndpoint(execution)\r
+               String createAAIVolumeGrpNameUrlRequest = aaiEndpoint + '/' + cloudRegion + "/volume-groups/volume-group/" + UriUtils.encode(volumeGroupId, "UTF-8")\r
+\r
+               String namespace =  aaiUtil.getNamespaceFromUri(aaiUtil.getCloudInfrastructureCloudRegionUri(execution))\r
+               utils.log("DEBUG", "AAI namespace is: " + namespace, isDebugEnabled)\r
+\r
+               utils.logAudit("Request URL for PUT: " + createAAIVolumeGrpNameUrlRequest)\r
+\r
+               NetworkUtils networkUtils = new NetworkUtils()\r
+               String payload = networkUtils.createCloudRegionVolumeRequest(volumeGroupId, volumeName, vnfType, vnfId, tenantId, cloudRegion, namespace, modelCustomizationId)\r
+               String payloadXml = utils.formatXml(payload)\r
+               utils.logAudit("Request payload for PUT: " + payloadXml)\r
+\r
+               APIResponse response = aaiUtil.executeAAIPutCall(execution, createAAIVolumeGrpNameUrlRequest, payloadXml)\r
+\r
+               String returnCode = response.getStatusCode()\r
+               String aaiResponseAsString = response.getResponseBodyAsString()\r
+               aaiResponseAsString = StringEscapeUtils.unescapeXml(aaiResponseAsString)\r
+\r
+               utils.logAudit("AAI create volume group return code: " + returnCode)\r
+               utils.logAudit("AAI create volume group response: " + aaiResponseAsString)\r
+\r
+               execution.setVariable(prefix+"createAAIVolumeGrpNameReturnCode", returnCode)\r
+               execution.setVariable(prefix+"createAAIVolumeGrpNameResponse", aaiResponseAsString)\r
+               \r
+               ExceptionUtil exceptionUtil = new ExceptionUtil()\r
+\r
+               if (returnCode =='201') {\r
+                       RollbackData rollbackData = execution.getVariable("rollbackData")\r
+                       rollbackData.put("DCVFMODULEVOL", "isAAIRollbackNeeded", "true")\r
+               } else {\r
+                       execution.setVariable(prefix+"isErrorMessageException", true)\r
+                       if (returnCode=='404') {\r
+                               exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Unable to create volume group in AAI. Response code: 404")\r
+                       } else {\r
+                               WorkflowException aWorkflowException = exceptionUtil.MapAAIExceptionToWorkflowException(aaiResponseAsString, execution)\r
+                               utils.log("DEBUG", " AAI Adapter Query Failed.  WorkflowException - " + "\n" + aWorkflowException, isDebugEnabled)\r
+                               throw new BpmnError("MSOWorkflowException")\r
+                       }\r
+               }\r
+       }\r
+       \r
+\r
+       /**\r
+        * Prepare VNF adapter create request XML\r
+        * @param execution\r
+        */\r
+       public void prepareVnfAdapterCreateRequest(Execution execution, isDebugEnabled) {\r
+\r
+               def aaiGenericVnfResponse = execution.getVariable(prefix+'AAIQueryGenericVfnResponse')\r
+               def vnfId = utils.getNodeText1(aaiGenericVnfResponse, 'vnf-id')\r
+               def vnfName = utils.getNodeText1(aaiGenericVnfResponse, 'vnf-name')\r
+               def vnfType = utils.getNodeText1(aaiGenericVnfResponse, "vnf-type")\r
+               \r
+               def requestId = execution.getVariable('msoRequestId')\r
+               def serviceId = execution.getVariable('serviceInstanceId')\r
+               def cloudSiteId = execution.getVariable('poLcpCloudRegionId')\r
+               def tenantId = execution.getVariable('tenantId')\r
+               def volumeGroupId = execution.getVariable('volumeGroupId')\r
+               def volumeGroupnName = execution.getVariable('volumeGroupName')\r
+\r
+               def vnfVersion = execution.getVariable("asdcServiceModelVersion") \r
+               def vnfModuleType = execution.getVariable("modelName")\r
+\r
+               def modelCustomizationId = execution.getVariable("modelCustomizationId")\r
+               \r
+               // for testing\r
+               utils.log("DEBUG", "volumeGroupId: " + volumeGroupId, isDebugEnabled)\r
+               def testGroupId = execution.getVariable('test-volume-group-id')\r
+               if (testGroupId != null && testGroupId.trim() != '') {\r
+                       utils.log("DEBUG", "test volumeGroupId is present: " + testGroupId, isDebugEnabled)\r
+                       volumeGroupId = testGroupId\r
+                       execution.setVariable("test-volume-group-name", "MSOTESTVOL101a-vSAMP12_base_vol_module-0")\r
+               }\r
+               utils.log("DEBUG", "volumeGroupId to be used: " + volumeGroupId, isDebugEnabled)\r
+                               \r
+               // volume group parameters\r
+               \r
+               String volumeGroupParams = ''\r
+               StringBuilder sbParams = new StringBuilder()\r
+               Map<String, String> paramsMap = execution.getVariable("vfModuleInputParams")\r
+               for (Map.Entry<String, String> entry : paramsMap.entrySet()) {\r
+                       String paramsXml\r
+                       String paramName = entry.getKey();\r
+                       String paramValue = entry.getValue()\r
+                       paramsXml =\r
+                               """     <entry>\r
+                          <key>${paramName}</key>\r
+                          <value>${paramValue}</value>\r
+                       </entry>\r
+                       """\r
+                       sbParams.append(paramsXml)\r
+               }\r
+\r
+               volumeGroupParams = sbParams.toString()\r
+               utils.log("DEBUG", "volumeGroupParams: "+ volumeGroupParams, isDebugEnabled)\r
+\r
+               def backoutOnFailure = execution.getVariable(prefix+"backoutOnFailure")\r
+               utils.log("DEBUG", "backoutOnFailure: "+ backoutOnFailure, isDebugEnabled)\r
+\r
+               def failIfExists = execution.getVariable("failIfExists")\r
+               if(failIfExists == null) {\r
+                       failIfExists = 'true'\r
+               }\r
+               \r
+               String messageId = UUID.randomUUID()\r
+               utils.log("DEBUG", "messageId to be used is generated: " + messageId, isDebugEnabled)\r
+               \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
+               utils.log("DEBUG", "CreateVfModuleVolume - notificationUrl: "+ notificationUrl, isDebugEnabled)\r
+               \r
+               // build request\r
+               String vnfSubCreateWorkflowRequest =\r
+                               """\r
+                       <createVolumeGroupRequest>\r
+                               <cloudSiteId>${cloudSiteId}</cloudSiteId>\r
+                               <tenantId>${tenantId}</tenantId>\r
+                               <vnfId>${vnfId}</vnfId>\r
+                               <vnfName>${vnfName}</vnfName>\r
+                               <volumeGroupId>${volumeGroupId}</volumeGroupId>\r
+                               <volumeGroupName>${volumeGroupnName}</volumeGroupName>\r
+                               <vnfType>${vnfType}</vnfType>\r
+                               <vnfVersion>${vnfVersion}</vnfVersion>\r
+                               <vfModuleType>${vnfModuleType}</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>${volumeGroupnName}</value>\r
+                                       </entry>\r
+                                       ${volumeGroupParams}\r
+                           </volumeGroupParams>\r
+                               <skipAAI>true</skipAAI>\r
+                               <backout>${backoutOnFailure}</backout>\r
+                               <failIfExists>${failIfExists}</failIfExists>\r
+                           <msoRequest>\r
+                               <requestId>${requestId}</requestId>\r
+                               <serviceInstanceId>${serviceId}</serviceInstanceId>\r
+                           </msoRequest>\r
+                           <messageId>${messageId}</messageId>\r
+                           <notificationUrl>${notificationUrl}</notificationUrl>\r
+                       </createVolumeGroupRequest>\r
+               """\r
+\r
+               String vnfSubCreateWorkflowRequestAsString = utils.formatXml(vnfSubCreateWorkflowRequest)\r
+               utils.logAudit(vnfSubCreateWorkflowRequestAsString)\r
+               utils.log('DEBUG', vnfSubCreateWorkflowRequestAsString, isDebugEnabled)\r
+               execution.setVariable(prefix+"createVnfARequest", vnfSubCreateWorkflowRequestAsString)\r
+\r
+               // build rollback request for use later if needed\r
+               \r
+               String vnfSubRollbackWorkflowRequest =\r
+                               """<rollbackVolumeGroupRequest>\r
+                               <cloudSiteId>${cloudSiteId}</cloudSiteId>\r
+                               <tenantId>${tenantId}</tenantId>\r
+                               <volumeGroupId>${volumeGroupId}</volumeGroupId>\r
+                               <skipAAI>true</skipAAI>\r
+                               <volumeGroupCreated>true</volumeGroupCreated>\r
+                           <msoRequest>\r
+                               <requestId>${requestId}</requestId>\r
+                               <serviceInstanceId>${serviceId}</serviceInstanceId>\r
+                           </msoRequest>\r
+                           <messageId>${messageId}</messageId>\r
+                           <notificationUrl>${notificationUrl}</notificationUrl>\r
+                       </rollbackVolumeGroupRequest>"""\r
+\r
+               utils.log("DEBUG", "Sub Vnf flow rollback request: vnfSubRollbackWorkflowRequest " + "\n" + vnfSubRollbackWorkflowRequest, isDebugEnabled)\r
+\r
+               String vnfSubRollbackWorkflowRequestAsString = utils.formatXml(vnfSubRollbackWorkflowRequest)\r
+               execution.setVariable(prefix+"rollbackVnfARequest", vnfSubRollbackWorkflowRequestAsString)\r
+       }\r
+\r
+       \r
+       /**\r
+        * Validate VNF adapter response\r
+        * @param execution\r
+        */\r
+       public void validateVnfResponse(Execution execution, isDebugEnabled) {\r
+               def vnfSuccess = execution.getVariable('VNFREST_SuccessIndicator')\r
+               utils.log("DEBUG", "vnfAdapterSuccessIndicator: "+ vnfSuccess, isDebugEnabled)\r
+               if(vnfSuccess==true) {\r
+                       def vnfRollbackRequest = execution.getVariable(prefix+"rollbackVnfARequest")\r
+                       utils.log("DEBUG", "vnfAdapter rollback request: "+ vnfRollbackRequest, isDebugEnabled)\r
+                       RollbackData rollbackData = execution.getVariable("rollbackData")\r
+                       rollbackData.put("DCVFMODULEVOL", "rollbackVnfARequest", vnfRollbackRequest)\r
+                       rollbackData.put("DCVFMODULEVOL", "isCreateVnfRollbackNeeded", "true")\r
+               }\r
+\r
+       }\r
+       \r
+\r
+       /**\r
+        * Update voulume group in AAI \r
+        * @TODO: Can we re-use the create method??\r
+        * @param execution\r
+        * @param isDebugEnabled\r
+        */\r
+       public void callRESTUpdateCreatedVolGrpName(Execution execution, isDebugEnabled) {\r
+\r
+               String requeryAAIVolGrpNameResponse = execution.getVariable(prefix+"queryAAIVolGrpNameResponse")\r
+               String volumeGroupId = utils.getNodeText1(requeryAAIVolGrpNameResponse, "volume-group-id")\r
+               String modelCustomizationId = execution.getVariable("modelCustomizationId")  \r
+               String cloudRegion = execution.getVariable("lcpCloudRegionId")\r
+\r
+               AaiUtil aaiUtil = new AaiUtil(this)\r
+               String aaiEndpoint = aaiUtil.getCloudInfrastructureCloudRegionEndpoint(execution)\r
+               String updateAAIVolumeGroupUrlRequest = aaiEndpoint + '/' + cloudRegion + "/volume-groups/volume-group/" + UriUtils.encode(volumeGroupId, 'UTF-8')\r
+\r
+               String namespace =  aaiUtil.getNamespaceFromUri(aaiUtil.getCloudInfrastructureCloudRegionUri(execution))\r
+\r
+               utils.logAudit(updateAAIVolumeGroupUrlRequest)\r
+               utils.log("DEBUG", "updateAAIVolumeGroupUrlRequest - " +  updateAAIVolumeGroupUrlRequest, isDebugEnabled)\r
+\r
+               String createVnfAResponse = execution.getVariable(prefix+"createVnfAResponse")\r
+               def heatStackID = utils.getNodeText1(createVnfAResponse, "volumeGroupStackId")\r
+               \r
+               execution.setVariable(prefix+"heatStackId", heatStackID)\r
+\r
+               NetworkUtils networkUtils = new NetworkUtils()\r
+               String payload = networkUtils.updateCloudRegionVolumeRequest(requeryAAIVolGrpNameResponse, heatStackID, namespace, modelCustomizationId)\r
+               String payloadXml = utils.formatXml(payload)\r
+\r
+               utils.logAudit("Payload to Update Created VolumeGroupName - " + "\n" + payloadXml)\r
+\r
+               APIResponse response = aaiUtil.executeAAIPutCall(execution, updateAAIVolumeGroupUrlRequest, payloadXml)\r
+\r
+               String returnCode = response.getStatusCode()\r
+               String aaiResponseAsString = response.getResponseBodyAsString()\r
+               aaiResponseAsString = StringEscapeUtils.unescapeXml(aaiResponseAsString)\r
+\r
+               utils.logAudit("AAI create volume group return code: " + returnCode)\r
+               utils.logAudit("AAI create volume group response: " + aaiResponseAsString)\r
+\r
+               ExceptionUtil exceptionUtil = new ExceptionUtil()\r
+\r
+               if (returnCode =='200') {\r
+                       execution.setVariable(prefix+"updateCreatedAAIVolumeGrpNameResponse", aaiResponseAsString)\r
+                       execution.setVariable(prefix+"isPONR", true)\r
+               } else {\r
+                       execution.setVariable(prefix+"isErrorMessageException", true)\r
+                       if (returnCode=='404') {\r
+                               exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Unable to update volume group in AAI. Response code: 404")\r
+                       } else {\r
+                               WorkflowException aWorkflowException = exceptionUtil.MapAAIExceptionToWorkflowException(aaiResponseAsString, execution)\r
+                               utils.log("DEBUG", " AAI Adapter Query Failed.  WorkflowException - " + "\n" + aWorkflowException, isDebugEnabled)\r
+                               throw new BpmnError("MSOWorkflowException")\r
+                       }\r
+               }\r
+       }\r
+\r
+\r
+       /**\r
+        * Query AAI Generic VNF\r
+        * @param execution\r
+        * @param isDebugEnabled\r
+        */\r
+       public void callRESTQueryAAIGenericVnf(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(prefix+'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