Merge "fixed aai response code in updateAAIVfModule"
[so.git] / bpmn / MSOCommonBPMN / src / main / groovy / org / onap / so / bpmn / common / scripts / SDNCAdapter.groovy
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.onap.so.bpmn.common.scripts;
22 import org.onap.so.bpmn.core.UrnPropertiesReader;
23
24 import java.text.SimpleDateFormat
25
26 import org.camunda.bpm.engine.delegate.DelegateExecution
27 import org.onap.so.bpmn.core.WorkflowException
28 import org.onap.so.logger.MessageEnum
29 import org.onap.so.logger.MsoLogger
30
31 import static org.apache.commons.lang3.StringUtils.*
32
33
34 // SDNC Adapter Request/Response processing
35 public class SDNCAdapter extends AbstractServiceTaskProcessor {
36         private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, SDNCAdapter.class);
37
38
39         def Prefix="SDNCA_"
40         ExceptionUtil exceptionUtil = new ExceptionUtil()
41
42         // Script Task: Process SDNC Workflow Request
43         // Params:      Workflow DelegateExecution
44         // Assume:      Received SDNCAdapterWorkflowRequest is in variable 'sdncAdapterWorkflowRequest'
45         //                      Put created SDNCAdapterRequest in variable 'sdncAdapterRequest'
46         public void preProcessRequest (DelegateExecution execution) {
47                 try{
48
49                         msoLogger.trace("Begin PreProcess SDNCAdapterRequestScript  ")
50                         msoLogger.debug("Incoming sdncAdapterWorkflowRequest:\n" + execution.getVariable("sdncAdapterWorkflowRequest"))
51
52                         // Initialize some variables used throughout the flow
53                         execution.setVariable("prefix", Prefix)
54                         execution.setVariable("sdncAdapterResponse", "")
55                         execution.setVariable("asynchronousResponseTimeout", false)
56                         execution.setVariable("continueListening", false)
57                         execution.setVariable("SDNCA_SuccessIndicator", false)
58                         execution.setVariable("SDNCA_InterimNotify", false)
59
60                         String requestId = execution.getVariable("mso-request-id")
61                         if(isBlank(requestId)){
62                                 exceptionUtil.buildAndThrowWorkflowException(execution, 400, 'mso-request-id not provided by calling flow')
63                         }
64
65                         // Authorization Info
66                         String basicAuthValue = UrnPropertiesReader.getVariable("mso.adapters.po.auth", execution)
67
68                         try {
69                                 def encodedString = utils.getBasicAuth(basicAuthValue, UrnPropertiesReader.getVariable("mso.msoKey", execution))
70                                 execution.setVariable("BasicAuthHeaderValue",encodedString)
71                         } catch (IOException ex) {
72                                 msoLogger.error(MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, "Unable to encode username password string", "BPMN", MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, "");
73                         }
74
75                         // TODO Use variables instead of passing xml request - Huh?
76
77                         // Get original RequestHeader
78                         def sdncwfreq= execution.getVariable("sdncAdapterWorkflowRequest")
79                         def requestHeader = utils.getNodeXml(sdncwfreq, "RequestHeader")
80                         requestHeader = requestHeader.replace("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n", "")
81
82                         // Set Callback URL to use from URN Mapping or jBoss Property
83                         def origCallbackUrl = utils.getNodeText(requestHeader, "CallbackUrl")
84                         def callbackUrlToUse = UrnPropertiesReader.getVariable("mso.workflow.sdncadapter.callback", execution)
85                         MsoUtils msoUtil = new MsoUtils()
86                         def useQualifiedHostName = UrnPropertiesReader.getVariable("mso.use.qualified.host", execution)
87                         if((useQualifiedHostName!=null) && (useQualifiedHostName.equals("true"))){
88                                 callbackUrlToUse = msoUtil.getQualifiedHostNameForCallback(callbackUrlToUse)
89                         }
90                         msoLogger.debug("Callback URL to use:\n" + callbackUrlToUse)
91                         requestHeader = requestHeader.replace(origCallbackUrl, callbackUrlToUse)
92
93                         // Get parameters from request header
94                         def sdnca_svcInstanceId = utils.getNodeText(requestHeader, "SvcInstanceId") // optional
95                         msoLogger.debug("SvcInstanceId: " + sdnca_svcInstanceId)
96                         def sdnca_msoAction = utils.getNodeText(requestHeader, "MsoAction") // optional
97                         msoLogger.debug("MsoAction: " + sdnca_msoAction)
98                         def sdnca_svcAction = utils.getNodeText(requestHeader, "SvcAction")
99                         msoLogger.debug("SvcAction: " + sdnca_svcAction)
100                         def sdnca_svcOperation = utils.getNodeText(requestHeader, "SvcOperation")
101                         msoLogger.debug("SvcOperation: " + sdnca_svcOperation)
102                         def sdncRequestData = utils.getChildNodes(sdncwfreq, "SDNCRequestData")
103                         sdncRequestData = sdncRequestData.replace("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n", "")
104                         sdncRequestData = sdncRequestData.replaceAll('tag0:', '').replaceAll(':tag0', '')
105                         msoLogger.debug("SDNCRequestData:\n" + sdncRequestData)
106                         def sdnca_serviceType = ""
107                         if (utils.nodeExists(sdncwfreq, "service-type")) {
108                                 sdnca_serviceType = utils.getNodeText(sdncwfreq, "service-type")
109                         }
110                         msoLogger.debug("service-type: " + sdnca_serviceType)
111                         def serviceConfigActivate = false
112                         def source = ''
113                         if ((sdnca_svcAction == 'activate') && (sdnca_svcOperation == 'service-configuration-operation') && (sdnca_serviceType == 'uCPE-VMS')) {
114                                 serviceConfigActivate = true
115                                 if (utils.nodeExists(sdncwfreq, 'source')) {
116                                         source = utils.getNodeText(sdncwfreq, 'source')
117                                 }
118                         }
119                         execution.setVariable("serviceConfigActivate", serviceConfigActivate)
120                         msoLogger.debug("serviceConfigActivate: " + serviceConfigActivate)
121                         execution.setVariable("source", source)
122                         msoLogger.debug("source: " + source)
123
124                         //calling process should pass a generated uuid if sending multiple sdnc requests
125                         def sdncRequestId = utils.getNodeText(requestHeader, "RequestId")
126                         execution.setVariable(Prefix + "requestId", sdncRequestId)
127
128                         // Prepare SDNC Request to the SDNC Adapter
129                         String sdncAdapterRequest = """
130                         <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
131                         <SOAP-ENV:Body>
132                         <aetgt:SDNCAdapterRequest xmlns:aetgt="http://org.onap/workflow/sdnc/adapter/schema/v1" xmlns:sdncadaptersc="http://org.onap/workflow/sdnc/adapter/schema/v1">
133                         <sdncadapter:RequestHeader xmlns:sdncadapter="http://org.onap/workflow/sdnc/adapter/schema/v1">
134                         <sdncadapter:RequestId>${MsoUtils.xmlEscape(sdncRequestId)}</sdncadapter:RequestId>"""
135
136                         if (sdnca_svcInstanceId != null) {
137                                 sdncAdapterRequest += """
138                         <sdncadapter:SvcInstanceId>${MsoUtils.xmlEscape(sdnca_svcInstanceId)}</sdncadapter:SvcInstanceId>"""
139                                 execution.setVariable("serviceInstanceId", sdnca_svcInstanceId)
140                         }
141
142                         sdncAdapterRequest += """
143                         <sdncadapter:SvcAction>${MsoUtils.xmlEscape(sdnca_svcAction)}</sdncadapter:SvcAction>
144                         <sdncadapter:SvcOperation>${MsoUtils.xmlEscape(sdnca_svcOperation)}</sdncadapter:SvcOperation>
145                         <sdncadapter:CallbackUrl>${MsoUtils.xmlEscape(callbackUrlToUse)}</sdncadapter:CallbackUrl>"""
146
147                         if (sdnca_msoAction != null) {
148                                 sdncAdapterRequest += """
149                         <sdncadapter:MsoAction>${MsoUtils.xmlEscape(sdnca_msoAction)}</sdncadapter:MsoAction>"""
150                         }
151
152                         sdncAdapterRequest += """
153                         </sdncadapter:RequestHeader>
154                         <sdncadaptersc:RequestData>
155                                 ${sdncRequestData}
156                         </sdncadaptersc:RequestData></aetgt:SDNCAdapterRequest></SOAP-ENV:Body></SOAP-ENV:Envelope>"""
157
158                         msoLogger.debug("Outgoing SDNCAdapterRequest:\n" + sdncAdapterRequest)
159                         execution.setVariable("sdncAdapterRequest", sdncAdapterRequest)
160
161                         msoLogger.debug(UrnPropertiesReader.getVariable("mso.adapters.sdnc.endpoint", execution))
162                 }catch(Exception e){
163                         msoLogger.debug('Internal Error occured during PreProcess Method: ', e)
164                         exceptionUtil.buildAndThrowWorkflowException(execution, 9999, 'Internal Error occured during PreProcess Method') // TODO: what message and error code?
165                 }
166                 msoLogger.trace("End pre Process SDNCRequestScript ")
167         }
168
169         public void postProcessResponse (DelegateExecution execution) {
170
171                 try{
172                         msoLogger.trace("Begin POSTProcess SDNCAdapter ")
173                         msoLogger.trace("Incoming sdncAdapterCallbackRequest:\n" + execution.getVariable("sdncAdapterCallbackRequest"))
174
175                         // Check the sdnccallback request and get the responsecode
176                         def sdnccallbackreq = execution.getVariable("sdncAdapterCallbackRequest")
177                         def callbackRequestData = ""
178                         def callbackHeader = ""
179
180                         if(sdnccallbackreq != null){
181                                 callbackHeader = utils.getNodeXml(sdnccallbackreq, "CallbackHeader")
182                                 callbackRequestData = utils.getNodeXml(sdnccallbackreq, "RequestData")
183
184                                 callbackHeader = callbackHeader.replace("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n", "")
185
186                                 callbackRequestData = callbackRequestData.replace("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n", "")
187
188                                 msoLogger.trace("EnhancedCallbackRequestData:\n" + callbackRequestData)
189                                 execution.setVariable("enhancedCallbackRequestData", callbackRequestData)
190
191                                 String sdncAdapterWorkflowResponse ="""
192                                                 <sdncadapterworkflow:SDNCAdapterWorkflowResponse xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
193                                                 <sdncadapterworkflow:response-data>
194                                                 ${callbackHeader}
195                                                 ${callbackRequestData}
196                                                 </sdncadapterworkflow:response-data>
197                                                 </sdncadapterworkflow:SDNCAdapterWorkflowResponse>"""
198
199
200                                 sdncAdapterWorkflowResponse = utils.formatXml(sdncAdapterWorkflowResponse)
201                                 execution.setVariable("sdncAdapterResponse", sdncAdapterWorkflowResponse)
202                                 // TODO: Should deprecate use of processKey+Response variable for the response. Will use "WorkflowResponse" instead
203                                 execution.setVariable("WorkflowResponse", sdncAdapterWorkflowResponse)
204
205                                 // Check final indicator to determine if we are to continue listening or not
206                                 def continueListening = false
207                                 if (utils.nodeExists(callbackRequestData, "ack-final-indicator")) {
208                                         if (utils.getNodeText(callbackRequestData, "ack-final-indicator") == 'N') {
209                                                 continueListening = true
210                                         }
211                                 }
212                                 execution.setVariable("continueListening", continueListening)
213                                 msoLogger.debug("Continue Listening: " + continueListening)
214                                 execution.setVariable("asynchronousResponseTimeout", false)
215                         }else{
216                                 // Timed out waiting for asynchronous message, build error response
217                                 exceptionUtil.buildWorkflowException(execution, 500, "SDNC Callback Timeout Error")
218                                 execution.setVariable("asynchronousResponseTimeout", true)
219                                 msoLogger.debug("Timed out waiting for asynchronous message")
220                         }
221                 }catch(Exception e){
222                         msoLogger.debug('Internal Error occured during PostProcess Method: ' + e)
223                         exceptionUtil.buildAndThrowWorkflowException(execution, 9999, 'Internal Error occured during PostProcess Method') // TODO: what message and error code?
224                 }
225                 msoLogger.trace("End POSTProcess SDNCAdapter ")
226         }
227
228         public void callbackResponsecheck(DelegateExecution execution){
229
230                 def sdnccallbackreq=execution.getVariable("sdncAdapterCallbackRequest")
231                 msoLogger.debug("sdncAdapterCallbackRequest :" + sdnccallbackreq)
232                 if (sdnccallbackreq==null){
233                         execution.setVariable("callbackResponseReceived",false);
234                 }else{
235                         execution.setVariable("callbackResponseReceived",true);
236                 }
237         }
238
239         public void resetCallbackRequest(DelegateExecution execution) {
240
241                 msoLogger.trace("Begin Reset Callback Info SDNCAdapter ")
242
243                 // Clear sdncAdapterCallbackRequest variable
244                 execution.removeVariable("sdncAdapterCallbackRequest")
245
246                 // Determine and set SDNC Timeout Value
247                 def enhancedCallbackRequestData = execution.getVariable("enhancedCallbackRequestData")
248                 msoLogger.debug("sdncAdapter - enhancedCallbackRequestData :" + enhancedCallbackRequestData)
249                 def interim = false
250                 if (enhancedCallbackRequestData != null) {
251                         if (utils.nodeExists(enhancedCallbackRequestData, "ack-final-indicator")) {
252                                 if (utils.getNodeText(enhancedCallbackRequestData, "ack-final-indicator") == 'N') {
253                                         interim = true
254                                 }
255                         }
256                 }
257                 def timeoutValue = UrnPropertiesReader.getVariable("mso.adapters.sdnc.timeout", execution)
258                 if(timeoutValue==null)
259                         timeoutValue="PT5M"
260                 def sdncAdapterWorkflowRequest = execution.getVariable("sdncAdapterWorkflowRequest")
261                 if (interim && utils.nodeExists(sdncAdapterWorkflowRequest, "InterimSDNCTimeOutValueInHours")) {
262                         timeoutValue = "PT" + utils.getNodeText(sdncAdapterWorkflowRequest, "InterimSDNCTimeOutValueInHours") + "H"
263                 } else if (utils.nodeExists(sdncAdapterWorkflowRequest, "SDNCTimeOutValueInMinutes")) {
264                         timeoutValue = "PT" + utils.getNodeText(sdncAdapterWorkflowRequest, "SDNCTimeOutValueInMinutes") + "M"
265                 }
266                 execution.setVariable("sdncTimeoutValue", timeoutValue)
267                 msoLogger.debug("Setting SDNC Timeout Value to " + timeoutValue)
268
269                 msoLogger.trace("End Reset Callback Info SDNCAdapter ")
270         }
271
272
273         public void prepareDBMessage(DelegateExecution execution) {
274
275                 msoLogger.trace("Begin Prepare DB Message SDNCAdapter ")
276
277                 // Create DB Message
278                 def dbRequestId = execution.getVariable("mso-request-id")
279                 String dbUpdateInterimStageCompletion = """
280                         <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
281                                 <SOAP-ENV:Body>
282                                         <DBAdapter:updateInterimStageCompletion xmlns:DBAdapter="http://org.onap.so/requestsdb">
283                                                 <requestId>${MsoUtils.xmlEscape(dbRequestId)}</requestId>
284                                                 <interimStageCompletion>1</interimStageCompletion>
285                                                 <lastModifiedBy>BPEL</lastModifiedBy>
286                                 </DBAdapter:updateInterimStageCompletion>
287                                 </SOAP-ENV:Body>
288                         </SOAP-ENV:Envelope>
289                         """
290
291                 execution.setVariable("dbUpdateInterimStageCompletion", dbUpdateInterimStageCompletion)
292                 msoLogger.debug("sdncAdapter - dbUpdateInterimStageCompletion :" + dbUpdateInterimStageCompletion)
293                 msoLogger.debug("DB UpdateInterimStageCompletion:\n" + dbUpdateInterimStageCompletion)
294                 msoLogger.trace("End Prepare DB Message SDNCAdapter ")
295         }
296
297         public String generateCurrentTimeInUtc(){
298                 final  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
299                 sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
300                 final String utcTime = sdf.format(new Date());
301                 return utcTime;
302         }
303
304         public void toggleSuccessIndicator(DelegateExecution execution){
305                 execution.setVariable("SDNCA_SuccessIndicator", true)
306                 msoLogger.debug("Setting SDNCA Success Indicator to True")
307         }
308
309         public void assignError(DelegateExecution execution){
310                 msoLogger.trace("Started Assign Error ")
311                 WorkflowException wf = execution.getVariable("WorkflowException")
312                 if(wf == null){
313                         exceptionUtil.buildWorkflowException(execution, 5000, "SDNCAdapter Encountered an Internal Error") // TODO: Not sure what message and error code we want here.....
314                 }else{
315                         execution.setVariable("WorkflowException", wf)
316                 }
317
318                 msoLogger.debug("Outgoing WorkflowException is: " + execution.getVariable("WorkflowException"))
319                 msoLogger.trace("End Assign Error ")
320         }
321
322         public void setTimeout(DelegateExecution execution){
323                 msoLogger.trace("Started SetTimeout ")
324                 msoLogger.debug("Timer expired, telling correlation service to stop listening")
325                 execution.setVariable("asynchronousResponseTimeout", true)
326
327                 msoLogger.debug("Timed out branch sleeping for one second to give success branch a chance to complete if running")
328                 Thread.sleep(1000)
329                 msoLogger.trace("End SetTimeout ")
330         }
331 }