868ed214be5765dca410329bf44a82a2de21df92
[so.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Modifications Copyright (c) 2019 Samsung
8  * ================================================================================
9  * Licensed under the Apache License, Version 2.0 (the "License");
10  * you may not use this file except in compliance with the License.
11  * You may obtain a copy of the License at
12  *
13  *      http://www.apache.org/licenses/LICENSE-2.0
14  *
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  * ============LICENSE_END=========================================================
21  */
22
23 package org.onap.so.bpmn.infrastructure.scripts;
24
25 import javax.ws.rs.core.UriBuilder
26 import javax.xml.parsers.DocumentBuilder
27 import javax.xml.parsers.DocumentBuilderFactory
28 import org.apache.commons.lang3.*
29 import org.camunda.bpm.engine.delegate.BpmnError
30 import org.camunda.bpm.engine.delegate.DelegateExecution
31 import org.onap.so.bpmn.common.scripts.AaiUtil
32 import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
33 import org.onap.so.bpmn.common.scripts.ExceptionUtil
34 import org.onap.so.bpmn.common.scripts.MsoUtils
35 import org.onap.so.bpmn.common.scripts.NetworkUtils
36 import org.onap.so.bpmn.common.scripts.SDNCAdapterUtils
37 import org.onap.so.bpmn.common.scripts.VidUtils
38 import org.onap.so.bpmn.core.UrnPropertiesReader
39 import org.onap.so.bpmn.core.WorkflowException
40 import org.onap.so.bpmn.core.json.JsonUtils
41 import org.onap.aaiclient.client.aai.AAIObjectType
42 import org.onap.aaiclient.client.aai.AAIResourcesClient
43 import org.onap.aaiclient.client.aai.entities.uri.AAIResourceUri
44 import org.onap.aaiclient.client.aai.entities.uri.AAIUriFactory
45 import org.onap.aaiclient.client.aai.entities.AAIResultWrapper
46 import org.onap.aaiclient.client.graphinventory.entities.uri.Depth
47 import org.onap.so.constants.Defaults
48 import org.slf4j.Logger
49 import org.slf4j.LoggerFactory
50
51 import org.springframework.web.util.UriUtils
52 import org.w3c.dom.Document
53 import org.w3c.dom.Element
54 import org.w3c.dom.NamedNodeMap
55 import org.w3c.dom.Node
56 import org.w3c.dom.NodeList;
57 import org.xml.sax.InputSource
58 import org.onap.aai.domain.yang.VpnBinding
59 import org.onap.aai.domain.yang.L3Network
60 import org.onap.aai.domain.yang.NetworkPolicy
61 import org.onap.aai.domain.yang.RouteTableReference
62 import org.onap.aai.domain.yang.RouteTarget
63 import org.onap.aai.domain.yang.Subnet
64 import javax.ws.rs.NotFoundException
65
66 import groovy.json.*
67 import groovy.xml.XmlUtil
68
69 /**
70  * This groovy class supports the <class>DoUpdateNetworkInstance.bpmn</class> process.
71  *
72  */
73 public class DoUpdateNetworkInstance extends AbstractServiceTaskProcessor {
74     private static final Logger logger = LoggerFactory.getLogger( DoUpdateNetworkInstance.class);
75
76     String Prefix="UPDNETI_"
77     ExceptionUtil exceptionUtil = new ExceptionUtil()
78     JsonUtils jsonUtil = new JsonUtils()
79     VidUtils vidUtils = new VidUtils(this)
80     NetworkUtils networkUtils = new NetworkUtils()
81     SDNCAdapterUtils sdncAdapterUtils = new SDNCAdapterUtils()
82
83     /**
84      * This method is executed during the preProcessRequest task of the <class>DoUpdateNetworkInstance.bpmn</class> process.
85      * @param execution
86      */
87     public InitializeProcessVariables(DelegateExecution execution){
88         /* Initialize all the process variables in this block */
89
90         execution.setVariable(Prefix + "messageId", "")
91         execution.setVariable("BasicAuthHeaderValuePO", "")
92         execution.setVariable("BasicAuthHeaderValueSDNC", "")
93         execution.setVariable(Prefix + "networkRequest", "")
94         execution.setVariable(Prefix + "networkInputs", "")
95         execution.setVariable(Prefix + "networkOutputs", "")
96         execution.setVariable(Prefix + "requestId", "")
97         execution.setVariable(Prefix + "source", "")
98         execution.setVariable(Prefix + "networkId", "")
99
100         execution.setVariable(Prefix + "isPONR", false)    // Point-of-no-return, means, rollback is not needed
101
102         // AAI query Cloud Region
103         execution.setVariable(Prefix + "queryCloudRegionRequest","")
104         execution.setVariable(Prefix + "queryCloudRegionReturnCode","")
105         execution.setVariable(Prefix + "queryCloudRegionResponse","")
106         execution.setVariable(Prefix + "cloudRegionPo","")
107         execution.setVariable(Prefix + "cloudRegionSdnc","")
108         execution.setVariable(Prefix + "isCloudRegionGood", false)
109
110         // AAI query Id
111         execution.setVariable(Prefix + "queryIdAAIRequest","")
112         execution.setVariable(Prefix + "queryIdAAIResponse", "")
113         execution.setVariable(Prefix + "aaiIdReturnCode", "")
114
115         // AAI query vpn binding
116         execution.setVariable(Prefix + "queryVpnBindingAAIRequest","")
117         execution.setVariable(Prefix + "queryVpnBindingAAIResponse", "")
118         execution.setVariable(Prefix + "aaiQqueryVpnBindingReturnCode", "")
119         execution.setVariable(Prefix + "vpnBindings", null)
120         execution.setVariable(Prefix + "vpnCount", 0)
121         execution.setVariable(Prefix + "routeCollection", "")
122
123         // AAI query network policy
124         execution.setVariable(Prefix + "queryNetworkPolicyAAIRequest","")
125         execution.setVariable(Prefix + "queryNetworkPolicyAAIResponse", "")
126         execution.setVariable(Prefix + "aaiQqueryNetworkPolicyReturnCode", "")
127         execution.setVariable(Prefix + "networkPolicyUriList", null)
128         execution.setVariable(Prefix + "networkPolicyCount", 0)
129         execution.setVariable(Prefix + "networkCollection", "")
130
131         // AAI query route table reference
132         execution.setVariable(Prefix + "queryNetworkTableRefAAIRequest","")
133         execution.setVariable(Prefix + "queryNetworkTableRefAAIResponse", "")
134         execution.setVariable(Prefix + "aaiQqueryNetworkTableRefReturnCode", "")
135         execution.setVariable(Prefix + "networkTableRefUriList", null)
136         execution.setVariable(Prefix + "networkTableRefCount", 0)
137         execution.setVariable(Prefix + "tableRefCollection", "")
138
139         // AAI requery Id
140         execution.setVariable(Prefix + "requeryIdAAIRequest","")
141         execution.setVariable(Prefix + "requeryIdAAIResponse", "")
142         execution.setVariable(Prefix + "aaiRequeryIdReturnCode", "")
143
144         // AAI update contrail
145         execution.setVariable(Prefix + "updateContrailAAIUrlRequest","")
146         execution.setVariable(Prefix + "updateContrailAAIPayloadRequest","")
147         execution.setVariable(Prefix + "updateContrailAAIResponse", "")
148         execution.setVariable(Prefix + "aaiUpdateContrailReturnCode", "")
149
150         execution.setVariable(Prefix + "updateNetworkRequest", "")
151         execution.setVariable(Prefix + "updateNetworkResponse", "")
152         execution.setVariable(Prefix + "rollbackNetworkRequest", "")
153         execution.setVariable(Prefix + "networkReturnCode", "")
154         execution.setVariable(Prefix + "isNetworkRollbackNeeded", false)
155
156         execution.setVariable(Prefix + "changeAssignSDNCRequest", "")
157         execution.setVariable(Prefix + "changeAssignSDNCResponse", "")
158         execution.setVariable(Prefix + "rollbackSDNCRequest", "")
159         execution.setVariable(Prefix + "sdncReturnCode", "")
160         execution.setVariable(Prefix + "isSdncRollbackNeeded", false)
161         execution.setVariable(Prefix + "sdncResponseSuccess", false)
162
163         execution.setVariable(Prefix + "isVnfBindingPresent", false)
164         execution.setVariable(Prefix + "Success", false)
165         execution.setVariable(Prefix + "serviceInstanceId", "")
166
167         execution.setVariable(Prefix + "isException", false)
168
169     }
170
171     // **************************************************
172     //     Pre or Prepare Request Section
173     // **************************************************
174     /**
175      * This method is executed during the preProcessRequest task of the <class>DoUpdateNetworkInstance.bpmn</class> process.
176      * @param execution
177      */
178     public void preProcessRequest (DelegateExecution execution) {
179
180         execution.setVariable("prefix",Prefix)
181
182         logger.trace("Inside preProcessRequest DoUpdateNetworkInstance Request ")
183
184         try {
185             // initialize flow variables
186             InitializeProcessVariables(execution)
187
188             // GET Incoming request & validate 3 kinds of format.
189             execution.setVariable("action", "UPDATE")
190             String networkRequest = execution.getVariable("bpmnRequest")
191             if (networkRequest != null) {
192                 if (networkRequest.contains("requestDetails")) {
193                     // JSON format request is sent, create xml
194                     try {
195                         def prettyJson = JsonOutput.prettyPrint(networkRequest.toString())
196                         logger.debug(" Incoming message formatted . . . : " + '\n' + prettyJson)
197                         networkRequest =  vidUtils.createXmlNetworkRequestInfra(execution, networkRequest)
198
199                     } catch (Exception ex) {
200                         String dataErrorMessage = " Invalid json format Request - " + ex.getMessage()
201                         logger.debug(dataErrorMessage)
202                         exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage)
203                     }
204                 } else {
205                     // XML format request is sent
206
207                 }
208             } else {
209                 // vIPR format request is sent, create xml from individual variables
210                 networkRequest = vidUtils.createXmlNetworkRequestInstance(execution)
211             }
212
213             networkRequest = utils.formatXml(networkRequest)
214             logger.debug(networkRequest)
215             execution.setVariable(Prefix + "networkRequest", networkRequest)
216             logger.debug(" network-request - " + '\n' + networkRequest)
217
218             // validate 'disableRollback'  (aka, 'suppressRollback')
219             boolean rollbackEnabled = networkUtils.isRollbackEnabled(execution, networkRequest)
220             execution.setVariable(Prefix + "rollbackEnabled", rollbackEnabled)
221             logger.debug(Prefix + "rollbackEnabled - " + rollbackEnabled)
222
223             String networkInputs = utils.getNodeXml(networkRequest, "network-inputs", false).replace("tag0:","").replace(":tag0","")
224             execution.setVariable(Prefix + "networkInputs", networkInputs)
225             logger.debug(Prefix + "networkInputs - " + '\n' + networkInputs)
226
227             // prepare messageId
228             String messageId = execution.getVariable(Prefix + "messageId")  // for testing
229             if (messageId == null || messageId == "") {
230                 messageId = UUID.randomUUID()
231                 logger.debug(" UPDNETI_messageId, random generated: " + messageId)
232             } else {
233                 logger.debug(" UPDNETI_messageId, pre-assigned: " + messageId)
234             }
235             execution.setVariable(Prefix + "messageId", messageId)
236
237             String source = utils.getNodeText(networkRequest, "source")
238             execution.setVariable(Prefix + "source", source)
239             logger.debug(Prefix + "source - " + source)
240
241             String networkId = ""
242             if (utils.nodeExists(networkRequest, "network-id")) {
243                 networkId = utils.getNodeText(networkRequest, "network-id")
244                 if (networkId == 'null' || networkId == "") {
245                     sendSyncError(execution)
246                     // missing value of networkId
247                     String dataErrorMessage = "Variable 'network-id' value/element is missing."
248                     logger.debug(" Invalid Request - " + dataErrorMessage)
249                     exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage)
250
251                 }
252             }
253
254             String lcpCloudRegion = ""
255             if (utils.nodeExists(networkRequest, "aic-cloud-region")) {
256                 lcpCloudRegion = utils.getNodeText(networkRequest, "aic-cloud-region")
257                 if ((lcpCloudRegion == 'null') || (lcpCloudRegion == "")) {
258                     sendSyncError(execution)
259                     String dataErrorMessage = "requestDetails has missing 'aic-cloud-region' value/element."
260                     logger.debug(" Invalid Request - " + dataErrorMessage)
261                     exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage)
262                 }
263             }
264
265             String serviceInstanceId = ""
266             if (utils.nodeExists(networkRequest, "service-instance-id")) {
267                 serviceInstanceId = utils.getNodeText(networkRequest, "service-instance-id")
268                 if ((serviceInstanceId == 'null') || (lcpCloudRegion == "")) {
269                     sendSyncError(execution)
270                     String dataErrorMessage = "Variable 'serviceInstanceId' value/element is missing."
271                     logger.debug(" Invalid Request - " + dataErrorMessage)
272                     exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage)
273                 }
274             }
275
276             // PO Authorization Info / headers Authorization=
277             String basicAuthValuePO = UrnPropertiesReader.getVariable("mso.adapters.po.auth",execution)
278
279
280             try {
281                 def encodedString = utils.getBasicAuth(basicAuthValuePO, UrnPropertiesReader.getVariable("mso.msoKey", execution))
282                 execution.setVariable("BasicAuthHeaderValuePO",encodedString)
283                 execution.setVariable("BasicAuthHeaderValueSDNC", encodedString)
284
285             } catch (IOException ex) {
286                 String exceptionMessage = "Exception Encountered in DoUpdateNetworkInstance, PreProcessRequest() - "
287                 String dataErrorMessage = exceptionMessage + " Unable to encode PO/SDNC user/password string - " + ex.getMessage()
288                 logger.debug(dataErrorMessage)
289                 exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage)
290             }
291
292             // Set variables for Generic Get Sub Flow use
293             execution.setVariable(Prefix + "serviceInstanceId", serviceInstanceId)
294             logger.debug(Prefix + "serviceInstanceId - " + serviceInstanceId)
295
296             logger.debug(" Url for SDNC adapter: " + UrnPropertiesReader.getVariable("mso.adapters.sdnc.endpoint",execution))
297
298             String sdncVersion = execution.getVariable("sdncVersion")
299             logger.debug("sdncVersion? : " + sdncVersion)
300
301             // build 'networkOutputs'
302             networkId = utils.getNodeText(networkRequest, "network-id")
303             if ((networkId == null) || (networkId == "null")) {
304                 networkId = ""
305             }
306             String networkName = utils.getNodeText(networkRequest, "network-name")
307             if ((networkName == null) || (networkName == "null")) {
308                 networkName = ""
309             }
310             String networkOutputs =
311                     """<network-outputs>
312                            <network-id>${MsoUtils.xmlEscape(networkId)}</network-id>
313                            <network-name>${MsoUtils.xmlEscape(networkName)}</network-name>
314                          </network-outputs>"""
315             execution.setVariable(Prefix + "networkOutputs", networkOutputs)
316             logger.debug(Prefix + "networkOutputs - " + '\n' + networkOutputs)
317             execution.setVariable(Prefix + "networkId", networkId)
318             execution.setVariable(Prefix + "networkName", networkName)
319
320
321         } catch (BpmnError e) {
322             throw e;
323
324         } catch (Exception ex){
325             sendSyncError(execution)
326             // caught exception
327             String exceptionMessage = "Exception Encountered in DoUpdateNetworkInstance, PreProcessRequest() - " + ex.getMessage()
328             logger.debug(exceptionMessage)
329             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
330
331         }
332     }
333
334     /**
335      * Gets the service instance uri from aai
336      *
337      */
338     public void getServiceInstance(DelegateExecution execution) {
339         logger.trace("getServiceInstance ")
340         try {
341             String serviceInstanceId = execution.getVariable('serviceInstanceId')
342
343             AAIResourcesClient resourceClient = new AAIResourcesClient()
344             AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, serviceInstanceId)
345
346             if(!resourceClient.exists(uri)){
347                 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, "Service Instance not found in aai")
348             }else{
349                 Map<String, String> keys = uri.getURIKeys()
350                 execution.setVariable("serviceType", keys.get("service-type"))
351                 execution.setVariable("subscriberName", keys.get("global-customer-id"))
352             }
353
354         }catch(BpmnError e) {
355             throw e;
356         }catch (Exception ex){
357             String msg = "Exception in getServiceInstance. " + ex.getMessage()
358             logger.debug(msg)
359             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
360         }
361     }
362
363     public void callRESTQueryAAICloudRegion (DelegateExecution execution) {
364
365         execution.setVariable("prefix", Prefix)
366
367         logger.debug(" ***** Inside callRESTQueryAAICloudRegion of DoUpdateNetworkInstance ***** " )
368
369         try {
370             String networkInputs  = execution.getVariable(Prefix + "networkInputs")
371             String cloudRegion = utils.getNodeText(networkInputs, "aic-cloud-region")
372
373             // Prepare AA&I url
374             String aai_endpoint = UrnPropertiesReader.getVariable("aai.endpoint", execution)
375             AaiUtil aaiUtil = new AaiUtil(this)
376
377             AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.CLOUD_REGION, Defaults.CLOUD_OWNER.toString(), cloudRegion)
378             def queryCloudRegionRequest = aaiUtil.createAaiUri(uri)
379
380             execution.setVariable(Prefix + "queryCloudRegionRequest", queryCloudRegionRequest)
381
382             String cloudRegionPo = aaiUtil.getAAICloudReqion(execution,  queryCloudRegionRequest, "PO", cloudRegion)
383             String cloudRegionSdnc = aaiUtil.getAAICloudReqion(execution,  queryCloudRegionRequest, "SDNC", cloudRegion)
384
385             if ((cloudRegionPo != "ERROR") && (cloudRegionSdnc != "ERROR")) {
386                 execution.setVariable(Prefix + "cloudRegionPo", cloudRegionPo)
387                 execution.setVariable(Prefix + "cloudRegionSdnc", cloudRegionSdnc)
388                 execution.setVariable(Prefix + "isCloudRegionGood", true)
389
390             } else {
391                 String dataErrorMessage = "QueryAAICloudRegion Unsuccessful. Return Code: " + execution.getVariable(Prefix + "queryCloudRegionReturnCode")
392                 logger.debug(dataErrorMessage)
393                 exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage)
394
395             }
396
397             logger.debug(" is Cloud Region Good: " + execution.getVariable(Prefix + "isCloudRegionGood"))
398
399         } catch (BpmnError e) {
400             throw e;
401
402         } catch (Exception ex) {
403             // try error
404             String exceptionMessage = "Bpmn error encountered in DoUpdateNetworkInstance flow - callRESTQueryAAICloudRegion() - " + ex.getMessage()
405             logger.debug(exceptionMessage)
406             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
407
408         }
409
410     }
411
412     public void callRESTQueryAAINetworkId(DelegateExecution execution) {
413
414         execution.setVariable("prefix", Prefix)
415
416         logger.debug(" ***** Inside callRESTQueryAAINetworkId of DoUpdateNetworkInstance ***** " )
417
418         try {
419             // get variables
420             String networkRequest = execution.getVariable(Prefix + "networkRequest")
421             String networkId   = utils.getNodeText(networkRequest, "network-id")
422             execution.setVariable(Prefix + "networkId", networkId)
423
424             AAIResourcesClient client = new AAIResourcesClient()
425             AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.L3_NETWORK, networkId).depth(Depth.ONE)
426             AAIResultWrapper network = client.get(uri, NotFoundException.class)
427
428             execution.setVariable(Prefix + "aaiIdReturnCode", "200")
429
430             execution.setVariable(Prefix + "queryIdAAIResponse", network)
431
432
433         } catch (NotFoundException e) {
434             String dataErrorMessage = "Response Error from QueryAAINetworkId is 404 (Not Found)."
435             logger.debug(" AAI Query Failed. " + dataErrorMessage)
436             exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage)
437         } catch (Exception ex) {
438             String exceptionMessage = "Bpmn error encountered in DoUpdateNetworkInstance flow. callRESTQueryAAINetworkId() - " + ex.getMessage()
439             logger.debug(exceptionMessage)
440             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
441
442         }
443
444     }
445
446     public void callRESTReQueryAAINetworkId(DelegateExecution execution) {
447
448         execution.setVariable("prefix", Prefix)
449
450         logger.debug(" ***** Inside callRESTReQueryAAINetworkId of DoUpdateNetworkInstance ***** " )
451
452         try {
453             // get variables
454             String networkRequest = execution.getVariable(Prefix + "networkRequest")
455             String networkId   = utils.getNodeText(networkRequest, "network-id")
456
457             AAIResourcesClient client = new AAIResourcesClient()
458             AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.L3_NETWORK, networkId).depth(Depth.ONE)
459             AAIResultWrapper network = client.get(uri, NotFoundException.class)
460
461             execution.setVariable(Prefix + "aaiRequeryIdReturnCode", "200")
462             execution.setVariable(Prefix + "requeryIdAAIResponse", network)
463
464             L3Network net = network.asBean(L3Network.class).get()
465             String netId = net.getNetworkId()
466             String netName = net.getNetworkName()
467             String networkOutputs =
468                     """<network-outputs>
469                    <network-id>${MsoUtils.xmlEscape(netId)}</network-id>
470                    <network-name>${MsoUtils.xmlEscape(netName)}</network-name>
471                  </network-outputs>"""
472             execution.setVariable(Prefix + "networkOutputs", networkOutputs)
473             logger.debug(" networkOutputs - " + '\n' + networkOutputs)
474
475         } catch (NotFoundException e) {
476             String dataErrorMessage = "Response Error from ReQueryAAINetworkId is 404 (Not Found)."
477             logger.debug(" AAI ReQuery Failed. - " + dataErrorMessage)
478             exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage)
479         } catch (Exception ex) {
480             String exceptionMessage = "Bpmn error encountered in DoUpdateNetworkInstance flow. callRESTReQueryAAINetworkId() - " + ex.getMessage()
481             logger.debug(exceptionMessage)
482             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
483
484         }
485
486     }
487
488     public void callRESTQueryAAINetworkVpnBinding(DelegateExecution execution) {
489
490         execution.setVariable("prefix", Prefix)
491
492         logger.debug(" ***** Inside callRESTQueryAAINetworkVpnBinding of DoUpdateNetworkInstance ***** " )
493
494         try {
495
496             // get variables
497             AAIResultWrapper queryIdAAIResponse = execution.getVariable(Prefix + "requeryIdAAIResponse")
498             if(queryIdAAIResponse.getRelationships().isPresent()){
499                 List<AAIResourceUri> uris = queryIdAAIResponse.getRelationships().get().getRelatedAAIUris(AAIObjectType.VPN_BINDING)
500
501                 logger.debug(Prefix + "vpnCount - " + uris.size())
502
503                 if (uris.size() > 0) {
504                     String routeTargets = ""
505                     for(AAIResourceUri u : uris) {
506
507                         AAIResourcesClient client = new AAIResourcesClient()
508                         AAIResultWrapper wrapper = client.get(u.depth(Depth.TWO), NotFoundException.class)
509                         Optional<VpnBinding> binding = wrapper.asBean(VpnBinding.class)
510
511                         String routeTarget = ""
512                         String routeRole = ""
513                         if(binding.get().getRouteTargets() != null) {
514                             List<RouteTarget> targets = binding.get().getRouteTargets().getRouteTarget()
515                             for(RouteTarget target : targets) {
516                                 routeTarget  = target.getGlobalRouteTarget()
517                                 routeRole  = target.getRouteTargetRole()
518                                 routeTargets += "<routeTargets>" + '\n' +
519                                         " <routeTarget>" + routeTarget + "</routeTarget>" + '\n' +
520                                         " <routeTargetRole>" + routeRole + "</routeTargetRole>" + '\n' +
521                                         "</routeTargets>" + '\n'
522                             }
523                         }
524
525                     } // end loop
526
527                     execution.setVariable(Prefix + "routeCollection", routeTargets)
528                     logger.debug(" UPDNETI_routeCollection - " + '\n' + routeTargets)
529
530                 } else {
531                     // reset return code to success
532                     execution.setVariable(Prefix + "aaiQqueryVpnBindingReturnCode", "200")
533                     AaiUtil aaiUriUtil = new AaiUtil(this)
534                     String schemaVersion = aaiUriUtil.getNamespace()
535                     String aaiStubResponse =
536                             """ <rest:payload contentType="text/xml" xmlns:rest="http://schemas.activebpel.org/REST/2007/12/01/aeREST.xsd">
537                                                         <vpn-binding xmlns="${schemaVersion}">
538                                                       <global-route-target/>
539                                                         </vpn-binding>
540                                                 </rest:payload>"""
541                     String aaiStubResponseAsXml = utils.formatXml(aaiStubResponse)
542                     execution.setVariable(Prefix + "queryVpnBindingAAIResponse", aaiStubResponseAsXml)
543                     execution.setVariable(Prefix + "routeCollection", "<routeTargets/>")
544                     logger.debug(" No vpnBinding, using this stub as response - " + '\n' + aaiStubResponseAsXml)
545
546                 }
547             }
548
549         } catch (NotFoundException e) {
550             logger.debug("Response Error from AAINetworkVpnBinding is 404 (Not Found).")
551             exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Response Error from AAINetworkVpnBinding is 404 (Not Found).")
552         } catch (Exception ex) {
553             String exceptionMessage = "Bpmn error encountered in DoUpdateNetworkInstance flow. callRESTQueryAAINetworkVpnBinding() - " + ex.getMessage()
554             logger.debug(exceptionMessage)
555             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
556
557         }
558
559     }
560
561     public void callRESTQueryAAINetworkPolicy(DelegateExecution execution) {
562
563         execution.setVariable("prefix", Prefix)
564
565         logger.debug(" ***** Inside callRESTQueryAAINetworkPolicy of DoUpdateNetworkInstance ***** " )
566
567         try {
568             // get variables
569             AAIResultWrapper queryIdAAIResponse = execution.getVariable(Prefix + "requeryIdAAIResponse")
570             if(queryIdAAIResponse.getRelationships().isPresent()){
571                 List<AAIResourceUri> uris = queryIdAAIResponse.getRelationships().get().getRelatedAAIUris(AAIObjectType.NETWORK_POLICY)
572
573                 execution.setVariable(Prefix + "networkPolicyCount", uris.size())
574                 logger.debug(Prefix + "networkPolicyCount - " + uris.size())
575
576                 if (uris.size() > 0) {
577
578                     String networkPolicies = ""
579                     // AII loop call using list vpnBindings
580                     for(AAIResourceUri u : uris) {
581
582                         AAIResourcesClient client = new AAIResourcesClient()
583                         NetworkPolicy p = client.get(u, NotFoundException.class).asBean(NetworkPolicy.class).get()
584
585                         execution.setVariable(Prefix + "aaiQqueryNetworkPolicyReturnCode", "200")
586
587                         String networkPolicy  = p.getNetworkPolicyFqdn()
588                         networkPolicies += "<policyFqdns>" + networkPolicy + "</policyFqdns>" + '\n'
589
590                     } // end loop
591
592                     execution.setVariable(Prefix + "networkCollection", networkPolicies)
593                     logger.debug(" UPDNETI_networkCollection - " + '\n' + networkPolicies)
594
595                 } else {
596                     // reset return code to success
597                     execution.setVariable(Prefix + "aaiQqueryNetworkPolicyReturnCode", "200")
598                     AaiUtil aaiUriUtil = new AaiUtil(this)
599                     String schemaVersion = aaiUriUtil.getNamespace()
600                     String aaiStubResponse =
601                             """ <rest:payload contentType="text/xml" xmlns:rest="http://schemas.activebpel.org/REST/2007/12/01/aeREST.xsd">
602                                                         <network-policy xmlns="${schemaVersion}">
603                                                           <network-policy-fqdn/>
604                             </network-policy>
605                                                 </rest:payload>"""
606                     String aaiStubResponseAsXml = utils.formatXml(aaiStubResponse)
607                     execution.setVariable(Prefix + "queryNetworkPolicyAAIResponse", aaiStubResponseAsXml)
608                     execution.setVariable(Prefix + "networkCollection", "<policyFqdns/>")
609                     logger.debug(" No net policies, using this stub as response - " + '\n' + aaiStubResponseAsXml)
610
611                 }
612             }
613
614         } catch (NotFoundException e) {
615             String dataErrorMessage = "Response Error from QueryAAINetworkPolicy is 404 (Not Found)."
616             logger.debug(dataErrorMessage)
617             exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage)
618         } catch (Exception ex) {
619             String exceptionMessage = "Bpmn error encountered in DoUpdateNetworkInstance flow. callRESTQueryAAINetworkPolicy() - " + ex.getMessage()
620             logger.debug(exceptionMessage)
621             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
622
623         }
624
625     }
626
627     public void callRESTQueryAAINetworkTableRef(DelegateExecution execution) {
628
629         execution.setVariable("prefix", Prefix)
630
631         logger.debug(" ***** Inside callRESTQueryAAINetworkTableRef of DoUpdateNetworkInstance ***** " )
632
633         try {
634             AAIResultWrapper queryIdAAIResponse = execution.getVariable(Prefix + "requeryIdAAIResponse")
635             if(queryIdAAIResponse.getRelationships().isPresent()){
636                 List<AAIResourceUri> uris = queryIdAAIResponse.getRelationships().get().getRelatedAAIUris(AAIObjectType.ROUTE_TABLE_REFERENCE)
637
638                 execution.setVariable(Prefix + "networkTableRefCount", uris.size())
639                 logger.debug(Prefix + "networkTableRefCount - " + uris.size())
640
641                 logger.debug(" UPDNETI_networkTableRefCount - " + uris.size())
642                 if (uris.size() > 0) {
643
644                     execution.setVariable(Prefix + "aaiQqueryNetworkTableRefReturnCode", "200")
645
646                     // AII loop call using list vpnBindings
647                     String networkTableRefs = ""
648                     for(AAIResourceUri u : uris) {
649
650                         AAIResourcesClient client = new AAIResourcesClient()
651                         RouteTableReference rt = client.get(u, NotFoundException.class).asBean(RouteTableReference.class).get()
652
653                         String networkTableRef  = rt.getRouteTableReferenceFqdn()
654                         networkTableRefs += "<routeTableFqdns>" + networkTableRef + "</routeTableFqdns>" + '\n'
655
656                     } // end loop
657
658                     execution.setVariable(Prefix + "tableRefCollection", networkTableRefs)
659                     logger.debug(" UPDNETI_tableRefCollection - " + '\n' + networkTableRefs)
660
661                 } else {
662                     // reset return code to success
663                     execution.setVariable(Prefix + "aaiQqueryNetworkTableRefReturnCode", "200")
664                     AaiUtil aaiUriUtil = new AaiUtil(this)
665                     String schemaVersion = aaiUriUtil.getNamespace()
666                     String aaiStubResponse =
667                             """ <rest:payload contentType="text/xml" xmlns:rest="http://schemas.activebpel.org/REST/2007/12/01/aeREST.xsd">
668                                                         <route-table-references xmlns="${schemaVersion}">
669                                                           <route-table-reference-fqdn/>
670                             </route-table-references>
671                                                 </rest:payload>"""
672                     String aaiStubResponseAsXml = utils.formatXml(aaiStubResponse)
673                     execution.setVariable(Prefix + "queryNetworkTableRefAAIResponse", aaiStubResponseAsXml)
674                     execution.setVariable(Prefix + "tableRefCollection", "<routeTableFqdns/>")
675                     logger.debug(" No net table references, using this stub as response - " + '\n' + aaiStubResponseAsXml)
676
677                 }
678             }
679
680         } catch (NotFoundException e) {
681             String dataErrorMessage = "Response Error from QueryAAINetworkTableRef is 404 (Not Found)."
682             logger.debug(dataErrorMessage)
683             exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage)
684
685         } catch (Exception ex) {
686             String exceptionMessage = "Bpmn error encountered in DoUpdateNetworkInstance flow. callRESTQueryAAINetworkTableRef() - " + ex.getMessage()
687             logger.debug(exceptionMessage)
688             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
689
690         }
691
692     }
693
694     public void callRESTUpdateContrailAAINetwork(DelegateExecution execution) {
695         execution.setVariable("prefix", Prefix)
696         logger.debug(" ***** Inside callRESTUpdateContrailAAINetwork of DoUpdateNetworkInstance ***** " )
697         try {
698             // get variables
699             String networkRequest = execution.getVariable(Prefix + "networkRequest")
700             String networkId   = utils.getNodeText(networkRequest, "network-id")
701             AAIResultWrapper requeryIdAAIResponse   = execution.getVariable(Prefix + "requeryIdAAIResponse")
702             String updateNetworkResponse   = execution.getVariable(Prefix + "updateNetworkResponse")
703
704             L3Network oldL3Network = requeryIdAAIResponse.asBean(L3Network.class).get()
705             L3Network l3Network = new L3Network()
706             if (oldL3Network.getHeatStackId() != null) {
707             } else {
708                 if (utils.nodeExists(updateNetworkResponse, 'networkStackId')) {
709                     l3Network.setHeatStackId(utils.getNodeText(updateNetworkResponse, 'networkStackId'))
710                 }
711             }
712             if (oldL3Network.getNeutronNetworkId() != null) {
713             } else {
714                 if (utils.nodeExists(updateNetworkResponse, 'neutronNetworkId')) {
715                     l3Network.setNeutronNetworkId(utils.getNodeText(updateNetworkResponse, 'neutronNetworkId'))
716                 }
717             }
718             if (oldL3Network.getContrailNetworkFqdn() != null) {
719             } else {
720                 if (utils.nodeExists(updateNetworkResponse, 'networkFqdn')) {
721                     l3Network.setContrailNetworkFqdn(utils.getNodeText(updateNetworkResponse, 'networkFqdn'))
722                 }
723             }
724
725             String status = utils.getNodeText(updateNetworkResponse, 'orchestration-status')
726             if(status.equals("pending-create") || status.equals("PendingCreate")){
727                 l3Network.setOrchestrationStatus("Created")
728             }else{
729                 l3Network.setOrchestrationStatus("Active")
730             }
731
732             AAIResourcesClient client = new AAIResourcesClient()
733             AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.L3_NETWORK, networkId)
734             client.update(uri, l3Network)
735
736             List<Subnet> subnets = oldL3Network.getSubnets().getSubnet()
737             for(Subnet s:subnets){
738                 String subnetOrchStatus = s.getOrchestrationStatus()
739                 String subnetId = s.getSubnetId()
740
741                 Subnet subnet = new Subnet()
742                 String neutronSubnetId = networkUtils.extractNeutSubId(updateNetworkResponse, subnetId)
743                 subnet.setNeutronSubnetId(neutronSubnetId)
744                 if(subnetOrchStatus.equals("pending-create") || subnetOrchStatus.equals("PendingCreate") ){
745                     subnet.setOrchestrationStatus("Created")
746                 }else{
747                     subnet.setOrchestrationStatus("Active")
748                 }
749
750                 AAIResourceUri subUri = AAIUriFactory.createResourceUri(AAIObjectType.SUBNET, networkId, subnetId)
751                 client.update(subUri, subnet)
752             }
753
754             execution.setVariable(Prefix + "isPONR", true)
755
756         } catch (BpmnError e) {
757             throw e;
758         } catch (NotFoundException e) {
759             String dataErrorMessage = " Response Error from UpdateContrailAAINetwork is 404 (Not Found)."
760             logger.debug(dataErrorMessage)
761             exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage)
762         } catch (Exception ex) {
763             String exceptionMessage = "Bpmn error encountered in DoUpdateNetworkInstance flow. callRESTUpdateContrailAAINetwork() - " + ex.getMessage()
764             logger.debug(exceptionMessage)
765             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
766
767         }
768
769     }
770
771     public void prepareUpdateNetworkRequest (DelegateExecution execution) {
772
773         execution.setVariable("prefix", Prefix)
774
775         logger.trace("Inside prepareUpdateNetworkRequest of DoUpdateNetworkInstance ")
776
777         try {
778
779             // get variables
780             String requestId = execution.getVariable(Prefix + "requestId")
781             String messageId = execution.getVariable(Prefix + "messageId")
782             String source    = execution.getVariable(Prefix + "source")
783
784             String requestInput = execution.getVariable(Prefix + "networkRequest")
785             L3Network queryIdResponse = execution.getVariable(Prefix + "requeryIdAAIResponse")
786             String cloudRegionId = execution.getVariable(Prefix + "cloudRegionPo")
787             String backoutOnFailure = execution.getVariable(Prefix + "rollbackEnabled")
788
789             // Prepare Network request
790             String routeCollection = execution.getVariable(Prefix + "routeCollection")
791             String policyCollection = execution.getVariable(Prefix + "networkCollection")
792             String tableCollection = execution.getVariable(Prefix + "tableRefCollection")
793             String updateNetworkRequest = networkUtils.UpdateNetworkRequestV2(execution, requestId, messageId, requestInput, queryIdResponse, routeCollection, policyCollection, tableCollection, cloudRegionId, backoutOnFailure, source )
794             // Format Response
795             String buildUpdateNetworkRequestAsString = utils.formatXml(updateNetworkRequest)
796             buildUpdateNetworkRequestAsString = buildUpdateNetworkRequestAsString.replace(":w1aac13n0", "").replace("w1aac13n0:", "")
797             logger.debug(buildUpdateNetworkRequestAsString)
798
799             execution.setVariable(Prefix + "updateNetworkRequest", buildUpdateNetworkRequestAsString)
800             logger.debug(" UPDNETI_updateNetworkRequest - " + "\n" +  buildUpdateNetworkRequestAsString)
801
802         } catch (Exception ex) {
803             String exceptionMessage = " Bpmn error encountered in DoUpdateNetworkInstance flow. prepareUpdateNetworkRequest() - " + ex.getMessage()
804             logger.debug(exceptionMessage)
805             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
806
807         }
808
809     }
810
811     public void prepareSDNCRequest (DelegateExecution execution) {
812
813         execution.setVariable("prefix", Prefix)
814
815         logger.trace("Inside prepareSDNCRequest of DoUpdateNetworkInstance ")
816
817         try {
818             // get variables
819             String sdncCallback = UrnPropertiesReader.getVariable("mso.workflow.sdncadapter.callback",execution)
820             String updateNetworkInput = execution.getVariable(Prefix + "networkRequest")
821             String cloudRegionId = execution.getVariable(Prefix + "cloudRegionSdnc")
822
823             String networkId = ""
824             if (utils.nodeExists(updateNetworkInput, "network-id")) {
825                 networkId = utils.getNodeText(updateNetworkInput, "network-id")
826             }
827             if (networkId == null) {networkId = ""}
828
829             String serviceInstanceId = utils.getNodeText(updateNetworkInput, "service-instance-id")
830
831             AAIResultWrapper wrapper = execution.getVariable(Prefix + "queryIdAAIResponse")
832             L3Network queryAAIResponse = wrapper.asBean(L3Network.class).get()
833
834             // 1. prepare assign topology via SDNC Adapter SUBFLOW call
835             String sndcTopologyCreateRequest = sdncAdapterUtils.sdncTopologyRequestV2(execution, updateNetworkInput, serviceInstanceId, sdncCallback, "changeassign", "NetworkActivateRequest", cloudRegionId, networkId, queryAAIResponse, null)
836
837             String sndcTopologyUpdateRequesAsString = utils.formatXml(sndcTopologyCreateRequest)
838             logger.debug(sndcTopologyUpdateRequesAsString)
839             execution.setVariable(Prefix + "changeAssignSDNCRequest", sndcTopologyUpdateRequesAsString)
840             logger.debug(" UPDNETI_changeAssignSDNCRequest - " + "\n" +  sndcTopologyUpdateRequesAsString)
841
842
843         } catch (Exception ex) {
844             String exceptionMessage = " Bpmn error encountered in DoUpdateNetworkInstance flow. prepareSDNCRequest() - " + ex.getMessage()
845             logger.debug(exceptionMessage)
846             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
847
848         }
849
850     }
851
852     public void validateSDNCResponse (DelegateExecution execution) {
853
854         execution.setVariable("prefix", Prefix)
855
856         logger.trace("Inside validateSDNCResponse of DoUpdateNetworkInstance ")
857
858         String response = execution.getVariable(Prefix + "changeAssignSDNCResponse")
859         WorkflowException workflowException = null
860         try {
861             workflowException = execution.getVariable(Prefix + "WorkflowException")
862             //execution.setVariable("WorkflowException", workflowException)
863         } catch (Exception ex) {
864             logger.debug(" Sdnc 'WorkflowException' object is empty or null. ")
865         }
866
867         boolean successIndicator = execution.getVariable("SDNCA_SuccessIndicator")
868
869         SDNCAdapterUtils sdncAdapterUtils = new SDNCAdapterUtils()
870         sdncAdapterUtils.validateSDNCResponse(execution, response, workflowException, successIndicator)
871         // reset variable
872         String changeAssignSDNCResponseDecodeXml = execution.getVariable(Prefix + "changeAssignSDNCResponse")
873         changeAssignSDNCResponseDecodeXml = changeAssignSDNCResponseDecodeXml.replace('<?xml version="1.0" encoding="UTF-8"?>', "")
874         execution.setVariable(Prefix + "changeAssignSDNCResponse", changeAssignSDNCResponseDecodeXml)
875
876         if (execution.getVariable(Prefix + "sdncResponseSuccess") == true) {  // from sdnc util, prefix+'sdncResponseSuccess'
877             execution.setVariable(Prefix + "isSdncRollbackNeeded", true)
878             logger.debug("Successfully Validated SDNC Response")
879
880         } else {
881             logger.debug("Did NOT Successfully Validated SDNC Response")
882             throw new BpmnError("MSOWorkflowException")
883         }
884
885     }
886
887
888     public void postProcessResponse (DelegateExecution execution) {
889
890         execution.setVariable("prefix", Prefix)
891
892         logger.trace("Inside postProcessResponse of DoUpdateNetworkInstance ")
893
894         try {
895             logger.debug(" ***** Is Exception Encountered (isException)? : " + execution.getVariable(Prefix + "isException"))
896             if (execution.getVariable(Prefix + "isException") == false) {
897                 // set rollback data
898                 execution.setVariable("orchestrationStatus", "")
899                 execution.setVariable("networkId", execution.getVariable(Prefix + "networkId"))
900                 execution.setVariable("networkName", execution.getVariable(Prefix + "networkName"))
901                 prepareSuccessRollbackData(execution) // populate rollbackData
902                 execution.setVariable("WorkflowException", null)
903                 execution.setVariable(Prefix + "Success", true)
904                 logger.debug(" ***** postProcessResponse(), GOOD !!!")
905             } else {
906                 execution.setVariable(Prefix + "Success", false)
907                 execution.setVariable("rollbackData", null)
908                 String exceptionMessage = " Exception encountered in MSO Bpmn. "
909                 if (execution.getVariable("workflowException") != null) {  // Output of Rollback flow.
910                     logger.debug(" ***** workflowException: " + execution.getVariable("workflowException"))
911                     WorkflowException wfex = execution.getVariable("workflowException")
912                     exceptionMessage = wfex.getErrorMessage()
913                 } else {
914                     if (execution.getVariable(Prefix + "WorkflowException") != null) {
915                         WorkflowException pwfex = execution.getVariable(Prefix + "WorkflowException")
916                         exceptionMessage = pwfex.getErrorMessage()
917                     }
918                 }
919                 // going to the Main flow: a-la-carte or macro
920                 logger.debug(" ***** postProcessResponse(), BAD !!!")
921                 exceptionUtil.buildWorkflowException(execution, 7000, exceptionMessage)
922                 throw new BpmnError("MSOWorkflowException")
923             }
924
925         } catch(BpmnError b){
926             logger.debug("Rethrowing MSOWorkflowException")
927             throw b
928
929
930         } catch (Exception ex) {
931             String exceptionMessage = " Bpmn error encountered in DoUpdateNetworkInstance flow. postProcessResponse() - " + ex.getMessage()
932             logger.debug(exceptionMessage)
933             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
934
935         }
936
937
938     }
939
940     public void prepareSDNCRollbackRequest (DelegateExecution execution) {
941
942         execution.setVariable("prefix", Prefix)
943
944         logger.trace("Inside prepareSDNCRollbackRequest of DoUpdateNetworkInstance ")
945
946         try {
947             // for some reason the WorkflowException object is null after the sdnc rollback call task, need to save WorkflowException.
948             execution.setVariable(Prefix + "WorkflowException", execution.getVariable("WorkflowException"))
949             // get variables
950             String sdncCallback = UrnPropertiesReader.getVariable("mso.workflow.sdncadapter.callback",execution)
951             String updateNetworkInput = execution.getVariable(Prefix + "networkRequest")
952             String cloudRegionId = execution.getVariable(Prefix + "cloudRegionSdnc")
953             String changeAssignSDNCResponse = execution.getVariable(Prefix + "changeAssignSDNCResponse")
954             String networkId = utils.getNodeText(changeAssignSDNCResponse, "network-id")
955
956             String serviceInstanceId = utils.getNodeText(updateNetworkInput, "service-instance-id")
957
958             // 2. prepare rollback topology via SDNC Adapter SUBFLOW call
959             String sndcTopologyRollbackRequest = sdncAdapterUtils.sdncTopologyRequestV2(execution, updateNetworkInput, serviceInstanceId, sdncCallback, "rollback", "NetworkActivateRequest", cloudRegionId, networkId, null, null)
960             String sndcTopologyRollbackRequestAsString = utils.formatXml(sndcTopologyRollbackRequest)
961             execution.setVariable(Prefix + "rollbackSDNCRequest", sndcTopologyRollbackRequestAsString)
962             logger.debug(" Preparing request for SDNC Topology assign's rollback/compensation . . . - " + "\n" +  sndcTopologyRollbackRequestAsString)
963
964         } catch (Exception ex) {
965             String exceptionMessage = " Bpmn error encountered in DoUpdateNetworkInstance flow. prepareSDNCRollbackRequest() - " + ex.getMessage()
966             logger.debug(exceptionMessage)
967             exceptionUtil.buildWorkflowException(execution, 7000, exceptionMessage)
968
969         }
970
971     }
972
973     public void prepareRollbackData(DelegateExecution execution) {
974
975         execution.setVariable("prefix",Prefix)
976
977         logger.trace("Inside prepareRollbackData() of DoUpdateNetworkInstance ")
978
979         try {
980
981             Map<String, String> rollbackData = new HashMap<String, String>();
982             String rollbackSDNCRequest = execution.getVariable(Prefix + "rollbackSDNCRequest")
983             if (rollbackSDNCRequest != null) {
984                 if (rollbackSDNCRequest != "") {
985                     rollbackData.put("rollbackSDNCRequest", execution.getVariable(Prefix + "rollbackSDNCRequest"))
986                 }
987             }
988             String rollbackNetworkRequest = execution.getVariable(Prefix + "rollbackNetworkRequest")
989             if (rollbackNetworkRequest != null) {
990                 if (rollbackNetworkRequest != "") {
991                     rollbackData.put("rollbackNetworkRequest", execution.getVariable(Prefix + "rollbackNetworkRequest"))
992                 }
993             }
994             execution.setVariable("rollbackData", rollbackData)
995             logger.debug("** rollbackData : " + rollbackData)
996
997             execution.setVariable("WorkflowException", execution.getVariable(Prefix + "WorkflowException"))
998             logger.debug("** WorkflowException : " + execution.getVariable("WorkflowException"))
999
1000         } catch (Exception ex) {
1001             String exceptionMessage = " Bpmn error encountered in DoUpdateNetworkInstance flow. prepareRollbackData() - " + ex.getMessage()
1002             logger.debug(exceptionMessage)
1003             exceptionUtil.buildWorkflowException(execution, 7000, exceptionMessage)
1004
1005         }
1006
1007     }
1008
1009     public void prepareSuccessRollbackData(DelegateExecution execution) {
1010
1011         execution.setVariable("prefix",Prefix)
1012
1013         logger.trace("Inside prepareSuccessRollbackData() of DoUpdateNetworkInstance ")
1014
1015         try {
1016
1017             if (execution.getVariable("sdncVersion") != '1610') {
1018                 // skip: 1702 for 'changeassign' or equivalent not yet defined in SNDC, so no rollback.
1019             } else {
1020                 prepareSDNCRollbackRequest(execution)
1021             }
1022
1023             Map<String, String> rollbackData = new HashMap<String, String>();
1024             String rollbackSDNCRequest = execution.getVariable(Prefix + "rollbackSDNCRequest")
1025             if (rollbackSDNCRequest != null) {
1026                 if (rollbackSDNCRequest != "") {
1027                     rollbackData.put("rollbackSDNCRequest", rollbackSDNCRequest)
1028                 }
1029             }
1030             String rollbackNetworkRequest = execution.getVariable(Prefix + "rollbackNetworkRequest")
1031             if (rollbackNetworkRequest != null) {
1032                 if (rollbackNetworkRequest != "") {
1033                     rollbackData.put("rollbackNetworkRequest", rollbackNetworkRequest)
1034                 }
1035             }
1036             execution.setVariable("rollbackData", rollbackData)
1037
1038             logger.debug("** 'rollbackData' for Full Rollback : " + rollbackData)
1039             execution.setVariable("WorkflowException", null)
1040
1041
1042         } catch (Exception ex) {
1043             String exceptionMessage = " Bpmn error encountered in DoUpdateNetworkInstance flow. prepareSuccessRollbackData() - " + ex.getMessage()
1044             logger.debug(exceptionMessage)
1045             exceptionUtil.buildWorkflowException(execution, 7000, exceptionMessage)
1046
1047         }
1048
1049     }
1050
1051     public void setExceptionFlag(DelegateExecution execution){
1052
1053         execution.setVariable("prefix",Prefix)
1054
1055         logger.trace("Inside setExceptionFlag() of DoUpdateNetworkInstance ")
1056
1057         try {
1058
1059             execution.setVariable(Prefix + "isException", true)
1060
1061             if (execution.getVariable("SavedWorkflowException1") != null) {
1062                 execution.setVariable(Prefix + "WorkflowException", execution.getVariable("SavedWorkflowException1"))
1063             } else {
1064                 execution.setVariable(Prefix + "WorkflowException", execution.getVariable("WorkflowException"))
1065             }
1066             logger.debug(Prefix + "WorkflowException - " +execution.getVariable(Prefix + "WorkflowException"))
1067
1068         } catch(Exception ex){
1069             String exceptionMessage = "Bpmn error encountered in DoUpdateNetworkInstance flow. setExceptionFlag(): " + ex.getMessage()
1070             logger.debug(exceptionMessage)
1071             exceptionUtil.buildWorkflowException(execution, 7000, exceptionMessage)
1072         }
1073
1074     }
1075
1076
1077     // *******************************
1078     //     Build Error Section
1079     // *******************************
1080
1081     public void processJavaException(DelegateExecution execution){
1082
1083         execution.setVariable("prefix",Prefix)
1084         try{
1085             logger.debug("Caught a Java Exception")
1086             logger.debug("Started processJavaException Method")
1087             logger.debug("Variables List: " + execution.getVariables())
1088             execution.setVariable("UnexpectedError", "Caught a Java Lang Exception - "  + Prefix)  // Adding this line temporarily until this flows error handling gets updated
1089             exceptionUtil.buildWorkflowException(execution, 500, "Caught a Java Lang Exception")
1090
1091         }catch(Exception e){
1092             logger.debug("Caught Exception during processJavaException Method: " + e)
1093             execution.setVariable("UnexpectedError", "Exception in processJavaException method")  // Adding this line temporarily until this flows error handling gets updated
1094             exceptionUtil.buildWorkflowException(execution, 500, "Exception in processJavaException method")
1095         }
1096         logger.debug("Completed processJavaException Method")
1097     }
1098
1099 }