-/*-
- * ============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