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