ffe122aed6655148526fe6da1ee6a33a1c0ca122
[so.git] / bpmn / MSOInfrastructureBPMN / src / main / groovy / org / openecomp / mso / bpmn / infrastructure / scripts / UpdateVfModuleVolumeInfraV1.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.camunda.bpm.engine.delegate.BpmnError\r
28 import org.camunda.bpm.engine.runtime.Execution\r
29 import org.apache.commons.lang3.*\r
30 import org.springframework.web.util.UriUtils\r
31 import org.openecomp.mso.bpmn.common.scripts.AaiUtil;\r
32 import org.openecomp.mso.bpmn.common.scripts.ExceptionUtil;\r
33 import org.openecomp.mso.bpmn.common.scripts.VfModuleBase;\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 import org.openecomp.mso.rest.RESTClient\r
38 import org.openecomp.mso.rest.RESTConfig\r
39 \r
40 class UpdateVfModuleVolumeInfraV1 extends VfModuleBase {\r
41         \r
42         /**\r
43          * Initialize the flow's variables.\r
44          * \r
45          * @param execution The flow's execution instance.\r
46          */\r
47         private void initProcessVariables(Execution execution) {\r
48                 execution.setVariable('prefix', 'UPDVfModVol_')\r
49                 execution.setVariable('UPDVfModVol_Request', null)\r
50                 execution.setVariable('UPDVfModVol_requestInfo', null)\r
51                 execution.setVariable('UPDVfModVol_requestId', null)\r
52                 execution.setVariable('UPDVfModVol_source', null)\r
53                 execution.setVariable('UPDVfModVol_volumeInputs', null)\r
54                 execution.setVariable('UPDVfModVol_volumeGroupId', null)\r
55                 execution.setVariable('UPDVfModVol_vnfType', null)\r
56                 execution.setVariable('UPDVfModVol_serviceId', null)\r
57                 execution.setVariable('UPDVfModVol_aicCloudRegion', null)\r
58                 execution.setVariable('UPDVfModVol_tenantId', null)\r
59                 execution.setVariable('UPDVfModVol_volumeParams', null)\r
60                 execution.setVariable('UPDVfModVol_volumeGroupHeatStackId', null)\r
61                 execution.setVariable('UPDVfModVol_volumeGroupTenantId', null)\r
62                 execution.setVariable('UpdateVfModuleVolumeSuccessIndicator', false)\r
63         }\r
64         \r
65 \r
66         /**\r
67          * Perform initial processing, such as request validation, initialization of variables, etc.\r
68          * * @param execution\r
69          */\r
70         public void preProcessRequest (Execution execution) {\r
71                 def isDebugEnabled=execution.getVariable("isDebugLogEnabled")\r
72                 preProcessRequest(execution, isDebugEnabled)\r
73         }\r
74         \r
75         public void preProcessRequest(Execution execution, isDebugLogEnabled) {\r
76 \r
77                 initProcessVariables(execution)\r
78                 String jsonRequest = validateRequest(execution)\r
79                 \r
80                 def request = ""\r
81                 \r
82                 try {\r
83                         def jsonSlurper = new JsonSlurper()\r
84                         Map reqMap = jsonSlurper.parseText(jsonRequest)\r
85                         \r
86                         def serviceInstanceId = execution.getVariable('serviceInstanceId')\r
87                         def volumeGroupId = execution.getVariable('volumeGroupId')\r
88                         //def vnfId = execution.getVariable('vnfId')\r
89                         \r
90                         def vidUtils = new VidUtils(this)\r
91                         request = vidUtils.createXmlVolumeRequest(reqMap, 'UPDATE_VF_MODULE_VOL', serviceInstanceId, volumeGroupId)\r
92                         \r
93                         execution.setVariable('UPDVfModVol_Request', request)\r
94                         execution.setVariable("UPDVfModVol_isVidRequest", true)\r
95                         \r
96                         //need to get persona-model-id aka model-invariantId to use later to validate vf-module relation in AAI\r
97                         \r
98                         def modelInvariantId = reqMap.requestDetails.modelInfo.modelInvariantId ?: ''\r
99                         execution.setVariable('UPDVfModVol_modelInvariantId', modelInvariantId)\r
100                 \r
101                         utils.log("DEBUG", "XML request:\n" + request, isDebugLogEnabled)\r
102                 }\r
103                 catch(groovy.json.JsonException je) {\r
104                         utils.log("DEBUG", " Request is in XML format.", isDebugLogEnabled)\r
105                         // assume request is in XML format - proceed as usual to process XML request\r
106                 }\r
107                 \r
108                 def requestId = execution.getVariable('mso-request-id')\r
109                 \r
110                 def requestInfo = getRequiredNodeXml(execution, request, 'request-info')\r
111                 execution.setVariable('UPDVfModVol_requestInfo', requestInfo)\r
112                 execution.setVariable('UPDVfModVol_requestId', requestId)\r
113                 //execution.setVariable('UPDVfModVol_requestId', getRequiredNodeText(execution, requestInfo, 'request-id'))\r
114                 execution.setVariable('UPDVfModVol_source', getNodeTextForce(requestInfo, 'source'))\r
115                 \r
116                 def volumeInputs = getRequiredNodeXml(execution, request, 'volume-inputs')\r
117                 execution.setVariable('UPDVfModVol_volumeInputs', volumeInputs)\r
118                 execution.setVariable('UPDVfModVol_volumeGroupId', getRequiredNodeText(execution, volumeInputs, 'volume-group-id'))\r
119                 execution.setVariable('UPDVfModVol_vnfType', getRequiredNodeText(execution, volumeInputs, 'vnf-type'))\r
120                 execution.setVariable('UPDVfModVol_vnfVersion', getRequiredNodeText(execution, volumeInputs, 'asdc-service-model-version'))\r
121                 execution.setVariable('UPDVfModVol_serviceId', utils.getNodeText1(volumeInputs, 'service-id'))\r
122                 execution.setVariable('UPDVfModVol_aicCloudRegion', getRequiredNodeText(execution, volumeInputs, 'aic-cloud-region'))\r
123                 execution.setVariable('UPDVfModVol_tenantId', getRequiredNodeText(execution, volumeInputs, 'tenant-id'))\r
124                 //execution.setVariable('UPDVfModVol_modelCustomizationId', getRequiredNodeText(execution, volumeInputs, 'model-customization-id'))\r
125 \r
126                 try {\r
127                         // Catalog DB headers Authorization\r
128                         String basicAuthValueDB = execution.getVariable("URN_mso_adapters_db_auth")\r
129                         utils.log("DEBUG", " Obtained BasicAuth userid password for Catalog DB adapter: " + basicAuthValueDB, isDebugLogEnabled)\r
130                         \r
131                         def encodedString = utils.getBasicAuth(basicAuthValueDB, execution.getVariable("URN_mso_msoKey"))\r
132                         execution.setVariable("BasicAuthHeaderValueDB",encodedString)\r
133                 } catch (IOException ex) {\r
134                         String dataErrorMessage = " Unable to encode Catalog DB user/password string - " + ex.getMessage()\r
135                         utils.log("DEBUG", dataErrorMessage, isDebugLogEnabled)\r
136                         exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage)\r
137                 }\r
138                 def volumeParams = utils.getNodeXml(request, 'volume-params')\r
139                 execution.setVariable('UPDVfModVol_volumeParams', volumeParams)\r
140         }\r
141 \r
142         /**\r
143          * Prepare and send the synchronous response.\r
144          * \r
145          * @param execution The flow's execution instance.\r
146          */\r
147         public void sendSynchResponse(Execution execution, isDebugLogEnabled) {\r
148 \r
149                 def requestInfo = execution.getVariable('UPDVfModVol_requestInfo')\r
150                 def requestId = execution.getVariable('UPDVfModVol_requestId')\r
151                 def source = execution.getVariable('UPDVfModVol_source')\r
152                 def progress = getNodeTextForce(requestInfo, 'progress')\r
153                 if (progress.isEmpty()) {\r
154                         progress = '0'\r
155                 }\r
156                 def startTime = getNodeTextForce(requestInfo, 'start-time')\r
157                 if (startTime.isEmpty()) {\r
158                         startTime = System.currentTimeMillis()\r
159                 }\r
160                 def volumeInputs = execution.getVariable('UPDVfModVol_volumeInputs')\r
161                 \r
162                 String xmlSyncResponse = """\r
163                         <volume-request xmlns="http://org.openecomp/mso/infra/vnf-request/v1">\r
164                                 <request-info>\r
165                                         <request-id>${requestId}</request-id>\r
166                                         <action>UPDATE_VF_MODULE_VOL</action>\r
167                                         <request-status>IN_PROGRESS</request-status>\r
168                                         <progress>${progress}</progress>\r
169                                         <start-time>${startTime}</start-time>\r
170                                         <source>${source}</source>\r
171                                 </request-info>\r
172                                 ${volumeInputs}\r
173                         </volume-request>\r
174                 """\r
175 \r
176                 def syncResponse = ''\r
177                 def isVidRequest = execution.getVariable('UPDVfModVol_isVidRequest')\r
178                 \r
179                 if(isVidRequest) {\r
180                         def volumeGroupId = execution.getVariable('volumeGroupId')\r
181                         syncResponse = """{"requestReferences":{"instanceId":"${volumeGroupId}","requestId":"${requestId}"}}""".trim()\r
182                 } \r
183                 else {\r
184                         syncResponse = utils.formatXml(xmlSyncResponse)\r
185                 }\r
186                 \r
187                 logDebug('Sync response: ' + syncResponse, isDebugLogEnabled)\r
188                 execution.setVariable('UPDVfModVol_syncResponseSent', true)\r
189                 sendWorkflowResponse(execution, 200, syncResponse)\r
190         }\r
191         \r
192         /**\r
193          * Prepare a Request for querying AAI for Volume Group information using the\r
194          * Volume Group Id and Aic Cloud Region.\r
195          * @param execution The flow's execution instance.\r
196          */\r
197         public void queryAAIForVolumeGroup(Execution execution, isDebugLogEnabled) {\r
198 \r
199                 def volumeGroupId = execution.getVariable('UPDVfModVol_volumeGroupId')\r
200                 def aicCloudRegion = execution.getVariable('UPDVfModVol_aicCloudRegion')\r
201 \r
202                 AaiUtil aaiUtil = new AaiUtil(this)\r
203                 String aaiEndpoint = aaiUtil.getCloudInfrastructureCloudRegionEndpoint(execution)\r
204                 String queryAAIVolumeGroupRequest = aaiEndpoint + '/' + URLEncoder.encode(aicCloudRegion, "UTF-8") + "/volume-groups/volume-group/" + UriUtils.encode(volumeGroupId, "UTF-8")\r
205                 \r
206                 utils.logAudit('Query AAI volume group by ID: ' + queryAAIVolumeGroupRequest)\r
207                 logDebug('Query AAI volume group by ID: ' + queryAAIVolumeGroupRequest, isDebugLogEnabled)\r
208                 \r
209                 APIResponse response = aaiUtil.executeAAIGetCall(execution, queryAAIVolumeGroupRequest)\r
210                 \r
211                 String returnCode = response.getStatusCode()\r
212                 String aaiResponseAsString = response.getResponseBodyAsString()\r
213                 aaiResponseAsString = StringEscapeUtils.unescapeXml(aaiResponseAsString)\r
214                 \r
215                 utils.logAudit("AAI query volume group by id return code: " + returnCode)\r
216                 utils.logAudit("AAI query volume group by id response: " + aaiResponseAsString)\r
217                 \r
218                 logDebug("AAI Volume Group return code: " + returnCode, isDebugLogEnabled)\r
219                 logDebug("AAI Volume Group response: " + aaiResponseAsString, isDebugLogEnabled)\r
220                 \r
221                 ExceptionUtil exceptionUtil = new ExceptionUtil()\r
222                 \r
223                 if ((returnCode == '200') || (returnCode == '204')) {\r
224                         \r
225                         execution.setVariable('UPDVfModVol_aaiVolumeGroupResponse', aaiResponseAsString)\r
226                         //def heatStackId = getNodeTextForce(aaiResponseAsString, 'heat-stack-id')\r
227                         //execution.setVariable('UPDVfModVol_volumeGroupHeatStackId', heatStackId)\r
228                         \r
229                         def volumeGroupTenantId = getTenantIdFromVolumeGroup(aaiResponseAsString)\r
230                         if (volumeGroupTenantId == null) {\r
231                                 exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Could not find Tenant Id element in Volume Group with Volume Group Id " + volumeGroupId\r
232                                         + ", AIC Cloud Region " + aicCloudRegion)\r
233                         }\r
234                         execution.setVariable('UPDVfModVol_volumeGroupTenantId', volumeGroupTenantId)\r
235                         logDebug("Received Tenant Id " + volumeGroupTenantId + " from AAI for Volume Group with Volume Group Id " + volumeGroupId + ", AIC Cloud Region " + aicCloudRegion, isDebugLogEnabled)\r
236 \r
237                         def relatedVfModuleLink = getRelatedVfModuleRelatedLink(aaiResponseAsString)\r
238                         logDebug("Related VF Module link: " + relatedVfModuleLink, isDebugLogEnabled)\r
239                         execution.setVariable('UPDVfModVol_relatedVfModuleLink', relatedVfModuleLink)\r
240                         \r
241                 } \r
242                 else if (returnCode == '404') {\r
243                         exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Volume Group " + volumeGroupId + " not found at AAI")\r
244                 } \r
245                 else {\r
246                         WorkflowException aWorkflowException = exceptionUtil.MapAAIExceptionToWorkflowException(aaiResponseAsString, execution)\r
247                         throw new BpmnError("MSOWorkflowException")\r
248                 }\r
249         }\r
250         \r
251         /**\r
252          * Query AAI service instance\r
253          * @param execution\r
254          * @param isDebugEnabled\r
255          */\r
256         public void queryAAIForGenericVnf(Execution execution, isDebugEnabled) {\r
257                 \r
258                 def vnfId = execution.getVariable('vnfId')\r
259                 \r
260                 AaiUtil aaiUtil = new AaiUtil(this)\r
261                 String aaiEndpoint = aaiUtil.getNetworkGenericVnfEndpoint(execution)\r
262                 def String queryAAIRequest = aaiEndpoint + "/" + UriUtils.encode(vnfId, "UTF-8")\r
263                 \r
264                 utils.logAudit("AAI query generic vnf request: " + queryAAIRequest)\r
265                 \r
266                 APIResponse response = aaiUtil.executeAAIGetCall(execution, queryAAIRequest)\r
267                 \r
268                 String returnCode = response.getStatusCode()\r
269                 String aaiResponseAsString = response.getResponseBodyAsString()\r
270                 aaiResponseAsString = StringEscapeUtils.unescapeXml(aaiResponseAsString)\r
271                 \r
272                 utils.logAudit("AAI query generic vnf return code: " + returnCode)\r
273                 utils.logAudit("AAI query generic vnf response: " + aaiResponseAsString)\r
274 \r
275                 ExceptionUtil exceptionUtil = new ExceptionUtil()\r
276                 \r
277                 if (returnCode=='200') {\r
278                         utils.log("DEBUG", 'Generic vnf ' + vnfId + ' found in AAI.', isDebugEnabled)\r
279                         execution.setVariable('UPDVfModVol_AAIQueryGenericVfnResponse', aaiResponseAsString)\r
280                 } else {\r
281                         if (returnCode=='404') {\r
282                                 def message = 'Generic vnf ' + vnfId + ' was not found in AAI. Return code: 404.'\r
283                                 utils.log("DEBUG", message, isDebugEnabled)\r
284                                 exceptionUtil.buildAndThrowWorkflowException(execution, 2500, message)\r
285                         } else {\r
286                                 WorkflowException aWorkflowException = exceptionUtil.MapAAIExceptionToWorkflowException(aaiResponseAsString, execution)\r
287                                 throw new BpmnError("MSOWorkflowException")\r
288                         }\r
289                 }\r
290         }\r
291         \r
292         /**\r
293          * Query AAI for VF Module using vf-module-id\r
294          * @param execution\r
295          * @param isDebugLogEnabled\r
296          */\r
297         public void queryAAIForVfModule(Execution execution, isDebugLogEnabled) {\r
298                 \r
299                         AaiUtil aaiUtil = new AaiUtil(this)\r
300                         String queryAAIVfModuleRequest = execution.getVariable('UPDVfModVol_relatedVfModuleLink')\r
301                         execution.setVariable('UPDVfModVol_personaModelId', '')\r
302                         \r
303                         utils.logAudit('Query AAI VF Module: ' + queryAAIVfModuleRequest)\r
304                         logDebug('Query AAI VF Module: ' + queryAAIVfModuleRequest, isDebugLogEnabled)\r
305                         \r
306                         APIResponse response = aaiUtil.executeAAIGetCall(execution, queryAAIVfModuleRequest)\r
307                         \r
308                         String returnCode = response.getStatusCode()\r
309                         String aaiResponseAsString = response.getResponseBodyAsString()\r
310                         aaiResponseAsString = StringEscapeUtils.unescapeXml(aaiResponseAsString)\r
311                         \r
312                         utils.logAudit("AAI query vf-module: " + returnCode)\r
313                         utils.logAudit("AAI query vf-module response: " + aaiResponseAsString)\r
314                         \r
315                         logDebug("AAI query vf-module:: " + returnCode, isDebugLogEnabled)\r
316                         logDebug("AAI query vf-module response: " + aaiResponseAsString, isDebugLogEnabled)\r
317                         \r
318                         ExceptionUtil exceptionUtil = new ExceptionUtil()\r
319                         \r
320                         if ((returnCode == '200') || (returnCode == '204')) {\r
321                                 def personaModelId =  utils.getNodeText1(aaiResponseAsString, 'persona-model-id')\r
322                                 execution.setVariable('UPDVfModVol_personaModelId', personaModelId)\r
323                         }\r
324                         else if (returnCode == '404') {\r
325                                 exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "VF Module not found at AAI")\r
326                         }\r
327                         else {\r
328                                 WorkflowException aWorkflowException = exceptionUtil.MapAAIExceptionToWorkflowException(aaiResponseAsString, execution)\r
329                                 throw new BpmnError("MSOWorkflowException")\r
330                         }\r
331                 }\r
332         /**\r
333          * \r
334          */\r
335         public String getRelatedVfModuleRelatedLink(xml) {\r
336                 def list = new XmlSlurper().parseText(xml)\r
337                 def vfModuleRelationship = list.'**'.find { node -> node.'related-to'.text() == 'vf-module'     }\r
338                 return vfModuleRelationship?.'related-link'?.text() ?: ''\r
339         }\r
340         \r
341         /**\r
342          * Prepare a Request for invoking the VnfAdapterRest subflow to do\r
343          * a Volume Group update.\r
344          *\r
345          * @param execution The flow's execution instance.\r
346          */\r
347         public void prepVnfAdapterRest(Execution execution, isDebugLogEnabled) {\r
348                 \r
349                 def aicCloudRegion = execution.getVariable('UPDVfModVol_aicCloudRegion')\r
350                 def tenantId = execution.getVariable('UPDVfModVol_tenantId')\r
351                 def volumeGroupId = execution.getVariable('UPDVfModVol_volumeGroupId')\r
352                 \r
353                 def aaiVolumeGroupResponse = execution.getVariable('UPDVfModVol_aaiVolumeGroupResponse')\r
354                 def volumeGroupHeatStackId = getNodeTextForce(aaiVolumeGroupResponse, 'heat-stack-id')\r
355                 def volumeGroupName = getNodeTextForce(aaiVolumeGroupResponse, 'volume-group-name')\r
356                 def modelCustomizationId = getNodeTextForce(aaiVolumeGroupResponse, 'vf-module-persona-model-customization-id')\r
357                 \r
358                 def vnfType = execution.getVariable('UPDVfModVol_vnfType')\r
359                 def vnfVersion = execution.getVariable('UPDVfModVol_vnfVersion')\r
360                 \r
361                 def aaiGenericVnfResponse = execution.getVariable('UPDVfModVol_AAIQueryGenericVfnResponse')\r
362                 def vnfId = utils.getNodeText1(aaiGenericVnfResponse, 'vnf-id')\r
363                 def vnfName = utils.getNodeText1(aaiGenericVnfResponse, 'vnf-name')\r
364 \r
365                 \r
366                 def volumeParamsXml = execution.getVariable('UPDVfModVol_volumeParams')\r
367                 def volumeGroupParams = transformVolumeParamsToEntries(volumeParamsXml)\r
368                 \r
369                 def requestId = execution.getVariable('UPDVfModVol_requestId')\r
370                 def serviceId = execution.getVariable('UPDVfModVol_serviceId')\r
371                 \r
372                 def messageId = execution.getVariable('mso-request-id') + '-' + System.currentTimeMillis()\r
373                 def notificationUrl = createCallbackURL(execution, "VNFAResponse", messageId)\r
374                 def useQualifiedHostName = execution.getVariable("URN_mso_use_qualified_host")\r
375                 if ('true'.equals(useQualifiedHostName)) {\r
376                                 notificationUrl = utils.getQualifiedHostNameForCallback(notificationUrl)\r
377                 }\r
378 \r
379                 String vnfAdapterRestRequest = """\r
380                         <updateVolumeGroupRequest>\r
381                                 <cloudSiteId>${aicCloudRegion}</cloudSiteId>\r
382                                 <tenantId>${tenantId}</tenantId>\r
383                                 <vnfId>${vnfId}</vnfId>\r
384                                 <vnfName>${vnfName}</vnfName>\r
385                                 <volumeGroupId>${volumeGroupId}</volumeGroupId>\r
386                                 <volumeGroupName>${volumeGroupName}</volumeGroupName>\r
387                                 <volumeGroupStackId>${volumeGroupHeatStackId}</volumeGroupStackId>\r
388                                 <vnfType>${vnfType}</vnfType>\r
389                                 <vnfVersion>${vnfVersion}</vnfVersion>\r
390                                 <vfModuleType></vfModuleType>\r
391                                 <modelCustomizationUuid>${modelCustomizationId}</modelCustomizationUuid>\r
392                                 <volumeGroupParams>\r
393                                         <entry>\r
394                                                 <key>vnf_id</key>\r
395                                                 <value>${vnfId}</value>\r
396                                         </entry>\r
397                                         <entry>\r
398                                                 <key>vnf_name</key>\r
399                                                 <value>${vnfName}</value>\r
400                                         </entry>\r
401                                         <entry>\r
402                                                 <key>vf_module_id</key>\r
403                                                 <value>${volumeGroupId}</value>\r
404                                         </entry>\r
405                                         <entry>\r
406                                                 <key>vf_module_name</key>\r
407                                                 <value>${volumeGroupName}</value>\r
408                                         </entry>\r
409                                         ${volumeGroupParams}\r
410                             </volumeGroupParams>\r
411                                 <skipAAI>true</skipAAI>\r
412                             <msoRequest>\r
413                                 <requestId>${requestId}</requestId>\r
414                                 <serviceInstanceId>${serviceId}</serviceInstanceId>\r
415                             </msoRequest>\r
416                             <messageId>${messageId}</messageId>\r
417                             <notificationUrl>${notificationUrl}</notificationUrl>\r
418                         </updateVolumeGroupRequest>\r
419                 """\r
420                 vnfAdapterRestRequest = utils.formatXml(vnfAdapterRestRequest)\r
421                 execution.setVariable('UPDVfModVol_vnfAdapterRestRequest', vnfAdapterRestRequest)\r
422                 logDebug('Request for VNFAdapter Rest:\n' + vnfAdapterRestRequest, isDebugLogEnabled)\r
423         }\r
424         \r
425         /**\r
426          * Prepare a Request for updating the DB for this Infra request.\r
427          *\r
428          * @param execution The flow's execution instance.\r
429          */\r
430         public void prepDbInfraDbRequest(Execution execution, isDebugLogEnabled) {\r
431 \r
432                 def requestId = execution.getVariable('UPDVfModVol_requestId')\r
433                 \r
434                 String updateInfraRequest = """\r
435                         <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"\r
436                                         xmlns:req="http://org.openecomp.mso/requestsdb">\r
437                                 <soapenv:Header/>\r
438                                 <soapenv:Body>\r
439                                         <req:updateInfraRequest>\r
440                                                 <requestId>${requestId}</requestId>\r
441                                                 <lastModifiedBy>BPEL</lastModifiedBy>\r
442                                                 <requestStatus>COMPLETE</requestStatus>\r
443                                                 <progress>100</progress>\r
444                                         </req:updateInfraRequest>\r
445                                 </soapenv:Body>\r
446                         </soapenv:Envelope>\r
447                 """\r
448 \r
449                 updateInfraRequest = utils.formatXml(updateInfraRequest)\r
450                 execution.setVariable('UPDVfModVol_updateInfraRequest', updateInfraRequest)\r
451                 logDebug('Request for Update Infra Request:\n' + updateInfraRequest, isDebugLogEnabled)\r
452         }\r
453         \r
454         /**\r
455          * Build a "CompletionHandler" request.\r
456          * @param execution The flow's execution instance.\r
457          */\r
458         public void prepCompletionHandlerRequest(Execution execution, requestId, action, source, isDebugLogEnabled) {\r
459 \r
460                 String content = """\r
461                 <aetgt:MsoCompletionRequest xmlns:aetgt="http://org.openecomp/mso/workflow/schema/v1"\r
462                                         xmlns:ns="http://org.openecomp/mso/request/types/v1">\r
463                         <request-info xmlns="http://org.openecomp/mso/infra/vnf-request/v1">\r
464                                 <request-id>${requestId}</request-id>\r
465                                 <action>CREATE</action>\r
466                                 <source>${source}</source>\r
467                         </request-info>\r
468                         <aetgt:mso-bpel-name>BPMN VF Module Volume action: UPDATE</aetgt:mso-bpel-name>\r
469                 </aetgt:MsoCompletionRequest>           \r
470                 """\r
471 \r
472                 content = utils.formatXml(content)\r
473                 logDebug('Request for Completion Handler:\n' + content, isDebugLogEnabled)\r
474                 execution.setVariable('UPDVfModVol_CompletionHandlerRequest', content)\r
475         }\r
476         \r
477 \r
478         /**\r
479          * Build a "FalloutHandler" request.\r
480          * @param execution The flow's execution instance.\r
481          */\r
482         public void prepFalloutHandler(Execution execution, isDebugLogEnabled) {\r
483                 \r
484                 def requestInfo = execution.getVariable('UPDVfModVol_requestInfo')\r
485                 \r
486                 def WorkflowException workflowException = execution.getVariable("WorkflowException")\r
487                 def errorResponseCode = workflowException.getErrorCode()\r
488                 def errorResponseMsg = workflowException.getErrorMessage()\r
489                 def encErrorResponseMsg = ""\r
490                 if (errorResponseMsg != null) {\r
491                         encErrorResponseMsg = errorResponseMsg.replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;")\r
492                 }\r
493 \r
494                 String content = """\r
495                         <sdncadapterworkflow:FalloutHandlerRequest xmlns:sdncadapterworkflow="http://org.openecomp/mso/workflow/schema/v1"\r
496                                         xmlns:reqtype="http://org.openecomp/mso/request/types/v1"\r
497                                         xmlns:msoservtypes="http://org.openecomp/mso/request/types/v1"\r
498                                         xmlns:structuredtypes="http://org.openecomp/mso/structured/types/v1">\r
499                                 ${requestInfo}\r
500                                 <sdncadapterworkflow:WorkflowException>\r
501                                         <sdncadapterworkflow:ErrorMessage>${encErrorResponseMsg}</sdncadapterworkflow:ErrorMessage>\r
502                                         <sdncadapterworkflow:ErrorCode>${errorResponseCode}</sdncadapterworkflow:ErrorCode>\r
503                                 </sdncadapterworkflow:WorkflowException>        \r
504                         </sdncadapterworkflow:FalloutHandlerRequest>\r
505                 """\r
506                 content = utils.formatXml(content)\r
507                 logDebug('Request for Fallout Handler:\n' + content, isDebugLogEnabled)\r
508                 execution.setVariable('UPDVfModVol_FalloutHandlerRequest', content)\r
509         }\r
510         \r
511         /**\r
512          * Create a WorkflowException for the error case where the Tenant Id from\r
513          * AAI did not match the Tenant Id in the incoming request.\r
514          * @param execution The flow's execution instance.\r
515          */\r
516         public void handleTenantIdMismatch(Execution execution, isDebugLogEnabled) {\r
517                 \r
518                 def volumeGroupId = execution.getVariable('UPDVfModVol_volumeGroupId')\r
519                 def aicCloudRegion = execution.getVariable('UPDVfModVol_aicCloudRegion')\r
520                 def tenantId = execution.getVariable('UPDVfModVol_tenantId')\r
521                 def volumeGroupTenantId = execution.getVariable('UPDVfModVol_volumeGroupTenantId')\r
522                 \r
523                 def String errorMessage = "TenantId " + tenantId + " in incoming request does not match Tenant Id " + volumeGroupTenantId +\r
524                         " retrieved from AAI for Volume Group Id " + volumeGroupId + ", AIC Cloud Region " + aicCloudRegion \r
525                 \r
526                 ExceptionUtil exceptionUtil = new ExceptionUtil()\r
527                 logError('Error in UpdateVfModuleVol: ' + errorMessage)\r
528                 exceptionUtil.buildAndThrowWorkflowException(execution, 2500, errorMessage)\r
529         }\r
530         \r
531         /**\r
532          * Create a WorkflowException for the error case where the Personal Model Id from\r
533          * AAI did not match the model invariant ID in the incoming request.\r
534          * @param execution The flow's execution instance.\r
535          */\r
536         public void handlePersonaModelIdMismatch(Execution execution, isDebugLogEnabled) {\r
537                 \r
538                 def modelInvariantId = execution.getVariable('UPDVfModVol_modelInvariantId')\r
539                 def personaModelId = execution.getVariable('UPDVfModVol_personaModelId')\r
540                 \r
541                 def String errorMessage = "Model Invariant ID " + modelInvariantId + " in incoming request does not match persona model ID " + personaModelId +\r
542                         " retrieved from AAI for Volume Group Id "\r
543                 \r
544                 ExceptionUtil exceptionUtil = new ExceptionUtil()\r
545                 logError('Error in UpdateVfModuleVol: ' + errorMessage)\r
546                 exceptionUtil.buildAndThrowWorkflowException(execution, 2500, errorMessage)\r
547         }\r
548         \r
549 }\r