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