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