4ca037018593a7ea89aa3b8a9294483b6aabb4f8
[so.git] / bpmn / MSOCommonBPMN / src / main / groovy / org / openecomp / mso / bpmn / common / scripts / SDNCAdapterUtils.groovy
1 /*-\r
2  * ============LICENSE_START=======================================================\r
3  * OPENECOMP - MSO\r
4  * ================================================================================\r
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.\r
6  * ================================================================================\r
7  * Licensed under the Apache License, Version 2.0 (the "License");\r
8  * you may not use this file except in compliance with the License.\r
9  * You may obtain a copy of the License at\r
10  * \r
11  *      http://www.apache.org/licenses/LICENSE-2.0\r
12  * \r
13  * Unless required by applicable law or agreed to in writing, software\r
14  * distributed under the License is distributed on an "AS IS" BASIS,\r
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
16  * See the License for the specific language governing permissions and\r
17  * limitations under the License.\r
18  * ============LICENSE_END=========================================================\r
19  */\r
20 \r
21 package org.openecomp.mso.bpmn.common.scripts;\r
22 \r
23 import org.apache.commons.lang3.*\r
24 import org.camunda.bpm.engine.delegate.BpmnError\r
25 import org.camunda.bpm.engine.runtime.Execution\r
26 import org.openecomp.mso.bpmn.core.WorkflowException\r
27 import org.openecomp.mso.bpmn.core.json.JsonUtils;\r
28 import org.springframework.web.util.UriUtils\r
29 \r
30 \r
31 /**\r
32  * @version 1.0\r
33  *\r
34  */\r
35 class SDNCAdapterUtils {\r
36 \r
37         ExceptionUtil exceptionUtil = new ExceptionUtil()\r
38         JsonUtils jsonUtil = new JsonUtils()\r
39 \r
40         private AbstractServiceTaskProcessor taskProcessor\r
41 \r
42         public SDNCAdapterUtils(AbstractServiceTaskProcessor taskProcessor) {\r
43                 this.taskProcessor = taskProcessor\r
44         }\r
45 \r
46         String SDNCAdapterFeatureRequest(Execution execution, String requestName, String action, String callbackURL, String serviceOperation, String timeoutValueInMinutes) {\r
47                 def utils=new MsoUtils()\r
48 \r
49                 def prefix = execution.getVariable('prefix')\r
50                 def request = taskProcessor.getVariable(execution, requestName)\r
51                 def requestInformation = utils.getNodeXml(request, 'request-information', false)\r
52                 def serviceInformation = utils.getNodeXml(request, 'service-information', false)\r
53                 def featureInformation = utils.getNodeXml(request, 'feature-information', false)\r
54                 def featureParameters = utils.getNodeXml(request, 'feature-parameters', false)\r
55 \r
56                 def requestId = execution.getVariable('testReqId') // for junits\r
57                 if(requestId==null){\r
58                         requestId = execution.getVariable("mso-request-id") + "-" +     System.currentTimeMillis()\r
59                 }\r
60 \r
61                 def svcInstanceId = execution.getVariable("mso-service-instance-id")\r
62 \r
63                 def nnsRequestInformation = utils.removeXmlNamespaces(requestInformation)\r
64                 def nnsServiceInformation = utils.removeXmlNamespaces(serviceInformation)\r
65                 def nnsFeatureInformation = utils.removeXmlNamespaces(featureInformation)\r
66                 def nnsFeatureParameters = utils.removeXmlNamespaces(featureParameters)\r
67 \r
68                 String sdncAdapterFeatureRequest = """\r
69                                 <sdncadapterworkflow:SDNCAdapterWorkflowRequest xmlns:sdncadapterworkflow="http://openecomp.com/mso/workflow/schema/v1"\r
70                                                 xmlns:sdncadapter="http://domain2.openecomp.com/workflow/sdnc/adapter/schema/v1">\r
71                                         <sdncadapter:RequestHeader>\r
72                                                 <sdncadapter:RequestId>${requestId}</sdncadapter:RequestId>\r
73                                                 <sdncadapter:SvcInstanceId>${svcInstanceId}</sdncadapter:SvcInstanceId>\r
74                                                 <sdncadapter:SvcAction>${action}</sdncadapter:SvcAction>\r
75                                                 <sdncadapter:SvcOperation>${serviceOperation}</sdncadapter:SvcOperation>\r
76                                                 <sdncadapter:CallbackUrl>${callbackURL}</sdncadapter:CallbackUrl>\r
77                                         </sdncadapter:RequestHeader>\r
78                                         <sdncadapterworkflow:SDNCRequestData>\r
79                                                 ${nnsRequestInformation}\r
80                                                 ${nnsServiceInformation}\r
81                                                 ${nnsFeatureInformation}\r
82                                                 ${nnsFeatureParameters}\r
83                                         </sdncadapterworkflow:SDNCRequestData>\r
84                                         <sdncadapterworkflow:SDNCTimeOutValueInMinutes>${timeoutValueInMinutes}</sdncadapterworkflow:SDNCTimeOutValueInMinutes>\r
85                                 </sdncadapterworkflow:SDNCAdapterWorkflowRequest>\r
86                         """\r
87                 sdncAdapterFeatureRequest = utils.removeXmlPreamble(utils.formatXML(sdncAdapterFeatureRequest))\r
88                 return sdncAdapterFeatureRequest\r
89         }\r
90 \r
91         String SDNCAdapterActivateVnfRequest(Execution execution, String action, String callbackURL, String serviceOperation, String msoAction, String timeoutValueInMinutes) {\r
92                 def utils=new MsoUtils()\r
93 \r
94                 def prefix = execution.getVariable('prefix')\r
95                 def request = taskProcessor.getVariable(execution, prefix+'Request')\r
96                 def requestInformation = utils.getNodeXml(request, 'request-information', false)\r
97                 def serviceInformation = utils.getNodeXml(request, 'service-information', false)\r
98                 def vnfInformationList = utils.getNodeXml(request, 'vnf-information-list', false)\r
99 \r
100                 def requestId = execution.getVariable('testReqId') // for junits\r
101                 if(requestId==null){\r
102                         requestId = execution.getVariable("mso-request-id") + "-" +     System.currentTimeMillis()\r
103                 }\r
104 \r
105                 def svcInstanceId = execution.getVariable("mso-service-instance-id")\r
106 \r
107                 def nnsRequestInformation = utils.removeXmlNamespaces(requestInformation)\r
108                 def nnsServiceInformation = utils.removeXmlNamespaces(serviceInformation)\r
109                 def nnsVnfInformationList = utils.removeXmlNamespaces(vnfInformationList)\r
110 \r
111                 String sdncAdapterActivateVnfRequest = """\r
112                                 <sdncadapterworkflow:SDNCAdapterWorkflowRequest xmlns:sdncadapterworkflow="http://openecomp.com/mso/workflow/schema/v1"\r
113                                                 xmlns:sdncadapter="http://domain2.openecomp.com/workflow/sdnc/adapter/schema/v1">\r
114                                         <sdncadapter:RequestHeader>\r
115                                                 <sdncadapter:RequestId>${requestId}</sdncadapter:RequestId>\r
116                                                 <sdncadapter:SvcInstanceId>${svcInstanceId}</sdncadapter:SvcInstanceId>\r
117                                                 <sdncadapter:SvcAction>${action}</sdncadapter:SvcAction>\r
118                                                 <sdncadapter:SvcOperation>${serviceOperation}</sdncadapter:SvcOperation>\r
119                                                 <sdncadapter:CallbackUrl>${callbackURL}</sdncadapter:CallbackUrl>\r
120                                                 <sdncadapter:MsoAction>${msoAction}</sdncadapter:MsoAction>\r
121                                         </sdncadapter:RequestHeader>\r
122                                         <sdncadapterworkflow:SDNCRequestData>\r
123                                                 ${nnsRequestInformation}\r
124                                                 ${nnsServiceInformation}\r
125                                                 ${nnsVnfInformationList}\r
126                                         </sdncadapterworkflow:SDNCRequestData>\r
127                                         <sdncadapterworkflow:SDNCTimeOutValueInMinutes>${timeoutValueInMinutes}</sdncadapterworkflow:SDNCTimeOutValueInMinutes>\r
128                                 </sdncadapterworkflow:SDNCAdapterWorkflowRequest>\r
129                         """\r
130                 sdncAdapterActivateVnfRequest = utils.removeXmlPreamble(utils.formatXML(sdncAdapterActivateVnfRequest))\r
131                 return sdncAdapterActivateVnfRequest\r
132         }\r
133 \r
134         String SDNCAdapterL3ToHigherLayerRequest(Execution execution, String action, String callbackURL, String serviceOperation, String timeoutValueInMinutes) {\r
135                 def utils=new MsoUtils()\r
136 \r
137                 def prefix = execution.getVariable('prefix')\r
138                 def request = taskProcessor.getVariable(execution, prefix+'Request')\r
139 \r
140                 def requestInformation = """<request-information>\r
141                                                                                 <request-id>${execution.getVariable("mso-request-id")}</request-id>\r
142                                                                                 <request-action>torepl</request-action>\r
143                                                                                 <source>${execution.getVariable(prefix+"source")}</source>\r
144                                                                                 <notification-url>${execution.getVariable(prefix+"notificationUrl")}</notification-url>\r
145                                                                         </request-information>"""\r
146 \r
147                 // Change the value of the 'request-information'.'request-action' element\r
148                 def xml = new XmlSlurper().parseText(requestInformation)\r
149                 if("assign".equalsIgnoreCase(action)){\r
150                         xml.'request-action'.replaceBody('createTrinityBonding')\r
151                 }else if("activate".equalsIgnoreCase(action)){\r
152                         xml.'request-action'.replaceBody('activateTrinityBonding')\r
153                 }else if("delete".equalsIgnoreCase(action)){\r
154                         xml.'request-action'.replaceBody('deleteTrinityBonding')\r
155                 }\r
156                 requestInformation = utils.removeXmlPreamble(groovy.xml.XmlUtil.serialize(xml))\r
157                 def nnsRequestInformation = utils.removeXmlNamespaces(requestInformation)\r
158 \r
159                 def requestId = execution.getVariable('testReqId') // for junits\r
160                 if(requestId==null){\r
161                         requestId = execution.getVariable("mso-request-id") + "-" +     System.currentTimeMillis()\r
162                 }\r
163 \r
164                 def svcInstanceId = execution.getVariable("mso-service-instance-id")\r
165 \r
166                 //Build Service Information\r
167                 // Send serviceName from CANOPI to sdnc for service-type\r
168                 def serviceInformation = """<service-information>\r
169                                                                               <service-type>${execution.getVariable(prefix+"serviceName")}</service-type>\r
170                                                                               <service-instance-id>${svcInstanceId}</service-instance-id>\r
171                                                                               <subscriber-name>${execution.getVariable(prefix+"subscriberName")}</subscriber-name>\r
172                                                                               <subscriber-global-id>${execution.getVariable(prefix+"subscriberGlobalId")}</subscriber-global-id>\r
173                                                                         </service-information>"""\r
174 \r
175                 //Build Additional Information - vpn or vni\r
176                 // Send serviceType from CANOPI to SDNC for nbnc-request-information service-type\r
177                 def service = execution.getVariable(prefix+"serviceType")\r
178                 def customerId = execution.getVariable(prefix+"customerId")\r
179                 def vpnId = execution.getVariable(prefix+"vpnId")\r
180                 def vpnRt = execution.getVariable(prefix+"vpnRt")\r
181                 def vpnService = execution.getVariable(prefix+"vpnService")\r
182                 def vpnRegion = execution.getVariable(prefix+"vpnRegion")\r
183                 def additionalInfo = ""\r
184                 if("assign".equalsIgnoreCase(action)){\r
185                         additionalInfo = """<vpn-data-list>\r
186                                                                         <vpn-id>${vpnId}</vpn-id>\r
187                                                                         <vpn-rt>${vpnRt}</vpn-rt>\r
188                                                                         <vpn-service>${vpnService}</vpn-service>\r
189                                                                         <vpn-region>${vpnRegion}</vpn-region>\r
190                                                                 </vpn-data-list>"""\r
191                 }else if("activate".equalsIgnoreCase(action) || "delete".equalsIgnoreCase(action)){\r
192                         def vniId = execution.getVariable(prefix+'vniId')\r
193                         additionalInfo = "<vni-id>${vniId}</vni-id>"\r
194                 }\r
195 \r
196                 //Set Interface Status\r
197                 def interfaceStatus = "DISABLE"\r
198                 if("activate".equalsIgnoreCase(action)){\r
199                         interfaceStatus = "ENABLE"\r
200                 }\r
201 \r
202                 //Build SDNC Adapter Request\r
203                 String sdncAdapterL3ToHLRequest = """\r
204                                 <sdncadapterworkflow:SDNCAdapterWorkflowRequest xmlns:sdncadapterworkflow="http://openecomp.com/mso/workflow/schema/v1"\r
205                                                 xmlns:sdncadapter="http://domain2.openecomp.com/workflow/sdnc/adapter/schema/v1">\r
206                                         <sdncadapter:RequestHeader>\r
207                                                 <sdncadapter:RequestId>${requestId}</sdncadapter:RequestId>\r
208                                                 <sdncadapter:SvcInstanceId>${svcInstanceId}</sdncadapter:SvcInstanceId>\r
209                                                 <sdncadapter:SvcAction>${action}</sdncadapter:SvcAction>\r
210                                                 <sdncadapter:SvcOperation>${serviceOperation}</sdncadapter:SvcOperation>\r
211                                                 <sdncadapter:CallbackUrl>${callbackURL}</sdncadapter:CallbackUrl>\r
212                                         </sdncadapter:RequestHeader>\r
213                                         <sdncadapterworkflow:SDNCRequestData>\r
214                                                 ${nnsRequestInformation}\r
215                                                 ${serviceInformation}\r
216                                 <nbnc-request-information>\r
217                                                         <service-type>${service}</service-type>\r
218                                                         <customer-id>${customerId}</customer-id>\r
219                                                         <interface-status>${interfaceStatus}</interface-status>\r
220                                                         ${additionalInfo}\r
221                                                 </nbnc-request-information>\r
222                                         </sdncadapterworkflow:SDNCRequestData>\r
223                                         <sdncadapterworkflow:SDNCTimeOutValueInMinutes>${timeoutValueInMinutes}</sdncadapterworkflow:SDNCTimeOutValueInMinutes>\r
224                                 </sdncadapterworkflow:SDNCAdapterWorkflowRequest>\r
225                         """\r
226                 sdncAdapterL3ToHLRequest = utils.removeXmlPreamble(utils.formatXML(sdncAdapterL3ToHLRequest))\r
227 \r
228                 return sdncAdapterL3ToHLRequest\r
229         }\r
230 \r
231 \r
232 \r
233         private void SDNCAdapterActivateRequest(Execution execution, String resultVar, String svcAction,\r
234                         String svcOperation, String additionalData) {\r
235                         def utils=new MsoUtils()\r
236 \r
237                         def prefix = execution.getVariable('prefix')\r
238                         def request = taskProcessor.getVariable(execution, prefix+'Request')\r
239                         def requestInformation = utils.getNodeXml(request, 'request-information', false)\r
240                         def serviceInformation = utils.getNodeXml(request, 'service-information', false)\r
241                         def serviceParameters = utils.getNodeXml(request, 'service-parameters', false)\r
242 \r
243                         def requestId = execution.getVariable('testReqId') // for junits\r
244                         if(requestId==null){\r
245                                 requestId = execution.getVariable("mso-request-id") + "-" +  System.currentTimeMillis()\r
246                         }\r
247 \r
248                         def svcInstanceId = execution.getVariable("mso-service-instance-id")\r
249                         def msoAction = 'gammainternet'\r
250 \r
251                         def timeoutInMinutes = execution.getVariable('URN_mso_sdnc_timeout_firewall_minutes')\r
252 \r
253                         def callbackUrl = (String) execution.getVariable('URN_mso_workflow_sdncadapter_callback')\r
254                         if (callbackUrl == null || callbackUrl.trim() == "") {\r
255                                 logError('mso:workflow:sdncadapter:callback URN is not set')\r
256                                 workflowException(execution, 'Internal Error', 9999) // TODO: what message and error code?\r
257                         }\r
258 \r
259                         def l2HomingInformation = utils.getNodeXml(serviceParameters, 'l2-homing-information', false)\r
260                         def internetEvcAccessInformation = utils.getNodeXml(serviceParameters, 'internet-evc-access-information', false)\r
261                         def vrLan = utils.getNodeXml(serviceParameters, 'vr-lan', false)\r
262                         def upceVmsServiceInformation = utils.getNodeXml(serviceParameters, 'ucpe-vms-service-information', false)\r
263 \r
264 \r
265                         def nnsRequestInformation = utils.removeXmlNamespaces(requestInformation)\r
266                         def nnsServiceInformation = utils.removeXmlNamespaces(serviceInformation)\r
267                         def nnsl2HomingInformation = utils.removeXmlNamespaces(l2HomingInformation)\r
268                         def nnsInternetEvcAccessInformation = utils.removeXmlNamespaces(internetEvcAccessInformation)\r
269                         def nnsVrLan = utils.removeXmlNamespaces(vrLan)\r
270                         def nnsUpceVmsServiceInformation = utils.removeXmlNamespaces(upceVmsServiceInformation)\r
271 \r
272                         if (additionalData == null) {\r
273                                 additionalData = ""\r
274                         }\r
275 \r
276                         String content = """\r
277                                 <sdncadapterworkflow:SDNCAdapterWorkflowRequest xmlns:sdncadapterworkflow="http://openecomp.com/mso/workflow/schema/v1"\r
278                                                 xmlns:sdncadapter="http://domain2.openecomp.com/workflow/sdnc/adapter/schema/v1">\r
279                                         <sdncadapter:RequestHeader>\r
280                                                 <sdncadapter:RequestId>${requestId}</sdncadapter:RequestId>\r
281                                                 <sdncadapter:SvcInstanceId>${svcInstanceId}</sdncadapter:SvcInstanceId>\r
282                                                 <sdncadapter:SvcAction>${svcAction}</sdncadapter:SvcAction>\r
283                                                 <sdncadapter:SvcOperation>${svcOperation}</sdncadapter:SvcOperation>\r
284                                                 <sdncadapter:CallbackUrl>${callbackUrl}</sdncadapter:CallbackUrl>\r
285                                                 <sdncadapter:MsoAction>${msoAction}</sdncadapter:MsoAction>\r
286                                         </sdncadapter:RequestHeader>\r
287                                         <sdncadapterworkflow:SDNCRequestData>\r
288                                                 ${additionalData}\r
289                                                 ${nnsRequestInformation}\r
290                                                 ${nnsServiceInformation}\r
291                                                 ${nnsl2HomingInformation}\r
292                                                 ${nnsInternetEvcAccessInformation}\r
293                                                 ${nnsVrLan}\r
294                                                 ${nnsUpceVmsServiceInformation}\r
295                                         </sdncadapterworkflow:SDNCRequestData>\r
296                                                 <sdncadapterworkflow:SDNCTimeOutValueInMinutes>${timeoutInMinutes}</sdncadapterworkflow:SDNCTimeOutValueInMinutes>\r
297                                 </sdncadapterworkflow:SDNCAdapterWorkflowRequest>\r
298                         """\r
299 \r
300                         content = utils.removeXmlPreamble(utils.formatXML(content))\r
301                         execution.setVariable(resultVar, content)\r
302         }\r
303 \r
304         /**\r
305          * Builds an SDNC "reserve" request and stores it in the specified execution\r
306          * variable.\r
307          * @param execution the execution\r
308          * @param resultVar the execution variable in which the result will be stored\r
309          */\r
310         public void sdncReservePrep(Execution execution, String action, String resultVar) {\r
311                 sdncPrep(execution, resultVar, action , 'service-configuration-operation', null, this.taskProcessor)\r
312         }\r
313 \r
314         /**\r
315          * Builds a basic SDNC request and stores it in the specified execution variable.\r
316          * @param execution the execution\r
317          * @param resultVar the execution variable in which the result will be stored\r
318          * @param svcAction the svcAction element value\r
319          * @param svcOperation the svcOperation element value\r
320          * @param additionalData additional XML content to be inserted into the\r
321          *        RequestData element (may be null)\r
322          */\r
323         public void sdncPrep(Execution execution, String resultVar, String svcAction,\r
324                         String svcOperation, String additionalData, AbstractServiceTaskProcessor taskProcessor) {\r
325                 def method = getClass().getSimpleName() + '.sdncPrep(' +\r
326                         'execution=' + execution.getId() +\r
327                         ', resultVar=' + resultVar +\r
328                         ', svcAction=' + svcAction +\r
329                         ', svcOperation=' + svcOperation +\r
330                         ', additionalData=' + (additionalData == null ? "no" : "yes") +\r
331                         ')'\r
332 \r
333                 def isDebugLogEnabled = execution.getVariable('isDebugLogEnabled')\r
334                 taskProcessor.logDebug('Entered ' + method, isDebugLogEnabled)\r
335                 MsoUtils utils = taskProcessor.utils\r
336                 try {\r
337                         def prefix = execution.getVariable('prefix')\r
338                         def request = taskProcessor.getVariable(execution, prefix+'Request')\r
339                         def requestInformation = utils.getNodeXml(request, 'request-information', false)\r
340                         def serviceInformation = utils.getNodeXml(request, 'service-information', false)\r
341                         def serviceParameters = utils.getChildNodes(request, 'service-parameters')\r
342                         def requestAction = utils.getNodeText1(request, 'request-action')\r
343 \r
344                         def timeoutInMinutes = execution.getVariable('URN_mso_sdnc_timeout_firewall_minutes')\r
345 \r
346                         def requestId = execution.getVariable('testReqId') // for junits\r
347                         if(requestId==null){\r
348                                 requestId = execution.getVariable("mso-request-id") + "-" +     System.currentTimeMillis()\r
349                         }\r
350 \r
351                         def svcInstanceId = execution.getVariable("mso-service-instance-id")\r
352                         def msoAction = 'gammainternet'\r
353 \r
354                         def callbackUrl = (String) execution.getVariable('URN_mso_workflow_sdncadapter_callback')\r
355                         if (callbackUrl == null || callbackUrl.trim() == "") {\r
356                                 taskProcessor.logError('mso:workflow:sdncadapter:callback URN is not set')\r
357                                 exceptionUtil.buildAndThrowWorkflowException(execution, 500, "Internal Error - During PreProcess Request")\r
358                         }\r
359 \r
360                         def l2HomingInformation = utils.getNodeXml(request, 'l2-homing-information', false)\r
361                         def internetEvcAccessInformation = utils.getNodeXml(request, 'internet-evc-access-information', false)\r
362                         def vrLan = utils.getNodeXml(request, 'vr-lan', false)\r
363                         def upceVmsServiceInfo = utils.getNodeXml(request, 'ucpe-vms-service-information', false)\r
364                         def vnfInformationList = utils.getNodeXml(request, 'vnf-information-list', false)\r
365 \r
366                         def nnsRequestInformation = utils.removeXmlNamespaces(requestInformation)\r
367                         def nnsServiceInformation = utils.removeXmlNamespaces(serviceInformation)\r
368                         def nnsl2HomingInformation = utils.removeXmlNamespaces(l2HomingInformation)\r
369                         def nnsInternetEvcAccessInformation = utils.removeXmlNamespaces(internetEvcAccessInformation)\r
370                         def nnsVrLan = utils.removeXmlNamespaces(vrLan)\r
371                         def nnsUpceVmsServiceInfo = utils.removeXmlNamespaces(upceVmsServiceInfo)\r
372                         def nnsVnfInformationList = utils.removeXmlNamespaces(vrLan)\r
373                         def nnsinternetSvcChangeDetails = ""\r
374 \r
375                         if(requestAction!=null && requestAction.equals("ChangeLayer3ServiceProvRequest")){\r
376                                 def internetSvcChangeDetails = utils.removeXmlNamespaces(serviceParameters)\r
377                                 nnsinternetSvcChangeDetails = """<internet-service-change-details>\r
378                                                         ${internetSvcChangeDetails}\r
379                                                 </internet-service-change-details>"""\r
380                         }\r
381 \r
382                         if (additionalData == null) {\r
383                                 additionalData = ""\r
384                         }\r
385 \r
386                         String content = """\r
387                                 <sdncadapterworkflow:SDNCAdapterWorkflowRequest xmlns:sdncadapterworkflow="http://openecomp.com/mso/workflow/schema/v1"\r
388                                                 xmlns:sdncadapter="http://domain2.openecomp.com/workflow/sdnc/adapter/schema/v1">\r
389                                         <sdncadapter:RequestHeader>\r
390                                                 <sdncadapter:RequestId>${requestId}</sdncadapter:RequestId>\r
391                                                 <sdncadapter:SvcInstanceId>${svcInstanceId}</sdncadapter:SvcInstanceId>\r
392                                                 <sdncadapter:SvcAction>${svcAction}</sdncadapter:SvcAction>\r
393                                                 <sdncadapter:SvcOperation>${svcOperation}</sdncadapter:SvcOperation>\r
394                                                 <sdncadapter:CallbackUrl>${callbackUrl}</sdncadapter:CallbackUrl>\r
395                                                 <sdncadapter:MsoAction>${msoAction}</sdncadapter:MsoAction>\r
396                                         </sdncadapter:RequestHeader>\r
397                                         <sdncadapterworkflow:SDNCRequestData>\r
398                                                 ${additionalData}\r
399                                                 ${nnsRequestInformation}\r
400                                                 ${nnsServiceInformation}\r
401                                                 ${nnsl2HomingInformation}\r
402                                                 ${nnsInternetEvcAccessInformation}\r
403                                                 ${nnsVrLan}\r
404                                                 ${nnsUpceVmsServiceInfo}\r
405                                                 ${nnsVnfInformationList}\r
406                                                 ${nnsinternetSvcChangeDetails}\r
407                                         </sdncadapterworkflow:SDNCRequestData>\r
408                                 </sdncadapterworkflow:SDNCAdapterWorkflowRequest>\r
409                         """\r
410 \r
411                         content = utils.removeXmlPreamble(utils.formatXML(content))\r
412                         execution.setVariable(resultVar, content)\r
413                         taskProcessor.logDebug(resultVar + ' = ' + System.lineSeparator() + content, isDebugLogEnabled)\r
414 \r
415                         taskProcessor.logDebug('Exited ' + method, isDebugLogEnabled)\r
416                 } catch (BpmnError e) {\r
417                         throw e;\r
418                 } catch (Exception e) {\r
419                         taskProcessor.logError('Caught exception in ' + method, e)\r
420                         exceptionUtil.buildAndThrowWorkflowException(execution, 5000, "Internal Error")\r
421                 }\r
422         }\r
423 \r
424         /**\r
425          * Builds a topology SDNC request and return String request.\r
426          * As V2 will use 1607-style request, region instead of aic clli code\r
427          * @param execution, the execution\r
428          * @param requestXML, the incoming request for the flow\r
429          * @param serviceInstanceId, the serviceIntance (if available)\r
430          * @param callbackUrl, the call back url\r
431          * @param action, the action element value\r
432          * @param requestAction the svcOperation element value\r
433          * @param cloudRegionId the aai's cloud-region-id\r
434          * @param networkId the aai's network-id\r
435          * @param additionalData additional XML content to be inserted into the\r
436          *   RequestData element (may be null)\r
437          */\r
438          public String sdncTopologyRequestV2 (Execution execution, String requestXML, String serviceInstanceId, String callbackUrl, String action, String requestAction, String cloudRegionId, networkId, String queryAAIResponse, String additionalData) {\r
439                  def utils=new MsoUtils()\r
440 \r
441                  String requestId = ""\r
442                  try {\r
443                          requestId = execution.getVariable("mso-request-id")\r
444                  } catch (Exception ex) {\r
445                          requestId = utils.getNodeText1(requestXML, "request-id")\r
446                  }\r
447 \r
448                  String aicCloudRegion = cloudRegionId\r
449                  String tenantId = ""\r
450                  if (utils.nodeExists(requestXML, "tenant-id")) {\r
451                          tenantId = utils.getNodeText1(requestXML, "tenant-id")\r
452                  }\r
453                  String networkType = ""\r
454                  if (utils.nodeExists(requestXML, "network-type")) {\r
455                          networkType = utils.getNodeText1(requestXML, "network-type")\r
456                  }\r
457 \r
458                  // Replace/Use the value of network-type from aai query (vs input) during Delete Network flows.\r
459                  if (queryAAIResponse != null) {\r
460                          networkType = utils.getNodeText1(queryAAIResponse, "network-type")\r
461                  }\r
462 \r
463                  String serviceId = ""\r
464                  if (utils.nodeExists(requestXML, "service-id")) {\r
465                          serviceId = utils.getNodeText1(requestXML, "service-id")\r
466                  }\r
467                  String networkName = ""\r
468                  if (utils.nodeExists(requestXML, "network-name")) {\r
469                          networkName = utils.getNodeText1(requestXML, "network-name")\r
470                  }\r
471                  String source = ""\r
472                  if (utils.nodeExists(requestXML, "source")) {\r
473                          source = utils.getNodeText1(requestXML, "source")\r
474                  }\r
475 \r
476                  // get resourceLink from subflow execution variable\r
477                  String serviceType = ""\r
478                  String subscriberName = ""\r
479                  String siRelatedLink = execution.getVariable("GENGSI_siResourceLink")\r
480                  if (siRelatedLink != null) {\r
481                          // get service type\r
482                          int serviceStart = siRelatedLink.indexOf("service-subscription/")\r
483                          int serviceEnd = siRelatedLink.indexOf("/service-instances/")\r
484                          serviceType = siRelatedLink.substring(serviceStart + 21, serviceEnd)\r
485                          serviceType = UriUtils.decode(serviceType,"UTF-8")\r
486                          // get subscriber name\r
487                          int subscriberNameStart = siRelatedLink.indexOf("customers/customer/")\r
488                          int subscriberNameEnd = siRelatedLink.indexOf("/service-subscriptions/")\r
489                          subscriberName = siRelatedLink.substring(subscriberNameStart + 19, subscriberNameEnd)\r
490                          subscriberName = UriUtils.decode(subscriberName,"UTF-8")\r
491                  }\r
492 \r
493                  String content =\r
494                         """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://openecomp.com/mso/workflow/schema/v1"\r
495                                                   xmlns:sdncadapterworkflow="http://openecomp.com/mso/workflow/schema/v1"\r
496                                                   xmlns:sdncadapter="http://domain2.openecomp.com/workflow/sdnc/adapter/schema/v1"\r
497                                                   xmlns:ns5="http://openecomp.com/mso/request/types/v1">\r
498                                            <sdncadapter:RequestHeader>\r
499                                                   <sdncadapter:RequestId>${requestId}</sdncadapter:RequestId>\r
500                                                   <sdncadapter:SvcInstanceId>${serviceInstanceId}</sdncadapter:SvcInstanceId>\r
501                                                   <sdncadapter:SvcAction>${action}</sdncadapter:SvcAction>\r
502                                                   <sdncadapter:SvcOperation>network-topology-operation</sdncadapter:SvcOperation>\r
503                                                   <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>\r
504                                            </sdncadapter:RequestHeader>\r
505                                            <sdncadapterworkflow:SDNCRequestData>\r
506                                               <request-information>\r
507                                                     <request-id>${requestId}</request-id>\r
508                                                     <request-action>${requestAction}</request-action>\r
509                                                     <source>${source}</source>\r
510                                                     <notification-url></notification-url>\r
511                                                     <order-number></order-number>\r
512                                                     <order-version></order-version>\r
513                                                  </request-information>\r
514                                                  <service-information>\r
515                                                     <service-id>${serviceId}</service-id>\r
516                                                                 <service-type>${serviceType}</service-type>\r
517                                                     <service-instance-id>${serviceInstanceId}</service-instance-id>\r
518                                                     <subscriber-name>${subscriberName}</subscriber-name>\r
519                                                  </service-information>\r
520                                                  <network-request-information>\r
521                                                     <network-id>${networkId}</network-id>\r
522                                                     <network-type>${networkType}</network-type>\r
523                                                     <network-name>${networkName}</network-name>\r
524                                                     <tenant>${tenantId}</tenant>\r
525                                                     <aic-cloud-region>${aicCloudRegion}</aic-cloud-region>\r
526                                                  </network-request-information>\r
527                                            </sdncadapterworkflow:SDNCRequestData>\r
528                                    </aetgt:SDNCAdapterWorkflowRequest>""".trim()\r
529 \r
530                         return content\r
531          }\r
532 \r
533          /**\r
534           * Builds a topology SDNC request and return String request.\r
535           * As V2 will use 1607-style request, region instead of aic clli code\r
536           * @param execution, the execution\r
537           * @param requestXML, the incoming request for the flow\r
538           * @param serviceInstanceId, the serviceIntance (if available)\r
539           * @param callbackUrl, the call back url\r
540           * @param action, the action element value\r
541           * @param requestAction the svcOperation element value\r
542           * @param cloudRegionId the aai's cloud-region-id\r
543           * @param networkId the aai's network-id\r
544           * @param additionalData additional XML content to be inserted into the\r
545           *   RequestData element (may be null)\r
546           */\r
547           public String sdncTopologyRequestRsrc (Execution execution, String requestXML, String serviceInstanceId, String callbackUrl, String action, String requestAction, String cloudRegionId, networkId, String additionalData) {\r
548                   def utils=new MsoUtils()\r
549 \r
550                   // SNDC is expecting request Id for header as unique each call.\r
551                   String hdrRequestId = ""\r
552                   String testHdrRequestId = execution.getVariable("testMessageId")  // for test purposes.\r
553                   if (testHdrRequestId == null) {\r
554                           hdrRequestId = UUID.randomUUID()  // generate unique\r
555                   } else {\r
556                           hdrRequestId = testHdrRequestId\r
557                   }\r
558 \r
559                   String requestId = ""\r
560                   String testRequestId = execution.getVariable("testMessageId")  // for test purposes.\r
561                   if (testRequestId == null) {\r
562                           try {\r
563                                   requestId = execution.getVariable("mso-request-id")\r
564                           } catch (Exception ex) {\r
565                                         requestId = utils.getNodeText1(requestXML, "request-id")\r
566                           }\r
567                   } else {\r
568                                 requestId = testRequestId\r
569                   }\r
570                   \r
571                   String aicCloudRegion = cloudRegionId\r
572                   String tenantId = ""\r
573                   if (utils.nodeExists(requestXML, "tenant-id")) {\r
574                           tenantId = utils.getNodeText1(requestXML, "tenant-id")\r
575                   }\r
576                   String networkType = ""\r
577                   if (utils.nodeExists(requestXML, "network-type")) {\r
578                           networkType = utils.getNodeText1(requestXML, "network-type")\r
579                   }\r
580 \r
581                   String subscriptionServiceType = ""\r
582                   if (utils.nodeExists(requestXML, "subscription-service-type")) {\r
583                           subscriptionServiceType = utils.getNodeText1(requestXML, "subscription-service-type")\r
584                   }\r
585 \r
586                   String globalCustomerId = ""\r
587                   if (utils.nodeExists(requestXML, "global-customer-id")) {\r
588                           globalCustomerId = utils.getNodeText1(requestXML, "global-customer-id")\r
589                   }\r
590 \r
591                   String serviceId = ""\r
592                   if (utils.nodeExists(requestXML, "service-id")) {\r
593                           serviceId = utils.getNodeText1(requestXML, "service-id")\r
594                   }\r
595                   String networkName = ""\r
596                   if (utils.nodeExists(requestXML, "network-name")) {\r
597                           networkName = utils.getNodeText1(requestXML, "network-name")\r
598                   }\r
599                   String source = ""\r
600                   if (utils.nodeExists(requestXML, "source")) {\r
601                           source = utils.getNodeText1(requestXML, "source")\r
602                   }\r
603 \r
604                   // get resourceLink from subflow execution variable\r
605                   String serviceType = ""\r
606                   String subscriberName = ""\r
607                   String siRelatedLink = execution.getVariable("GENGSI_siResourceLink")\r
608                   if (siRelatedLink != null) {\r
609                           // get service type\r
610                           int serviceStart = siRelatedLink.indexOf("service-subscription/")\r
611                           int serviceEnd = siRelatedLink.indexOf("/service-instances/")\r
612                           serviceType = siRelatedLink.substring(serviceStart + 21, serviceEnd)\r
613                           serviceType = UriUtils.decode(serviceType,"UTF-8")\r
614                           // get subscriber name\r
615                           int subscriberNameStart = siRelatedLink.indexOf("customers/customer/")\r
616                           int subscriberNameEnd = siRelatedLink.indexOf("/service-subscriptions/")\r
617                           subscriberName = siRelatedLink.substring(subscriberNameStart + 19, subscriberNameEnd)\r
618                           subscriberName = UriUtils.decode(subscriberName,"UTF-8")\r
619                   }\r
620 \r
621                   // network-information from 'networkModelInfo' // verify the DB Catalog response\r
622                   String networkModelInfo = utils.getNodeXml(requestXML, "networkModelInfo", false).replace("tag0:","").replace(":tag0","")\r
623                   String modelInvariantUuid = utils.getNodeText1(networkModelInfo, "modelInvariantUuid") !=null ?\r
624                                                                           utils.getNodeText1(networkModelInfo, "modelInvariantUuid") : ""\r
625                   String modelCustomizationUuid = utils.getNodeText1(networkModelInfo, "modelCustomizationUuid")  !=null ?\r
626                                                                                   utils.getNodeText1(networkModelInfo, "modelCustomizationUuid")  : ""\r
627                   String modelUuid = utils.getNodeText1(networkModelInfo, "modelUuid") !=null ?\r
628                                                          utils.getNodeText1(networkModelInfo, "modelUuid") : ""\r
629                   String modelVersion = utils.getNodeText1(networkModelInfo, "modelVersion") !=null ?\r
630                                                                   utils.getNodeText1(networkModelInfo, "modelVersion") : ""\r
631                   String modelName = utils.getNodeText1(networkModelInfo, "modelName") !=null ?\r
632                                                          utils.getNodeText1(networkModelInfo, "modelName") : ""\r
633 \r
634                  // service-information from 'networkModelInfo' // verify the DB Catalog response\r
635                  String serviceModelInfo = utils.getNodeXml(requestXML, "serviceModelInfo", false).replace("tag0:","").replace(":tag0","")\r
636                  String serviceModelInvariantUuid = utils.getNodeText1(serviceModelInfo, "modelInvariantUuid")  !=null ?\r
637                                                                                         utils.getNodeText1(serviceModelInfo, "modelInvariantUuid")  : ""\r
638                  String serviceModelUuid = utils.getNodeText1(serviceModelInfo, "modelUuid") !=null ?\r
639                                                                    utils.getNodeText1(serviceModelInfo, "modelUuid") : ""\r
640                  String serviceModelVersion = utils.getNodeText1(serviceModelInfo, "modelVersion") !=null ?\r
641                                                                           utils.getNodeText1(serviceModelInfo, "modelVersion") : ""\r
642                  String serviceModelName = utils.getNodeText1(serviceModelInfo, "modelName") !=null ?\r
643                                                                    utils.getNodeText1(serviceModelInfo, "modelName") : ""\r
644 \r
645 \r
646                   String content =\r
647                   """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://openecomp.com/mso/workflow/schema/v1"\r
648                                                                     xmlns:sdncadapter="http://domain2.openecomp.com/workflow/sdnc/adapter/schema/v1" \r
649                                                     xmlns:sdncadapterworkflow="http://openecomp.com/mso/workflow/schema/v1">\r
650                                            <sdncadapter:RequestHeader>\r
651                                                   <sdncadapter:RequestId>${hdrRequestId}</sdncadapter:RequestId>\r
652                                                   <sdncadapter:SvcInstanceId>${serviceInstanceId}</sdncadapter:SvcInstanceId>\r
653                                                   <sdncadapter:SvcAction>${action}</sdncadapter:SvcAction>\r
654                                                   <sdncadapter:SvcOperation>network-topology-operation</sdncadapter:SvcOperation>\r
655                                                   <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>\r
656                           <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>\r
657                                            </sdncadapter:RequestHeader>\r
658                                            <sdncadapterworkflow:SDNCRequestData>\r
659                                                    <request-information>\r
660                                                       <request-id>${requestId}</request-id>\r
661                                                       <request-action>${requestAction}</request-action>\r
662                                                       <source>${source}</source>\r
663                                                       <notification-url></notification-url>\r
664                                                       <order-number></order-number>\r
665                                                       <order-version></order-version>\r
666                                                    </request-information>\r
667                                                    <service-information>\r
668                                                       <service-id>${serviceId}</service-id>\r
669                                                       <subscription-service-type>${subscriptionServiceType}</subscription-service-type>\r
670                                                           <ecomp-model-information>\r
671                                                                    <model-invariant-uuid>${serviceModelInvariantUuid}</model-invariant-uuid>\r
672                                                                    <model-uuid>${serviceModelUuid}</model-uuid>\r
673                                                                    <model-version>${serviceModelVersion}</model-version>\r
674                                                                    <model-name>${serviceModelName}</model-name>\r
675                               </ecomp-model-information>\r
676                                                       <service-instance-id>${serviceInstanceId}</service-instance-id>\r
677                                                       <global-customer-id>${globalCustomerId}</global-customer-id>\r
678                                                       <subscriber-name>${subscriberName}</subscriber-name>\r
679                                                    </service-information>\r
680                                                    <network-information>\r
681                                                       <network-id>${networkId}</network-id>\r
682                                                       <network-type>${networkType}</network-type>\r
683                                                           <ecomp-model-information>\r
684                                                                    <model-invariant-uuid>${modelInvariantUuid}</model-invariant-uuid>\r
685                                                                    <model-customization-uuid>${modelCustomizationUuid}</model-customization-uuid>\r
686                                                                    <model-uuid>${modelUuid}</model-uuid>\r
687                                                                    <model-version>${modelVersion}</model-version>\r
688                                                                    <model-name>${modelName}</model-name>\r
689                                                           </ecomp-model-information>\r
690                                                    </network-information>\r
691                                                    <network-request-input>\r
692                                                      <network-name>${networkName}</network-name>\r
693                                                  <tenant>${tenantId}</tenant>\r
694                                                      <aic-cloud-region>${aicCloudRegion}</aic-cloud-region>\r
695                                                      <aic-clli></aic-clli>\r
696                                                      <network-input-parameters/>\r
697                                                    </network-request-input>\r
698                                       </sdncadapterworkflow:SDNCRequestData>\r
699                    </aetgt:SDNCAdapterWorkflowRequest>""".trim()\r
700 \r
701                          return content\r
702           }\r
703 \r
704                         /**\r
705                          * Validates a workflow response.\r
706                          * @param execution the execution\r
707                          * @param responseVar the execution variable in which the response is stored\r
708                          * @param workflowException the WorkflowException Object returned from sdnc call\r
709                          */\r
710         public void validateSDNCResponse(Execution execution, String response, WorkflowException workflowException, boolean successIndicator){\r
711                 def isDebugLogEnabled = execution.getVariable('isDebugLogEnabled')\r
712                 taskProcessor.utils.log("DEBUG", "SDNC Response is: " + response, isDebugLogEnabled)\r
713                 taskProcessor.utils.log("DEBUG", "SuccessIndicator is: " + successIndicator, isDebugLogEnabled)\r
714 \r
715                 try {\r
716                         def prefix = execution.getVariable('prefix')\r
717                         execution.setVariable(prefix+'sdncResponseSuccess', false)\r
718                         taskProcessor.utils.log("DEBUG", "Response" + ' = ' + (response == null ? "" : System.lineSeparator()) + response, isDebugLogEnabled)\r
719 \r
720                         if (successIndicator == true){\r
721                                 if (response == null || response.trim().equals("")) {\r
722                                         taskProcessor.utils.log("DEBUG", response + ' is empty');\r
723                                         exceptionUtil.buildAndThrowWorkflowException(execution, 500, "SDNCAdapter Workflow Response is Empty")\r
724                                 }else{\r
725 \r
726                                         // we need to peer into the request data for error\r
727                                         def String sdncAdapterWorkflowResponse = taskProcessor.utils.getNodeXml(response, 'response-data', false)\r
728                                         def String decodedXml = decodeXML(sdncAdapterWorkflowResponse).replace('<?xml version="1.0" encoding="UTF-8"?>', "")\r
729 \r
730                                         // change '&' to "&amp; (if present as data, ex: subscriber-name = 'FOUR SEASONS HEATING & COOLING_8310006378683'\r
731                                         decodedXml = decodedXml.replace("&", "&amp;")\r
732 \r
733                                         taskProcessor.utils.log("DEBUG","decodedXml:\n" + decodedXml, isDebugLogEnabled)\r
734 \r
735                                         int requestDataResponseCode = 200\r
736                                         def String requestDataResponseMessage = ''\r
737 \r
738                                         try{\r
739                                                 if (taskProcessor.utils.nodeExists(decodedXml, "response-message")) {\r
740                                                         requestDataResponseMessage = taskProcessor.utils.getNodeText(decodedXml, "response-message")\r
741                                                 } else if (taskProcessor.utils.nodeExists(decodedXml, "ResponseMessage")) {\r
742                                                         requestDataResponseMessage = taskProcessor.utils.getNodeText(decodedXml, "ResponseMessage")\r
743                                                 }\r
744                                         }catch(Exception e){\r
745                                                 taskProcessor.utils.log("DEBUG", 'Error caught while decoding resposne ' + e.getMessage(), isDebugLogEnabled)\r
746                                         }\r
747 \r
748                                         if(taskProcessor.utils.nodeExists(decodedXml, "response-code")) {\r
749                                                 taskProcessor.utils.log("DEBUG","response-code node Exist ", isDebugLogEnabled)\r
750                                                 String code = taskProcessor.utils.getNodeText1(decodedXml, "response-code")\r
751                                                 if(code.isEmpty() || code.equals("")){\r
752                                                         // if response-code is blank then Success\r
753                                                         taskProcessor.utils.log("DEBUG","response-code node is empty", isDebugLogEnabled)\r
754                                                         requestDataResponseCode = 0\r
755                                                 }else{\r
756                                                         requestDataResponseCode  = code.toInteger()\r
757                                                         taskProcessor.utils.log("DEBUG","response-code is: " + requestDataResponseCode, isDebugLogEnabled)\r
758                                                 }\r
759                                         }else if(taskProcessor.utils.nodeExists(decodedXml, "ResponseCode")){\r
760                                                 taskProcessor.utils.log("DEBUG","ResponseCode node Exist ", isDebugLogEnabled)\r
761                                                 String code = taskProcessor.utils.getNodeText1(decodedXml, "ResponseCode")\r
762                                                 if(code.isEmpty() || code.equals("")){\r
763                                                         // if ResponseCode blank then Success\r
764                                                         taskProcessor.utils.log("DEBUG","ResponseCode node is empty", isDebugLogEnabled)\r
765                                                         requestDataResponseCode = 0\r
766                                                 }else{\r
767                                                         requestDataResponseCode  = code.toInteger()\r
768                                                         taskProcessor.utils.log("DEBUG","ResponseCode is: " + requestDataResponseCode, isDebugLogEnabled)\r
769                                                 }\r
770                                         }else{\r
771                                                 taskProcessor.utils.log("DEBUG","A Response Code DOES NOT Exist.", isDebugLogEnabled)\r
772                                                 // if a response code does not exist then Success\r
773                                                 requestDataResponseCode = 0\r
774                                         }\r
775                                         try{\r
776 \r
777                                                 // if a response code is 0 or 200 then Success\r
778                                                 if (requestDataResponseCode == 200 || requestDataResponseCode == 0) {\r
779                                                         execution.setVariable(prefix+'sdncResponseSuccess', true)\r
780                                                         taskProcessor.utils.log("DEBUG", "Setting sdncResponseSuccess to True ", isDebugLogEnabled)\r
781                                                         taskProcessor.utils.log("DEBUG", "Exited ValidateSDNCResponse Method", isDebugLogEnabled)\r
782                                                 }else{\r
783                                                         ExceptionUtil exceptionUtil = new ExceptionUtil()\r
784                                                         String convertedCode = exceptionUtil.MapSDNCResponseCodeToErrorCode(requestDataResponseCode.toString())\r
785                                                         int convertedCodeInt = Integer.parseInt(convertedCode)\r
786                                                         exceptionUtil.buildAndThrowWorkflowException(execution, convertedCodeInt, "Received error from SDN-C: " + requestDataResponseMessage)\r
787                                                 }\r
788 \r
789                                         }catch(Exception e){\r
790                                                 //TODO proper handling of new, non numerical response codes in 1607 and new error handling for common API\r
791                                                 requestDataResponseCode = 500\r
792                                         }\r
793 \r
794                                         taskProcessor.utils.log("DEBUG", "SDNC callback response-code: " + requestDataResponseCode, isDebugLogEnabled)\r
795                                         taskProcessor.utils.log("DEBUG", "SDNC callback response-message: " + requestDataResponseMessage, isDebugLogEnabled)\r
796                                 }\r
797 \r
798                         }else {\r
799                                 taskProcessor.utils.log("DEBUG", 'SDNCAdapter Subflow did NOT complete Successfully.  SuccessIndicator is False. ')\r
800                                 if(workflowException != null){\r
801                                         exceptionUtil.buildAndThrowWorkflowException(execution, workflowException.getErrorCode(), workflowException.getErrorMessage())\r
802                                 }else{\r
803                                         //TODO : what error code and error message use here\r
804                                         exceptionUtil.buildAndThrowWorkflowException(execution, 500, "Internal Error - SDNCAdapter Subflow did NOT complete successfully.")\r
805                                 }\r
806                         }\r
807 \r
808                 } catch (BpmnError e) {\r
809                         throw e;\r
810                 } catch (Exception e) {\r
811                         taskProcessor.utils.log("DEBUG", 'END of Validate SDNC Response', isDebugLogEnabled)\r
812                         exceptionUtil.buildAndThrowWorkflowException(execution, 500, 'Internal Error- Unable to validate SDNC Response ');\r
813                 }\r
814         }\r
815 \r
816         /**\r
817                          * Validates a workflow response.\r
818                          * @param execution the execution\r
819                          * @param responseVar the execution variable in which the response is stored\r
820                          * @param responseCodeVar the execution variable in which the response code is stored\r
821                          * @param errorResponseVar the execution variable in which the error response is stored\r
822                          */\r
823                         public void validateL3BondingSDNCResp(Execution execution, String response, WorkflowException workflowException, boolean success) {\r
824                                 def method = getClass().getSimpleName() + '.validateL3BondingSDNCResp(' +\r
825                                         'execution=' + execution.getId() +\r
826                                         ', response=' + response +\r
827                                         ')'\r
828                                 def isDebugLogEnabled = execution.getVariable('isDebugLogEnabled')\r
829                                 taskProcessor.logDebug('Entered ' + method, isDebugLogEnabled)\r
830                                 def prefix = execution.getVariable('prefix')\r
831                                 TrinityExceptionUtil trinityExceptionUtil = new TrinityExceptionUtil()\r
832 \r
833                                 try {\r
834                                         execution.setVariable(prefix+'sdncResponseSuccess', false)\r
835 \r
836                                         taskProcessor.utils.log("sdncAdapter Success Indicator is: " + success, isDebugLogEnabled)\r
837                                         if (success == true) {\r
838 \r
839                                                 // we need to look inside the request data for error\r
840                                                 def String callbackRequestData = taskProcessor.utils.getNodeXml(response, 'RequestData', false)\r
841                                                 def String decodedXml = decodeXML(callbackRequestData)\r
842                                                 taskProcessor.utils.log("DEBUG","decodedXml:\n" + decodedXml, isDebugLogEnabled)\r
843 \r
844                                                 def requestDataResponseCode = '200'\r
845                                                 def requestDataResponseMessage = ''\r
846                                                 int intDataResponseCode = 200\r
847 \r
848                                                 if (taskProcessor.utils.nodeExists(decodedXml, "response-code")) {\r
849 \r
850                                                         requestDataResponseCode  = ((String) taskProcessor.utils.getNodeText(decodedXml, "response-code"))\r
851                                                         if (taskProcessor.utils.nodeExists(decodedXml, "response-message")) {\r
852                                                                 requestDataResponseMessage  = taskProcessor.utils.getNodeText(decodedXml, "response-message")\r
853                                                         }\r
854                                                 }else if(taskProcessor.utils.nodeExists(decodedXml, "ResponseCode")){\r
855                                                         requestDataResponseCode  = ((String) taskProcessor.utils.getNodeText1(decodedXml, "ResponseCode")).toInteger()\r
856                                                 }else if(taskProcessor.utils.nodeExists(response, "ResponseCode")){\r
857                                                         requestDataResponseCode  = ((String) taskProcessor.utils.getNodeText1(response, "ResponseCode")).toInteger()\r
858                                                         requestDataResponseMessage  = taskProcessor.utils.getNodeText(response, "ResponseMessage")\r
859                                                 }\r
860 \r
861                                                 taskProcessor.utils.log("DEBUG", "SDNC callback response-code: " + requestDataResponseCode, isDebugLogEnabled)\r
862                                                 taskProcessor.utils.log("DEBUG", "SDNC callback response-message: " + requestDataResponseMessage, isDebugLogEnabled)\r
863 \r
864                                                 // Get the AAI Status to determine if rollback is needed on ASSIGN\r
865                                                 def aai_status = ''\r
866                                                 if (taskProcessor.utils.nodeExists(decodedXml, "aai-status")) {\r
867                                                         aai_status = ((String) taskProcessor.utils.getNodeText(decodedXml, "aai-status"))\r
868                                                         taskProcessor.utils.log("DEBUG", "SDNC sent AAI STATUS code: " + aai_status, isDebugLogEnabled)\r
869                                                 }\r
870                                                 if (aai_status != null && !aai_status.equals("")) {\r
871                                                         execution.setVariable(prefix+"AaiStatus",aai_status)\r
872                                                         taskProcessor.utils.log("DEBUG", "Set variable " + prefix + "AaiStatus: " + execution.getVariable(prefix+"AaiStatus"), isDebugLogEnabled)\r
873                                                 }\r
874 \r
875                                                 // Get the result string to determine if rollback is needed on ASSIGN in Add Bonding flow only\r
876                                                 def sdncResult = ''\r
877                                                 if (taskProcessor.utils.nodeExists(decodedXml, "result")) {\r
878                                                         sdncResult = ((String) taskProcessor.utils.getNodeText(decodedXml, "result"))\r
879                                                         taskProcessor.utils.log("DEBUG", "SDNC sent result: " + sdncResult, isDebugLogEnabled)\r
880                                                 }\r
881                                                 if (sdncResult != null && !sdncResult.equals("")) {\r
882                                                         execution.setVariable(prefix+"SdncResult",sdncResult)\r
883                                                         taskProcessor.utils.log("DEBUG", "Set variable " + prefix + "SdncResult: " + execution.getVariable(prefix+"SdncResult"), isDebugLogEnabled)\r
884                                                 }\r
885 \r
886                                                 try{\r
887                                                         intDataResponseCode = Integer.parseInt(String.valueOf(requestDataResponseCode))\r
888                                                 }catch(Exception e){\r
889                                                         intDataResponseCode = 400\r
890                                                 }\r
891 \r
892                                                 taskProcessor.utils.log("DEBUG", "intDataResponseCode " + intDataResponseCode , isDebugLogEnabled)\r
893 \r
894                                                 // if response-code is not Success (200, 201, etc) we need to throw an exception\r
895                                                 if (intDataResponseCode != 200 &&  intDataResponseCode != 0) {\r
896                                                         execution.setVariable(prefix+'ResponseCode', intDataResponseCode)\r
897                                                         execution.setVariable("L3HLAB_rollback", true)\r
898                                                         def msg = trinityExceptionUtil.mapSDNCAdapterExceptionToErrorResponse(response, execution)\r
899                                                         exceptionUtil.buildAndThrowWorkflowException(execution, intDataResponseCode, "Received error from SDN-C: " + msg)\r
900 \r
901                                                 }\r
902                                         }else {\r
903                                                 taskProcessor.logWarn('sdncAdapter did not complete successfully, sdncAdapter Success Indicator was false ')\r
904                                                 execution.setVariable("L3HLAB_rollback", true)\r
905                                                 def msg = trinityExceptionUtil.mapSDNCAdapterExceptionToErrorResponse(response, execution)\r
906                                                 exceptionUtil.buildAndThrowWorkflowException(execution, responseCode, msg)\r
907                                         }\r
908 \r
909                                         if (response == null || response.trim().equals("")) {\r
910                                                 taskProcessor.logWarn('sdncAdapter workflow response is empty');\r
911                                                 execution.setVariable("L3HLAB_rollback", true)\r
912                                                 def msg = trinityExceptionUtil.buildException("Exception occurred while validating SDNC response " , execution)\r
913                                                 exceptionUtil.buildAndThrowWorkflowException(execution, intResponseCode, msg)\r
914                                         }\r
915 \r
916                                         execution.setVariable(prefix+'sdncResponseSuccess', true)\r
917                                         taskProcessor.logDebug('Exited ' + method, isDebugLogEnabled)\r
918                                 } catch (BpmnError e) {\r
919                                         throw e;\r
920                                 } catch (Exception e) {\r
921                                         taskProcessor.logError('Caught exception in ' + method, e)\r
922                                         execution.setVariable(prefix+"ResponseCode",400)\r
923                                         execution.setVariable("L3HLAB_rollback", true)\r
924                                         def msg = trinityExceptionUtil.buildException("Exception occurred while validating SDNC response: " + e.getMessage(), execution)\r
925                                         exceptionUtil.buildAndThrowWorkflowException(execution, 400, msg)\r
926                                 }\r
927                         }\r
928                         \r
929         public String modelInfoToEcompModelInformation(String jsonModelInfo) {\r
930                 String modelInvariantId = jsonUtil.getJsonValue(jsonModelInfo, "modelInvariantId")\r
931                 String modelVersionId = jsonUtil.getJsonValue(jsonModelInfo, "modelVersionId")\r
932                 if (modelVersionId == null) {\r
933                         modelVersionId = ""\r
934                 }\r
935                 String modelCustomizationUuid = jsonUtil.getJsonValue(jsonModelInfo, "modelCustomizationUuid")\r
936                 String modelCustomizationString = ""\r
937                 if (modelCustomizationUuid != null) {\r
938                         modelCustomizationString = "<model-customization-uuid>${modelCustomizationUuid}</model-customization-uuid>"\r
939                 }\r
940                 String modelVersion = jsonUtil.getJsonValue(jsonModelInfo, "modelVersion")\r
941                 String modelName = jsonUtil.getJsonValue(jsonModelInfo, "modelName")\r
942                 String ecompModelInformation =\r
943                                 """<ecomp-model-information>\r
944                                                 <model-invariant-uuid>${modelInvariantId}</model-invariant-uuid>\r
945                                                 <model-uuid>${modelVersionId}</model-uuid>\r
946                                                 ${modelCustomizationString}\r
947                                                 <model-version>${modelVersion}</model-version>\r
948                                                 <model-name>${modelName}</model-name>\r
949                                 </ecomp-model-information>"""\r
950 \r
951                 return ecompModelInformation\r
952         }\r
953 \r
954         /**\r
955          * Decode XML - replace &amp; &lt; and &gt; with '&', '<' and '>'\r
956          * @param xml - the xml to be decoded\r
957          */\r
958         private String decodeXML(String xml) {\r
959                 def String decodedXml = xml.replaceAll("&amp;", "&")\r
960                 decodedXml = decodedXml.replaceAll("&lt;", "<")\r
961                 decodedXml = decodedXml.replaceAll("&gt;", ">")\r
962         }\r
963         \r
964         \r
965 \r
966 }