7bda7b4fe3763eb395fc036208983c1951cb6fba
[so.git] / bpmn / MSOInfrastructureBPMN / src / main / groovy / org / openecomp / mso / bpmn / infrastructure / scripts / DeleteVfModuleVolumeInfraV1.groovy
1 /*-\r
2  * ============LICENSE_START=======================================================\r
3  * OPENECOMP - MSO\r
4  * ================================================================================\r
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.\r
6  * ================================================================================\r
7  * Licensed under the Apache License, Version 2.0 (the "License");\r
8  * you may not use this file except in compliance with the License.\r
9  * You may obtain a copy of the License at\r
10  * \r
11  *      http://www.apache.org/licenses/LICENSE-2.0\r
12  * \r
13  * Unless required by applicable law or agreed to in writing, software\r
14  * distributed under the License is distributed on an "AS IS" BASIS,\r
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
16  * See the License for the specific language governing permissions and\r
17  * limitations under the License.\r
18  * ============LICENSE_END=========================================================\r
19  */\r
20 \r
21 package org.openecomp.mso.bpmn.infrastructure.scripts;\r
22 \r
23 import groovy.json.JsonSlurper\r
24 \r
25 import java.util.concurrent.ExecutionException;\r
26 \r
27 import org.springframework.web.util.UriUtils\r
28 import org.camunda.bpm.engine.delegate.BpmnError\r
29 import org.camunda.bpm.engine.runtime.Execution\r
30 import org.apache.commons.lang3.*\r
31 import org.openecomp.mso.bpmn.common.scripts.AaiUtil;\r
32 import org.openecomp.mso.bpmn.common.scripts.AbstractServiceTaskProcessor;\r
33 import org.openecomp.mso.bpmn.common.scripts.ExceptionUtil;\r
34 import org.openecomp.mso.bpmn.common.scripts.VidUtils;\r
35 import org.openecomp.mso.bpmn.core.WorkflowException\r
36 import org.openecomp.mso.rest.APIResponse\r
37 \r
38 /**\r
39  * This groovy class supports the <class>DeleteVfModuleVolume.bpmn</class> process.\r
40  */\r
41 public class DeleteVfModuleVolumeInfraV1 extends AbstractServiceTaskProcessor {\r
42 \r
43         private XmlParser xmlParser = new XmlParser()\r
44         /**\r
45          * This method is executed during the preProcessRequest task of the <class>DeleteVfModuleVolume.bpmn</class> process.\r
46          * @param execution\r
47          */\r
48         public InitializeProcessVariables(Execution execution){\r
49                 execution.setVariable('prefix', 'DELVfModVol_')\r
50                 execution.setVariable("DELVfModVol_volumeRequest", null)\r
51                 execution.setVariable('DELVfModVol_requestInfo', null)\r
52                 execution.setVariable('DELVfModVol_requestId', null)\r
53                 execution.setVariable('DELVfModVol_source', null)\r
54                 execution.setVariable('DELVfModVol_volumeInputs', null)\r
55                 execution.setVariable('DELVfModVol_volumeOutputs', null)\r
56                 execution.setVariable('DELVfModVol_volumeGroupId', null)\r
57                 execution.setVariable('DELVfModVol_vnfType', null)\r
58                 execution.setVariable('DELVfModVol_serviceId', null)\r
59                 execution.setVariable('DELVfModVol_cloudRegion', null)\r
60                 execution.setVariable('DELVfModVol_tenantId', null)\r
61                 execution.setVariable('DELVfModVol_volumeParams', null)\r
62                 execution.setVariable('DELVfModVol_volumeGroupHeatStackId', null)\r
63                 execution.setVariable('DELVfModVol_volumeGroupTenantId', null)\r
64                 execution.setVariable("DELVfModVol_queryAAIVolGrpResponse", null)\r
65                 execution.setVariable('DELVfModVol_messageId', null)\r
66                 execution.setVariable('DELVfModVol_deleteVnfARequest', null)\r
67                 execution.setVariable('DELVfModVol_updateInfraRequest', null)\r
68                 execution.setVariable('DELVfModVol_CompleteMsoProcessRequest', null)\r
69                 execution.setVariable('DELVfModVol_WorkflowException', null)\r
70                 execution.setVariable('DELVfModVol_TransactionSuccessIndicator', false)\r
71                 execution.setVariable("DELVfModVol_isErrorMessageException", false)\r
72                 execution.setVariable('DELVfModVol_syncResponseSent', false)\r
73         }\r
74 \r
75         /**\r
76          * Perform initial processing, such as request validation, initialization of variables, etc.\r
77          * * @param execution\r
78          */\r
79         public void preProcessRequest (Execution execution) {\r
80                 def isDebugEnabled=execution.getVariable("isDebugLogEnabled")\r
81                 preProcessRequest(execution, isDebugEnabled)\r
82         }\r
83 \r
84         /**\r
85          * This method is executed during the preProcessRequest task of the <class>DeleteVfModuleVolume.bpmn</class> process.\r
86          * @param execution\r
87          */\r
88         public void preProcessRequest (Execution execution, isDebugLogEnabled) {\r
89 \r
90                 InitializeProcessVariables(execution)\r
91 \r
92                 String createVolumeIncoming = validateRequest(execution)\r
93                 utils.logAudit(createVolumeIncoming)\r
94 \r
95                 // check if request is xml or json\r
96                 try {\r
97                         def jsonSlurper = new JsonSlurper()\r
98                         Map reqMap = jsonSlurper.parseText(createVolumeIncoming)\r
99                         utils.log("DEBUG", " Request is in JSON format.", isDebugLogEnabled)\r
100 \r
101                         def serviceInstanceId = execution.getVariable('serviceInstanceId')\r
102                         def volumeGroupId = execution.getVariable('volumeGroupId')\r
103                         def vidUtils = new VidUtils(this)\r
104                         createVolumeIncoming = vidUtils.createXmlVolumeRequest(reqMap, 'DELETE_VF_MODULE_VOL', serviceInstanceId, volumeGroupId)\r
105                         execution.setVariable("DELVfModVol_isVidRequest", true)\r
106                 }\r
107                 catch(groovy.json.JsonException je) {\r
108                         utils.log("DEBUG", " Request is in XML format.", isDebugLogEnabled)\r
109                         // assume request is in XML format - proceed as usual to process XML request\r
110                 }\r
111 \r
112                 String request = utils.getNodeXml(createVolumeIncoming, "volume-request").drop(38).trim().replace("tag0:","").replace(":tag0","")\r
113                 execution.setVariable("DELVfModVol_volumeRequest", request)\r
114 \r
115                 def requestInfo = getRequiredNodeXml(execution, request, 'request-info')\r
116                 execution.setVariable('DELVfModVol_requestInfo', requestInfo)\r
117                 String requestId = execution.getVariable("mso-request-id")\r
118                 if (requestId == null || requestId == "") {\r
119                         requestId = getRequiredNodeText(execution, requestInfo, 'request-id')\r
120                 }\r
121                 execution.setVariable('DELVfModVol_requestId', requestId)\r
122                 execution.setVariable('DELVfModVol_source', getNodeTextForce(requestInfo, 'source'))\r
123 \r
124                 def volumeInputs = getRequiredNodeXml(execution, request, 'volume-inputs')\r
125                 execution.setVariable('DELVfModVol_volumeInputs', volumeInputs)\r
126                 execution.setVariable('DELVfModVol_volumeGroupId', getRequiredNodeText(execution, volumeInputs, 'volume-group-id'))\r
127                 execution.setVariable('DELVfModVol_vnfType', getRequiredNodeText(execution, volumeInputs, 'vnf-type'))\r
128                 execution.setVariable('DELVfModVol_serviceId', utils.getNodeText1(volumeInputs, 'service-id'))\r
129                 execution.setVariable('DELVfModVol_tenantId', getRequiredNodeText(execution, volumeInputs, 'tenant-id'))\r
130                 execution.setVariable('DELVfModVol_messageId', UUID.randomUUID().toString())\r
131                 execution.setVariable('DELVfModVol_volumeOutputs', utils.getNodeXml(request, 'volume-outputs', false))\r
132                 execution.setVariable('DELVfModVol_volumeParams', utils.getNodeXml(request, 'volume-params'))\r
133                 execution.setVariable('DELVfModVol_cloudRegion', utils.getNodeText1(request, 'aic-cloud-region'))\r
134 \r
135                 try {\r
136                         // Catalog DB headers Authorization\r
137                         String basicAuthValueDB = execution.getVariable("URN_mso_adapters_db_auth")\r
138                         utils.log("DEBUG", " Obtained BasicAuth userid password for Catalog DB adapter: " + basicAuthValueDB, isDebugLogEnabled)\r
139                         \r
140                         def encodedString = utils.getBasicAuth(basicAuthValueDB, execution.getVariable("URN_mso_msoKey"))\r
141                         execution.setVariable("BasicAuthHeaderValueDB",encodedString)\r
142                 } catch (IOException ex) {\r
143                         String dataErrorMessage = " Unable to encode Catalog DB user/password string - " + ex.getMessage()\r
144                         utils.log("DEBUG", dataErrorMessage, isDebugLogEnabled)\r
145                         exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage)\r
146                 }\r
147                 \r
148                 logDebug('Request: ' + createVolumeIncoming, isDebugLogEnabled)\r
149         }\r
150 \r
151         public void sendSyncResponse (Execution execution, isDebugEnabled) {\r
152 \r
153                 String volumeRequest = execution.getVariable("DELVfModVol_volumeRequest")\r
154                 utils.log("DEBUG", " DELVfModVol_volumeRequest - " + "\n" + volumeRequest, isDebugEnabled)\r
155                 // RESTResponse (for API Handler (APIH) Reply Task)\r
156                 String deleteVolumeRequest =\r
157                                 """<rest:RESTResponse xmlns:rest="http://schemas.activebpel.org/REST/2007/12/01/aeREST.xsd" statusCode="200">\r
158                 <rest:payload xmlns:rest="http://schemas.activebpel.org/REST/2007/12/01/aeREST.xsd"\r
159                           contentType="text/xml">\r
160                                 ${volumeRequest}\r
161                 </rest:payload>\r
162                        </rest:RESTResponse>""".trim()\r
163 \r
164                 def isVidRequest = execution.getVariable('DELVfModVol_isVidRequest')\r
165                 def syncResponse = ''\r
166 \r
167                 if(isVidRequest) {\r
168                         def serviceInstanceId = execution.getVariable('serviceInstanceId')\r
169                         def volumeGroupId = execution.getVariable('volumeGroupId')\r
170                         def requestId = execution.getVariable('DELVfModVol_requestId')\r
171                         syncResponse = """{"requestReferences":{"instanceId":"${volumeGroupId}","requestId":"${requestId}"}}""".trim()\r
172                 }\r
173                 else {\r
174                         syncResponse = utils.formatXml(deleteVolumeRequest)\r
175                 }\r
176 \r
177                 execution.setVariable('DELVfModVol_syncResponseSent', true)\r
178 \r
179                 sendWorkflowResponse(execution, 200, syncResponse)\r
180         }\r
181 \r
182 \r
183         public void sendSyncError (Execution execution, isDebugEnabled) {\r
184                 WorkflowException we = execution.getVariable('WorkflowException')\r
185                 def errorCode = we?.getErrorCode()\r
186                 def errorMessage = we?.getErrorMessage()\r
187                 //default to 400 since only invalid request will trigger this method\r
188                 sendWorkflowResponse(execution, 400, errorMessage)\r
189         }\r
190 \r
191 \r
192         public void callRESTQueryAAICloudRegion (Execution execution, isDebugEnabled) {\r
193 \r
194                 String cloudRegion = execution.getVariable('DELVfModVol_cloudRegion')\r
195 \r
196                 String aai_endpoint = execution.getVariable("URN_aai_endpoint")\r
197                 AaiUtil aaiUtil = new AaiUtil(this)\r
198                 String aai_uri = aaiUtil.getCloudInfrastructureCloudRegionUri(execution)\r
199                 String queryCloudRegionRequest = "${aai_endpoint}${aai_uri}/" + cloudRegion\r
200                 utils.logAudit(queryCloudRegionRequest)\r
201                 execution.setVariable("DELVfModVol_queryCloudRegionRequest", queryCloudRegionRequest)\r
202                 utils.log("DEBUG", " DELVfModVol_queryCloudRegionRequest - " + "\n" + queryCloudRegionRequest, isDebugEnabled)\r
203 \r
204                 cloudRegion = aaiUtil.getAAICloudReqion(execution,  queryCloudRegionRequest, "PO", cloudRegion)\r
205 \r
206                 ExceptionUtil exceptionUtil = new ExceptionUtil()\r
207 \r
208                 if ((cloudRegion != "ERROR")) {\r
209                         if(execution.getVariable("DELVfModVol_queryCloudRegionReturnCode") == "404"){\r
210                                 execution.setVariable("DELVfModVol_aicCloudRegion", "AAIAIC25")\r
211                         }else{\r
212                                 execution.setVariable("DELVfModVol_aicCloudRegion", cloudRegion)\r
213                         }\r
214                         execution.setVariable("DELVfModVol_cloudRegion", cloudRegion)\r
215                         execution.setVariable("DELVfModVol_isCloudRegionGood", true)\r
216 \r
217                 } else {\r
218                         utils.log("DEBUG", "AAI Query Cloud Region Unsuccessful.", isDebugEnabled)\r
219                         execution.setVariable("DELVfModVol_isCloudRegionGood", false)\r
220                         exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "AAI Query Cloud Region Unsuccessful. Return Code: " + execution.getVariable("DELVfModVol_queryCloudRegionReturnCode"))\r
221                 }\r
222 \r
223                 utils.log("DEBUG", " is Cloud Region Good: " + execution.getVariable("DELVfModVol_isCloudRegionGood"), isDebugEnabled)\r
224         }\r
225 \r
226         /**\r
227          * Query volume group by id\r
228          * @param execution\r
229          */\r
230         public void queryAAIForVolumeGroup(Execution execution, isDebugLogEnabled) {\r
231 \r
232                 ExceptionUtil exceptionUtil = new ExceptionUtil()\r
233 \r
234                 def volumeGroupId = execution.getVariable('DELVfModVol_volumeGroupId')\r
235                 if(volumeGroupId == null) {\r
236                         exceptionUtil.buildAndThrowWorkflowException(execution, 2500, 'volume-group-id is not provided in the request')\r
237                         throw new Exception('volume-group-id is not provided in the request')\r
238                 }\r
239                 String cloudRegion = execution.getVariable('DELVfModVol_aicCloudRegion')\r
240 \r
241                 AaiUtil aaiUtil = new AaiUtil(this)\r
242                 String aaiEndpoint = aaiUtil.getCloudInfrastructureCloudRegionEndpoint(execution)\r
243                 String queryAAIVolumeGroupRequest = aaiEndpoint + '/' + URLEncoder.encode(cloudRegion, "UTF-8") + "/volume-groups/volume-group/" + UriUtils.encode(volumeGroupId, "UTF-8")\r
244 \r
245                 utils.logAudit('Query AAI volume group by ID: ' + queryAAIVolumeGroupRequest)\r
246                 logDebug('Query AAI volume group by ID: ' + queryAAIVolumeGroupRequest, isDebugLogEnabled)\r
247 \r
248                 APIResponse response = aaiUtil.executeAAIGetCall(execution, queryAAIVolumeGroupRequest)\r
249 \r
250                 String returnCode = response.getStatusCode()\r
251                 String aaiResponseAsString = response.getResponseBodyAsString()\r
252                 aaiResponseAsString = StringEscapeUtils.unescapeXml(aaiResponseAsString)\r
253 \r
254                 utils.logAudit("AAI query volume group by id return code: " + returnCode)\r
255                 utils.logAudit("AAI query volume group by id response: " + aaiResponseAsString)\r
256 \r
257                 execution.setVariable("DELVfModVol_queryAAIVolGrpResponse", aaiResponseAsString)\r
258 \r
259                 if (returnCode=='200' || returnCode == '204') {\r
260 \r
261                         def heatStackId = getNodeTextForce(aaiResponseAsString, 'heat-stack-id')\r
262                         execution.setVariable('DELVfModVol_volumeGroupHeatStackId', heatStackId)\r
263 \r
264                         if(hasVfModuleRelationship(aaiResponseAsString)){\r
265                                 utils.log("DEBUG", 'Volume Group ' + volumeGroupId + ' currently in use', isDebugLogEnabled)\r
266                                 exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Volume Group ${volumeGroupId} currently in use - found vf-module relationship.")\r
267                         }\r
268 \r
269                         def volumeGroupTenantId = getTenantIdFromVolumeGroup(aaiResponseAsString)\r
270                         if (volumeGroupTenantId == null) {\r
271                                 utils.log("DEBUG", "Could not find Tenant Id element in Volume Group with Volume Group Id ${volumeGroupId}", isDebugLogEnabled)\r
272                                 exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Could not find Tenant Id element in Volume Group with Volume Group Id ${volumeGroupId}")\r
273                         }\r
274 \r
275                         execution.setVariable('DELVfModVol_volumeGroupTenantId', volumeGroupTenantId)\r
276                         logDebug('Received Tenant Id ' + volumeGroupTenantId + ' from AAI for Volume Group with Volume Group Id ' + volumeGroupId , isDebugLogEnabled)\r
277                 }\r
278                 else {\r
279                         if (returnCode=='404') {\r
280                                 utils.log("DEBUG", "Volume Group ${volumeGroupId} not found in AAI", isDebugLogEnabled)\r
281                                 exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Volume Group ${volumeGroupId} not found in AAI. Response code: 404")\r
282                         }\r
283                         else {\r
284                                 WorkflowException aWorkflowException = exceptionUtil.MapAAIExceptionToWorkflowException(aaiResponseAsString, execution)\r
285                                 throw new BpmnError("MSOWorkflowException")\r
286                         }\r
287                 }\r
288         }\r
289 \r
290         /**\r
291          * Extract the Tenant Id from the Volume Group information returned by AAI.\r
292          *\r
293          * @param volumeGroupXml Volume Group XML returned by AAI.\r
294          * @return the Tenant Id extracted from the Volume Group information. 'null' is returned if\r
295          * the Tenant Id is missing or could not otherwise be extracted.\r
296          */\r
297         private String getTenantIdFromVolumeGroup(String volumeGroupXml) {\r
298                 def Node volumeGroupNode = xmlParser.parseText(volumeGroupXml)\r
299                 def Node relationshipList = utils.getChildNode(volumeGroupNode, 'relationship-list')\r
300                 if (relationshipList != null) {\r
301                         def NodeList relationships = utils.getIdenticalChildren(relationshipList, 'relationship')\r
302                         for (Node relationship in relationships) {\r
303                                 def Node relatedTo = utils.getChildNode(relationship, 'related-to')\r
304                                 if ((relatedTo != null) && (relatedTo.text().equals('tenant'))) {\r
305                                         def NodeList relationshipDataList = utils.getIdenticalChildren(relationship, 'relationship-data')\r
306                                         for (Node relationshipData in relationshipDataList) {\r
307                                                 def Node relationshipKey = utils.getChildNode(relationshipData, 'relationship-key')\r
308                                                 if ((relationshipKey != null) && (relationshipKey.text().equals('tenant.tenant-id'))) {\r
309                                                         def Node relationshipValue = utils.getChildNode(relationshipData, 'relationship-value')\r
310                                                         if (relationshipValue != null) {\r
311                                                                 return relationshipValue.text()\r
312                                                         }\r
313                                                 }\r
314                                         }\r
315                                 }\r
316                         }\r
317                 }\r
318                 return null\r
319         }\r
320 \r
321         private boolean hasVnfRelationship(String volumeGroupXml) {\r
322                 def Node volumeGroupNode = xmlParser.parseText(volumeGroupXml)\r
323                 def Node relationshipList = utils.getChildNode(volumeGroupNode, 'relationship-list')\r
324                 if (relationshipList != null) {\r
325                         def NodeList relationships = utils.getIdenticalChildren(relationshipList, 'relationship')\r
326                         for (Node relationship in relationships) {\r
327                                 def Node relatedTo = utils.getChildNode(relationship, 'related-to')\r
328                                 if ((relatedTo != null) && (relatedTo.text().equals('generic-vnf'))) {\r
329                                         def Node relatedLink = utils.getChildNode(relationship, 'related-link')\r
330                                         if (relatedLink !=null && relatedLink.text() != null){\r
331                                                 return true\r
332                                         }\r
333                                 }\r
334                         }\r
335                 }\r
336                 return false\r
337         }\r
338 \r
339         private boolean hasVfModuleRelationship(String volumeGroupXml) {\r
340                 def Node volumeGroupNode = xmlParser.parseText(volumeGroupXml)\r
341                 def Node relationshipList = utils.getChildNode(volumeGroupNode, 'relationship-list')\r
342                 if (relationshipList != null) {\r
343                         def NodeList relationships = utils.getIdenticalChildren(relationshipList, 'relationship')\r
344                         for (Node relationship in relationships) {\r
345                                 def Node relatedTo = utils.getChildNode(relationship, 'related-to')\r
346                                 if ((relatedTo != null) && (relatedTo.text().equals('vf-module'))) {\r
347                                         def Node relatedLink = utils.getChildNode(relationship, 'related-link')\r
348                                         if (relatedLink !=null && relatedLink.text() != null){\r
349                                                 return true\r
350                                         }\r
351                                 }\r
352                         }\r
353                 }\r
354                 return false\r
355         }\r
356 \r
357         public void prepareVnfAdapterDeleteRequest(Execution execution, isDebugLogEnabled) {\r
358                 def cloudRegion = execution.getVariable('DELVfModVol_cloudRegion')\r
359                 def tenantId = execution.getVariable('DELVfModVol_tenantId')\r
360                 def volumeGroupId = execution.getVariable('DELVfModVol_volumeGroupId')\r
361                 def volumeGroupHeatStackId = execution.getVariable('DELVfModVol_volumeGroupHeatStackId')\r
362                 def requestId = execution.getVariable('DELVfModVol_requestId')\r
363                 def serviceId = execution.getVariable('DELVfModVol_serviceId')\r
364 \r
365                 def messageId = execution.getVariable('DELVfModVol_messageId')\r
366                 def notificationUrl = createCallbackURL(execution, "VNFAResponse", messageId) \r
367                 def useQualifiedHostName = execution.getVariable("URN_mso_use_qualified_host")\r
368                 if ('true'.equals(useQualifiedHostName)) {\r
369                                 notificationUrl = utils.getQualifiedHostNameForCallback(notificationUrl)\r
370                 }\r
371 \r
372                 String vnfAdapterRestRequest = """\r
373                         <deleteVolumeGroupRequest>\r
374                                 <cloudSiteId>${cloudRegion}</cloudSiteId>\r
375                                 <tenantId>${tenantId}</tenantId>\r
376                                 <volumeGroupId>${volumeGroupId}</volumeGroupId>\r
377                                 <volumeGroupStackId>${volumeGroupHeatStackId}</volumeGroupStackId>\r
378                                 <skipAAI>true</skipAAI>\r
379                             <msoRequest>\r
380                                 <requestId>${requestId}</requestId>\r
381                                 <serviceInstanceId>${serviceId}</serviceInstanceId>\r
382                             </msoRequest>\r
383                             <messageId>${messageId}</messageId>\r
384                             <notificationUrl>${notificationUrl}</notificationUrl>\r
385                         </deleteVolumeGroupRequest>\r
386                 """\r
387                 vnfAdapterRestRequest = utils.formatXml(vnfAdapterRestRequest)\r
388                 execution.setVariable('DELVfModVol_deleteVnfARequest', vnfAdapterRestRequest)\r
389                 logDebug('Request for VNFAdapter Rest:\n' + vnfAdapterRestRequest, isDebugLogEnabled)\r
390         }\r
391 \r
392 \r
393         public void deleteVolGrpId(Execution execution, isDebugEnabled) {\r
394 \r
395                 // get variables\r
396                 String queryAAIVolGrpIdResponse = execution.getVariable("DELVfModVol_queryAAIVolGrpResponse")\r
397                 String groupId = utils.getNodeText(queryAAIVolGrpIdResponse, "volume-group-id")\r
398                 String resourceVersion = utils.getNodeText(queryAAIVolGrpIdResponse, "resource-version")\r
399                 String messageId = execution.getVariable('DELVfModVol_messageId')\r
400                 String cloudRegion = execution.getVariable('DELVfModVol_aicCloudRegion')\r
401 \r
402                 AaiUtil aaiUtil = new AaiUtil(this)\r
403                 String aaiEndpoint = aaiUtil.getCloudInfrastructureCloudRegionEndpoint(execution)\r
404                 String deleteAAIVolumeGrpIdRequest = aaiEndpoint + '/' + URLEncoder.encode(cloudRegion, "UTF-8")  + "/volume-groups/volume-group/" +  UriUtils.encode(groupId, "UTF-8")\r
405 \r
406                 if(resourceVersion !=null){\r
407                         deleteAAIVolumeGrpIdRequest = deleteAAIVolumeGrpIdRequest +'?resource-version=' + UriUtils.encode(resourceVersion, 'UTF-8')\r
408                 }\r
409 \r
410                 utils.logAudit('Delete AAI volume group : ' + deleteAAIVolumeGrpIdRequest)\r
411                 utils.log("DEBUG", "Delete AAI volume group : " + deleteAAIVolumeGrpIdRequest, isDebugEnabled)\r
412 \r
413                 APIResponse response = aaiUtil.executeAAIDeleteCall(execution, deleteAAIVolumeGrpIdRequest)\r
414 \r
415                 String returnCode = response.getStatusCode()\r
416                 String aaiResponseAsString = response.getResponseBodyAsString()\r
417                 aaiResponseAsString = StringEscapeUtils.unescapeXml(aaiResponseAsString)\r
418 \r
419                 utils.logAudit("AAI delete volume group return code: " + returnCode)\r
420                 utils.logAudit("AAI delete volume group response: " + aaiResponseAsString)\r
421 \r
422                 ExceptionUtil exceptionUtil = new ExceptionUtil()\r
423                 if (returnCode=='200' || (returnCode == '204')) {\r
424                         utils.log("DEBUG", "Volume group $groupId deleted.", isDebugEnabled)\r
425                 } else {\r
426                         if (returnCode=='404') {\r
427                                 exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Volume group $groupId not found for delete in AAI Response code: 404")\r
428                         } else {\r
429                                 WorkflowException aWorkflowException = exceptionUtil.MapAAIExceptionToWorkflowException(aaiResponseAsString, execution)\r
430                                 throw new BpmnError("MSOWorkflowException")\r
431                         }\r
432                 }\r
433         }\r
434 \r
435 \r
436         public void prepareDBRequest (Execution execution, isDebugLogEnabled) {\r
437 \r
438                 WorkflowException workflowExceptionObj = execution.getVariable("WorkflowException")\r
439 \r
440                 def requestId = execution.getVariable('DELVfModVol_requestId')\r
441                 def volOutputs = execution.getVariable('DELVfModVol_volumeOutputs')\r
442                 def statusMessage = "VolumeGroup successfully deleted"\r
443                 def progress = "100"\r
444                 def requestStatus = "COMPLETE"\r
445 \r
446                 if (workflowExceptionObj != null) {\r
447                         statusMessage = (workflowExceptionObj.getErrorMessage()).replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;")\r
448                         execution.setVariable("DELVfModVol_WorkflowExceptionMessage", statusMessage)\r
449                         execution.setVariable("DELVfModVol_WorkflowExceptionCode", workflowExceptionObj.getErrorCode())\r
450                         requestStatus = "FAILURE"\r
451                         progress = ""\r
452                 }\r
453 \r
454                 String updateInfraRequest = """\r
455                         <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"\r
456                                         xmlns:req="http://org.openecomp.mso/requestsdb">\r
457                                 <soapenv:Header/>\r
458                                 <soapenv:Body>\r
459                                         <req:updateInfraRequest>\r
460                                                 <requestId>${requestId}</requestId>\r
461                                                 <lastModifiedBy>BPMN</lastModifiedBy>\r
462                                                 <statusMessage>${statusMessage}</statusMessage>\r
463                                                 <requestStatus>${requestStatus}</requestStatus>\r
464                                                 <progress>${progress}</progress>\r
465                                                 <vnfOutputs>${volOutputs}</vnfOutputs>\r
466                                         </req:updateInfraRequest>\r
467                                 </soapenv:Body>\r
468                         </soapenv:Envelope>\r
469                 """\r
470 \r
471                 updateInfraRequest = utils.formatXml(updateInfraRequest)\r
472                 execution.setVariable('DELVfModVol_updateInfraRequest', updateInfraRequest)\r
473                 logDebug('Request for Update Infra Request:\n' + updateInfraRequest, isDebugLogEnabled)\r
474 \r
475         }\r
476 \r
477 \r
478         public void prepareCompletionHandlerRequest (Execution execution, isDebugLogEnabled) {\r
479                 def requestId = execution.getVariable("mso-request-id")\r
480                 def source = execution.getVariable("DELVfModVol_source")\r
481 \r
482                 String msoCompletionRequest =\r
483                         """<aetgt:MsoCompletionRequest xmlns:aetgt="http://org.openecomp/mso/workflow/schema/v1"\r
484                                                         xmlns:ns="http://org.openecomp/mso/request/types/v1">\r
485                                         <request-info xmlns="http://org.openecomp/mso/infra/vnf-request/v1">\r
486                                                 <request-id>${requestId}</request-id>\r
487                                                 <action>DELETE</action>\r
488                                                 <source>${source}</source>\r
489                                         </request-info>\r
490                                         <aetgt:status-message>Volume Group has been deleted successfully.</aetgt:status-message>\r
491                                         <aetgt:mso-bpel-name>BPMN VF Module Volume action: DELETE</aetgt:mso-bpel-name>\r
492                                 </aetgt:MsoCompletionRequest>"""\r
493 \r
494                 String xmlMsoCompletionRequest = utils.formatXml(msoCompletionRequest)\r
495                 execution.setVariable('DELVfModVol_CompleteMsoProcessRequest', xmlMsoCompletionRequest)\r
496                 utils.log("DEBUG", " Overall SUCCESS Response going to CompleteMsoProcess - " + "\n" + xmlMsoCompletionRequest, isDebugLogEnabled)\r
497 \r
498         }\r
499 \r
500 \r
501 \r
502         public void prepareFalloutHandler (Execution execution, isDebugEnabled) {\r
503 \r
504                 execution.setVariable("DELVfModVol_Success", false)\r
505                 String requestId = execution.getVariable("DELVfModVol_requestId")\r
506                 String source = execution.getVariable("DELVfModVol_source")\r
507 \r
508                 WorkflowException workflowExceptionObj = execution.getVariable("WorkflowException")\r
509                 def errorMessage = workflowExceptionObj.getErrorMessage()\r
510                 def errorCode =  workflowExceptionObj.getErrorCode()\r
511 \r
512                 String falloutHandlerRequest =\r
513                     """<aetgt:FalloutHandlerRequest xmlns:aetgt="http://org.openecomp/mso/workflow/schema/v1"\r
514                                                              xmlns:ns="http://org.openecomp/mso/request/types/v1"\r
515                                                              xmlns:wfsch="http://org.openecomp/mso/workflow/schema/v1">\r
516                                    <request-info xmlns="http://org.openecomp/mso/infra/vnf-request/v1">\r
517                                       <request-id>${requestId}</request-id>\r
518                                       <action>DELETE</action>\r
519                                       <source>${source}</source>\r
520                                    </request-info>\r
521                                         <aetgt:WorkflowException>\r
522                                       <aetgt:ErrorMessage>${errorMessage}</aetgt:ErrorMessage>\r
523                                       <aetgt:ErrorCode>${errorCode}</aetgt:ErrorCode>\r
524                                         </aetgt:WorkflowException>\r
525                                 </aetgt:FalloutHandlerRequest>"""\r
526 \r
527                 // Format Response\r
528                 String xmlHandlerRequest = utils.formatXml(falloutHandlerRequest)\r
529                 utils.logAudit(xmlHandlerRequest)\r
530 \r
531                 execution.setVariable("DELVfModVol_FalloutHandlerRequest", xmlHandlerRequest)\r
532                 utils.log("ERROR", "  Overall Error Response going to FalloutHandler: " + "\n" + xmlHandlerRequest, isDebugEnabled)\r
533 \r
534         }\r
535 \r
536 \r
537         /**\r
538          * Create a WorkflowException for the error case where the Tenant Id from\r
539          * AAI did not match the Tenant Id in the incoming request.\r
540          *\r
541          * @param execution The flow's execution instance.\r
542          */\r
543         public void handleTenantIdMismatch(Execution execution, isDebugLogEnabled) {\r
544 \r
545                 def volumeGroupId = execution.getVariable('DELVfModVol_volumeGroupId')\r
546                 def aicCloudRegion = execution.getVariable('DELVfModVol_aicCloudRegion')\r
547                 def tenantId = execution.getVariable('DELVfModVol_tenantId')\r
548                 def volumeGroupTenantId = execution.getVariable('DELVfModVol_volumeGroupTenantId')\r
549 \r
550                 def String errorMessage = 'TenantId ' + tenantId + ' in incoming request does not match Tenant Id ' + volumeGroupTenantId +\r
551                         ' retrieved from AAI for Volume Group Id ' + volumeGroupId\r
552 \r
553                 logError('Error in DeleteVfModuleVolume: ' + errorMessage)\r
554 \r
555                 ExceptionUtil exceptionUtil = new ExceptionUtil()\r
556                 exceptionUtil.buildWorkflowException(execution, 5000, errorMessage)\r
557 \r
558         }\r
559 \r
560 }\r