Remove unnecessary use of Calendar.getInstance()
[so.git] / bpmn / MSOGammaBPMN / src / main / groovy / com / att / bpm / scripts / DeleteNetworkInstanceInfra.groovy
1 /*-
2  * ============LICENSE_START=======================================================
3  * OPENECOMP - MSO
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 package com.att.bpm.scripts;
22
23 import org.openecomp.mso.bpmn.core.WorkflowException
24 import org.openecomp.mso.bpmn.core.json.JsonUtils;
25 import org.openecomp.mso.rest.APIResponse
26 import org.openecomp.mso.rest.RESTClient
27 import org.openecomp.mso.rest.RESTConfig
28
29 import java.util.UUID;
30
31 import org.camunda.bpm.engine.delegate.BpmnError
32 import org.camunda.bpm.engine.runtime.Execution
33 import org.apache.commons.lang3.*
34 import org.apache.commons.codec.binary.Base64;
35 import org.springframework.web.util.UriUtils
36
37 import groovy.xml.XmlUtil
38 import groovy.json.*
39
40 public class DeleteNetworkInstanceInfra extends AbstractServiceTaskProcessor {
41         String Prefix="DELNWKI_"
42         ExceptionUtil exceptionUtil = new ExceptionUtil()
43         JsonUtils jsonUtil = new JsonUtils()
44         VidUtils vidUtils = new VidUtils(this)
45
46         public InitializeProcessVariables(Execution execution){
47                 /* Initialize all the process variables in this block */
48
49                 execution.setVariable("DELNWKI_DeleteNetworkInstanceInfraJsonRequest", "")
50                 execution.setVariable("DELNWKI_networkRequest", "")
51                 execution.setVariable("DELNWKI_networkRESTRequest", "")
52                 execution.setVariable("DELNWKI_CompleteMsoProcessRequest", "")
53                 execution.setVariable("DELNWKI_FalloutHandlerRequest", "")
54                 execution.setVariable("DELNWKI_isSilentSuccess", false)
55                 execution.setVariable("DELNWKI_Success", false)
56                 execution.setVariable("DELNWKI_isPONR", false)    // Point-of-no-return, means, rollback is not needed
57
58                 execution.setVariable("DELNWKI_requestId", "")
59                 execution.setVariable("DELNWKI_source", "")
60                 execution.setVariable("DELNWKI_networkInputs", "")
61
62                 execution.setVariable("DELNWKI_queryAAIRequest","")
63                 execution.setVariable("DELNWKI_queryAAIResponse", "")
64                 execution.setVariable("DELNWKI_aaiReturnCode", "")
65                 execution.setVariable("DELNWKI_isAAIGood", false)
66                 execution.setVariable("DELNWKI_isVfRelationshipExist", false)
67
68                 // AAI query Cloud Region
69                 execution.setVariable("DELNWKI_queryCloudRegionRequest","")
70                 execution.setVariable("DELNWKI_queryCloudRegionReturnCode","")
71                 execution.setVariable("DELNWKI_queryCloudRegionResponse","")
72                 execution.setVariable("DELNWKI_cloudRegionPo","")
73                 execution.setVariable("DELNWKI_cloudRegionSdnc","")
74
75                 execution.setVariable("DELNWKI_deleteNetworkRequest", "")
76                 execution.setVariable("DELNWKI_deleteNetworkResponse", "")
77                 execution.setVariable("DELNWKI_networkReturnCode", "")
78
79                 execution.setVariable("DELNWKI_deleteSDNCRequest", "")
80                 execution.setVariable("DELNWKI_deleteSDNCResponse", "")
81                 execution.setVariable("DELNWKI_rollbackSDNCRequest", "")
82                 execution.setVariable("DELNWKI_rollbackSDNCResponse", "")
83                 execution.setVariable("DELNWKI_sdncReturnCode", "")
84                 execution.setVariable("DELNWKI_rollbackSDNCReturnCode", "")
85                 execution.setVariable("DELNWKI_isSdncRollbackNeeded", false)
86                 execution.setVariable("DELNWKI_sdncResponseSuccess", false)
87
88         }
89
90         // **************************************************
91         //     Pre or Prepare Request Section
92         // **************************************************
93
94         public void preProcessRequest (Execution execution) {
95                 def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
96                 execution.setVariable("prefix",Prefix)
97
98                 utils.log("DEBUG", " ***** Inside preProcessRequest() DeleteNetworkV2 Request ***** ", isDebugEnabled)
99
100                 // initialize flow variables
101                 InitializeProcessVariables(execution)
102
103                 // get incoming message/input
104                 String deleteNetworkJsonIncoming = execution.getVariable("bpmnRequest")
105                 utils.logAudit(deleteNetworkJsonIncoming)
106
107                 try {
108                         def prettyJson = JsonOutput.prettyPrint(deleteNetworkJsonIncoming.toString())
109                         utils.log("DEBUG", " Incoming message formatted . . . : " + '\n' + prettyJson, isDebugEnabled)
110
111                 } catch (Exception ex) {
112                         String dataErrorMessage = " Invalid json format Request - " + ex.getMessage()
113                         utils.log("DEBUG", dataErrorMessage, isDebugEnabled)
114                         exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage)
115                 }
116
117                 // prepare messageId
118                 String messageId = execution.getVariable("DELNWKI_messageId") // test scenario
119                 if (messageId == null || messageId == "") {
120                         messageId = UUID.randomUUID()
121                         utils.log("DEBUG", " DELNWKI_messageId, random generated: " + messageId, isDebugEnabled)
122                 } else {
123                         utils.log("DEBUG", " DELNWKI_messageId, pre-assigned: " + messageId, isDebugEnabled)
124                 }
125                 execution.setVariable("DELNWKI_messageId", messageId)
126
127                 // PO Authorization Info / headers Authorization=
128                 String basicAuthValuePO = execution.getVariable("URN_mso_adapters_po_auth")
129                 utils.log("DEBUG", " Obtained BasicAuth userid password for PO/SDNC adapter: " + basicAuthValuePO, isDebugEnabled)
130                 try {
131                         def encodedString = utils.getBasicAuth(basicAuthValuePO, execution.getVariable("URN_mso_msoKey"))
132                         execution.setVariable("BasicAuthHeaderValuePO",encodedString)
133                         execution.setVariable("BasicAuthHeaderValueSDNC", encodedString)
134
135                 } catch (IOException ex) {
136                         String dataErrorMessage = " Unable to encode PO/SDNC user/password string - " + ex.getMessage()
137                         utils.log("DEBUG", dataErrorMessage, isDebugEnabled)
138                         exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage)
139                 }
140
141                 try {
142
143                         execution.setVariable("DELNWKI_DeleteNetworkInstanceInfraJsonRequest", deleteNetworkJsonIncoming)
144
145                         // recreate the xml network-request
146                         String networkRequest =  vidUtils.createXmlNetworkRequestInfra(execution, deleteNetworkJsonIncoming)
147                         execution.setVariable("DELNWKI_networkRequest", networkRequest)
148                         utils.log("DEBUG", " network-request - " + '\n' + networkRequest, isDebugEnabled)
149
150                         String networkInputs = utils.getNodeXml(networkRequest, "network-inputs", false).replace("tag0:","").replace(":tag0","")
151                         execution.setVariable("DELNWKI_networkInputs", networkInputs)
152
153                         String requestId = execution.getVariable("att-mso-request-id")
154                         if (requestId == null || requestId == "") {
155                                 requestId = utils.getNodeText(networkRequest, "request-id")
156                         }
157                         execution.setVariable("DELNWKI_requestId", requestId)
158                         execution.setVariable("DELNWKI_source", utils.getNodeText(networkRequest, "source"))
159
160                         String networkId = ""
161                         if (utils.nodeExists(networkInputs, "network-id")) {
162                                 networkId = utils.getNodeText1(networkInputs, "network-id")
163                                 if (networkId == 'null' || networkId == "") {
164                                         sendSyncError(execution)
165                                         // missing value of network-name
166                                         String dataErrorMessage = "network-request has missing 'network-id' element/value."
167                                         utils.log("DEBUG", " Invalid Request - " + dataErrorMessage, isDebugEnabled)
168                                         exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage)
169                                 }
170                         }
171
172                         String lcpCloudRegion = ""
173                         if (utils.nodeExists(networkInputs, "aic-cloud-region")) {
174                                 lcpCloudRegion = utils.getNodeText1(networkInputs, "aic-cloud-region")
175                                 if ((lcpCloudRegion == 'null') || (lcpCloudRegion == "")) {
176                                         sendSyncError(execution)
177                                         String dataErrorMessage = "network-request has missing 'aic-cloud-region' element/value."
178                                         utils.log("DEBUG", " Invalid Request - " + dataErrorMessage, isDebugEnabled)
179                                         exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage)
180                                 }
181                         }
182
183
184                 } catch (BpmnError e) {
185                         throw e;
186
187                 } catch (Exception ex){
188                          // caught exception
189                         String exceptionMessage = "Exception Encountered in DeleteNetworkInstanceInfra, PreProcessRequest() - " + ex.getMessage()
190                         utils.log("DEBUG", exceptionMessage, isDebugEnabled)
191                         exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
192
193                 }
194
195         }
196
197         public void sendSyncResponse (Execution execution) {
198                 def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
199                 execution.setVariable("prefix",Prefix)
200
201                 utils.log("DEBUG", " ***** Inside sendSyncResponse() of DeleteNetworkV2 ***** ", isDebugEnabled)
202
203                 try {
204                         String requestId = execution.getVariable("att-mso-request-id")
205                         String serviceInstanceId = execution.getVariable("serviceInstanceId")
206
207                         // RESTResponse (for API Handler (APIH) Reply Task)
208                         String deleteNetworkRestRequest = """{"requestReferences":{"instanceId":"${serviceInstanceId}","requestId":"${requestId}"}}""".trim()
209
210                         utils.log("DEBUG", " sendSyncResponse to APIH - " + "\n" + deleteNetworkRestRequest, isDebugEnabled)
211
212                         sendWorkflowResponse(execution, 202, deleteNetworkRestRequest)
213
214                 } catch (Exception ex) {
215                          // caught exception
216                         String exceptionMessage = "Exception Encountered in DeleteNetworkInstanceInfra, sendSyncResponse() - " + ex.getMessage()
217                         utils.log("DEBUG", exceptionMessage, isDebugEnabled)
218                         exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
219
220                 }
221
222         }
223
224         public void callRESTQueryAAI (Execution execution) {
225                 def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
226                 execution.setVariable("prefix",Prefix)
227
228                 utils.log("DEBUG", " ***** Inside callRESTQueryAAI() of DeleteNetworkV2 ***** " , isDebugEnabled)
229
230                 // get variables
231                 String networkInputs  = execution.getVariable("DELNWKI_networkInputs")
232                 String networkId   = utils.getNodeText(networkInputs, "network-id")
233                 networkId = UriUtils.encode(networkId,"UTF-8")
234                 String messageId = execution.getVariable("DELNWKI_messageId")
235
236                 // Prepare AA&I url
237                 String aai_endpoint = execution.getVariable("URN_aai_endpoint")
238                 AaiUtil aaiUriUtil = new AaiUtil(this)
239                 String aai_uri = aaiUriUtil.getNetworkL3NetworkUri(execution)
240                 String queryAAIRequest = "${aai_endpoint}${aai_uri}/" + networkId
241                 utils.logAudit(queryAAIRequest)
242                 execution.setVariable("DELNWKI_queryAAIRequest", queryAAIRequest)
243                 utils.log("DEBUG", " DELNWKI_AAIRequest - " + "\n" + queryAAIRequest, isDebugEnabled)
244
245                 String basicAuthCred = utils.getBasicAuth(execution.getVariable("URN_aai_auth"),execution.getVariable("URN_mso_msoKey"))
246
247                 RESTConfig config = new RESTConfig(queryAAIRequest);
248
249                 ExceptionUtil exceptionUtil = new ExceptionUtil()
250                 Boolean isVfRelationshipExist = false
251                 try {
252                         RESTClient client = new RESTClient(config).addHeader("X-TransactionId", messageId)
253                                                                                                           .addHeader("X-FromAppId", "MSO")
254                                                                                                           .addHeader("Content-Type", "application/xml")
255                                                                                                           .addHeader("Accept","application/xml");
256                         if (basicAuthCred != null && !"".equals(basicAuthCred)) {
257                                 client.addAuthorizationHeader(basicAuthCred)
258                         }
259                         APIResponse response = client.get()
260                         String returnCode = response.getStatusCode()
261                         execution.setVariable("DELNWKI_aaiReturnCode", returnCode)
262
263                         utils.log("DEBUG", " ***** AAI Response Code  : " + returnCode, isDebugEnabled)
264
265                         String aaiResponseAsString = response.getResponseBodyAsString()
266                         aaiResponseAsString = StringEscapeUtils.unescapeXml(aaiResponseAsString)
267                         execution.setVariable("DELNWKI_queryAAIResponse", aaiResponseAsString)
268
269                         if (returnCode=='200' || returnCode=='204') {
270                                 utils.logAudit(aaiResponseAsString)
271                                 execution.setVariable("DELNWKI_isAAIGood", true)
272                                 utils.log("DEBUG", " AAI Query Success REST Response - " + "\n" + aaiResponseAsString, isDebugEnabled)
273                                 // verify if vf or vnf relationship exist
274                                 if (utils.nodeExists(aaiResponseAsString, "relationship")) {
275                                         NetworkUtils networkUtils = new NetworkUtils()
276                                 isVfRelationshipExist = networkUtils.isVfRelationshipExist(aaiResponseAsString)
277                                         execution.setVariable("DELNWKI_isVfRelationshipExist", isVfRelationshipExist)
278                                         if (isVfRelationshipExist == true) {
279                                                 String relationshipMessage = "AAI Query Success Response but 'vf-module' relationship exist, not allowed to delete: network Id: " + networkId
280                                                 exceptionUtil.buildWorkflowException(execution, 2500, relationshipMessage)
281
282                                         }
283                                 }
284                                 utils.log("DEBUG", " DELNWKI_isVfRelationshipExist - " + isVfRelationshipExist, isDebugEnabled)
285
286                         } else {
287                                 execution.setVariable("DELNWKI_isAAIGood", false)
288                             if (returnCode=='404' || aaiResponseAsString == "" || aaiResponseAsString == null) {
289                                         // not found // empty aai response
290                                         execution.setVariable("DELNWKI_isSilentSuccess", true)
291                                         utils.log("DEBUG", " AAI Query is Silent Success", isDebugEnabled)
292
293                                 } else {
294                                    if (aaiResponseAsString.contains("RESTFault")) {
295                                            WorkflowException exceptionObject = exceptionUtil.MapAAIExceptionToWorkflowException(aaiResponseAsString, execution)
296                                            execution.setVariable("WorkflowException", exceptionObject)
297
298                                    } else {
299                                   // aai all errors
300                                                  String dataErrorMessage = "Unexpected Error Response from callRESTQueryAAI() - " + returnCode
301                                                  utils.log("DEBUG", dataErrorMessage, isDebugEnabled)
302                                                  exceptionUtil.buildWorkflowException(execution, 2500, dataErrorMessage)
303
304                               }
305                                 }
306                         }
307
308                         utils.log("DEBUG", " AAI Query call, isAAIGood? : " + execution.getVariable("DELNWKI_isAAIGood"), isDebugEnabled)
309
310                 } catch (Exception ex) {
311                    // caught exception
312                    String exceptionMessage = "Exception Encountered in DeleteNetworkInstanceInfra, callRESTQueryAAI() - " + ex.getMessage()
313                    utils.log("DEBUG", exceptionMessage, isDebugEnabled)
314                    exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
315
316                 }
317
318         }
319
320         public void callRESTQueryAAICloudRegion (Execution execution) {
321                 def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
322                 execution.setVariable("prefix", Prefix)
323
324                 utils.log("DEBUG", " ***** Inside callRESTQueryAAICloudRegion of DeleteNetworkV2 ***** " , isDebugEnabled)
325
326                 try {
327                         String networkInputs  = execution.getVariable("DELNWKI_networkInputs")
328                         String cloudRegion = utils.getNodeText(networkInputs, "aic-cloud-region")
329                         cloudRegion = UriUtils.encode(cloudRegion,"UTF-8")
330                         // Prepare AA&I url
331                         String aai_endpoint = execution.getVariable("URN_aai_endpoint")
332                         AaiUtil aaiUtil = new AaiUtil(this)
333                         String aai_uri = aaiUtil.getCloudInfrastructureCloudRegionUri(execution)
334                         String queryCloudRegionRequest = "${aai_endpoint}${aai_uri}/" + cloudRegion
335                         utils.logAudit(queryCloudRegionRequest)
336                         execution.setVariable("DELNWKI_queryCloudRegionRequest", queryCloudRegionRequest)
337                         utils.log("DEBUG", " DELNWKI_queryCloudRegionRequest - " + "\n" + queryCloudRegionRequest, isDebugEnabled)
338
339                         String cloudRegionPo = aaiUtil.getAAICloudReqion(execution,  queryCloudRegionRequest, "PO", cloudRegion)
340                         String cloudRegionSdnc = aaiUtil.getAAICloudReqion(execution,  queryCloudRegionRequest, "SDNC", cloudRegion)
341
342                         if ((cloudRegionPo != "ERROR") && (cloudRegionSdnc != "ERROR")) {
343                                 execution.setVariable("DELNWKI_cloudRegionPo", cloudRegionPo)
344                                 execution.setVariable("DELNWKI_cloudRegionSdnc", cloudRegionSdnc)
345
346                         } else {
347                                 String dataErrorMessage = "QueryAAICloudRegion Unsuccessful. Return Code: " + execution.getVariable("DELNWKI_queryCloudRegionReturnCode")
348                                 utils.log("DEBUG", dataErrorMessage, isDebugEnabled)
349                                 exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage)
350
351                         }
352
353                 } catch (BpmnError e) {
354                 throw e;
355
356                 } catch (Exception ex) {
357                         // caught exception
358                         String exceptionMessage = "Bpmn error encountered in DeleteNetworkInstanceInfra, callRESTQueryAAICloudRegion(). Unexpected Response from AAI - " + ex.getMessage()
359                         utils.log("DEBUG", exceptionMessage, isDebugEnabled)
360                         exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
361
362                 }
363
364         }
365
366         public void prepareNetworkRequest (Execution execution) {
367                 def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
368                 execution.setVariable("prefix", Prefix)
369
370                 utils.log("DEBUG", " ***** Inside prepareNetworkRequest of DeleteNetworkV2 ***** ", isDebugEnabled)
371                 ExceptionUtil exceptionUtil = new ExceptionUtil()
372                 try {
373                         // get variables
374                         String cloudSiteId = execution.getVariable("DELNWKI_cloudRegionPo")
375                         String networkInputs = execution.getVariable("DELNWKI_networkInputs")
376                         String tenantId = utils.getNodeText(networkInputs, "tenant-id")
377                         String networkType = utils.getNodeText(networkInputs, "network-type")
378                         String networkId = utils.getNodeText(networkInputs, "network-id")
379
380                         String networkStackId = ""
381                         networkStackId = utils.getNodeText1(execution.getVariable("DELNWKI_queryAAIResponse"), "heat-stack-id")
382                         if (networkStackId == 'null' || networkStackId == "") {
383                                 networkStackId = "force_delete"
384                         }
385
386                         String requestId = execution.getVariable("DELNWKI_requestId")
387                         String serviceInstanceId = execution.getVariable("serviceInstanceId")
388
389                         // Added new Elements
390                         String messageId = execution.getVariable("DELNWKI_messageId")
391                         String notificationUrl = ""                                   //TODO - is this coming from URN? What variable/value to use?
392                         //String notificationUrl = execution.getVariable("URN_?????") //TODO - is this coming from URN? What variable/value to use?
393
394                         String deleteNetworkRequest = """
395                                           <deleteNetworkRequest>
396                                             <cloudSiteId>${cloudSiteId}</cloudSiteId>
397                                             <tenantId>${tenantId}</tenantId>
398                                             <networkId>${networkId}</networkId>
399                                                 <networkStackId>${networkStackId}</networkStackId>
400                                             <networkType>${networkType}</networkType>
401                                                 <skipAAI>true</skipAAI>
402                                             <msoRequest>
403                                                <requestId>${requestId}</requestId>
404                                                <serviceInstanceId>${serviceInstanceId}</serviceInstanceId>
405                                             </msoRequest>
406                                                 <messageId>${messageId}</messageId>
407                                                 <notificationUrl>${notificationUrl}</notificationUrl>
408                                           </deleteNetworkRequest>
409                                                 """.trim()
410
411                         utils.log("DEBUG", " DELNWKI_deleteNetworkRequest - " + "\n" +  deleteNetworkRequest, isDebugEnabled)
412                         // Format Response
413                         String buildDeleteNetworkRequestAsString = utils.formatXml(deleteNetworkRequest)
414                         utils.logAudit(buildDeleteNetworkRequestAsString)
415                         utils.log("DEBUG", " DELNWKI_deleteNetworkRequestAsString - " + "\n" +  buildDeleteNetworkRequestAsString, isDebugEnabled)
416
417                         String restURL = execution.getVariable("URN_mso_adapters_network_rest_endpoint")
418                         execution.setVariable("URN_mso_adapters_network_rest_endpoint", restURL + "/" + networkId)
419                         utils.log("DEBUG", "URN_mso_adapters_network_rest_endpoint - " + "\n" +  restURL + "/" + networkId, isDebugEnabled)
420
421                         execution.setVariable("DELNWKI_deleteNetworkRequest", buildDeleteNetworkRequestAsString)
422                         utils.log("DEBUG", " DELNWKI_deleteNetworkRequest - " + "\n" +  buildDeleteNetworkRequestAsString, isDebugEnabled)
423                 }
424                 catch (Exception ex) {
425                         // caught exception
426                         String exceptionMessage = "Bpmn error encountered in DeleteNetworkInstanceInfra, prepareNetworkRequest(). Unexpected Response from AAI - " + ex.getMessage()
427                         utils.log("DEBUG", exceptionMessage, isDebugEnabled)
428                         exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
429
430                 }
431         }
432
433         /**
434          * This method is used instead of an HTTP Connector task because the
435          * connector does not allow DELETE with a body.
436          */
437         public void sendRequestToVnfAdapter(Execution execution) {
438                 def method = getClass().getSimpleName() + '.sendRequestToVnfAdapter(' +
439                         'execution=' + execution.getId() +
440                         ')'
441                 def isDebugEnabled = execution.getVariable('isDebugLogEnabled')
442                 logDebug('Entered ' + method, isDebugEnabled)
443
444                 try {
445
446                         String vnfAdapterUrl = execution.getVariable("URN_mso_adapters_network_rest_endpoint")
447                         String vnfAdapterRequest = execution.getVariable("DELNWKI_deleteNetworkRequest")
448
449                         RESTConfig config = new RESTConfig(vnfAdapterUrl)
450                         RESTClient client = new RESTClient(config).
451                                 addHeader("Content-Type", "application/xml").
452                                 addAuthorizationHeader(execution.getVariable("BasicAuthHeaderValuePO"));
453
454                         APIResponse response;
455
456                         response = client.httpDelete(vnfAdapterRequest)
457
458                         execution.setVariable("DELNWKI_networkReturnCode", response.getStatusCode())
459                         execution.setVariable("DELNWKI_deleteNetworkResponse", response.getResponseBodyAsString())
460
461                 } catch (Exception ex) {
462                         // caught exception
463                         String exceptionMessage = "Bpmn error encountered in DeleteNetworkInstanceInfra, sendRequestToVnfAdapter() - " + ex.getMessage()
464                         logError(exceptionMessage)
465                         utils.log("DEBUG", exceptionMessage, isDebugEnabled)
466                         exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
467
468                 }
469         }
470
471
472         public void prepareSDNCRequest (Execution execution) {
473                 def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
474                 execution.setVariable("prefix", Prefix)
475
476                 utils.log("DEBUG", " ***** Inside prepareSDNCRequest of DeleteNetworkV2 ***** ", isDebugEnabled)
477
478                 try {
479                         // get variables
480                         String sdncCallback = execution.getVariable("URN_mso_workflow_sdncadapter_callback")
481                         String deleteNetworkInput = execution.getVariable("DELNWKI_networkRequest")
482
483                         String networkId = ""
484                         if (utils.nodeExists(deleteNetworkInput, "network-id")) {
485                                 networkId = utils.getNodeText1(deleteNetworkInput, "network-id")
486                         }
487                         if (networkId == 'null') {networkId = ""}
488
489                         String serviceInstanceId = utils.getNodeText1(deleteNetworkInput, "service-instance-id")
490
491                         SDNCAdapterUtils sdncAdapterUtils = new SDNCAdapterUtils()
492                         String cloudRegionId = execution.getVariable("DELNWKI_cloudRegionSdnc")
493                         // 1. prepare delete topology via SDNC Adapter SUBFLOW call
494                         String sndcTopologyDeleteRequest = sdncAdapterUtils.sdncTopologyRequestV2(execution, deleteNetworkInput, serviceInstanceId, sdncCallback, "delete", "DisconnectNetworkRequest", cloudRegionId, networkId, null)
495                     String sndcTopologyDeleteRequesAsString = utils.formatXml(sndcTopologyDeleteRequest)
496                         utils.logAudit(sndcTopologyDeleteRequesAsString)
497                         execution.setVariable("DELNWKI_deleteSDNCRequest", sndcTopologyDeleteRequesAsString)
498                         utils.log("DEBUG", " DELNWKI_deleteSDNCRequest - " + "\n" +  sndcTopologyDeleteRequesAsString, isDebugEnabled)
499
500                         // 2. prepare rollback topology via SDNC Adapter SUBFLOW call
501                         String sndcTopologyRollbackRequest = sdncAdapterUtils.sdncTopologyRequestV2(execution, deleteNetworkInput, serviceInstanceId, sdncCallback, "rollback", "DisconnectNetworkRequest", cloudRegionId, networkId, null)
502                         String sndcTopologyRollbackRequestAsString = utils.formatXml(sndcTopologyRollbackRequest)
503                         execution.setVariable("DELNWKI_rollbackSDNCRequest", sndcTopologyRollbackRequestAsString)
504                         utils.log("DEBUG", " DELNWKI_rollbackSDNCRequest (prepared if NEEDED later for SDNC Topology delete's rollback/compensation . . . - " + "\n" +  sndcTopologyRollbackRequestAsString, isDebugEnabled)
505
506                 } catch (Exception ex) {
507                         // caught exception
508                         String exceptionMessage = "Bpmn error encountered in DeleteNetworkInstanceInfra, prepareSDNCRequest() - " + ex.getMessage()
509                         logError(exceptionMessage)
510                         utils.log("DEBUG", exceptionMessage, isDebugEnabled)
511                         exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
512
513                 }
514
515         }
516
517         public void prepareDBRequest (Execution execution) {
518                 def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
519                 execution.setVariable("prefix", Prefix)
520
521                 try {
522                         utils.log("DEBUG", " ***** Inside prepareDBRequest of DeleteNetworkV2 ***** ", isDebugEnabled)
523
524                         String aaiReturnCode = execution.getVariable("DELNWKI_aaiReturnCode")
525                         String requestId = execution.getVariable("DELNWKI_requestId")
526
527                         String statusMessage = ""
528                         if (aaiReturnCode == '404' || execution.getVariable("DELNWKI_isSilentSuccess") == true) {
529                                 // SILENT SUCCESS
530                                 statusMessage = "Network Id to be deleted NOT found. Silent success."
531                         } else {
532                                 statusMessage = "Network successfully deleted."
533                         }
534
535                         String dbRequest =
536                                         """<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
537                                                 <soapenv:Header/>
538                                                 <soapenv:Body>
539                                                         <ns:updateInfraRequest xmlns:ns="http://com.att.mso/requestsdb">
540                                                                 <requestId>${requestId}</requestId>
541                                                                 <lastModifiedBy>BPMN</lastModifiedBy>
542                                                                 <statusMessage>${statusMessage}</statusMessage>
543                                                                 <responseBody></responseBody>
544                                                                 <requestStatus>COMPLETED</requestStatus>
545                                                                 <progress>100</progress>
546                                                                 <vnfOutputs>&lt;network-outputs xmlns="http://ecomp.att.com/mso/infra/vnf-request/v1" xmlns:aetgt="http://ecomp.att.com/mso/infra/vnf-request/v1" xmlns:rest="http://schemas.activebpel.org/REST/2007/12/01/aeREST.xsd"/&gt;</vnfOutputs>
547                                                         </ns:updateInfraRequest>
548                                                 </soapenv:Body>
549                                            </soapenv:Envelope>"""
550
551                    String buildDeleteDBRequestAsString = utils.formatXml(dbRequest)
552                    utils.logAudit(buildDeleteDBRequestAsString)
553                    execution.setVariable("DELNWKI_deleteDBRequest", buildDeleteDBRequestAsString)
554                    utils.log("DEBUG", " DB Adapter Request - " + "\n" + buildDeleteDBRequestAsString, isDebugEnabled)
555
556                 } catch (Exception ex) {
557                         // caught exception
558                         String exceptionMessage = "Bpmn error encountered in DeleteNetworkInstanceInfra, prepareDBRequest() - " + ex.getMessage()
559                         logError(exceptionMessage)
560                         utils.log("DEBUG", exceptionMessage, isDebugEnabled)
561                         exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
562
563                 }
564
565          }
566
567         public void prepareDBRequestError (Execution execution) {
568                 def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
569                 execution.setVariable("prefix", Prefix)
570
571                 try {
572                         utils.log("DEBUG", " ***** Inside prepareDBRequestError of DeleteNetworkV2 ***** ", isDebugEnabled)
573
574                         WorkflowException wfe = execution.getVariable("WorkflowException")
575                         String statusMessage = wfe.getErrorMessage()
576                         String requestId = execution.getVariable("DELNWKI_requestId")
577
578                         String dbRequest =
579                                         """<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
580                                                 <soapenv:Header/>
581                                                 <soapenv:Body>
582                                                         <ns:updateInfraRequest xmlns:ns="http://com.att.mso/requestsdb">
583                                                                 <requestId>${requestId}</requestId>
584                                                                 <lastModifiedBy>BPMN</lastModifiedBy>
585                                                                 <statusMessage>${statusMessage}</statusMessage>
586                                                                 <responseBody></responseBody>
587                                                                 <requestStatus>FAILED</requestStatus>
588                                                                 <progress></progress>
589                                                                 <vnfOutputs>&lt;network-outputs xmlns="http://ecomp.att.com/mso/infra/vnf-request/v1" xmlns:aetgt="http://ecomp.att.com/mso/infra/vnf-request/v1" xmlns:rest="http://schemas.activebpel.org/REST/2007/12/01/aeREST.xsd"/&gt;</vnfOutputs>
590                                                         </ns:updateInfraRequest>
591                                                 </soapenv:Body>
592                                            </soapenv:Envelope>"""
593
594                    execution.setVariable("DELNWKI_deleteDBRequest", dbRequest)
595                    utils.log("DEBUG", " DB Adapter Request - " + "\n" + dbRequest, isDebugEnabled)
596
597                 } catch (Exception ex) {
598                         // caught exception
599                         String exceptionMessage = "Bpmn error encountered in DeleteNetworkInstanceInfra, prepareDBRequestError() - " + ex.getMessage()
600                         logError(exceptionMessage)
601                         utils.log("DEBUG", exceptionMessage, isDebugEnabled)
602                         exceptionUtil.buildWorkflowException(execution, 7000, exceptionMessage)
603
604                 }
605
606          }
607
608         // **************************************************
609         //     Post or Validate Response Section
610         // **************************************************
611
612         public void validateNetworkResponse (Execution execution) {
613                 def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
614                 execution.setVariable("prefix", Prefix)
615
616                 utils.log("DEBUG", " ***** Inside validateNetworkResponse of DeleteNetworkV2 *****", isDebugEnabled)
617
618                 try {
619                         String returnCode = execution.getVariable("DELNWKI_networkReturnCode")
620                         String networkResponse = execution.getVariable("DELNWKI_deleteNetworkResponse")
621
622                         utils.log("DEBUG", " Network Adapter responseCode: " + returnCode, isDebugEnabled)
623                         utils.log("DEBUG", "Network Adapter Error Response - " + "\n" + networkResponse, isDebugEnabled)
624
625                         String errorMessage = ""
626                         if (returnCode == "200") {
627                                 utils.logAudit(networkResponse)
628                                 execution.setVariable("DELNWKI_deleteNetworkResponse", networkResponse)
629                                 utils.log("DEBUG", " Network Adapter Success Response - " + "\n" + networkResponse, isDebugEnabled)
630
631                         } else { // network error
632                            if (returnCode.toInteger() > 399 && returnCode.toInteger() < 600) {   //4xx, 5xx
633                                    if (networkResponse.contains("deleteNetworkError")  ) {
634                                            networkResponse = networkResponse.replace('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>', '')
635                                            errorMessage  = utils.getNodeText1(networkResponse, "message")
636                                            errorMessage  = "Received error from Network Adapter: " + errorMessage
637                                            exceptionUtil.buildAndThrowWorkflowException(execution, 2500, errorMessage)
638
639                                    } else { // CatchAll exception
640                                            if (returnCode == "500") {
641                                                    errorMessage = "JBWEB000065: HTTP Status 500."
642                                        } else {
643                                                errorMessage = "Return code is " + returnCode
644                                        }
645                                            errorMessage  = "Received error from Network Adapter: " + errorMessage
646                                            exceptionUtil.buildAndThrowWorkflowException(execution, 2500, errorMessage)
647
648                                    }
649
650                            } else { // CatchAll exception
651                                    String dataErrorMessage  = "Received error from Network Adapter. Return code is: " + returnCode
652                                    exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage)
653
654                            }
655
656                         }
657
658                 } catch (BpmnError e) {
659                         throw e;
660
661                 } catch (Exception ex) {
662                         // caught exception
663                         String exceptionMessage = "Bpmn error encountered in DeleteNetworkInstanceInfra, validateNetworkResponse() - " + ex.getMessage()
664                         utils.log("DEBUG", exceptionMessage, isDebugEnabled)
665                         exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
666
667                 }
668
669         }
670
671         public void validateSDNCResponse (Execution execution) {
672                 def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
673                 execution.setVariable("prefix", Prefix)
674
675                 utils.log("DEBUG", " ***** Inside validateSDNCResponse of DeleteNetworkV2 ***** ", isDebugEnabled)
676
677                 String response = execution.getVariable("DELNWKI_deleteSDNCResponse")
678                 WorkflowException workflowException = execution.getVariable("WorkflowException")
679
680                 boolean successIndicator = execution.getVariable("SDNCA_SuccessIndicator")
681
682                 SDNCAdapterUtils sdncAdapterUtils = new SDNCAdapterUtils(this)
683                 sdncAdapterUtils.validateSDNCResponse(execution, response, workflowException, successIndicator)
684                 // reset variable
685                 String deleteSDNCResponseDecodeXml = sdncAdapterUtils.decodeXML(execution.getVariable("DELNWKI_deleteSDNCResponse"))
686                 deleteSDNCResponseDecodeXml = deleteSDNCResponseDecodeXml.replace("&", "&amp;").replace('<?xml version="1.0" encoding="UTF-8"?>', "")
687                 execution.setVariable("DELNWKI_deleteSDNCResponse", deleteSDNCResponseDecodeXml)
688
689                 if (execution.getVariable("DELNWKI_sdncResponseSuccess") == true) {  // from sdnc util, prefix+'sdncResponseSuccess'
690                         execution.setVariable("DELNWKI_isSdncRollbackNeeded", true)      //
691                         execution.setVariable("DELNWKI_isPONR", true)
692                         utils.log("DEBUG", "Successfully Validated SDNC Response", isDebugEnabled)
693                 } else {
694                         utils.log("DEBUG", "Did NOT Successfully Validated SDNC Response", isDebugEnabled)
695                         throw new BpmnError("MSOWorkflowException")
696                 }
697
698         }
699
700
701         public void postProcessResponse (Execution execution) {
702                 def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
703                 execution.setVariable("prefix", Prefix)
704
705                 utils.log("DEBUG", " ***** Inside postProcessResponse of DeleteNetworkV2 ***** ", isDebugEnabled)
706
707                 try {
708                         // Display DB response: DELNWKI_deleteDBResponse / DELNWKI_dbReturnCode
709                         String dbReturnCode = execution.getVariable("DELNWKI_dbReturnCode")
710                         utils.log("DEBUG", " ***** DB Update Response Code  : " + dbReturnCode, isDebugEnabled)
711                         utils.log("DEBUG", " ***** DB Update Response String: " + '\n' + execution.getVariable("DELNWKI_deleteDBResponse"), isDebugEnabled)
712
713                         if (dbReturnCode == '200') {
714
715                                 String source = execution.getVariable("DELNWKI_source")
716                                 String requestId = execution.getVariable("DELNWKI_requestId")
717
718                                 String msoCompletionRequest =
719                                         """<aetgt:MsoCompletionRequest xmlns:aetgt="http://ecomp.att.com/mso/workflow/schema/v1"
720                                                                         xmlns:ns="http://ecomp.att.com/mso/request/types/v1"
721                                                         xmlns:ns8="http://ecomp.att.com/mso/workflow/schema/v1">
722                                                         <request-info xmlns="http://ecomp.att.com/mso/infra/vnf-request/v1">
723                                                                 <request-id>${requestId}</request-id>
724                                                                 <action>DELETE</action>
725                                                                 <source>${source}</source>
726                                                         </request-info>
727                                                         <ns8:status-message>Network has been deleted successfully.</ns8:status-message>
728                                                         <ns8:mso-bpel-name>BPMN Network action: DELETE</ns8:mso-bpel-name>
729                                                 </aetgt:MsoCompletionRequest>"""
730
731                                         // Format Response
732                                         String xmlMsoCompletionRequest = utils.formatXml(msoCompletionRequest)
733
734                                 utils.logAudit(xmlMsoCompletionRequest)
735                                 execution.setVariable("DELNWKI_CompleteMsoProcessRequest", xmlMsoCompletionRequest)
736                                 execution.setVariable("DELNWKI_Success", true)
737                                 if (execution.getVariable("DELNWKI_isSilentSuccess") == false) {
738                                         utils.log("DEBUG", " Overall SUCCESS Response going to CompleteMsoProcess - " + "\n" + xmlMsoCompletionRequest, isDebugEnabled)
739                                 } else {
740                                         utils.log("DEBUG", " Silent SUCCESS going to CompleteMsoProcess - " + "\n" + xmlMsoCompletionRequest, isDebugEnabled)
741                                 }
742
743                         } else {
744                                 // caught exception
745                                 String exceptionMessage = "Bpmn error encountered in DeleteNetworkInstanceInfra, DB Update Failed: " + dbReturnCode
746                                 utils.log("DEBUG", exceptionMessage, isDebugEnabled)
747                                 exceptionUtil.buildAndThrowWorkflowException(execution, 2500, exceptionMessage)
748
749                         }
750
751                 } catch (BpmnError e) {
752                         throw e;
753
754                 } catch (Exception ex) {
755                         // caught exception
756                         String exceptionMessage = "Bpmn error encountered in DeleteNetworkInstanceInfra, postProcessResponse() - " + ex.getMessage()
757                         utils.log("DEBUG", exceptionMessage, isDebugEnabled)
758                         exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
759
760         }
761
762         }
763
764
765         // *******************************
766         //     Build Error Section
767         // *******************************
768
769         // Prepare for FalloutHandler
770         public void buildErrorResponse (Execution execution) {
771                 def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
772                 execution.setVariable("prefix", Prefix)
773
774                 utils.log("DEBUG", " ***** Prepare for FalloutHandler. FAILURE - prepare request for sub-process FalloutHandler. *****", isDebugEnabled)
775
776                 String dbReturnCode = execution.getVariable("DELNWKI_dbReturnCode")
777                 utils.log("DEBUG", " ***** DB Update Response Code  : " + dbReturnCode, isDebugEnabled)
778                 utils.log("DEBUG", " ***** DB Update Response String: " + '\n' + execution.getVariable("DELNWKI_deleteDBResponse"), isDebugEnabled)
779
780                 String falloutHandlerRequest = ""
781                 String workflowException = ""
782                 String requestId = execution.getVariable("DELNWKI_requestId")
783                 String source = execution.getVariable("DELNWKI_source")
784                 execution.setVariable("DELNWKI_Success", false)
785                 try {
786                         WorkflowException wfe = execution.getVariable("WorkflowException")
787                         String errorCode = String.valueOf(wfe.getErrorCode())
788                         String errorMessage = wfe.getErrorMessage()
789
790                         falloutHandlerRequest =
791                             """<aetgt:FalloutHandlerRequest xmlns:aetgt="http://ecomp.att.com/mso/workflow/schema/v1"
792                                                                      xmlns:ns="http://ecomp.att.com/mso/request/types/v1"
793                                                                      xmlns:wfsch="http://ecomp.att.com/mso/workflow/schema/v1">
794                                            <request-info xmlns="http://ecomp.att.com/mso/infra/vnf-request/v1">
795                                               <request-id>${requestId}</request-id>
796                                               <action>DELETE</action>
797                                               <source>${source}</source>
798                                            </request-info>
799                                                 <aetgt:WorkflowException xmlns:aetgt="http://ecomp.att.com/mso/workflow/schema/v1">
800                                                         <aetgt:ErrorMessage>${errorMessage}</aetgt:ErrorMessage>
801                                                         <aetgt:ErrorCode>${errorCode}</aetgt:ErrorCode>
802                                                 </aetgt:WorkflowException>
803                                         </aetgt:FalloutHandlerRequest>"""
804
805                         utils.logAudit(falloutHandlerRequest)
806                         execution.setVariable("DELNWKI_FalloutHandlerRequest", falloutHandlerRequest)
807                         utils.log("ERROR", "  Overall Error Response going to FalloutHandler: " + "\n" + falloutHandlerRequest, isDebugEnabled)
808
809                 } catch (Exception ex) {
810                         // caught exception
811                         String exceptionMessage = "Bpmn error encountered in DeleteNetworkInstanceInfra, buildErrorResponse() - " + ex.getMessage()
812                         utils.log("DEBUG", exceptionMessage, isDebugEnabled)
813                         falloutHandlerRequest =
814                         """<aetgt:FalloutHandlerRequest xmlns:aetgt="http://ecomp.att.com/mso/workflow/schema/v1"
815                                                                      xmlns:ns="http://ecomp.att.com/mso/request/types/v1"
816                                                                      xmlns:wfsch="http://ecomp.att.com/mso/workflow/schema/v1">
817                                            <request-info xmlns="http://ecomp.att.com/mso/infra/vnf-request/v1">
818                                               <request-id>${requestId}</request-id>
819                                               <action>CREATE</action>
820                                               <source>${source}</source>
821                                            </request-info>
822                                                 <aetgt:WorkflowException xmlns:aetgt="http://ecomp.att.com/mso/workflow/schema/v1">
823                                                         <aetgt:ErrorMessage>${exceptionMessage}</aetgt:ErrorMessage>
824                                                         <aetgt:ErrorCode>9999</aetgt:ErrorCode>
825                                                 </aetgt:WorkflowException>
826                                         </aetgt:FalloutHandlerRequest>"""
827                         execution.setVariable("DELNWKI_FalloutHandlerRequest", falloutHandlerRequest)
828                         utils.log("DEBUG", "  Overall Error Response going to FalloutHandler: " + "\n" + falloutHandlerRequest, isDebugEnabled)
829                 }
830         }
831
832
833         public void sendSyncError (Execution execution) {
834                 def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
835                 execution.setVariable("prefix", Prefix)
836
837                 try {
838                         String requestId = execution.getVariable("att-mso-request-id")
839                         String serviceInstanceId = execution.getVariable("serviceInstanceId")
840
841                         // RESTResponse (for API Handler (APIH) Reply Task)
842                         String deleteNetworkRestError = """{"requestReferences":{"instanceId":"${serviceInstanceId}","requestId":"${requestId}"}}""".trim()
843
844                         utils.log("DEBUG", " sendSyncResponse to APIH - " + "\n" + deleteNetworkRestError, isDebugEnabled)
845
846                         sendWorkflowResponse(execution, 500, deleteNetworkRestError)
847
848                 } catch (Exception ex) {
849                         utils.log("DEBUG", " Sending Sync Error Activity Failed - DeleteNetworkInstanceInfra, sendSyncError(): " + "\n" + ex.getMessage(), isDebugEnabled)
850                 }
851         }
852
853         public void processJavaException(Execution execution){
854                 def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
855                 execution.setVariable("prefix",Prefix)
856                 try{
857                         utils.log("DEBUG", "Caught a Java Exception", isDebugEnabled)
858                         utils.log("DEBUG", "Started processJavaException Method", isDebugEnabled)
859                         utils.log("DEBUG", "Variables List: " + execution.getVariables(), isDebugEnabled)
860                         execution.setVariable("UnexpectedError", "Caught a Java Lang Exception")  // Adding this line temporarily until this flows error handling gets updated
861                         exceptionUtil.buildAndThrowWorkflowException(execution, 500, "Caught a Java Lang Exception")
862                 }catch(BpmnError b){
863                         utils.log("ERROR", "Rethrowing MSOWorkflowException", isDebugEnabled)
864                         throw b
865                 }catch(Exception e){
866                         utils.log("DEBUG", "Caught Exception during processJavaException Method: " + e, isDebugEnabled)
867                         execution.setVariable("UnexpectedError", "Exception in processJavaException method")  // Adding this line temporarily until this flows error handling gets updated
868                         exceptionUtil.buildAndThrowWorkflowException(execution, 500, "Exception in processJavaException method")
869                 }
870                 utils.log("DEBUG", "Completed processJavaException Method", isDebugEnabled)
871         }
872
873 }