6162780b27339d6db6d0d37c8d95fbe3f6789484
[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.so.client.aai.AAIObjectType
42 import org.onap.so.client.aai.AAIResourcesClient
43 import org.onap.so.client.aai.entities.uri.AAIResourceUri
44 import org.onap.so.client.aai.entities.uri.AAIUriFactory
45 import org.onap.so.client.aai.entities.AAIResultWrapper
46 import org.onap.so.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
853
854
855         // **************************************************
856         //     Post or Validate Response Section
857         // **************************************************
858
859         public void validateUpdateNetworkResponse (DelegateExecution execution) {
860
861                 execution.setVariable("prefix", Prefix)
862
863                 logger.trace("Inside validateUpdateNetworkResponse of DoUpdateNetworkInstance ")
864
865                 try {
866                         String returnCode = execution.getVariable(Prefix + "networkReturnCode")
867                         String networkResponse = execution.getVariable(Prefix + "updateNetworkResponse")
868                         if (networkResponse==null)      {
869                                 networkResponse="" // reset
870                         }
871
872                         logger.debug(" Network Adapter update responseCode: " + returnCode)
873
874                         String errorMessage = ""
875                         if (returnCode == "200") {
876                                 execution.setVariable(Prefix + "isNetworkRollbackNeeded", true)
877                                 logger.debug(networkResponse)
878                                 execution.setVariable(Prefix + "updateNetworkResponse", networkResponse)
879                                 logger.debug(" Network Adapter update Success Response - " + "\n" + networkResponse)
880
881                                 // prepare rollback data
882                                 String rollbackData = utils.getNodeXml(networkResponse, "rollback", false).replace("tag0:","").replace(":tag0","")
883                                 rollbackData = rollbackData.replace("rollback>", "networkRollback>")
884                                 String rollbackNetwork =
885                                         """<rollbackNetworkRequest>
886                                                         ${rollbackData}
887                                                 </rollbackNetworkRequest>"""
888                                 String rollbackNetworkXml = utils.formatXml(rollbackNetwork)
889                                 execution.setVariable(Prefix + "rollbackNetworkRequest", rollbackNetworkXml)
890                                 logger.debug(" Network Adapter rollback data - " + "\n" + rollbackNetworkXml)
891
892                         } else { // network error
893                            if (returnCode.toInteger() > 399 && returnCode.toInteger() < 600) {   //4xx, 5xx
894                                    if (networkResponse.contains("updateNetworkError")) {
895                                            networkResponse = networkResponse.replace('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>', '')
896                                            errorMessage = utils.getNodeText(networkResponse, "message")
897                                            errorMessage  = "Received error from Network Adapter: " + errorMessage
898                                            exceptionUtil.buildAndThrowWorkflowException(execution, 2500, errorMessage)
899
900                                    } else { // CatchAll exception
901                                            if (returnCode == "500") {
902                                                    errorMessage = "JBWEB000065: HTTP Status 500."
903                                        } else {
904                                                errorMessage = "Return code is " + returnCode
905                                        }
906                                            errorMessage  = "Received error from Network Adapter: " + errorMessage
907                                            exceptionUtil.buildAndThrowWorkflowException(execution, 2500, errorMessage)
908
909                                    }
910
911                            } else { // CatchAll exception
912                                    String dataErrorMessage  = "Received error from Network Adapter. Return code is: " + returnCode
913                                    exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage)
914
915                            }
916
917                         }
918
919                 } catch (BpmnError e) {
920                         throw e;
921
922                 } catch (Exception ex) {
923                         String exceptionMessage = " Bpmn error encountered in DoUpdateNetworkInstance flow. validateUpdateNetworkResponse() - " + ex.getMessage()
924                         logger.debug(exceptionMessage)
925                         exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
926
927                 }
928
929
930         }
931
932         public void validateSDNCResponse (DelegateExecution execution) {
933
934                 execution.setVariable("prefix", Prefix)
935
936                 logger.trace("Inside validateSDNCResponse of DoUpdateNetworkInstance ")
937
938                 String response = execution.getVariable(Prefix + "changeAssignSDNCResponse")
939                 WorkflowException workflowException = null
940                 try {
941                         workflowException = execution.getVariable(Prefix + "WorkflowException")
942                         //execution.setVariable("WorkflowException", workflowException)
943                 } catch (Exception ex) {
944                         logger.debug(" Sdnc 'WorkflowException' object is empty or null. ")
945                 }
946
947                 boolean successIndicator = execution.getVariable("SDNCA_SuccessIndicator")
948
949                 SDNCAdapterUtils sdncAdapterUtils = new SDNCAdapterUtils()
950                 sdncAdapterUtils.validateSDNCResponse(execution, response, workflowException, successIndicator)
951                 // reset variable
952                 String changeAssignSDNCResponseDecodeXml = execution.getVariable(Prefix + "changeAssignSDNCResponse")
953                 changeAssignSDNCResponseDecodeXml = changeAssignSDNCResponseDecodeXml.replace('<?xml version="1.0" encoding="UTF-8"?>', "")
954                 execution.setVariable(Prefix + "changeAssignSDNCResponse", changeAssignSDNCResponseDecodeXml)
955
956                 if (execution.getVariable(Prefix + "sdncResponseSuccess") == true) {  // from sdnc util, prefix+'sdncResponseSuccess'
957                         execution.setVariable(Prefix + "isSdncRollbackNeeded", true)
958                         logger.debug("Successfully Validated SDNC Response")
959
960                 } else {
961                         logger.debug("Did NOT Successfully Validated SDNC Response")
962                         throw new BpmnError("MSOWorkflowException")
963                 }
964
965         }
966
967
968         public void postProcessResponse (DelegateExecution execution) {
969
970                 execution.setVariable("prefix", Prefix)
971
972                 logger.trace("Inside postProcessResponse of DoUpdateNetworkInstance ")
973
974                 try {
975                         logger.debug(" ***** Is Exception Encountered (isException)? : " + execution.getVariable(Prefix + "isException"))
976                         if (execution.getVariable(Prefix + "isException") == false) {
977                                 // set rollback data
978                                 execution.setVariable("orchestrationStatus", "")
979                                 execution.setVariable("networkId", execution.getVariable(Prefix + "networkId"))
980                                 execution.setVariable("networkName", execution.getVariable(Prefix + "networkName"))
981                                 prepareSuccessRollbackData(execution) // populate rollbackData
982                                 execution.setVariable("WorkflowException", null)
983                                 execution.setVariable(Prefix + "Success", true)
984                                 logger.debug(" ***** postProcessResponse(), GOOD !!!")
985                         } else {
986                                 execution.setVariable(Prefix + "Success", false)
987                                 execution.setVariable("rollbackData", null)
988                                 String exceptionMessage = " Exception encountered in MSO Bpmn. "
989                                 if (execution.getVariable("workflowException") != null) {  // Output of Rollback flow.
990                                    logger.debug(" ***** workflowException: " + execution.getVariable("workflowException"))
991                                    WorkflowException wfex = execution.getVariable("workflowException")
992                                    exceptionMessage = wfex.getErrorMessage()
993                                 } else {
994                                if (execution.getVariable(Prefix + "WorkflowException") != null) {
995                                       WorkflowException pwfex = execution.getVariable(Prefix + "WorkflowException")
996                                       exceptionMessage = pwfex.getErrorMessage()
997                                }
998                                 }
999                             // going to the Main flow: a-la-carte or macro
1000                             logger.debug(" ***** postProcessResponse(), BAD !!!")
1001                             exceptionUtil.buildWorkflowException(execution, 7000, exceptionMessage)
1002                                 throw new BpmnError("MSOWorkflowException")
1003                         }
1004
1005                 } catch(BpmnError b){
1006                      logger.debug("Rethrowing MSOWorkflowException")
1007                      throw b
1008
1009
1010                 } catch (Exception ex) {
1011                         String exceptionMessage = " Bpmn error encountered in DoUpdateNetworkInstance flow. postProcessResponse() - " + ex.getMessage()
1012                         logger.debug(exceptionMessage)
1013                         exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
1014
1015         }
1016
1017
1018         }
1019
1020         public void prepareSDNCRollbackRequest (DelegateExecution execution) {
1021
1022                 execution.setVariable("prefix", Prefix)
1023
1024                 logger.trace("Inside prepareSDNCRollbackRequest of DoUpdateNetworkInstance ")
1025
1026                 try {
1027                         // for some reason the WorkflowException object is null after the sdnc rollback call task, need to save WorkflowException.
1028                         execution.setVariable(Prefix + "WorkflowException", execution.getVariable("WorkflowException"))
1029                         // get variables
1030                         String sdncCallback = UrnPropertiesReader.getVariable("mso.workflow.sdncadapter.callback",execution)
1031                         String updateNetworkInput = execution.getVariable(Prefix + "networkRequest")
1032                         String cloudRegionId = execution.getVariable(Prefix + "cloudRegionSdnc")
1033                         String changeAssignSDNCResponse = execution.getVariable(Prefix + "changeAssignSDNCResponse")
1034                         String networkId = utils.getNodeText(changeAssignSDNCResponse, "network-id")
1035
1036                         String serviceInstanceId = utils.getNodeText(updateNetworkInput, "service-instance-id")
1037
1038                         // 2. prepare rollback topology via SDNC Adapter SUBFLOW call
1039                         String sndcTopologyRollbackRequest = sdncAdapterUtils.sdncTopologyRequestV2(execution, updateNetworkInput, serviceInstanceId, sdncCallback, "rollback", "NetworkActivateRequest", cloudRegionId, networkId, null, null)
1040                         String sndcTopologyRollbackRequestAsString = utils.formatXml(sndcTopologyRollbackRequest)
1041                         execution.setVariable(Prefix + "rollbackSDNCRequest", sndcTopologyRollbackRequestAsString)
1042                         logger.debug(" Preparing request for SDNC Topology assign's rollback/compensation . . . - " + "\n" +  sndcTopologyRollbackRequestAsString)
1043
1044                 } catch (Exception ex) {
1045                         String exceptionMessage = " Bpmn error encountered in DoUpdateNetworkInstance flow. prepareSDNCRollbackRequest() - " + ex.getMessage()
1046                         logger.debug(exceptionMessage)
1047                         exceptionUtil.buildWorkflowException(execution, 7000, exceptionMessage)
1048
1049                 }
1050
1051         }
1052
1053         public void prepareRollbackData(DelegateExecution execution) {
1054
1055                 execution.setVariable("prefix",Prefix)
1056
1057                 logger.trace("Inside prepareRollbackData() of DoUpdateNetworkInstance ")
1058
1059                 try {
1060
1061                         Map<String, String> rollbackData = new HashMap<String, String>();
1062                         String rollbackSDNCRequest = execution.getVariable(Prefix + "rollbackSDNCRequest")
1063                         if (rollbackSDNCRequest != null) {
1064                                 if (rollbackSDNCRequest != "") {
1065                                         rollbackData.put("rollbackSDNCRequest", execution.getVariable(Prefix + "rollbackSDNCRequest"))
1066                                 }
1067                         }
1068                         String rollbackNetworkRequest = execution.getVariable(Prefix + "rollbackNetworkRequest")
1069                         if (rollbackNetworkRequest != null) {
1070                                 if (rollbackNetworkRequest != "") {
1071                                         rollbackData.put("rollbackNetworkRequest", execution.getVariable(Prefix + "rollbackNetworkRequest"))
1072                                 }
1073                         }
1074                         execution.setVariable("rollbackData", rollbackData)
1075                         logger.debug("** rollbackData : " + rollbackData)
1076
1077                         execution.setVariable("WorkflowException", execution.getVariable(Prefix + "WorkflowException"))
1078                         logger.debug("** WorkflowException : " + execution.getVariable("WorkflowException"))
1079
1080                 } catch (Exception ex) {
1081                         String exceptionMessage = " Bpmn error encountered in DoUpdateNetworkInstance flow. prepareRollbackData() - " + ex.getMessage()
1082                         logger.debug(exceptionMessage)
1083                         exceptionUtil.buildWorkflowException(execution, 7000, exceptionMessage)
1084
1085                 }
1086
1087         }
1088
1089         public void prepareSuccessRollbackData(DelegateExecution execution) {
1090
1091                 execution.setVariable("prefix",Prefix)
1092
1093                 logger.trace("Inside prepareSuccessRollbackData() of DoUpdateNetworkInstance ")
1094
1095                 try {
1096
1097                         if (execution.getVariable("sdncVersion") != '1610') {
1098                                 // skip: 1702 for 'changeassign' or equivalent not yet defined in SNDC, so no rollback.
1099                         } else {
1100                                 prepareSDNCRollbackRequest(execution)
1101                         }
1102
1103                         Map<String, String> rollbackData = new HashMap<String, String>();
1104                         String rollbackSDNCRequest = execution.getVariable(Prefix + "rollbackSDNCRequest")
1105                         if (rollbackSDNCRequest != null) {
1106                                 if (rollbackSDNCRequest != "") {
1107                                         rollbackData.put("rollbackSDNCRequest", rollbackSDNCRequest)
1108                                 }
1109                         }
1110                         String rollbackNetworkRequest = execution.getVariable(Prefix + "rollbackNetworkRequest")
1111                         if (rollbackNetworkRequest != null) {
1112                                 if (rollbackNetworkRequest != "") {
1113                                         rollbackData.put("rollbackNetworkRequest", rollbackNetworkRequest)
1114                                 }
1115                         }
1116                         execution.setVariable("rollbackData", rollbackData)
1117
1118                         logger.debug("** 'rollbackData' for Full Rollback : " + rollbackData)
1119                         execution.setVariable("WorkflowException", null)
1120
1121
1122                 } catch (Exception ex) {
1123                         String exceptionMessage = " Bpmn error encountered in DoUpdateNetworkInstance flow. prepareSuccessRollbackData() - " + ex.getMessage()
1124                         logger.debug(exceptionMessage)
1125                         exceptionUtil.buildWorkflowException(execution, 7000, exceptionMessage)
1126
1127                 }
1128
1129         }
1130
1131         public void setExceptionFlag(DelegateExecution execution){
1132
1133                 execution.setVariable("prefix",Prefix)
1134
1135                 logger.trace("Inside setExceptionFlag() of DoUpdateNetworkInstance ")
1136
1137                 try {
1138
1139                         execution.setVariable(Prefix + "isException", true)
1140
1141                         if (execution.getVariable("SavedWorkflowException1") != null) {
1142                                 execution.setVariable(Prefix + "WorkflowException", execution.getVariable("SavedWorkflowException1"))
1143                         } else {
1144                                 execution.setVariable(Prefix + "WorkflowException", execution.getVariable("WorkflowException"))
1145                         }
1146                         logger.debug(Prefix + "WorkflowException - " +execution.getVariable(Prefix + "WorkflowException"))
1147
1148                 } catch(Exception ex){
1149                           String exceptionMessage = "Bpmn error encountered in DoUpdateNetworkInstance flow. setExceptionFlag(): " + ex.getMessage()
1150                         logger.debug(exceptionMessage)
1151                         exceptionUtil.buildWorkflowException(execution, 7000, exceptionMessage)
1152                 }
1153
1154         }
1155
1156
1157         // *******************************
1158         //     Build Error Section
1159         // *******************************
1160
1161         public void processJavaException(DelegateExecution execution){
1162
1163                 execution.setVariable("prefix",Prefix)
1164                 try{
1165                         logger.debug("Caught a Java Exception")
1166                         logger.debug("Started processJavaException Method")
1167                         logger.debug("Variables List: " + execution.getVariables())
1168                         execution.setVariable("UnexpectedError", "Caught a Java Lang Exception - "  + Prefix)  // Adding this line temporarily until this flows error handling gets updated
1169                         exceptionUtil.buildWorkflowException(execution, 500, "Caught a Java Lang Exception")
1170
1171                 }catch(Exception e){
1172                         logger.debug("Caught Exception during processJavaException Method: " + e)
1173                         execution.setVariable("UnexpectedError", "Exception in processJavaException method")  // Adding this line temporarily until this flows error handling gets updated
1174                         exceptionUtil.buildWorkflowException(execution, 500, "Exception in processJavaException method")
1175                 }
1176                 logger.debug("Completed processJavaException Method")
1177         }
1178
1179 }