Containerization feature of SO
[so.git] / bpmn / so-bpmn-infrastructure-flows / src / main / groovy / org / onap / so / bpmn / infrastructure / scripts / DoCreateNetworkInstance.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 org.apache.commons.lang3.*
24 import org.camunda.bpm.engine.delegate.BpmnError
25 import org.camunda.bpm.engine.delegate.DelegateExecution
26 import org.onap.so.bpmn.common.scripts.AaiUtil
27 import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
28 import org.onap.so.bpmn.common.scripts.ExceptionUtil
29 import org.onap.so.bpmn.common.scripts.MsoUtils
30 import org.onap.so.bpmn.common.scripts.NetworkUtils
31 import org.onap.so.bpmn.common.scripts.SDNCAdapterUtils
32 import org.onap.so.bpmn.common.scripts.VidUtils
33 import org.onap.so.bpmn.core.UrnPropertiesReader
34 import org.onap.so.bpmn.core.WorkflowException
35 import org.onap.so.bpmn.core.json.JsonUtils
36 import org.onap.so.logger.MsoLogger
37 import org.onap.so.rest.APIResponse;
38 import org.springframework.web.util.UriUtils
39
40 import groovy.json.*
41 import groovy.xml.XmlUtil
42
43
44 /**
45  * This groovy class supports the <class>DoCreateNetworkInstance.bpmn</class> process.
46  *
47  */
48 public class DoCreateNetworkInstance extends AbstractServiceTaskProcessor {
49         private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, DoCreateNetworkInstance.class);
50         
51         String Prefix="CRENWKI_"
52         ExceptionUtil exceptionUtil = new ExceptionUtil()
53         JsonUtils jsonUtil = new JsonUtils()
54         VidUtils vidUtils = new VidUtils(this)
55         NetworkUtils networkUtils = new NetworkUtils()
56         SDNCAdapterUtils sdncAdapterUtils = new SDNCAdapterUtils()
57
58         def className = getClass().getSimpleName()
59         
60         /**
61          * This method is executed during the preProcessRequest task of the <class>DoCreateNetworkInstance.bpmn</class> process.
62          * @param execution
63          */
64         public InitializeProcessVariables(DelegateExecution execution){
65                 /* Initialize all the process variables in this block */
66
67                 execution.setVariable(Prefix + "networkRequest", "")
68                 execution.setVariable(Prefix + "rollbackEnabled", null)
69                 execution.setVariable(Prefix + "networkInputs", "")
70                 //execution.setVariable(Prefix + "requestId", "")
71                 execution.setVariable(Prefix + "messageId", "")
72                 execution.setVariable(Prefix + "source", "")
73                 execution.setVariable("BasicAuthHeaderValuePO", "")
74                 execution.setVariable("BasicAuthHeaderValueSDNC", "")
75                 execution.setVariable(Prefix + "serviceInstanceId","")
76                 execution.setVariable("GENGS_type", "")
77                 execution.setVariable(Prefix + "rsrc_endpoint", null)
78                 execution.setVariable(Prefix + "networkOutputs", "")
79                 execution.setVariable(Prefix + "networkId","")
80                 execution.setVariable(Prefix + "networkName","")
81                 
82                 // AAI query Name
83                 execution.setVariable(Prefix + "queryNameAAIRequest","")
84                 execution.setVariable(Prefix + "queryNameAAIResponse", "")
85                 execution.setVariable(Prefix + "aaiNameReturnCode", "")
86                 execution.setVariable(Prefix + "isAAIqueryNameGood", false)
87
88                 // AAI query Cloud Region
89                 execution.setVariable(Prefix + "queryCloudRegionRequest","")
90                 execution.setVariable(Prefix + "queryCloudRegionReturnCode","")
91                 execution.setVariable(Prefix + "queryCloudRegionResponse","")
92                 execution.setVariable(Prefix + "cloudRegionPo","")
93                 execution.setVariable(Prefix + "cloudRegionSdnc","")
94                 execution.setVariable(Prefix + "isCloudRegionGood", false)
95
96                 // AAI query Id
97                 execution.setVariable(Prefix + "queryIdAAIRequest","")
98                 execution.setVariable(Prefix + "queryIdAAIResponse", "")
99                 execution.setVariable(Prefix + "aaiIdReturnCode", "")
100
101                 // AAI query vpn binding
102                 execution.setVariable(Prefix + "queryVpnBindingAAIRequest","")
103                 execution.setVariable(Prefix + "queryVpnBindingAAIResponse", "")
104                 execution.setVariable(Prefix + "aaiQqueryVpnBindingReturnCode", "")
105                 execution.setVariable(Prefix + "vpnBindings", null)
106                 execution.setVariable(Prefix + "vpnCount", 0)
107                 execution.setVariable(Prefix + "routeCollection", "")
108
109                 // AAI query network policy
110                 execution.setVariable(Prefix + "queryNetworkPolicyAAIRequest","")
111                 execution.setVariable(Prefix + "queryNetworkPolicyAAIResponse", "")
112                 execution.setVariable(Prefix + "aaiQqueryNetworkPolicyReturnCode", "")
113                 execution.setVariable(Prefix + "networkPolicyUriList", null)
114                 execution.setVariable(Prefix + "networkPolicyCount", 0)
115                 execution.setVariable(Prefix + "networkCollection", "")
116
117                 // AAI query route table reference
118                 execution.setVariable(Prefix + "queryNetworkTableRefAAIRequest","")
119                 execution.setVariable(Prefix + "queryNetworkTableRefAAIResponse", "")
120                 execution.setVariable(Prefix + "aaiQqueryNetworkTableRefReturnCode", "")
121                 execution.setVariable(Prefix + "networkTableRefUriList", null)
122                 execution.setVariable(Prefix + "networkTableRefCount", 0)
123                 execution.setVariable(Prefix + "tableRefCollection", "")
124
125                 // AAI requery Id
126                 execution.setVariable(Prefix + "requeryIdAAIRequest","")
127                 execution.setVariable(Prefix + "requeryIdAAIResponse", "")
128                 execution.setVariable(Prefix + "aaiRequeryIdReturnCode", "")
129
130                 // AAI update contrail
131                 execution.setVariable(Prefix + "updateContrailAAIUrlRequest","")
132                 execution.setVariable(Prefix + "updateContrailAAIPayloadRequest","")
133                 execution.setVariable(Prefix + "updateContrailAAIResponse", "")
134                 execution.setVariable(Prefix + "aaiUpdateContrailReturnCode", "")
135
136                 execution.setVariable(Prefix + "createNetworkRequest", "")
137                 execution.setVariable(Prefix + "createNetworkResponse", "")
138                 execution.setVariable(Prefix + "rollbackNetworkRequest", "")
139                 //execution.setVariable(Prefix + "rollbackNetworkResponse", "")
140                 execution.setVariable(Prefix + "networkReturnCode", "")
141                 //execution.setVariable(Prefix + "rollbackNetworkReturnCode", "")
142                 execution.setVariable(Prefix + "isNetworkRollbackNeeded", false)
143
144                 execution.setVariable(Prefix + "assignSDNCRequest", "")
145                 execution.setVariable(Prefix + "assignSDNCResponse", "")
146                 execution.setVariable(Prefix + "rollbackSDNCRequest", "")
147                 //execution.setVariable(Prefix + "rollbackSDNCResponse", "")
148                 execution.setVariable(Prefix + "sdncReturnCode", "")
149                 //execution.setVariable(Prefix + "rollbackSDNCReturnCode", "")
150                 execution.setVariable(Prefix + "isSdncRollbackNeeded", false)
151                 execution.setVariable(Prefix + "sdncResponseSuccess", false)
152                 
153                 execution.setVariable(Prefix + "activateSDNCRequest", "")
154                 execution.setVariable(Prefix + "activateSDNCResponse", "")
155                 execution.setVariable(Prefix + "rollbackActivateSDNCRequest", "")
156                 //execution.setVariable(Prefix + "rollbackActivateSDNCResponse", "")
157                 execution.setVariable(Prefix + "sdncActivateReturnCode", "")
158                 //execution.setVariable(Prefix + "rollbackActivateSDNCReturnCode", "")
159                 execution.setVariable(Prefix + "isSdncActivateRollbackNeeded", false)
160                 execution.setVariable(Prefix + "sdncActivateResponseSuccess", false)
161
162                 execution.setVariable(Prefix + "orchestrationStatus", "")
163                 execution.setVariable(Prefix + "isVnfBindingPresent", false)
164                 execution.setVariable(Prefix + "Success", false)
165
166                 execution.setVariable(Prefix + "isException", false)
167                 
168         }
169
170         // **************************************************
171         //     Pre or Prepare Request Section
172         // **************************************************
173         /**
174          * This method is executed during the preProcessRequest task of the <class>DoCreateNetworkInstance.bpmn</class> process.
175          * @param execution
176          */
177         public void preProcessRequest (DelegateExecution execution) {
178                 
179                 execution.setVariable("prefix",Prefix)          
180                 msoLogger.trace("Inside preProcessRequest() of " + className + ".groovy")
181                 
182                 try {
183                         // initialize flow variables
184                         InitializeProcessVariables(execution)
185                         
186                         // GET Incoming request & validate 3 kinds of format.
187                         execution.setVariable("action", "CREATE")
188                         String networkRequest = execution.getVariable("bpmnRequest")
189                         if (networkRequest != null) {
190                                 if (networkRequest.contains("requestDetails")) {
191                                         // JSON format request is sent, create xml 
192                                         try {
193                                                 def prettyJson = JsonOutput.prettyPrint(networkRequest.toString())
194                                                 msoLogger.debug(" Incoming message formatted . . . : " + '\n' + prettyJson)
195                                                 networkRequest =  vidUtils.createXmlNetworkRequestInfra(execution, networkRequest)
196                 
197                                         } catch (Exception ex) {
198                                                 String dataErrorMessage = " Invalid json format Request - " + ex.getMessage()
199                                                 msoLogger.debug(dataErrorMessage)
200                                                 exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage)
201                                         }
202                                 } else {
203                                    // XML format request is sent
204                                    
205                                 }
206                         } else {
207                                 // vIPR format request is sent, create xml from individual variables
208                                 networkRequest = vidUtils.createXmlNetworkRequestInstance(execution)
209                         }
210                                 
211                         networkRequest = utils.formatXml(networkRequest)
212                         execution.setVariable(Prefix + "networkRequest", networkRequest)
213                         msoLogger.debug(Prefix + "networkRequest - " + '\n' + networkRequest)
214                         
215                         // validate 'backout-on-failure' to override 'mso.rollback'
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("testMessageId")  // for testing
226                         if (messageId == null || messageId == "") {
227                                 messageId = UUID.randomUUID()
228                                 msoLogger.debug(Prefix + "messageId, random generated: " + messageId)
229                         } else {
230                                 msoLogger.debug(Prefix + "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                         // validate cloud region 
239                         String lcpCloudRegionId = utils.getNodeText(networkRequest, "aic-cloud-region")
240                         if ((lcpCloudRegionId == null) || (lcpCloudRegionId == "") || (lcpCloudRegionId == "null")) {
241                                 String dataErrorMessage = "Missing value/element: 'lcpCloudRegionId' or 'cloudConfiguration' or 'aic-cloud-region'."
242                                 msoLogger.debug(" Invalid Request - " + dataErrorMessage)
243                                 exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage)
244                         }
245
246                         // validate service instance id
247                         String serviceInstanceId = utils.getNodeText(networkRequest, "service-instance-id") 
248                         if ((serviceInstanceId == null) || (serviceInstanceId == "") || (serviceInstanceId == "null")) {
249                                 String dataErrorMessage = "Missing value/element: 'serviceInstanceId'."
250                                 msoLogger.debug(" Invalid Request - " + dataErrorMessage)
251                                 exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage)
252                         }
253
254                         // PO Authorization Info / headers Authorization=
255                         String basicAuthValuePO = UrnPropertiesReader.getVariable("mso.adapters.po.auth",execution)
256                         
257                         try {
258                                 def encodedString = utils.getBasicAuth(basicAuthValuePO, UrnPropertiesReader.getVariable("mso.msoKey",execution))
259                                 execution.setVariable("BasicAuthHeaderValuePO",encodedString)
260                                 execution.setVariable("BasicAuthHeaderValueSDNC", encodedString)
261         
262                         } catch (IOException ex) {
263                                 String exceptionMessage = "Exception Encountered in DoCreateNetworkInstance, PreProcessRequest() - "
264                                 String dataErrorMessage = exceptionMessage + " Unable to encode PO/SDNC user/password string - " + ex.getMessage()
265                                 msoLogger.debug(dataErrorMessage)
266                                 exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage)
267                         }
268
269                         // Set variables for Generic Get Sub Flow use
270                         execution.setVariable(Prefix + "serviceInstanceId", serviceInstanceId)
271                         msoLogger.debug(Prefix + "serviceInstanceId - " + serviceInstanceId)
272
273                         execution.setVariable("GENGS_type", "service-instance")
274                         msoLogger.debug("GENGS_type - " + "service-instance")
275                         msoLogger.debug(" Url for SDNC adapter: " + UrnPropertiesReader.getVariable("mso.adapters.sdnc.endpoint",execution))
276                         
277                         String sdncVersion = execution.getVariable("sdncVersion")
278                         msoLogger.debug("sdncVersion? : " + sdncVersion)
279                         
280                         // build 'networkOutputs'                       
281                         String networkId = utils.getNodeText(networkRequest, "network-id")
282                         if ((networkId == null) || (networkId == "null")) {
283                                 networkId = ""
284                         }
285                         String networkName = utils.getNodeText(networkRequest, "network-name")
286                         if ((networkName == null) || (networkName == "null")) {
287                                 networkName = ""
288                         }
289                         String networkOutputs =
290                            """<network-outputs>
291                            <network-id>${MsoUtils.xmlEscape(networkId)}</network-id>
292                            <network-name>${MsoUtils.xmlEscape(networkName)}</network-name>
293                          </network-outputs>"""
294                         execution.setVariable(Prefix + "networkOutputs", networkOutputs)
295                         msoLogger.debug(Prefix + "networkOutputs - " + '\n' + networkOutputs)
296                         execution.setVariable(Prefix + "networkId", networkId)
297                         execution.setVariable(Prefix + "networkName", networkName)
298                 
299                 } catch (BpmnError e) {
300                 throw e;
301                 
302                 } catch (Exception ex) {
303                         sendSyncError(execution)
304                         // caught exception
305                         String exceptionMessage = "Exception Encountered in PreProcessRequest() of " + className + ".groovy ***** : " + ex.getMessage()
306                         msoLogger.debug(exceptionMessage)
307                         exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
308                 
309                 }
310
311         }
312         
313         public void callRESTQueryAAINetworkName (DelegateExecution execution) {
314                 
315                 execution.setVariable("prefix",Prefix)
316                 
317                 msoLogger.debug(" ***** Inside callRESTQueryAAINetworkName() of DoCreateNetworkInstance ***** " )
318
319                 // get variables
320                 String networkInputs  = execution.getVariable(Prefix + "networkInputs")
321                 String networkName   = utils.getNodeText(networkInputs, "network-name")
322                 networkName = UriUtils.encode(networkName,"UTF-8")
323
324                 // Prepare AA&I url with network-name
325                 String aai_endpoint = UrnPropertiesReader.getVariable("aai.endpoint", execution)
326                 AaiUtil aaiUriUtil = new AaiUtil(this)
327                 String aai_uri = aaiUriUtil.getNetworkL3NetworkUri(execution)
328                 String queryAAINameRequest = "${aai_endpoint}${aai_uri}" + "?network-name=" + networkName
329                 execution.setVariable(Prefix + "queryNameAAIRequest", queryAAINameRequest)
330                 msoLogger.debug(Prefix + "queryNameAAIRequest - " + "\n" + queryAAINameRequest)
331
332                 try {
333                         APIResponse response = aaiUriUtil.executeAAIGetCall(execution, queryAAINameRequest)
334                         String returnCode = response.getStatusCode()
335                         execution.setVariable(Prefix + "aaiNameReturnCode", returnCode)
336                         msoLogger.debug(" ***** AAI Query Name Response Code  : " + returnCode)
337
338                         String aaiResponseAsString = response.getResponseBodyAsString()
339                         msoLogger.debug(" ***** AAI Query Name Response : " +'\n'+ aaiResponseAsString)
340
341                         if (returnCode=='200') {
342                                 execution.setVariable(Prefix + "queryNameAAIResponse", aaiResponseAsString)
343                                 execution.setVariable(Prefix + "isAAIqueryNameGood", true)
344                                 String orchestrationStatus = ""
345                                 try {
346                                         // response is NOT empty
347                                         orchestrationStatus = utils.getNodeText(aaiResponseAsString, "orchestration-status")
348                                         execution.setVariable(Prefix + "orchestrationStatus", orchestrationStatus.toUpperCase())
349                                         msoLogger.debug(Prefix + "orchestrationStatus - " + orchestrationStatus.toUpperCase())
350                                         execution.setVariable("orchestrationStatus", orchestrationStatus)
351                                         
352                                 } catch (Exception ex) {
353                                     // response is empty
354                                         execution.setVariable(Prefix + "orchestrationStatus", orchestrationStatus)
355                                         msoLogger.debug(Prefix + "orchestrationStatus - " + orchestrationStatus)
356                                 }
357
358                         } else {
359                             if (returnCode=='404') {
360                                         msoLogger.debug(" QueryAAINetworkName return code = '404' (Not Found).  Proceed with the Create !!! ")
361
362                             } else {
363                                 // aai all errors
364                                         String dataErrorMessage = "Unexpected Error Response from QueryAAINetworkName - " + returnCode
365                                         msoLogger.debug(dataErrorMessage)
366                                         exceptionUtil.buildWorkflowException(execution, 2500, dataErrorMessage)
367
368                       }
369
370                         }
371
372                         msoLogger.debug(Prefix + "isAAIqueryNameGood? : " + execution.getVariable(Prefix + "isAAIqueryNameGood"))
373
374                 } catch (BpmnError e) {
375                 throw e;
376
377                 } catch (Exception ex) {
378                         // try error
379                         String exceptionMessage = "Bpmn error encountered in DoCreateNetworkInstance flow - callRESTQueryAAINetworkName() -  " + ex.getMessage()
380                         msoLogger.debug(exceptionMessage)
381                         exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
382
383                 }
384
385         }
386
387         public void callRESTQueryAAICloudRegion (DelegateExecution execution) {
388                 
389                 execution.setVariable("prefix",Prefix)
390                                 
391                 msoLogger.debug(" ***** Inside callRESTQueryAAICloudRegion() of DoCreateNetworkInstance ***** " )
392
393                 try {
394                         String networkInputs  = execution.getVariable(Prefix + "networkInputs")
395                         String cloudRegion = utils.getNodeText(networkInputs, "aic-cloud-region")
396                         cloudRegion = UriUtils.encode(cloudRegion,"UTF-8")
397
398                         // Prepare AA&I url
399                         String aai_endpoint = UrnPropertiesReader.getVariable("aai.endpoint", execution)
400                         AaiUtil aaiUtil = new AaiUtil(this)
401                         String aai_uri = aaiUtil.getCloudInfrastructureCloudRegionUri(execution)
402                         String queryCloudRegionRequest = "${aai_endpoint}${aai_uri}/" + cloudRegion
403                         execution.setVariable(Prefix + "queryCloudRegionRequest", queryCloudRegionRequest)
404                         msoLogger.debug(Prefix + "queryCloudRegionRequest - " + "\n" + queryCloudRegionRequest)
405
406                         String cloudRegionPo = aaiUtil.getAAICloudReqion(execution,  queryCloudRegionRequest, "PO", cloudRegion)
407                         String cloudRegionSdnc = aaiUtil.getAAICloudReqion(execution,  queryCloudRegionRequest, "SDNC", cloudRegion)
408
409                         if ((cloudRegionPo != "ERROR") && (cloudRegionSdnc != "ERROR")) {
410                                 execution.setVariable(Prefix + "cloudRegionPo", cloudRegionPo)
411                                 execution.setVariable(Prefix + "cloudRegionSdnc", cloudRegionSdnc)
412                                 execution.setVariable(Prefix + "isCloudRegionGood", true)
413
414                         } else {
415                             String dataErrorMessage = "QueryAAICloudRegion Unsuccessful. Return Code: " + execution.getVariable(Prefix + "queryCloudRegionReturnCode")
416                             msoLogger.debug(dataErrorMessage)
417                                 exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage)
418
419                         }
420
421                         msoLogger.debug(" is Cloud Region Good: " + execution.getVariable(Prefix + "isCloudRegionGood"))
422
423                 } catch (BpmnError e) {
424                         throw e;
425
426                 } catch (Exception ex) {
427                         // try error
428                         String exceptionMessage = "Bpmn error encountered in DoCreateNetworkInstance flow - callRESTQueryAAICloudRegion() - " + ex.getMessage()
429                         msoLogger.debug(exceptionMessage)
430                         exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
431
432                 }
433
434         }
435
436         public void callRESTQueryAAINetworkId(DelegateExecution execution) {
437                 
438                 execution.setVariable("prefix",Prefix)
439
440                 msoLogger.debug(" ***** Inside callRESTQueryAAINetworkId() of DoCreateNetworkInstance ***** " )
441
442                 try {
443                         // get variables
444                         String networkId = ""
445                         String assignSDNCResponse = execution.getVariable(Prefix + "assignSDNCResponse")
446                         if (execution.getVariable("sdncVersion") != "1610") {
447                            String networkResponseInformation = ""
448                            try {        
449                               networkResponseInformation = utils.getNodeXml(assignSDNCResponse, "network-response-information", false).replace("tag0:","").replace(":tag0","")
450                                   networkId = utils.getNodeText(networkResponseInformation, "instance-id")
451                            } catch (Exception ex) {
452                               String dataErrorMessage = " SNDC Response network validation for 'instance-id' (network-id) failed: Empty <network-response-information>"
453                               msoLogger.debug(dataErrorMessage)
454                                   exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage)
455                            }      
456                                   
457                         } else {
458                            networkId = utils.getNodeText(assignSDNCResponse, "network-id")
459                         }
460                         if (networkId == null || networkId == "null") {
461                                 String dataErrorMessage = "SNDC Response did not contains 'instance-id' or 'network-id' element, or the value is null."
462                                 msoLogger.debug(dataErrorMessage)
463                                 exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage)
464                         } else {
465                            msoLogger.debug(" SNDC Response network validation for 'instance-id' (network-id)' is good: " + networkId)
466                         }
467
468     
469                         execution.setVariable(Prefix + "networkId", networkId)
470                         String networkName   = utils.getNodeText(assignSDNCResponse, "network-name")
471                         execution.setVariable(Prefix + "networkName", networkName)
472                         
473                         networkId = UriUtils.encode(networkId,"UTF-8")
474
475                         // Prepare AA&I url
476                         String aai_endpoint = UrnPropertiesReader.getVariable("aai.endpoint", execution)
477                         AaiUtil aaiUriUtil = new AaiUtil(this)
478                         String aai_uri = aaiUriUtil.getNetworkL3NetworkUri(execution)
479                         String queryIdAAIRequest = "${aai_endpoint}${aai_uri}/" + networkId + "?depth=all"
480                         execution.setVariable(Prefix + "queryIdAAIRequest", queryIdAAIRequest)
481                         msoLogger.debug(Prefix + "queryIdAAIRequest - " + "\n" + queryIdAAIRequest)
482
483                         APIResponse response = aaiUriUtil.executeAAIGetCall(execution, queryIdAAIRequest)
484                         String returnCode = response.getStatusCode()
485                         execution.setVariable(Prefix + "aaiIdReturnCode", returnCode)
486
487                         msoLogger.debug(" ***** AAI Response Code  : " + returnCode)
488
489                         String aaiResponseAsString = response.getResponseBodyAsString()
490
491                         if (returnCode=='200') {
492                                 execution.setVariable(Prefix + "queryIdAAIResponse", aaiResponseAsString)
493                                 msoLogger.debug(" QueryAAINetworkId Success REST Response - " + "\n" + aaiResponseAsString)
494                                 
495                                 String netId   = utils.getNodeText(aaiResponseAsString, "network-id")
496                                 execution.setVariable(Prefix + "networkId", netId)
497                                 String netName   = utils.getNodeText(aaiResponseAsString, "network-name")
498                                 execution.setVariable(Prefix + "networkName", netName)
499
500                         } else {
501                                 if (returnCode=='404') {
502                                         String dataErrorMessage = "Response Error from QueryAAINetworkId is 404 (Not Found)."
503                                         msoLogger.debug(" AAI Query Failed. " + dataErrorMessage)
504                                         exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage)
505
506                                 } else {
507                                    if (aaiResponseAsString.contains("RESTFault")) {
508                                            WorkflowException exceptionObject = exceptionUtil.MapAAIExceptionToWorkflowException(aaiResponseAsString, execution)
509                                            execution.setVariable("WorkflowException", exceptionObject)
510                                            throw new BpmnError("MSOWorkflowException")
511
512                                    } else {
513                                                         // aai all errors
514                                                         String dataErrorMessage = "Unexpected Response from QueryAAINetworkId - " + returnCode
515                                                         msoLogger.debug("Unexpected Response from QueryAAINetworkId - " + dataErrorMessage)
516                                                         exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage)
517
518                                   }
519                                 }
520                         }
521
522                 } catch (BpmnError e) {
523                         throw e;
524
525                 } catch (Exception ex) {
526                         String exceptionMessage = "Bpmn error encountered in DoCreateNetworkInstance flow. callRESTQueryAAINetworkId() - " + ex.getMessage()
527                         msoLogger.debug(exceptionMessage)
528                         exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
529
530                 }
531
532         }
533
534         public void callRESTReQueryAAINetworkId(DelegateExecution execution) {
535                 
536                 execution.setVariable("prefix",Prefix)
537
538                 msoLogger.debug(" ***** Inside callRESTReQueryAAINetworkId() of DoCreateNetworkInstance ***** " )
539
540                 try {
541                         // get variables
542                         String networkId   = execution.getVariable(Prefix + "networkId")
543                         String netId = networkId 
544                         networkId = UriUtils.encode(networkId,"UTF-8")
545
546                         // Prepare AA&I url
547                         String aai_endpoint = UrnPropertiesReader.getVariable("aai.endpoint", execution)
548                         AaiUtil aaiUriUtil = new AaiUtil(this)
549                         String aai_uri = aaiUriUtil.getNetworkL3NetworkUri(execution)
550                         String requeryIdAAIRequest = "${aai_endpoint}${aai_uri}/" + networkId + "?depth=all"
551                         execution.setVariable(Prefix + "requeryIdAAIRequest", requeryIdAAIRequest)
552                         msoLogger.debug(Prefix + "requeryIdAAIRequest - " + "\n" + requeryIdAAIRequest)
553
554                         APIResponse response = aaiUriUtil.executeAAIGetCall(execution, requeryIdAAIRequest)
555                         String returnCode = response.getStatusCode()
556                         execution.setVariable(Prefix + "aaiRequeryIdReturnCode", returnCode)
557                         msoLogger.debug(" ***** AAI ReQuery Response Code  : " + returnCode)
558
559                         String aaiResponseAsString = response.getResponseBodyAsString()
560
561                         if (returnCode=='200') {
562                                 execution.setVariable(Prefix + "requeryIdAAIResponse", aaiResponseAsString)
563                                 msoLogger.debug(" ReQueryAAINetworkId Success REST Response - " + "\n" + aaiResponseAsString)
564
565                                 String netName = utils.getNodeText(aaiResponseAsString, "network-name")
566                                 String networkOutputs =
567                                    """<network-outputs>
568                    <network-id>${MsoUtils.xmlEscape(netId)}</network-id>
569                    <network-name>${MsoUtils.xmlEscape(netName)}</network-name>
570                  </network-outputs>"""
571                                 execution.setVariable(Prefix + "networkOutputs", networkOutputs)
572                                 msoLogger.debug(" networkOutputs - " + '\n' + networkOutputs)
573
574                         } else {
575                                 if (returnCode=='404') {
576                                         String dataErrorMessage = "Response Error from ReQueryAAINetworkId is 404 (Not Found)."
577                                         msoLogger.debug(" AAI ReQuery Failed. - " + dataErrorMessage)
578                                         exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage)
579
580                                 } else {
581                                    if (aaiResponseAsString.contains("RESTFault")) {
582                                            WorkflowException exceptionObject = exceptionUtil.MapAAIExceptionToWorkflowException(aaiResponseAsString, execution)
583                                            execution.setVariable("WorkflowException", exceptionObject)
584                                            throw new BpmnError("MSOWorkflowException")
585
586                                            } else {
587                                                         // aai all errors
588                                                         String dataErrorMessage = "Unexpected Response from ReQueryAAINetworkId - " + returnCode
589                                                         msoLogger.debug(dataErrorMessage)
590                                                         exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage)
591
592                                         }
593                                 }
594                         }
595
596                 } catch (BpmnError e) {
597                         throw e;
598
599                 } catch (Exception ex) {
600                         String exceptionMessage = "Bpmn error encountered in DoCreateNetworkInstance flow. callRESTReQueryAAINetworkId() - " + ex.getMessage()
601                         msoLogger.debug(exceptionMessage)
602                         exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
603
604                 }
605
606         }
607
608         public void callRESTQueryAAINetworkVpnBinding(DelegateExecution execution) {
609                 
610                 execution.setVariable("prefix",Prefix)
611
612                 msoLogger.debug(" ***** Inside callRESTQueryAAINetworkVpnBinding() of DoCreateNetworkInstance ***** " )
613
614                 try {
615
616                         // get variables
617                         String queryIdAAIResponse   = execution.getVariable(Prefix + "queryIdAAIResponse").replace('<?xml version="1.0" encoding="UTF-8"?>', "")
618                         String relationship = networkUtils.getFirstNodeXml(queryIdAAIResponse, "relationship-list").trim().replace("tag0:","").replace(":tag0","")
619                         msoLogger.debug(" relationship - " + relationship)
620
621                         // Check if Vnf Binding is present, then build a List of vnfBinding
622                         List vpnBindingUri = networkUtils.getVnfBindingObject(relationship)
623                         int vpnCount = vpnBindingUri.size()
624                         execution.setVariable(Prefix + "vpnCount", vpnCount)
625                         msoLogger.debug(Prefix + "vpnCount - " + vpnCount)
626
627                         String aai_endpoint = UrnPropertiesReader.getVariable("aai.endpoint", execution)
628                         AaiUtil aaiUriUtil = new AaiUtil(this)
629
630                         if (vpnCount > 0) {
631                                 execution.setVariable(Prefix + "vpnBindings", vpnBindingUri)
632                                 msoLogger.debug(" vpnBindingUri List - " + vpnBindingUri)
633
634                                 String routeTargets = ""
635                                 // AII loop call using list vpnBindings
636                                 for (i in 0..vpnBindingUri.size()-1) {
637
638                                         int counting = i+1
639
640                                         // prepare url using vpnBinding
641                                         String queryVpnBindingAAIRequest = ""
642                                         String aai_uri = aaiUriUtil.getNetworkVpnBindingUri(execution)
643
644                                         // Note: By default, the vpnBinding url is found in 'related-link' of the response,
645                                         //       so, the default in URN mappings for this is set to "" (ie, space), unless forced to use the URN mapping.
646                                         if (aai_uri == null || aai_uri == "") {
647                                                 // using value of 'related-link' from response
648                                                 if (vpnBindingUri[i].charAt(vpnBindingUri[i].length()-1) == '/') {
649                                                     queryVpnBindingAAIRequest = "${aai_endpoint}" + vpnBindingUri[i].substring(0, vpnBindingUri[i].length()-1) + "?depth=all"
650                                                 } else {
651                                                     queryVpnBindingAAIRequest = "${aai_endpoint}" + vpnBindingUri[i] + "?depth=all"
652                                                 }
653
654                                         } else {
655                                             // using uri value in URN mapping
656                                                 String vpnBindingId = vpnBindingUri[i].substring(vpnBindingUri[i].indexOf("/vpn-binding/")+13, vpnBindingUri[i].length())
657                                                 if (vpnBindingId.charAt(vpnBindingId.length()-1) == '/') {
658                                                         vpnBindingId = vpnBindingId.substring(0, vpnBindingId.length()-1)
659                                                 }
660                                             queryVpnBindingAAIRequest = "${aai_endpoint}${aai_uri}/" + vpnBindingId + "?depth=all"
661                                         }
662
663                                         execution.setVariable(Prefix + "queryVpnBindingAAIRequest", queryVpnBindingAAIRequest)
664                                         msoLogger.debug(Prefix + "queryVpnBindingAAIRequest, , vpnBinding #" + counting + " : " + "\n" + queryVpnBindingAAIRequest)
665
666                                         APIResponse response = aaiUriUtil.executeAAIGetCall(execution, queryVpnBindingAAIRequest)
667                                         String returnCode = response.getStatusCode()
668                                         execution.setVariable(Prefix + "aaiQqueryVpnBindingReturnCode", returnCode)
669                                         msoLogger.debug(" ***** AAI query vpn binding Response Code, vpnBinding #" + counting + " : " + returnCode)
670
671                                         String aaiResponseAsString = response.getResponseBodyAsString()
672
673                                         if (returnCode=='200') {
674                                                 execution.setVariable(Prefix + "queryVpnBindingAAIResponse", aaiResponseAsString)
675                                                 msoLogger.debug(" AAI Query Vpn Binding Success REST Response, , vpnBinding #" + counting + " : " + "\n" + aaiResponseAsString)
676
677                                                 String routeTarget = ""
678                                                 String routeRole = ""
679                                                 if (utils.nodeExists(aaiResponseAsString, "route-targets")) {
680                                                         String aaiRouteTargets = utils.getNodeXml(aaiResponseAsString, "route-targets", false)
681                                                         def aaiRouteTargetsXml = new XmlSlurper().parseText(aaiRouteTargets)
682                                                         def aaiRouteTarget = aaiRouteTargetsXml.'**'.findAll {it.name() == "route-target"}
683                                                         for (j in 0..aaiRouteTarget.size()-1) {
684                                                                 routeTarget  = utils.getNodeText(XmlUtil.serialize(aaiRouteTarget[j]), "global-route-target")
685                                                                 routeRole  = utils.getNodeText(XmlUtil.serialize(aaiRouteTarget[j]), "route-target-role")
686                                                                 routeTargets += "<routeTargets>" + '\n' +
687                                                                                 " <routeTarget>" + routeTarget + "</routeTarget>" + '\n' +
688                                                                                                 " <routeTargetRole>" + routeRole + "</routeTargetRole>" + '\n' +
689                                                                                                 "</routeTargets>" + '\n'
690                                                         }
691                                                 }
692
693                                         } else {
694                                                 if (returnCode=='404') {
695                                                         String dataErrorMessage = "Response Error from AAINetworkVpnBinding is 404 (Not Found)."
696                                                         msoLogger.debug(dataErrorMessage)
697                                                         exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage)
698
699                                                 } else {
700                                                    if (aaiResponseAsString.contains("RESTFault")) {
701                                                            WorkflowException exceptionObject = exceptionUtil.MapAAIExceptionToWorkflowException(aaiResponseAsString, execution)
702                                                            execution.setVariable("WorkflowException", exceptionObject)
703                                                            throw new BpmnError("MSOWorkflowException")
704
705                                                            } else {
706                                                                         // aai all errors
707                                                                         String dataErrorMessage = " Unexpected Response from AAINetworkVpnBinding - " + returnCode
708                                                                         msoLogger.debug(dataErrorMessage)
709                                                                         exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage)
710
711                                                           }
712                                                 }
713                                         }
714
715                                 } // end loop
716
717                                 execution.setVariable(Prefix + "routeCollection", routeTargets)
718                                 msoLogger.debug(Prefix + "routeCollection - " + '\n' + routeTargets)
719
720                         } else {
721                                 // reset return code to success
722                                 execution.setVariable(Prefix + "aaiQqueryVpnBindingReturnCode", "200")
723                             String aai_uri = aaiUriUtil.getNetworkL3NetworkUri(execution)
724                                 String schemaVersion = aaiUriUtil.getNamespaceFromUri(execution, aai_uri)
725                             String aaiStubResponse =
726                                         """     <rest:payload contentType="text/xml" xmlns:rest="http://schemas.activebpel.org/REST/2007/12/01/aeREST.xsd">
727                                                         <vpn-binding xmlns="${schemaVersion}">
728                                                       <global-route-target/>
729                                                         </vpn-binding>
730                                                 </rest:payload>"""
731                                 String aaiStubResponseAsXml = utils.formatXml(aaiStubResponse)
732                                 execution.setVariable(Prefix + "queryVpnBindingAAIResponse", aaiStubResponseAsXml)
733                                 execution.setVariable(Prefix + "routeCollection", "<routeTargets/>")
734                                 msoLogger.debug(" No vpnBinding, using this stub as response - " + '\n' + aaiStubResponseAsXml)
735
736                         }
737
738                 } catch (BpmnError e) {
739                         throw e;
740
741                 } catch (Exception ex) {
742                         String exceptionMessage = "Bpmn error encountered in DoCreateNetworkInstance flow. callRESTQueryAAINetworkVpnBinding() - " + ex.getMessage()
743                         msoLogger.debug(exceptionMessage)
744                         exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
745
746                 }
747
748         }
749
750         public void callRESTQueryAAINetworkPolicy(DelegateExecution execution) {
751                 
752                 execution.setVariable("prefix",Prefix)
753
754                 msoLogger.debug(" ***** Inside callRESTQueryAAINetworkPolicy() of DoCreateNetworkInstance ***** " )
755
756                 try {
757                         // get variables
758                         String queryIdAAIResponse   = execution.getVariable(Prefix + "queryIdAAIResponse").replace('<?xml version="1.0" encoding="UTF-8"?>', "")
759                         String relationship = networkUtils.getFirstNodeXml(queryIdAAIResponse, "relationship-list").trim().replace("tag0:","").replace(":tag0","")
760                         msoLogger.debug(" relationship - " + relationship)
761
762                         // Check if Network Policy is present, then build a List of network policy
763                         List networkPolicyUriList = networkUtils.getNetworkPolicyObject(relationship)
764                         int networkPolicyCount = networkPolicyUriList.size()
765                         execution.setVariable(Prefix + "networkPolicyCount", networkPolicyCount)
766                         msoLogger.debug(Prefix + "networkPolicyCount - " + networkPolicyCount)
767
768                         String aai_endpoint = UrnPropertiesReader.getVariable("aai.endpoint", execution)
769                         AaiUtil aaiUriUtil = new AaiUtil(this)
770
771                         if (networkPolicyCount > 0) {
772                                 execution.setVariable(Prefix + "networkPolicyUriList", networkPolicyUriList)
773                                 msoLogger.debug(" networkPolicyUri List - " + networkPolicyUriList)
774
775                                 String networkPolicies = ""
776                                 // AII loop call using list vpnBindings
777                                 for (i in 0..networkPolicyUriList.size()-1) {
778
779                                         int counting = i+1
780
781                                         // prepare url using vpnBinding
782                                         String queryNetworkPolicyAAIRequest = ""
783
784                                         String aai_uri = aaiUriUtil.getNetworkPolicyUri(execution)
785
786                                         // Note: By default, the network policy url is found in 'related-link' of the response,
787                                         //       so, the default in URN mappings for this is set to "" (ie, space), unless forced to use the URN mapping.
788                                         if (aai_uri == null || aai_uri == "") {
789                                                 // using value of 'related-link' from response
790                                                 if (networkPolicyUriList[i].charAt(networkPolicyUriList[i].length()-1) == '/') {
791                                                         queryNetworkPolicyAAIRequest = "${aai_endpoint}" + networkPolicyUriList[i].substring(0, networkPolicyUriList[i].length()-1) + "?depth=all"
792                                                 } else {
793                                                         queryNetworkPolicyAAIRequest = "${aai_endpoint}" + networkPolicyUriList[i] + "?depth=all"
794                                                 }
795                                         } else {
796                                                 // using uri value in URN mapping
797                                                 String networkPolicyId = networkPolicyUriList[i].substring(networkPolicyUriList[i].indexOf("/network-policy/")+16, networkPolicyUriList[i].length())
798                                                 println " networkPolicyId - " + networkPolicyId
799                                                 if (networkPolicyId.charAt(networkPolicyId.length()-1) == '/') {
800                                                         networkPolicyId = networkPolicyId.substring(0, networkPolicyId.length()-1)
801                                                 }
802                                                 queryNetworkPolicyAAIRequest = "${aai_endpoint}${aai_uri}/" + networkPolicyId + "?depth=all"
803
804                                         }
805
806
807                                         execution.setVariable(Prefix + "queryNetworkPolicyAAIRequest", queryNetworkPolicyAAIRequest)
808                                         msoLogger.debug(Prefix + "queryNetworkPolicyAAIRequest, , NetworkPolicy #" + counting + " : " + "\n" + queryNetworkPolicyAAIRequest)
809
810                                         APIResponse response = aaiUriUtil.executeAAIGetCall(execution, queryNetworkPolicyAAIRequest)
811                                         String returnCode = response.getStatusCode()
812                                         execution.setVariable(Prefix + "aaiQqueryNetworkPolicyReturnCode", returnCode)
813                                         msoLogger.debug(" ***** AAI query network policy Response Code, NetworkPolicy #" + counting + " : " + returnCode)
814
815                                         String aaiResponseAsString = response.getResponseBodyAsString()
816
817                                         if (returnCode=='200') {
818                                                 execution.setVariable(Prefix + "queryNetworkPolicyAAIResponse", aaiResponseAsString)
819                                                 msoLogger.debug(" QueryAAINetworkPolicy Success REST Response, , NetworkPolicy #" + counting + " : " + "\n" + aaiResponseAsString)
820
821                                                 String networkPolicy = ""
822                                                 if (utils.nodeExists(aaiResponseAsString, "network-policy-fqdn")) {
823                                                         networkPolicy  = utils.getNodeText(aaiResponseAsString, "network-policy-fqdn")
824                                                         networkPolicies += "<policyFqdns>" + networkPolicy + "</policyFqdns>" + '\n'
825                                                 }
826
827                                         } else {
828                                                 if (returnCode=='404') {
829                                                         String dataErrorMessage = "Response Error from QueryAAINetworkPolicy is 404 (Not Found)."
830                                                         msoLogger.debug(dataErrorMessage)
831                                                         exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage)
832
833                                                 } else {
834                                                    if (aaiResponseAsString.contains("RESTFault")) {
835                                                            WorkflowException exceptionObject = exceptionUtil.MapAAIExceptionToWorkflowException(aaiResponseAsString, execution)
836                                                            execution.setVariable("WorkflowException", exceptionObject)
837                                                            throw new BpmnError("MSOWorkflowException")
838
839                                                            } else {
840                                                                         // aai all errors
841                                                                         String dataErrorMessage = "Unexpected Response from QueryAAINetworkPolicy - " + returnCode
842                                                                         msoLogger.debug(dataErrorMessage)
843                                                                         exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage)
844
845                                                           }
846                                                 }
847                                         }
848
849                                 } // end loop
850
851                                 execution.setVariable(Prefix + "networkCollection", networkPolicies)
852                                 msoLogger.debug(Prefix + "networkCollection - " + '\n' + networkPolicies)
853
854                         } else {
855                                 // reset return code to success
856                                 execution.setVariable(Prefix + "aaiQqueryNetworkPolicyReturnCode", "200")
857                                 String aai_uri = aaiUriUtil.getNetworkL3NetworkUri(execution)
858                                 String schemaVersion = aaiUriUtil.getNamespaceFromUri(execution, aai_uri)
859                                 String aaiStubResponse =
860                                         """     <rest:payload contentType="text/xml" xmlns:rest="http://schemas.activebpel.org/REST/2007/12/01/aeREST.xsd">
861                                                         <network-policy xmlns="${schemaVersion}">
862                                                           <network-policy-fqdn/>
863                             </network-policy>
864                                                 </rest:payload>"""
865                                 String aaiStubResponseAsXml = utils.formatXml(aaiStubResponse)
866                                 execution.setVariable(Prefix + "queryNetworkPolicyAAIResponse", aaiStubResponseAsXml)
867                                 execution.setVariable(Prefix + "networkCollection", "<policyFqdns/>")
868                                 msoLogger.debug(" No net policies, using this stub as response - " + '\n' + aaiStubResponseAsXml)
869
870                         }
871
872                 } catch (BpmnError e) {
873                         throw e;
874
875                 } catch (Exception ex) {
876                         String exceptionMessage = "Bpmn error encountered in DoCreateNetworkInstance flow. callRESTQueryAAINetworkPolicy() - " + ex.getMessage()
877                         msoLogger.debug(exceptionMessage)
878                         exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
879
880                 }
881
882         }
883
884         public void callRESTQueryAAINetworkTableRef(DelegateExecution execution) {
885                 
886                 execution.setVariable("prefix",Prefix)
887
888                 msoLogger.debug(" ***** Inside callRESTQueryAAINetworkTableRef() of DoCreateNetworkInstance ***** " )
889
890                 try {
891                         // get variables
892                         String queryIdAAIResponse   = execution.getVariable(Prefix + "queryIdAAIResponse").replace('<?xml version="1.0" encoding="UTF-8"?>', "")
893                         String relationship = networkUtils.getFirstNodeXml(queryIdAAIResponse, "relationship-list").trim().replace("tag0:","").replace(":tag0","")
894                         msoLogger.debug(" relationship - " + relationship)
895
896                         // Check if Network TableREf is present, then build a List of network policy
897                         List networkTableRefUriList = networkUtils.getNetworkTableRefObject(relationship)
898                         int networkTableRefCount = networkTableRefUriList.size()
899                         execution.setVariable(Prefix + "networkTableRefCount", networkTableRefCount)
900                         msoLogger.debug(Prefix + "networkTableRefCount - " + networkTableRefCount)
901
902                         String aai_endpoint = UrnPropertiesReader.getVariable("aai.endpoint", execution)
903                         AaiUtil aaiUriUtil = new AaiUtil(this)
904
905                         if (networkTableRefCount > 0) {
906                                 execution.setVariable(Prefix + "networkTableRefUriList", networkTableRefUriList)
907                                 msoLogger.debug(" networkTableRefUri List - " + networkTableRefUriList)
908
909                                 // AII loop call using list vpnBindings
910                                 String networkTableRefs = ""
911                                 for (i in 0..networkTableRefUriList.size()-1) {
912
913                                         int counting = i+1
914
915                                         // prepare url using tableRef
916                                         String queryNetworkTableRefAAIRequest = ""
917
918                                         String aai_uri = aaiUriUtil.getNetworkTableReferencesUri(execution)
919
920                                         // Note: By default, the network policy url is found in 'related-link' of the response,
921                                         //       so, the default in URN mappings for this is set to "" (ie, space), unless forced to use the URN mapping.
922                                         if (aai_uri == null || aai_uri == "") {
923                                                 // using value of 'related-link' from response
924                                                 if (networkTableRefUriList[i].charAt(networkTableRefUriList[i].length()-1) == '/') {
925                                                         queryNetworkTableRefAAIRequest = "${aai_endpoint}" + networkTableRefUriList[i].substring(0, networkTableRefUriList[i].length()-1) + "?depth=all"
926                                                 } else {
927                                                         queryNetworkTableRefAAIRequest = "${aai_endpoint}" + networkTableRefUriList[i] + "?depth=all"
928                                                 }
929                                         } else {
930                                                 // using uri value in URN mapping
931                                                 String networkTableRefId = networkTableRefUriList[i].substring(networkTableRefUriList[i].indexOf("/route-table-reference/")+23, networkTableRefUriList[i].length())
932
933                                                 if (networkTableRefId.charAt(networkTableRefId.length()-1) == '/') {
934                                                         networkTableRefId = networkTableRefId.substring(0, networkTableRefId.length()-1)
935                                                 }
936                                                 queryNetworkTableRefAAIRequest = "${aai_endpoint}${aai_uri}/" + networkTableRefId + "?depth=all"
937
938                                         }
939
940
941                                         execution.setVariable(Prefix + "queryNetworkTableRefAAIRequest", queryNetworkTableRefAAIRequest)
942                                         msoLogger.debug(Prefix + "queryNetworkTableRefAAIRequest, , NetworkTableRef #" + counting + " : " + "\n" + queryNetworkTableRefAAIRequest)
943
944                                         APIResponse response = aaiUriUtil.executeAAIGetCall(execution, queryNetworkTableRefAAIRequest)
945                                         String returnCode = response.getStatusCode()
946                                         execution.setVariable(Prefix + "aaiQqueryNetworkTableRefReturnCode", returnCode)
947                                         msoLogger.debug(" ***** AAI query network Table Reference Response Code, NetworkTableRef #" + counting + " : " + returnCode)
948
949                                         String aaiResponseAsString = response.getResponseBodyAsString()
950
951                                         if (returnCode=='200') {
952                                                 execution.setVariable(Prefix + "queryNetworkTableRefAAIResponse", aaiResponseAsString)
953                                                 msoLogger.debug(" QueryAAINetworkTableRef Success REST Response, , NetworkTableRef #" + counting + " : " + "\n" + aaiResponseAsString)
954
955                                                 String networkTableRef = ""
956                                                 if (utils.nodeExists(aaiResponseAsString, "route-table-reference-fqdn")) {
957                                                         networkTableRef  = utils.getNodeText(aaiResponseAsString, "route-table-reference-fqdn")
958                                                         networkTableRefs += "<routeTableFqdns>" + networkTableRef + "</routeTableFqdns>" + '\n'
959                                                 }
960
961                                         } else {
962                                                 if (returnCode=='404') {
963                                                         String dataErrorMessage = "Response Error from QueryAAINetworkTableRef is 404 (Not Found)."
964                                                         msoLogger.debug(dataErrorMessage)
965                                                         exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage)
966
967                                                 } else {
968                                                    if (aaiResponseAsString.contains("RESTFault")) {
969                                                            WorkflowException exceptionObject = exceptionUtil.MapAAIExceptionToWorkflowException(aaiResponseAsString, execution)
970                                                            execution.setVariable("WorkflowException", exceptionObject)
971                                                            throw new BpmnError("MSOWorkflowException")
972
973                                                            } else {
974                                                                         // aai all errors
975                                                                         String dataErrorMessage = "Unexpected Response from QueryAAINetworkTableRef - " + returnCode
976                                                                         msoLogger.debug(dataErrorMessage)
977                                                                         exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage)
978
979                                                           }
980                                                 }
981                                         }
982
983                                 } // end loop
984
985                                 execution.setVariable(Prefix + "tableRefCollection", networkTableRefs)
986                                 msoLogger.debug(Prefix + "tableRefCollection - " + '\n' + networkTableRefs)
987
988                         } else {
989                                 // reset return code to success
990                                 execution.setVariable(Prefix + "aaiQqueryNetworkTableRefReturnCode", "200")
991                                 String aai_uri = aaiUriUtil.getNetworkL3NetworkUri(execution)
992                                 String schemaVersion = aaiUriUtil.getNamespaceFromUri(execution, aai_uri)
993                                 String aaiStubResponse =
994                                         """     <rest:payload contentType="text/xml" xmlns:rest="http://schemas.activebpel.org/REST/2007/12/01/aeREST.xsd">
995                                                         <route-table-references xmlns="${schemaVersion}">
996                                                           <route-table-reference-fqdn/>
997                             </route-table-references>
998                                                 </rest:payload>"""
999                                 String aaiStubResponseAsXml = utils.formatXml(aaiStubResponse)
1000                                 execution.setVariable(Prefix + "queryNetworkTableRefAAIResponse", aaiStubResponseAsXml)
1001                                 execution.setVariable(Prefix + "tableRefCollection", "<routeTableFqdns/>")
1002                                 msoLogger.debug(" No net table references, using this stub as response - " + '\n' + aaiStubResponseAsXml)
1003
1004                         }
1005
1006                 } catch (BpmnError e) {
1007                         throw e;
1008
1009                 } catch (Exception ex) {
1010                         String exceptionMessage = "Bpmn error encountered in DoCreateNetworkInstance flow. callRESTQueryAAINetworkTableRef() - " + ex.getMessage()
1011                         msoLogger.debug(exceptionMessage)
1012                         exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
1013
1014                 }
1015
1016         }
1017
1018
1019         public void callRESTUpdateContrailAAINetwork(DelegateExecution execution) {
1020                 
1021                 execution.setVariable("prefix",Prefix)
1022
1023                 msoLogger.debug(" ***** Inside callRESTUpdateContrailAAINetwork() of DoCreateNetworkInstance ***** " )
1024
1025                 try {
1026                         // get variables
1027                         String networkId   = execution.getVariable(Prefix + "networkId")
1028                         networkId = UriUtils.encode(networkId,"UTF-8")
1029                         String requeryIdAAIResponse   = execution.getVariable(Prefix + "requeryIdAAIResponse")
1030                         String createNetworkResponse   = execution.getVariable(Prefix + "createNetworkResponse")
1031
1032                         // Prepare url
1033                         String aai_endpoint = UrnPropertiesReader.getVariable("aai.endpoint", execution)
1034                         AaiUtil aaiUriUtil = new AaiUtil(this)
1035                         String aai_uri = aaiUriUtil.getNetworkL3NetworkUri(execution)
1036                         String updateContrailAAIUrlRequest = "${aai_endpoint}${aai_uri}/" + networkId + "?depth=all"
1037
1038                         execution.setVariable(Prefix + "updateContrailAAIUrlRequest", updateContrailAAIUrlRequest)
1039                         msoLogger.debug(Prefix + "updateContrailAAIUrlRequest - " + "\n" + updateContrailAAIUrlRequest)
1040
1041                         //Prepare payload (PUT)
1042                         String schemaVersion = aaiUriUtil.getNamespaceFromUri(execution, aai_uri)
1043                         String payload = networkUtils.ContrailNetworkCreatedUpdate(requeryIdAAIResponse, createNetworkResponse, schemaVersion)
1044                         String payloadXml = utils.formatXml(payload)
1045                         execution.setVariable(Prefix + "updateContrailAAIPayloadRequest", payloadXml)
1046                         msoLogger.debug(" 'payload' to Update Contrail - " + "\n" + payloadXml)
1047
1048                         APIResponse response = aaiUriUtil.executeAAIPutCall(execution, updateContrailAAIUrlRequest, payloadXml)
1049                                                 
1050                         String returnCode = response.getStatusCode()
1051                         execution.setVariable(Prefix + "aaiUpdateContrailReturnCode", returnCode)
1052                         msoLogger.debug(" ***** AAI Update Contrail Response Code  : " + returnCode)
1053                         String aaiUpdateContrailResponseAsString = response.getResponseBodyAsString()
1054                         if (returnCode=='200') {
1055                                 execution.setVariable(Prefix + "updateContrailAAIResponse", aaiUpdateContrailResponseAsString)
1056                                 msoLogger.debug(" AAI Update Contrail Success REST Response - " + "\n" + aaiUpdateContrailResponseAsString)
1057                                 // Point-of-no-return is set to false, rollback not needed.
1058                                 String rollbackEnabled = execution.getVariable(Prefix + "rollbackEnabled")
1059                                 if (rollbackEnabled == "true") {
1060                                    execution.setVariable(Prefix + "isPONR", false)
1061                                 } else {
1062                                    execution.setVariable(Prefix + "isPONR", true)
1063                                 }  
1064                                 msoLogger.debug(Prefix + "isPONR" + ": " + execution.getVariable(Prefix + "isPONR"))
1065                         } else {
1066                                 if (returnCode=='404') {
1067                                         String dataErrorMessage = " Response Error from UpdateContrailAAINetwork is 404 (Not Found)."
1068                                         msoLogger.debug(dataErrorMessage)
1069                                         exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage)
1070
1071                                 } else {
1072                                    if (aaiUpdateContrailResponseAsString.contains("RESTFault")) {
1073                                            WorkflowException exceptionObject = exceptionUtil.MapAAIExceptionToWorkflowException(aaiUpdateContrailResponseAsString, execution)
1074                                            execution.setVariable("WorkflowException", exceptionObject)
1075                                            throw new BpmnError("MSOWorkflowException")
1076
1077                                            } else {
1078                                                         // aai all errors
1079                                                         String errorMessage = "Unexpected Response from UpdateContrailAAINetwork - " + returnCode
1080                                                         msoLogger.debug(errorMessage)
1081                                                         exceptionUtil.buildAndThrowWorkflowException(execution, 2500, errorMessage)
1082                                           }
1083                                 }
1084                         }
1085
1086                 } catch (BpmnError e) {
1087                         throw e;
1088
1089                 } catch (Exception ex) {
1090                         String exceptionMessage = "Bpmn error encountered in DoCreateNetworkInstance flow. callRESTUpdateContrailAAINetwork() - " + ex.getMessage()
1091                         msoLogger.debug(exceptionMessage)
1092                         exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
1093
1094                 }
1095
1096         }
1097
1098         public void prepareCreateNetworkRequest (DelegateExecution execution) {
1099                 
1100                 execution.setVariable("prefix",Prefix)
1101
1102                 msoLogger.trace("Inside prepareCreateNetworkRequest() of DoCreateNetworkInstance")
1103
1104                 try {
1105
1106                         // get variables
1107                         String requestId = execution.getVariable("msoRequestId")
1108                         if (requestId == null) {
1109                                 requestId = execution.getVariable("mso-request-id") 
1110                         }
1111                         String messageId = execution.getVariable(Prefix + "messageId")
1112                         String source    = execution.getVariable(Prefix + "source")
1113
1114                         String requestInput = execution.getVariable(Prefix + "networkRequest")
1115                         String queryIdResponse = execution.getVariable(Prefix + "queryIdAAIResponse")
1116                         String cloudRegionId = execution.getVariable(Prefix + "cloudRegionPo")
1117                         String backoutOnFailure = execution.getVariable(Prefix + "rollbackEnabled")
1118                         
1119                         // Prepare Network request
1120                         String routeCollection = execution.getVariable(Prefix + "routeCollection")
1121                         String policyCollection = execution.getVariable(Prefix + "networkCollection")
1122                         String tableCollection = execution.getVariable(Prefix + "tableRefCollection")
1123                         String createNetworkRequest = networkUtils.CreateNetworkRequestV2(execution, requestId, messageId, requestInput, queryIdResponse, routeCollection, policyCollection, tableCollection, cloudRegionId, backoutOnFailure, source )
1124                         // Format Response
1125                         String buildDeleteNetworkRequestAsString = utils.formatXml(createNetworkRequest)
1126                         buildDeleteNetworkRequestAsString = buildDeleteNetworkRequestAsString.replace(":w1aac13n0", "").replace("w1aac13n0:", "")
1127
1128                         execution.setVariable(Prefix + "createNetworkRequest", buildDeleteNetworkRequestAsString)
1129                         msoLogger.debug(Prefix + "createNetworkRequest - " + "\n" +  buildDeleteNetworkRequestAsString)
1130
1131                 } catch (Exception ex) {
1132                         String exceptionMessage = " Bpmn error encountered in DoCreateNetworkInstance flow. prepareCreateNetworkRequest() - " + ex.getMessage()
1133                         msoLogger.debug(exceptionMessage)
1134                         exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
1135
1136                 }
1137
1138         }
1139
1140         public void prepareSDNCRequest (DelegateExecution execution) {
1141                 
1142                 execution.setVariable("prefix",Prefix)
1143
1144                 msoLogger.trace("Inside prepareSDNCRequest() of DoCreateNetworkInstance")
1145
1146                 try {
1147                         // get variables
1148                         String sdncCallback = UrnPropertiesReader.getVariable("mso.workflow.sdncadapter.callback",execution)
1149                         String createNetworkInput = execution.getVariable(Prefix + "networkRequest")
1150                         String cloudRegionId = execution.getVariable(Prefix + "cloudRegionSdnc")
1151
1152                         String networkId = execution.getVariable(Prefix + "networkId")
1153                         String serviceInstanceId = execution.getVariable(Prefix + "serviceInstanceId")
1154
1155                         // get/set 'msoRequestId' and 'mso-request-id'
1156                         String requestId = execution.getVariable("msoRequestId")
1157                         if (requestId != null) {
1158                                 execution.setVariable("mso-request-id", requestId)
1159                         } else {
1160                             requestId = execution.getVariable("mso-request-id")
1161                         }       
1162                         execution.setVariable(Prefix + "requestId", requestId)
1163                         
1164                         // 1. prepare assign topology via SDNC Adapter SUBFLOW call
1165                         String sndcTopologyCreateRequest = sdncAdapterUtils.sdncTopologyRequestV2(execution, createNetworkInput, serviceInstanceId, sdncCallback, "assign", "NetworkActivateRequest", cloudRegionId, networkId, null, null)
1166
1167                         String sndcTopologyCreateRequesAsString = utils.formatXml(sndcTopologyCreateRequest)
1168                         execution.setVariable(Prefix + "assignSDNCRequest", sndcTopologyCreateRequesAsString)
1169                         msoLogger.debug(Prefix + "assignSDNCRequest - " + "\n" +  sndcTopologyCreateRequesAsString)
1170
1171
1172                 } catch (Exception ex) {
1173                         String exceptionMessage = " Bpmn error encountered in DoCreateNetworkInstance flow. prepareSDNCRequest() - " + ex.getMessage()
1174                         msoLogger.debug(exceptionMessage)
1175                         exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
1176
1177                 }
1178
1179         }
1180
1181         public void prepareRpcSDNCRequest (DelegateExecution execution) {
1182                 
1183                 execution.setVariable("prefix",Prefix)
1184
1185                 msoLogger.trace("Inside prepareRpcSDNCRequest() of DoCreateNetworkInstance")
1186
1187                 try {
1188                         // get variables
1189                         
1190                         String sdncCallback = UrnPropertiesReader.getVariable("mso.workflow.sdncadapter.callback",execution)
1191                         String createNetworkInput = execution.getVariable(Prefix + "networkRequest")
1192                         String cloudRegionId = execution.getVariable(Prefix + "cloudRegionSdnc")
1193
1194                         String networkId = execution.getVariable(Prefix + "networkId")
1195                         String serviceInstanceId = execution.getVariable(Prefix + "serviceInstanceId")
1196                         
1197                         // 1. prepare assign topology via SDNC Adapter SUBFLOW call
1198                         String sndcTopologyCreateRequest = sdncAdapterUtils.sdncTopologyRequestRsrc(execution, createNetworkInput, serviceInstanceId, sdncCallback, "assign", "CreateNetworkInstance", cloudRegionId, networkId, null)
1199
1200                         String sndcTopologyCreateRequesAsString = utils.formatXml(sndcTopologyCreateRequest)
1201                         execution.setVariable(Prefix + "assignSDNCRequest", sndcTopologyCreateRequesAsString)
1202                         msoLogger.debug(Prefix + "assignSDNCRequest - " + "\n" +  sndcTopologyCreateRequesAsString)
1203
1204                 } catch (Exception ex) {
1205                         String exceptionMessage = " Bpmn error encountered in DoCreateNetworkInstance flow. prepareRpcSDNCRequest() - " + ex.getMessage()
1206                         msoLogger.debug(exceptionMessage)
1207                         exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
1208
1209                 }
1210
1211         }
1212         
1213         public void prepareRpcSDNCActivateRequest (DelegateExecution execution) {
1214                 
1215                 execution.setVariable("prefix",Prefix)
1216                 
1217                 msoLogger.trace("Inside prepareRpcSDNCActivateRequest() of DoCreateNetworkInstance")
1218
1219                 try {
1220                         // get variables
1221                         String sdncCallback = UrnPropertiesReader.getVariable("mso.workflow.sdncadapter.callback",execution)
1222                         String createNetworkInput = execution.getVariable(Prefix + "networkRequest")
1223                         String cloudRegionId = execution.getVariable(Prefix + "cloudRegionSdnc")
1224                         String networkId = execution.getVariable(Prefix + "networkId")
1225                         String serviceInstanceId = execution.getVariable(Prefix + "serviceInstanceId")
1226                         
1227                         // 1. prepare assign topology via SDNC Adapter SUBFLOW call
1228                         String sndcTopologyCreateRequest = sdncAdapterUtils.sdncTopologyRequestRsrc(execution, createNetworkInput, serviceInstanceId, sdncCallback, "activate", "CreateNetworkInstance", cloudRegionId, networkId, null)
1229
1230                         String sndcTopologyCreateRequesAsString = utils.formatXml(sndcTopologyCreateRequest)
1231                         execution.setVariable(Prefix + "activateSDNCRequest", sndcTopologyCreateRequesAsString)
1232                         msoLogger.debug(Prefix + "activateSDNCRequest - " + "\n" +  sndcTopologyCreateRequesAsString)
1233
1234
1235                 } catch (Exception ex) {
1236                         String exceptionMessage = " Bpmn error encountered in DoCreateNetworkInstance flow. prepareRpcSDNCActivateRequest() - " + ex.getMessage()
1237                         msoLogger.debug(exceptionMessage)
1238                         exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
1239
1240                 }
1241
1242         }
1243         
1244
1245
1246
1247         // **************************************************
1248         //     Post or Validate Response Section
1249         // **************************************************
1250
1251         public void validateCreateNetworkResponse (DelegateExecution execution) {
1252                 
1253                 execution.setVariable("prefix",Prefix)
1254
1255                 msoLogger.trace("Inside validateNetworkResponse() of DoCreateNetworkInstance")
1256
1257                 try {
1258                         String returnCode = execution.getVariable(Prefix + "networkReturnCode")
1259                         String networkResponse = execution.getVariable(Prefix + "createNetworkResponse")
1260                         if (networkResponse==null)      {
1261                                 networkResponse="" // reset
1262                         }
1263
1264                         msoLogger.debug(" Network Adapter create responseCode: " + returnCode)
1265
1266                         String errorMessage = ""
1267                         if (returnCode == "200") {
1268                                 execution.setVariable(Prefix + "isNetworkRollbackNeeded", true)
1269                                 execution.setVariable(Prefix + "createNetworkResponse", networkResponse)
1270                                 msoLogger.debug(" Network Adapter create Success Response - " + "\n" + networkResponse)
1271
1272                                 // prepare rollback data
1273                                 String rollbackData = utils.getNodeXml(networkResponse, "rollback", false).replace("tag0:","").replace(":tag0","")
1274                                 rollbackData = rollbackData.replace("rollback>", "networkRollback>")
1275                                 String rollbackNetwork =
1276                                         """<rollbackNetworkRequest>
1277                                                         ${rollbackData}
1278                                                 </rollbackNetworkRequest>"""
1279                                 String rollbackNetworkXml = utils.formatXml(rollbackNetwork)
1280                                 execution.setVariable(Prefix + "rollbackNetworkRequest", rollbackNetworkXml)
1281                                 msoLogger.debug(" Network Adapter rollback data - " + "\n" + rollbackNetworkXml)
1282
1283                         } else { // network error
1284                            if (returnCode.toInteger() > 399 && returnCode.toInteger() < 600) {   //4xx, 5xx
1285                                    if (networkResponse.contains("createNetworkError")) {
1286                                            networkResponse = networkResponse.replace('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>', '')
1287                                            errorMessage = utils.getNodeText(networkResponse, "message")
1288                                            errorMessage  = "Received error from Network Adapter: " + errorMessage
1289                                            exceptionUtil.buildAndThrowWorkflowException(execution, 2500, errorMessage)
1290
1291                                    } else { // CatchAll exception
1292                                            if (returnCode == "500") {
1293                                                    errorMessage = "JBWEB000065: HTTP Status 500."
1294                                        } else {
1295                                                errorMessage = "Return code is " + returnCode
1296                                        }
1297                                            errorMessage  = "Received error from Network Adapter: " + errorMessage
1298                                            exceptionUtil.buildAndThrowWorkflowException(execution, 2500, errorMessage)
1299
1300                                    }
1301
1302                            } else { // CatchAll exception
1303                                    String dataErrorMessage  = "Received error from Network Adapter. Return code is: " + returnCode
1304                                    exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage)
1305
1306                            }
1307
1308                         }
1309
1310                 } catch (BpmnError e) {
1311                         throw e;
1312
1313                 } catch (Exception ex) {
1314                         String exceptionMessage = " Bpmn error encountered in DoCreateNetworkInstance flow. validateCreateNetworkResponse() - " + ex.getMessage()
1315                         msoLogger.debug(exceptionMessage)
1316                         exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
1317
1318                 }
1319
1320
1321         }
1322
1323         public void validateSDNCResponse (DelegateExecution execution) {
1324                 
1325                 execution.setVariable("prefix",Prefix)
1326
1327                 msoLogger.trace("Inside validateSDNCResponse() of DoCreateNetworkInstance")
1328
1329                 String response = execution.getVariable(Prefix + "assignSDNCResponse")
1330                 boolean successIndicator = execution.getVariable("SDNCA_SuccessIndicator")
1331                 WorkflowException workflowException = execution.getVariable("WorkflowException")
1332                 
1333                 SDNCAdapterUtils sdncAdapterUtils = new SDNCAdapterUtils(this)
1334                 sdncAdapterUtils.validateSDNCResponse(execution, response, workflowException, successIndicator)
1335                 // reset variable
1336                 String assignSDNCResponseDecodeXml = execution.getVariable(Prefix + "assignSDNCResponse")
1337                 assignSDNCResponseDecodeXml = assignSDNCResponseDecodeXml.replace('<?xml version="1.0" encoding="UTF-8"?>', "")
1338                 execution.setVariable(Prefix + "assignSDNCResponse", assignSDNCResponseDecodeXml)
1339
1340                 if (execution.getVariable(Prefix + "sdncResponseSuccess") == true) {  // from sdnc util, Prefix+'sdncResponseSuccess'
1341                         execution.setVariable(Prefix + "isSdncRollbackNeeded", true)
1342                         msoLogger.debug("Successfully Validated SDNC Response")
1343
1344                 } else {
1345                         msoLogger.debug("Did NOT Successfully Validated SDNC Response")
1346                         throw new BpmnError("MSOWorkflowException")
1347                 }
1348
1349         }
1350
1351         public void validateRpcSDNCActivateResponse (DelegateExecution execution) {
1352                 
1353                 execution.setVariable("prefix",Prefix)
1354
1355                 msoLogger.trace("Inside validateRpcSDNCActivateResponse() of DoCreateNetworkInstance")
1356
1357                 String response = execution.getVariable(Prefix + "activateSDNCResponse")
1358                 boolean successIndicator = execution.getVariable("SDNCA_SuccessIndicator")
1359                 WorkflowException workflowException = execution.getVariable("WorkflowException")
1360
1361                 SDNCAdapterUtils sdncAdapterUtils = new SDNCAdapterUtils(this)
1362                 sdncAdapterUtils.validateSDNCResponse(execution, response, workflowException, successIndicator)
1363                 // reset variable
1364                 String assignSDNCResponseDecodeXml = execution.getVariable(Prefix + "activateSDNCResponse")
1365                 assignSDNCResponseDecodeXml = assignSDNCResponseDecodeXml.replace('<?xml version="1.0" encoding="UTF-8"?>', "")
1366                 execution.setVariable(Prefix + "activateSDNCResponse", assignSDNCResponseDecodeXml)
1367
1368                 if (execution.getVariable(Prefix + "sdncResponseSuccess") == true) {  // from sdnc util, Prefix+'sdncResponseSuccess'
1369                         execution.setVariable(Prefix + "isSdncActivateRollbackNeeded", true)
1370                         msoLogger.debug("Successfully Validated Rpc SDNC Activate Response")
1371
1372                 } else {
1373                         msoLogger.debug("Did NOT Successfully Validated Rpc SDNC Activate Response")
1374                         throw new BpmnError("MSOWorkflowException")
1375                 }
1376                 
1377         }
1378
1379
1380         public void prepareSDNCRollbackRequest (DelegateExecution execution) {
1381                 
1382                 execution.setVariable("prefix",Prefix)
1383
1384                 msoLogger.trace("Inside prepareSDNCRollbackRequest() of DoCreateNetworkInstance")
1385
1386                 try {
1387                         // get variables
1388                         String sdncCallback = UrnPropertiesReader.getVariable("mso.workflow.sdncadapter.callback",execution)
1389                         String createNetworkInput = execution.getVariable(Prefix + "networkRequest")
1390                         String cloudRegionId = execution.getVariable(Prefix + "cloudRegionSdnc")
1391                         String assignSDNCResponse = execution.getVariable(Prefix + "assignSDNCResponse")
1392                         String networkId = execution.getVariable(Prefix + "networkId")
1393                         if (networkId == 'null') {networkId = ""}
1394                         String serviceInstanceId = execution.getVariable(Prefix + "serviceInstanceId")
1395                         
1396                         // 2. prepare rollback topology via SDNC Adapter SUBFLOW call
1397                         String sndcTopologyRollbackRequest = sdncAdapterUtils.sdncTopologyRequestV2(execution, createNetworkInput, serviceInstanceId, sdncCallback, "rollback", "NetworkActivateRequest", cloudRegionId, networkId, null, null)
1398                         String sndcTopologyRollbackRequestAsString = utils.formatXml(sndcTopologyRollbackRequest)
1399                         execution.setVariable(Prefix + "rollbackSDNCRequest", sndcTopologyRollbackRequestAsString)
1400                         msoLogger.debug(" Preparing request for SDNC Topology 'rollback-NetworkActivateRequest' rollback . . . - " + "\n" +  sndcTopologyRollbackRequestAsString)
1401
1402
1403                 } catch (Exception ex) {
1404                         String exceptionMessage = " Bpmn error encountered in DoCreateNetworkInstance flow. prepareSDNCRollbackRequest() - " + ex.getMessage()
1405                         msoLogger.debug(exceptionMessage)
1406                         exceptionUtil.buildWorkflowException(execution, 7000, exceptionMessage)
1407
1408                 }
1409
1410         }
1411
1412         public void prepareRpcSDNCRollbackRequest (DelegateExecution execution) {
1413                 
1414                 execution.setVariable("prefix",Prefix)
1415
1416                 msoLogger.trace("Inside prepareRpcSDNCRollbackRequest() of DoCreateNetworkInstance")
1417
1418                 try {
1419                         // get variables
1420                         String sdncCallback = UrnPropertiesReader.getVariable("mso.workflow.sdncadapter.callback",execution)
1421                         String createNetworkInput = execution.getVariable(Prefix + "networkRequest")
1422                         String cloudRegionId = execution.getVariable(Prefix + "cloudRegionSdnc")
1423                         String assignSDNCResponse = execution.getVariable(Prefix + "assignSDNCResponse")
1424                         String networkId = execution.getVariable(Prefix + "networkId")
1425                         if (networkId == 'null') {networkId = ""}
1426                         String serviceInstanceId = execution.getVariable(Prefix + "serviceInstanceId")
1427
1428                         // 2. prepare rollback topology via SDNC Adapter SUBFLOW call
1429                         String sndcTopologyRollbackRpcRequest = sdncAdapterUtils.sdncTopologyRequestRsrc(execution, createNetworkInput, serviceInstanceId, sdncCallback, "unassign", "DeleteNetworkInstance", cloudRegionId, networkId, null)
1430                         String sndcTopologyRollbackRpcRequestAsString = utils.formatXml(sndcTopologyRollbackRpcRequest)
1431                         execution.setVariable(Prefix + "rollbackSDNCRequest", sndcTopologyRollbackRpcRequestAsString)
1432                         msoLogger.debug(" Preparing request for SDNC Topology 'unassign-DeleteNetworkInstance' rollback . . . - " + "\n" +  sndcTopologyRollbackRpcRequestAsString)
1433
1434
1435                 } catch (Exception ex) {
1436                         String exceptionMessage = " Bpmn error encountered in DoCreateNetworkInstance flow. prepareRpcSDNCRollbackRequest() - " + ex.getMessage()
1437                         msoLogger.debug(exceptionMessage)
1438                         exceptionUtil.buildWorkflowException(execution, 7000, exceptionMessage)
1439
1440                 }
1441
1442         }
1443         
1444         public void prepareRpcSDNCActivateRollback(DelegateExecution execution) {
1445                 
1446                 execution.setVariable("prefix",Prefix)
1447
1448                 msoLogger.trace("Inside prepareRpcSDNCActivateRollback() of DoCreateNetworkInstance")
1449
1450                 try {
1451                 
1452                         // get variables
1453                         String sdncCallback = UrnPropertiesReader.getVariable("mso.workflow.sdncadapter.callback",execution)
1454                         String createNetworkInput = execution.getVariable(Prefix + "networkRequest")
1455                         String cloudRegionId = execution.getVariable(Prefix + "cloudRegionSdnc")
1456                         String activateSDNCResponse = execution.getVariable(Prefix + "activateSDNCResponse")
1457                         String networkId = execution.getVariable(Prefix + "networkId")
1458                         if (networkId == 'null') {networkId = ""}
1459                         String serviceInstanceId = execution.getVariable(Prefix + "serviceInstanceId")
1460
1461                         // 2. prepare rollback topology via SDNC Adapter SUBFLOW call
1462                         String sndcTopologyRollbackRpcRequest = sdncAdapterUtils.sdncTopologyRequestRsrc(execution, createNetworkInput, serviceInstanceId, sdncCallback, "deactivate", "DeleteNetworkInstance", cloudRegionId, networkId, null)
1463                         String sndcTopologyRollbackRpcRequestAsString = utils.formatXml(sndcTopologyRollbackRpcRequest)
1464                         execution.setVariable(Prefix + "rollbackActivateSDNCRequest", sndcTopologyRollbackRpcRequestAsString)
1465                         msoLogger.debug(" Preparing request for RPC SDNC Topology 'deactivate-DeleteNetworkInstance' rollback . . . - " + "\n" +  sndcTopologyRollbackRpcRequestAsString)
1466
1467
1468                 } catch (Exception ex) {
1469                         String exceptionMessage = " Bpmn error encountered in DoCreateNetworkInstance flow. prepareRpcSDNCActivateRollback() - " + ex.getMessage()
1470                         msoLogger.debug(exceptionMessage)
1471                         exceptionUtil.buildWorkflowException(execution, 7000, exceptionMessage)
1472
1473                 }
1474
1475         }
1476         
1477         public void prepareRollbackData(DelegateExecution execution) {
1478                 
1479                 execution.setVariable("prefix",Prefix)
1480                 
1481                 msoLogger.trace("Inside prepareRollbackData() of DoCreateNetworkInstance")
1482                 
1483                 try {
1484                         
1485                         Map<String, String> rollbackData = new HashMap<String, String>();
1486                         String rollbackSDNCRequest = execution.getVariable(Prefix + "rollbackSDNCRequest")
1487                         if (rollbackSDNCRequest != null) { 
1488                                 if (rollbackSDNCRequest != "") {
1489                                 rollbackData.put("rollbackSDNCRequest", execution.getVariable(Prefix + "rollbackSDNCRequest"))
1490                             }
1491                         }       
1492                         String rollbackNetworkRequest = execution.getVariable(Prefix + "rollbackNetworkRequest")
1493                         if (rollbackNetworkRequest != null) {
1494                                 if (rollbackNetworkRequest != "") {      
1495                                 rollbackData.put("rollbackNetworkRequest", execution.getVariable(Prefix + "rollbackNetworkRequest"))
1496                                 }       
1497                         }
1498                         String rollbackActivateSDNCRequest = execution.getVariable(Prefix + "rollbackActivateSDNCRequest")
1499                         if (rollbackActivateSDNCRequest != null) {
1500                                 if (rollbackActivateSDNCRequest != "") {         
1501                                 rollbackData.put("rollbackActivateSDNCRequest", execution.getVariable(Prefix + "rollbackActivateSDNCRequest"))
1502                                 }       
1503                         }
1504                         execution.setVariable("rollbackData", rollbackData)
1505                         msoLogger.debug("** rollbackData : " + rollbackData)
1506                         
1507                         execution.setVariable("WorkflowException", execution.getVariable(Prefix + "WorkflowException"))
1508                         msoLogger.debug("** WorkflowException : " + execution.getVariable("WorkflowException"))
1509                         
1510                 } catch (Exception ex) {
1511                         String exceptionMessage = " Bpmn error encountered in DoCreateNetworkInstance flow. prepareRollbackData() - " + ex.getMessage()
1512                         msoLogger.debug(exceptionMessage)
1513                         exceptionUtil.buildWorkflowException(execution, 7000, exceptionMessage)
1514                 
1515                 }
1516                 
1517         }
1518         
1519         public void postProcessResponse(DelegateExecution execution) {
1520                 
1521                 execution.setVariable("prefix",Prefix)
1522                 
1523                 msoLogger.trace("Inside postProcessResponse() of DoCreateNetworkInstance")
1524                 
1525                 try {
1526                         
1527                         //Conditions:
1528                         // 1. Silent Success: execution.getVariable("CRENWKI_orchestrationStatus") == "ACTIVE"  
1529                         // 2. Success: execution.getVariable("WorkflowException") == null (NULL)
1530                         // 3. WorkflowException: execution.getVariable("WorkflowException") != null (NOT NULL) 
1531                         
1532                         msoLogger.debug(" ***** Is Exception Encountered (isException)? : " + execution.getVariable(Prefix + "isException"))
1533                         // successful flow
1534                         if (execution.getVariable(Prefix + "isException") == false) {  
1535                                 // set rollback data
1536                                 execution.setVariable("orchestrationStatus", "")
1537                                 execution.setVariable("networkId", execution.getVariable(Prefix + "networkId"))
1538                                 execution.setVariable("networkName", execution.getVariable(Prefix + "networkName"))
1539                                 prepareSuccessRollbackData(execution) // populate rollbackData  
1540                                 execution.setVariable("WorkflowException", null)
1541                                 execution.setVariable(Prefix + "Success", true)
1542                                 msoLogger.debug(" ***** postProcessResponse(), GOOD !!!")
1543                         } else {
1544                            // inside sub-flow logic
1545                                 execution.setVariable(Prefix + "Success", false) 
1546                                 execution.setVariable("rollbackData", null)
1547                                 String exceptionMessage = " Exception encountered in MSO Bpmn. "
1548                                 if (execution.getVariable("workflowException") != null) {  // Output of Rollback flow.
1549                                    msoLogger.debug(" ***** workflowException: " + execution.getVariable("workflowException"))
1550                                    WorkflowException wfex = execution.getVariable("workflowException")
1551                                    exceptionMessage = wfex.getErrorMessage()
1552                                 } else {
1553                                if (execution.getVariable(Prefix + "WorkflowException") != null) {
1554                                       WorkflowException pwfex = execution.getVariable(Prefix + "WorkflowException")
1555                                       exceptionMessage = pwfex.getErrorMessage()
1556                                }   
1557                                 }
1558                             // going to the Main flow: a-la-carte or macro
1559                             msoLogger.debug(" ***** postProcessResponse(), BAD !!!")
1560                             exceptionUtil.buildWorkflowException(execution, 7000, exceptionMessage)
1561                                 throw new BpmnError("MSOWorkflowException")
1562                         }
1563                                                         
1564                 } catch(BpmnError b){
1565                      msoLogger.debug("Rethrowing MSOWorkflowException")
1566                      throw b
1567                         
1568                 } catch (Exception ex) {
1569                         String exceptionMessage = " Bpmn error encountered in DoCreateNetworkInstance flow. postProcessResponse() - " + ex.getMessage()
1570                         msoLogger.debug(exceptionMessage)
1571                         exceptionUtil.buildWorkflowException(execution, 7000, exceptionMessage)
1572                         throw new BpmnError("MSOWorkflowException")
1573                 
1574                 }
1575                 
1576                 
1577                 
1578         }
1579         
1580         public void prepareSuccessRollbackData(DelegateExecution execution) {
1581                 
1582                 execution.setVariable("prefix",Prefix)
1583                 
1584                 msoLogger.trace("Inside prepareSuccessRollbackData() of DoCreateNetworkInstance")
1585                 
1586                 try {
1587                         
1588                         if (execution.getVariable("sdncVersion") != '1610') {
1589                             prepareRpcSDNCRollbackRequest(execution)
1590                                 prepareRpcSDNCActivateRollback(execution)
1591                         } else {
1592                             prepareSDNCRollbackRequest(execution)
1593                         }       
1594                         
1595                         Map<String, String> rollbackData = new HashMap<String, String>();
1596                         String rollbackSDNCRequest = execution.getVariable(Prefix + "rollbackSDNCRequest")
1597                         if (rollbackSDNCRequest != null) {
1598                                 if (rollbackSDNCRequest != "") {
1599                                         rollbackData.put("rollbackSDNCRequest", rollbackSDNCRequest)
1600                                 }
1601                         }
1602                         String rollbackNetworkRequest = execution.getVariable(Prefix + "rollbackNetworkRequest")
1603                         if (rollbackNetworkRequest != null) {
1604                                 if (rollbackNetworkRequest != "") {
1605                                         rollbackData.put("rollbackNetworkRequest", rollbackNetworkRequest)
1606                                 }
1607                         }
1608                         String rollbackActivateSDNCRequest = execution.getVariable(Prefix + "rollbackActivateSDNCRequest")
1609                         if (rollbackActivateSDNCRequest != null) {
1610                                 if (rollbackActivateSDNCRequest != "") {
1611                                         rollbackData.put("rollbackActivateSDNCRequest", rollbackActivateSDNCRequest)
1612                                 }
1613                         }
1614                         execution.setVariable("rollbackData", rollbackData)
1615                         
1616                         msoLogger.debug("** 'rollbackData' for Full Rollback : " + rollbackData)
1617                         execution.setVariable("WorkflowException", null)
1618
1619                         
1620                 } catch (Exception ex) {
1621                         String exceptionMessage = " Bpmn error encountered in DoCreateNetworkInstance flow. prepareSuccessRollbackData() - " + ex.getMessage()
1622                         msoLogger.debug(exceptionMessage)
1623                         exceptionUtil.buildWorkflowException(execution, 7000, exceptionMessage)
1624                 
1625                 }
1626                 
1627         }
1628
1629         public void setExceptionFlag(DelegateExecution execution){
1630                 
1631                 execution.setVariable("prefix",Prefix)
1632                 
1633                 msoLogger.trace("Inside setExceptionFlag() of DoCreateNetworkInstance")
1634                 
1635                 try {
1636                         
1637                         execution.setVariable(Prefix + "isException", true)
1638                         
1639                         if (execution.getVariable("SavedWorkflowException1") != null) {
1640                                 execution.setVariable(Prefix + "WorkflowException", execution.getVariable("SavedWorkflowException1"))
1641                         } else {
1642                                 execution.setVariable(Prefix + "WorkflowException", execution.getVariable("WorkflowException"))
1643                         }
1644                         msoLogger.debug(Prefix + "WorkflowException - " +execution.getVariable(Prefix + "WorkflowException"))
1645                         
1646                 } catch(Exception ex){
1647                         String exceptionMessage = "Bpmn error encountered in DoCreateNetworkInstance flow. setExceptionFlag(): " + ex.getMessage()
1648                         msoLogger.debug(exceptionMessage)
1649                         exceptionUtil.buildWorkflowException(execution, 7000, exceptionMessage)
1650                 }  
1651                 
1652         }
1653         
1654         
1655         // *******************************
1656         //     Build Error Section
1657         // *******************************
1658
1659
1660         
1661         public void processJavaException(DelegateExecution execution){
1662                 
1663                 execution.setVariable("prefix",Prefix)
1664                 
1665                 try{
1666                         msoLogger.debug( "Caught a Java Exception in " + Prefix)
1667                         msoLogger.debug("Started processJavaException Method")
1668                         msoLogger.debug("Variables List: " + execution.getVariables())
1669                         execution.setVariable("UnexpectedError", "Caught a Java Lang Exception - " + Prefix)  // Adding this line temporarily until this flows error handling gets updated
1670                         exceptionUtil.buildWorkflowException(execution, 500, "Caught a Java Lang Exception")
1671                         
1672                 }catch(Exception e){
1673                         msoLogger.debug("Caught Exception during processJavaException Method: " + e)
1674                         execution.setVariable("UnexpectedError", "Exception in processJavaException method - " + Prefix)  // Adding this line temporarily until this flows error handling gets updated
1675                         exceptionUtil.buildWorkflowException(execution, 500, "Exception in processJavaException method" + Prefix)
1676                 }
1677                 msoLogger.debug( "Completed processJavaException Method in " + Prefix)
1678         }
1679
1680 }