Groovy scripts header correction
[so.git] / bpmn / MSOInfrastructureBPMN / src / main / groovy / org / openecomp / mso / bpmn / infrastructure / scripts / DeleteVfModuleVolumeInfraV1.groovy
1 /*-\r
2  * ============LICENSE_START=======================================================\r
3  * ONAP - SO\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                 setBasicDBAuthHeader(execution, isDebugLogEnabled)\r
136                 \r
137                 logDebug('Request: ' + createVolumeIncoming, isDebugLogEnabled)\r
138         }\r
139 \r
140         public void sendSyncResponse (Execution execution, isDebugEnabled) {\r
141 \r
142                 String volumeRequest = execution.getVariable("DELVfModVol_volumeRequest")\r
143                 utils.log("DEBUG", " DELVfModVol_volumeRequest - " + "\n" + volumeRequest, isDebugEnabled)\r
144                 // RESTResponse (for API Handler (APIH) Reply Task)\r
145                 String deleteVolumeRequest =\r
146                                 """<rest:RESTResponse xmlns:rest="http://schemas.activebpel.org/REST/2007/12/01/aeREST.xsd" statusCode="200">\r
147                 <rest:payload xmlns:rest="http://schemas.activebpel.org/REST/2007/12/01/aeREST.xsd"\r
148                           contentType="text/xml">\r
149                                 ${volumeRequest}\r
150                 </rest:payload>\r
151                        </rest:RESTResponse>""".trim()\r
152 \r
153                 def isVidRequest = execution.getVariable('DELVfModVol_isVidRequest')\r
154                 def syncResponse = ''\r
155 \r
156                 if(isVidRequest) {\r
157                         def serviceInstanceId = execution.getVariable('serviceInstanceId')\r
158                         def volumeGroupId = execution.getVariable('volumeGroupId')\r
159                         def requestId = execution.getVariable('DELVfModVol_requestId')\r
160                         syncResponse = """{"requestReferences":{"instanceId":"${volumeGroupId}","requestId":"${requestId}"}}""".trim()\r
161                 }\r
162                 else {\r
163                         syncResponse = utils.formatXml(deleteVolumeRequest)\r
164                 }\r
165 \r
166                 execution.setVariable('DELVfModVol_syncResponseSent', true)\r
167 \r
168                 sendWorkflowResponse(execution, 200, syncResponse)\r
169         }\r
170 \r
171 \r
172         public void sendSyncError (Execution execution, isDebugEnabled) {\r
173                 WorkflowException we = execution.getVariable('WorkflowException')\r
174                 def errorCode = we?.getErrorCode()\r
175                 def errorMessage = we?.getErrorMessage()\r
176                 //default to 400 since only invalid request will trigger this method\r
177                 sendWorkflowResponse(execution, 400, errorMessage)\r
178         }\r
179 \r
180 \r
181         public void callRESTQueryAAICloudRegion (Execution execution, isDebugEnabled) {\r
182 \r
183                 String cloudRegion = execution.getVariable('DELVfModVol_cloudRegion')\r
184 \r
185                 String aai_endpoint = execution.getVariable("URN_aai_endpoint")\r
186                 AaiUtil aaiUtil = new AaiUtil(this)\r
187                 String aai_uri = aaiUtil.getCloudInfrastructureCloudRegionUri(execution)\r
188                 String queryCloudRegionRequest = "${aai_endpoint}${aai_uri}/" + cloudRegion\r
189                 utils.logAudit(queryCloudRegionRequest)\r
190                 execution.setVariable("DELVfModVol_queryCloudRegionRequest", queryCloudRegionRequest)\r
191                 utils.log("DEBUG", " DELVfModVol_queryCloudRegionRequest - " + "\n" + queryCloudRegionRequest, isDebugEnabled)\r
192 \r
193                 cloudRegion = aaiUtil.getAAICloudReqion(execution,  queryCloudRegionRequest, "PO", cloudRegion)\r
194 \r
195                 ExceptionUtil exceptionUtil = new ExceptionUtil()\r
196 \r
197                 if ((cloudRegion != "ERROR")) {\r
198                         if(execution.getVariable("DELVfModVol_queryCloudRegionReturnCode") == "404"){\r
199                                 execution.setVariable("DELVfModVol_aicCloudRegion", "AAIAIC25")\r
200                         }else{\r
201                                 execution.setVariable("DELVfModVol_aicCloudRegion", cloudRegion)\r
202                         }\r
203                         execution.setVariable("DELVfModVol_cloudRegion", cloudRegion)\r
204                         execution.setVariable("DELVfModVol_isCloudRegionGood", true)\r
205 \r
206                 } else {\r
207                         utils.log("DEBUG", "AAI Query Cloud Region Unsuccessful.", isDebugEnabled)\r
208                         execution.setVariable("DELVfModVol_isCloudRegionGood", false)\r
209                         exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "AAI Query Cloud Region Unsuccessful. Return Code: " + execution.getVariable("DELVfModVol_queryCloudRegionReturnCode"))\r
210                 }\r
211 \r
212                 utils.log("DEBUG", " is Cloud Region Good: " + execution.getVariable("DELVfModVol_isCloudRegionGood"), isDebugEnabled)\r
213         }\r
214 \r
215         /**\r
216          * Query volume group by id\r
217          * @param execution\r
218          */\r
219         public void queryAAIForVolumeGroup(Execution execution, isDebugLogEnabled) {\r
220 \r
221                 ExceptionUtil exceptionUtil = new ExceptionUtil()\r
222 \r
223                 def volumeGroupId = execution.getVariable('DELVfModVol_volumeGroupId')\r
224                 if(volumeGroupId == null) {\r
225                         exceptionUtil.buildAndThrowWorkflowException(execution, 2500, 'volume-group-id is not provided in the request')\r
226                         throw new Exception('volume-group-id is not provided in the request')\r
227                 }\r
228                 String cloudRegion = execution.getVariable('DELVfModVol_aicCloudRegion')\r
229 \r
230                 AaiUtil aaiUtil = new AaiUtil(this)\r
231                 String aaiEndpoint = aaiUtil.getCloudInfrastructureCloudRegionEndpoint(execution)\r
232                 String queryAAIVolumeGroupRequest = aaiEndpoint + '/' + URLEncoder.encode(cloudRegion, "UTF-8") + "/volume-groups/volume-group/" + UriUtils.encode(volumeGroupId, "UTF-8")\r
233 \r
234                 utils.logAudit('Query AAI volume group by ID: ' + queryAAIVolumeGroupRequest)\r
235                 logDebug('Query AAI volume group by ID: ' + queryAAIVolumeGroupRequest, isDebugLogEnabled)\r
236 \r
237                 APIResponse response = aaiUtil.executeAAIGetCall(execution, queryAAIVolumeGroupRequest)\r
238 \r
239                 String returnCode = response.getStatusCode()\r
240                 String aaiResponseAsString = response.getResponseBodyAsString()\r
241                 aaiResponseAsString = StringEscapeUtils.unescapeXml(aaiResponseAsString)\r
242 \r
243                 utils.logAudit("AAI query volume group by id return code: " + returnCode)\r
244                 utils.logAudit("AAI query volume group by id response: " + aaiResponseAsString)\r
245 \r
246                 execution.setVariable("DELVfModVol_queryAAIVolGrpResponse", aaiResponseAsString)\r
247 \r
248                 if (returnCode=='200' || returnCode == '204') {\r
249 \r
250                         def heatStackId = getNodeTextForce(aaiResponseAsString, 'heat-stack-id')\r
251                         execution.setVariable('DELVfModVol_volumeGroupHeatStackId', heatStackId)\r
252 \r
253                         if(hasVfModuleRelationship(aaiResponseAsString)){\r
254                                 utils.log("DEBUG", 'Volume Group ' + volumeGroupId + ' currently in use', isDebugLogEnabled)\r
255                                 exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Volume Group ${volumeGroupId} currently in use - found vf-module relationship.")\r
256                         }\r
257 \r
258                         def volumeGroupTenantId = getTenantIdFromVolumeGroup(aaiResponseAsString)\r
259                         if (volumeGroupTenantId == null) {\r
260                                 utils.log("DEBUG", "Could not find Tenant Id element in Volume Group with Volume Group Id ${volumeGroupId}", isDebugLogEnabled)\r
261                                 exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Could not find Tenant Id element in Volume Group with Volume Group Id ${volumeGroupId}")\r
262                         }\r
263 \r
264                         execution.setVariable('DELVfModVol_volumeGroupTenantId', volumeGroupTenantId)\r
265                         logDebug('Received Tenant Id ' + volumeGroupTenantId + ' from AAI for Volume Group with Volume Group Id ' + volumeGroupId , isDebugLogEnabled)\r
266                 }\r
267                 else {\r
268                         if (returnCode=='404') {\r
269                                 utils.log("DEBUG", "Volume Group ${volumeGroupId} not found in AAI", isDebugLogEnabled)\r
270                                 exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Volume Group ${volumeGroupId} not found in AAI. Response code: 404")\r
271                         }\r
272                         else {\r
273                                 WorkflowException aWorkflowException = exceptionUtil.MapAAIExceptionToWorkflowException(aaiResponseAsString, execution)\r
274                                 throw new BpmnError("MSOWorkflowException")\r
275                         }\r
276                 }\r
277         }\r
278 \r
279         /**\r
280          * Extract the Tenant Id from the Volume Group information returned by AAI.\r
281          *\r
282          * @param volumeGroupXml Volume Group XML returned by AAI.\r
283          * @return the Tenant Id extracted from the Volume Group information. 'null' is returned if\r
284          * the Tenant Id is missing or could not otherwise be extracted.\r
285          */\r
286         private String getTenantIdFromVolumeGroup(String volumeGroupXml) {\r
287                 def Node volumeGroupNode = xmlParser.parseText(volumeGroupXml)\r
288                 def Node relationshipList = utils.getChildNode(volumeGroupNode, 'relationship-list')\r
289                 if (relationshipList != null) {\r
290                         def NodeList relationships = utils.getIdenticalChildren(relationshipList, 'relationship')\r
291                         for (Node relationship in relationships) {\r
292                                 def Node relatedTo = utils.getChildNode(relationship, 'related-to')\r
293                                 if ((relatedTo != null) && (relatedTo.text().equals('tenant'))) {\r
294                                         def NodeList relationshipDataList = utils.getIdenticalChildren(relationship, 'relationship-data')\r
295                                         for (Node relationshipData in relationshipDataList) {\r
296                                                 def Node relationshipKey = utils.getChildNode(relationshipData, 'relationship-key')\r
297                                                 if ((relationshipKey != null) && (relationshipKey.text().equals('tenant.tenant-id'))) {\r
298                                                         def Node relationshipValue = utils.getChildNode(relationshipData, 'relationship-value')\r
299                                                         if (relationshipValue != null) {\r
300                                                                 return relationshipValue.text()\r
301                                                         }\r
302                                                 }\r
303                                         }\r
304                                 }\r
305                         }\r
306                 }\r
307                 return null\r
308         }\r
309 \r
310         private boolean hasVnfRelationship(String volumeGroupXml) {\r
311                 def Node volumeGroupNode = xmlParser.parseText(volumeGroupXml)\r
312                 def Node relationshipList = utils.getChildNode(volumeGroupNode, 'relationship-list')\r
313                 if (relationshipList != null) {\r
314                         def NodeList relationships = utils.getIdenticalChildren(relationshipList, 'relationship')\r
315                         for (Node relationship in relationships) {\r
316                                 def Node relatedTo = utils.getChildNode(relationship, 'related-to')\r
317                                 if ((relatedTo != null) && (relatedTo.text().equals('generic-vnf'))) {\r
318                                         def Node relatedLink = utils.getChildNode(relationship, 'related-link')\r
319                                         if (relatedLink !=null && relatedLink.text() != null){\r
320                                                 return true\r
321                                         }\r
322                                 }\r
323                         }\r
324                 }\r
325                 return false\r
326         }\r
327 \r
328         private boolean hasVfModuleRelationship(String volumeGroupXml) {\r
329                 def Node volumeGroupNode = xmlParser.parseText(volumeGroupXml)\r
330                 def Node relationshipList = utils.getChildNode(volumeGroupNode, 'relationship-list')\r
331                 if (relationshipList != null) {\r
332                         def NodeList relationships = utils.getIdenticalChildren(relationshipList, 'relationship')\r
333                         for (Node relationship in relationships) {\r
334                                 def Node relatedTo = utils.getChildNode(relationship, 'related-to')\r
335                                 if ((relatedTo != null) && (relatedTo.text().equals('vf-module'))) {\r
336                                         def Node relatedLink = utils.getChildNode(relationship, 'related-link')\r
337                                         if (relatedLink !=null && relatedLink.text() != null){\r
338                                                 return true\r
339                                         }\r
340                                 }\r
341                         }\r
342                 }\r
343                 return false\r
344         }\r
345 \r
346         public void prepareVnfAdapterDeleteRequest(Execution execution, isDebugLogEnabled) {\r
347                 def cloudRegion = execution.getVariable('DELVfModVol_cloudRegion')\r
348                 def tenantId = execution.getVariable('DELVfModVol_tenantId')\r
349                 def volumeGroupId = execution.getVariable('DELVfModVol_volumeGroupId')\r
350                 def volumeGroupHeatStackId = execution.getVariable('DELVfModVol_volumeGroupHeatStackId')\r
351                 def requestId = execution.getVariable('DELVfModVol_requestId')\r
352                 def serviceId = execution.getVariable('DELVfModVol_serviceId')\r
353 \r
354                 def messageId = execution.getVariable('DELVfModVol_messageId')\r
355                 def notificationUrl = createCallbackURL(execution, "VNFAResponse", messageId) \r
356                 def useQualifiedHostName = execution.getVariable("URN_mso_use_qualified_host")\r
357                 if ('true'.equals(useQualifiedHostName)) {\r
358                                 notificationUrl = utils.getQualifiedHostNameForCallback(notificationUrl)\r
359                 }\r
360 \r
361                 String vnfAdapterRestRequest = """\r
362                         <deleteVolumeGroupRequest>\r
363                                 <cloudSiteId>${cloudRegion}</cloudSiteId>\r
364                                 <tenantId>${tenantId}</tenantId>\r
365                                 <volumeGroupId>${volumeGroupId}</volumeGroupId>\r
366                                 <volumeGroupStackId>${volumeGroupHeatStackId}</volumeGroupStackId>\r
367                                 <skipAAI>true</skipAAI>\r
368                             <msoRequest>\r
369                                 <requestId>${requestId}</requestId>\r
370                                 <serviceInstanceId>${serviceId}</serviceInstanceId>\r
371                             </msoRequest>\r
372                             <messageId>${messageId}</messageId>\r
373                             <notificationUrl>${notificationUrl}</notificationUrl>\r
374                         </deleteVolumeGroupRequest>\r
375                 """\r
376                 vnfAdapterRestRequest = utils.formatXml(vnfAdapterRestRequest)\r
377                 execution.setVariable('DELVfModVol_deleteVnfARequest', vnfAdapterRestRequest)\r
378                 logDebug('Request for VNFAdapter Rest:\n' + vnfAdapterRestRequest, isDebugLogEnabled)\r
379         }\r
380 \r
381 \r
382         public void deleteVolGrpId(Execution execution, isDebugEnabled) {\r
383 \r
384                 // get variables\r
385                 String queryAAIVolGrpIdResponse = execution.getVariable("DELVfModVol_queryAAIVolGrpResponse")\r
386                 String groupId = utils.getNodeText(queryAAIVolGrpIdResponse, "volume-group-id")\r
387                 String resourceVersion = utils.getNodeText(queryAAIVolGrpIdResponse, "resource-version")\r
388                 String messageId = execution.getVariable('DELVfModVol_messageId')\r
389                 String cloudRegion = execution.getVariable('DELVfModVol_aicCloudRegion')\r
390 \r
391                 AaiUtil aaiUtil = new AaiUtil(this)\r
392                 String aaiEndpoint = aaiUtil.getCloudInfrastructureCloudRegionEndpoint(execution)\r
393                 String deleteAAIVolumeGrpIdRequest = aaiEndpoint + '/' + URLEncoder.encode(cloudRegion, "UTF-8")  + "/volume-groups/volume-group/" +  UriUtils.encode(groupId, "UTF-8")\r
394 \r
395                 if(resourceVersion !=null){\r
396                         deleteAAIVolumeGrpIdRequest = deleteAAIVolumeGrpIdRequest +'?resource-version=' + UriUtils.encode(resourceVersion, 'UTF-8')\r
397                 }\r
398 \r
399                 utils.logAudit('Delete AAI volume group : ' + deleteAAIVolumeGrpIdRequest)\r
400                 utils.log("DEBUG", "Delete AAI volume group : " + deleteAAIVolumeGrpIdRequest, isDebugEnabled)\r
401 \r
402                 APIResponse response = aaiUtil.executeAAIDeleteCall(execution, deleteAAIVolumeGrpIdRequest)\r
403 \r
404                 String returnCode = response.getStatusCode()\r
405                 String aaiResponseAsString = response.getResponseBodyAsString()\r
406                 aaiResponseAsString = StringEscapeUtils.unescapeXml(aaiResponseAsString)\r
407 \r
408                 utils.logAudit("AAI delete volume group return code: " + returnCode)\r
409                 utils.logAudit("AAI delete volume group response: " + aaiResponseAsString)\r
410 \r
411                 ExceptionUtil exceptionUtil = new ExceptionUtil()\r
412                 if (returnCode=='200' || (returnCode == '204')) {\r
413                         utils.log("DEBUG", "Volume group $groupId deleted.", isDebugEnabled)\r
414                 } else {\r
415                         if (returnCode=='404') {\r
416                                 exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Volume group $groupId not found for delete in AAI Response code: 404")\r
417                         } else {\r
418                                 WorkflowException aWorkflowException = exceptionUtil.MapAAIExceptionToWorkflowException(aaiResponseAsString, execution)\r
419                                 throw new BpmnError("MSOWorkflowException")\r
420                         }\r
421                 }\r
422         }\r
423 \r
424 \r
425         public void prepareDBRequest (Execution execution, isDebugLogEnabled) {\r
426 \r
427                 WorkflowException workflowExceptionObj = execution.getVariable("WorkflowException")\r
428                 ExceptionUtil exceptionUtil = new ExceptionUtil();\r
429                 def requestId = execution.getVariable('DELVfModVol_requestId')\r
430                 def volOutputs = execution.getVariable('DELVfModVol_volumeOutputs')\r
431                 def statusMessage = "VolumeGroup successfully deleted"\r
432                 def progress = "100"\r
433                 def requestStatus = "COMPLETE"\r
434 \r
435                 if (workflowExceptionObj != null) {\r
436                         statusMessage = (workflowExceptionObj.getErrorMessage()).replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;")\r
437                         execution.setVariable("DELVfModVol_WorkflowExceptionMessage", statusMessage)\r
438                         execution.setVariable("DELVfModVol_WorkflowExceptionCode", workflowExceptionObj.getErrorCode())\r
439                         requestStatus = "FAILURE"\r
440                         progress = ""\r
441                 }\r
442                 \r
443                 String updateInfraRequest = """\r
444                         <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"\r
445                                         xmlns:req="http://org.openecomp.mso/requestsdb">\r
446                                 <soapenv:Header/>\r
447                                 <soapenv:Body>\r
448                                         <req:updateInfraRequest>\r
449                                                 <requestId>${requestId}</requestId>\r
450                                                 <lastModifiedBy>BPMN</lastModifiedBy>\r
451                                                 <statusMessage>${statusMessage}</statusMessage>\r
452                                                 <requestStatus>${requestStatus}</requestStatus>\r
453                                                 <progress>${progress}</progress>\r
454                                                 <vnfOutputs>${volOutputs}</vnfOutputs>\r
455                                         </req:updateInfraRequest>\r
456                                 </soapenv:Body>\r
457                         </soapenv:Envelope>\r
458                 """\r
459 \r
460                 updateInfraRequest = utils.formatXml(updateInfraRequest)\r
461                 execution.setVariable('DELVfModVol_updateInfraRequest', updateInfraRequest)\r
462                 logDebug('Request for Update Infra Request:\n' + updateInfraRequest, isDebugLogEnabled)\r
463 \r
464         }\r
465 \r
466 \r
467         public void prepareCompletionHandlerRequest (Execution execution, isDebugLogEnabled) {\r
468                 def requestId = execution.getVariable("mso-request-id")\r
469                 def source = execution.getVariable("DELVfModVol_source")\r
470 \r
471                 String msoCompletionRequest =\r
472                         """<aetgt:MsoCompletionRequest xmlns:aetgt="http://org.openecomp/mso/workflow/schema/v1"\r
473                                                         xmlns:ns="http://org.openecomp/mso/request/types/v1">\r
474                                         <request-info xmlns="http://org.openecomp/mso/infra/vnf-request/v1">\r
475                                                 <request-id>${requestId}</request-id>\r
476                                                 <action>DELETE</action>\r
477                                                 <source>${source}</source>\r
478                                         </request-info>\r
479                                         <aetgt:status-message>Volume Group has been deleted successfully.</aetgt:status-message>\r
480                                         <aetgt:mso-bpel-name>BPMN VF Module Volume action: DELETE</aetgt:mso-bpel-name>\r
481                                 </aetgt:MsoCompletionRequest>"""\r
482 \r
483                 String xmlMsoCompletionRequest = utils.formatXml(msoCompletionRequest)\r
484                 execution.setVariable('DELVfModVol_CompleteMsoProcessRequest', xmlMsoCompletionRequest)\r
485                 utils.log("DEBUG", " Overall SUCCESS Response going to CompleteMsoProcess - " + "\n" + xmlMsoCompletionRequest, isDebugLogEnabled)\r
486 \r
487         }\r
488 \r
489 \r
490 \r
491         public void prepareFalloutHandler (Execution execution, isDebugEnabled) {\r
492 \r
493                 execution.setVariable("DELVfModVol_Success", false)\r
494                 String requestId = execution.getVariable("DELVfModVol_requestId")\r
495                 String source = execution.getVariable("DELVfModVol_source")\r
496 \r
497                 WorkflowException workflowExceptionObj = execution.getVariable("WorkflowException")\r
498                 def errorMessage = workflowExceptionObj.getErrorMessage()\r
499                 def errorCode =  workflowExceptionObj.getErrorCode()\r
500 \r
501                 String falloutHandlerRequest =\r
502                     """<aetgt:FalloutHandlerRequest xmlns:aetgt="http://org.openecomp/mso/workflow/schema/v1"\r
503                                                              xmlns:ns="http://org.openecomp/mso/request/types/v1"\r
504                                                              xmlns:wfsch="http://org.openecomp/mso/workflow/schema/v1">\r
505                                    <request-info xmlns="http://org.openecomp/mso/infra/vnf-request/v1">\r
506                                       <request-id>${requestId}</request-id>\r
507                                       <action>DELETE</action>\r
508                                       <source>${source}</source>\r
509                                    </request-info>\r
510                                         <aetgt:WorkflowException>\r
511                                       <aetgt:ErrorMessage>${errorMessage}</aetgt:ErrorMessage>\r
512                                       <aetgt:ErrorCode>${errorCode}</aetgt:ErrorCode>\r
513                                         </aetgt:WorkflowException>\r
514                                 </aetgt:FalloutHandlerRequest>"""\r
515 \r
516                 // Format Response\r
517                 String xmlHandlerRequest = utils.formatXml(falloutHandlerRequest)\r
518                 utils.logAudit(xmlHandlerRequest)\r
519 \r
520                 execution.setVariable("DELVfModVol_FalloutHandlerRequest", xmlHandlerRequest)\r
521                 utils.log("ERROR", "  Overall Error Response going to FalloutHandler: " + "\n" + xmlHandlerRequest, isDebugEnabled)\r
522 \r
523         }\r
524 \r
525 \r
526         /**\r
527          * Create a WorkflowException for the error case where the Tenant Id from\r
528          * AAI did not match the Tenant Id in the incoming request.\r
529          *\r
530          * @param execution The flow's execution instance.\r
531          */\r
532         public void handleTenantIdMismatch(Execution execution, isDebugLogEnabled) {\r
533 \r
534                 def volumeGroupId = execution.getVariable('DELVfModVol_volumeGroupId')\r
535                 def aicCloudRegion = execution.getVariable('DELVfModVol_aicCloudRegion')\r
536                 def tenantId = execution.getVariable('DELVfModVol_tenantId')\r
537                 def volumeGroupTenantId = execution.getVariable('DELVfModVol_volumeGroupTenantId')\r
538 \r
539                 def String errorMessage = 'TenantId ' + tenantId + ' in incoming request does not match Tenant Id ' + volumeGroupTenantId +\r
540                         ' retrieved from AAI for Volume Group Id ' + volumeGroupId\r
541 \r
542                 logError('Error in DeleteVfModuleVolume: ' + errorMessage)\r
543 \r
544                 ExceptionUtil exceptionUtil = new ExceptionUtil()\r
545                 exceptionUtil.buildWorkflowException(execution, 5000, errorMessage)\r
546 \r
547         }\r
548 \r
549 }\r