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