Containerization feature of SO
[so.git] / bpmn / so-bpmn-infrastructure-flows / src / main / groovy / org / onap / so / bpmn / infrastructure / scripts / DoCreateNetworkInstanceRollback.groovy
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.onap.so.bpmn.infrastructure.scripts;
22
23 import groovy.xml.XmlUtil
24
25 import groovy.json.*
26 import org.onap.so.bpmn.core.UrnPropertiesReader
27 import org.onap.so.bpmn.core.json.JsonUtils
28 import org.onap.so.logger.MsoLogger
29 import org.onap.so.logger.MessageEnum
30
31 import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
32 import org.onap.so.bpmn.common.scripts.ExceptionUtil
33 import org.onap.so.bpmn.common.scripts.NetworkUtils
34 import org.onap.so.bpmn.common.scripts.SDNCAdapterUtils
35 import org.onap.so.bpmn.common.scripts.VidUtils
36 import org.onap.so.bpmn.core.WorkflowException
37 import org.onap.so.rest.APIResponse;
38 import org.onap.so.rest.RESTClient
39 import org.onap.so.rest.RESTConfig
40
41 import java.util.UUID;
42
43 import org.camunda.bpm.engine.delegate.BpmnError
44 import org.camunda.bpm.engine.delegate.DelegateExecution
45 import org.apache.commons.lang3.*
46 import org.apache.commons.codec.binary.Base64;
47 import org.springframework.web.util.UriUtils
48
49 /**
50  * This groovy class supports the <class>DoCreateNetworkInstance.bpmn</class> process.
51  *
52  */
53 public class DoCreateNetworkInstanceRollback extends AbstractServiceTaskProcessor {
54         private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, DoCreateNetworkInstanceRollback.class);
55
56         String Prefix="CRENWKIR_"
57         ExceptionUtil exceptionUtil = new ExceptionUtil()
58         JsonUtils jsonUtil = new JsonUtils()
59         VidUtils vidUtils = new VidUtils(this)
60         NetworkUtils networkUtils = new NetworkUtils()
61         SDNCAdapterUtils sdncAdapterUtils = new SDNCAdapterUtils()
62
63         def className = getClass().getSimpleName()
64         
65         /**
66          * This method is executed during the preProcessRequest task of the <class>DoCreateNetworkInstanceRollback.bpmn</class> process.
67          * @param execution
68          */
69         public InitializeProcessVariables(DelegateExecution execution){
70                 /* Initialize all the process variables in this block */
71
72                 execution.setVariable(Prefix + "rollbackNetworkRequest", null)
73                 execution.setVariable(Prefix + "rollbackSDNCRequest", null)
74                 execution.setVariable(Prefix + "rollbackActivateSDNCRequest", null)
75                 execution.setVariable(Prefix + "WorkflowException", null)
76                 
77                 execution.setVariable(Prefix + "rollbackNetworkRequest", "")
78                 execution.setVariable(Prefix + "rollbackNetworkResponse", "")
79                 execution.setVariable(Prefix + "rollbackNetworkReturnCode", "")
80
81                 execution.setVariable(Prefix + "rollbackSDNCRequest", "")
82                 execution.setVariable(Prefix + "rollbackSDNCResponse", "")
83                 execution.setVariable(Prefix + "rollbackSDNCReturnCode", "")
84                 
85                 execution.setVariable(Prefix + "rollbackActivateSDNCRequest", "")
86                 execution.setVariable(Prefix + "rollbackActivateSDNCResponse", "")
87                 execution.setVariable(Prefix + "rollbackActivateSDNCReturnCode", "")
88
89                 execution.setVariable(Prefix + "Success", false)
90                 execution.setVariable(Prefix + "fullRollback", false)
91                 execution.setVariable(Prefix + "networkId", "")
92                 execution.setVariable(Prefix + "urlRollbackPoNetwork", "")
93
94         }
95
96         // **************************************************
97         //     Pre or Prepare Request Section
98         // **************************************************
99         /**
100          * This method is executed during the preProcessRequest task of the <class>DoCreateNetworkInstanceRollback.bpmn</class> process.
101          * @param execution
102          */
103         public void preProcessRequest (DelegateExecution execution) {
104                 def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
105                 execution.setVariable("prefix",Prefix)
106                 
107                 msoLogger.trace("Inside preProcessRequest() of " + className + ".groovy")
108
109                 try {
110                         // initialize flow variables
111                         InitializeProcessVariables(execution)
112                         
113                         // GET Incoming request/variables
114                         String rollbackNetworkRequest = null
115                         String rollbackSDNCRequest = null
116                         String rollbackActivateSDNCRequest = null
117                         
118                         // Partial Rollback
119                         Map<String, String> rollbackData = execution.getVariable("rollbackData")
120                         if (rollbackData != null && rollbackData instanceof Map) {
121
122                                         if(rollbackData.containsKey("rollbackSDNCRequest")) {
123                                            rollbackSDNCRequest = rollbackData["rollbackSDNCRequest"]
124                                         }
125                                         
126                                         if(rollbackData.containsKey("rollbackNetworkRequest")) {
127                                                 rollbackNetworkRequest = rollbackData["rollbackNetworkRequest"]
128                                         }
129
130                                         if(rollbackData.containsKey("rollbackActivateSDNCRequest")) {
131                                            rollbackActivateSDNCRequest = rollbackData["rollbackActivateSDNCRequest"]
132                                         }
133                                         
134                         }
135                         
136                         execution.setVariable(Prefix + "rollbackNetworkRequest", rollbackNetworkRequest)
137                         execution.setVariable(Prefix + "rollbackSDNCRequest", rollbackSDNCRequest)
138                         execution.setVariable(Prefix + "rollbackActivateSDNCRequest", rollbackActivateSDNCRequest)
139                         msoLogger.debug("'rollbackData': " + '\n' + execution.getVariable("rollbackData"))
140                         
141                         String sdncVersion = execution.getVariable("sdncVersion")
142                         msoLogger.debug("sdncVersion? : " + sdncVersion)
143
144                         // PO Authorization Info / headers Authorization=
145                         String basicAuthValuePO = UrnPropertiesReader.getVariable("mso.adapters.po.auth",execution)
146                         try {
147                                 def encodedString = utils.getBasicAuth(basicAuthValuePO, UrnPropertiesReader.getVariable("mso.msoKey", execution))
148                                 execution.setVariable("BasicAuthHeaderValuePO",encodedString)
149                                 execution.setVariable("BasicAuthHeaderValueSDNC", encodedString)
150         
151                         } catch (IOException ex) {
152                                 String exceptionMessage = "Exception Encountered in DoCreateNetworkInstance, PreProcessRequest() - "
153                                 String dataErrorMessage = exceptionMessage + " Unable to encode PO/SDNC user/password string - " + ex.getMessage()
154                                 msoLogger.debug(dataErrorMessage )
155                                 exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage)
156                         }
157
158                         if (execution.getVariable("SavedWorkflowException1") != null) {
159                                 execution.setVariable(Prefix + "WorkflowException", execution.getVariable("SavedWorkflowException1"))
160                         } else {
161                                 execution.setVariable(Prefix + "WorkflowException", execution.getVariable("WorkflowException"))
162                         }
163                         msoLogger.debug("*** WorkflowException : " + execution.getVariable(Prefix + "WorkflowException"))
164                         if(execution.getVariable(Prefix + "WorkflowException") != null) {
165                                 // called by: DoCreateNetworkInstance, partial rollback
166                                 execution.setVariable(Prefix + "fullRollback", false)
167
168                         } else {
169                            // called by: Macro - Full Rollback, WorkflowException = null
170                            execution.setVariable(Prefix + "fullRollback", true)
171                         
172                         }
173                         msoLogger.debug("*** fullRollback? : " + execution.getVariable(Prefix + "fullRollback"))
174                         
175                 
176                 } catch (BpmnError e) {
177                 throw e;
178                 
179                 } catch (Exception ex) {
180                         // caught exception
181                         String exceptionMessage = "Exception Encountered in PreProcessRequest() of " + className + ".groovy ***** : " + ex.getMessage()
182                         msoLogger.debug(exceptionMessage)
183                         exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
184                 
185                 }
186
187         }
188         
189         public void callPONetworkAdapter (DelegateExecution execution) {
190                 def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
191                 execution.setVariable("prefix",Prefix)
192
193                 msoLogger.trace("Inside callPONetworkAdapter() of " + className + "")
194                 
195                 try {
196                         String poUrl = UrnPropertiesReader.getVariable("mso.adapters.network.rest.endpoint",execution)
197                         String rollbackSDNCRequest = execution.getVariable(Prefix + "rollbackSDNCRequest")
198                         String networkId = utils.getNodeText(rollbackSDNCRequest, "network-id")
199                 
200                         String rollbackNetworkRequest  = execution.getVariable(Prefix + "rollbackNetworkRequest")
201
202                         String urlRollbackPoNetwork = poUrl+ "/" + networkId + "/rollback"
203                         msoLogger.debug("'urlRollbackPoNetwork': " + urlRollbackPoNetwork)
204                         execution.setVariable(Prefix + "urlRollbackPoNetwork", urlRollbackPoNetwork)
205
206                         RESTConfig config = new RESTConfig(urlRollbackPoNetwork)
207                         RESTClient client = new RESTClient(config).
208                                                                              addHeader("Content-Type", "application/xml").
209                                                                           addAuthorizationHeader(execution.getVariable("BasicAuthHeaderValuePO"));
210
211                     APIResponse response = client.httpDelete(rollbackNetworkRequest)
212                         String responseCode = response.getStatusCode()
213                         String responseBody = response.getResponseBodyAsString() 
214                 
215                         execution.setVariable(Prefix + "rollbackNetworkReturnCode", responseCode)
216                         execution.setVariable(Prefix + "rollbackNetworkResponse", responseBody)
217                 
218                         msoLogger.debug(" Network Adapter rollback responseCode: " + responseCode)
219                         msoLogger.debug(" Network Adapter rollback responseBody: " + responseBody)
220                 
221                         
222                 } catch (Exception ex) {
223                         String exceptionMessage = "Exception Encountered in callPONetworkAdapter() of DoCreateNetworkInstanceRollback flow - " + ex.getMessage()
224                         msoLogger.debug(exceptionMessage)
225                         exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
226                 }
227                 
228         }
229         
230         
231         public void validateRollbackResponses (DelegateExecution execution) {
232                 def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
233                 execution.setVariable("prefix",Prefix)
234
235                 msoLogger.trace("Inside validateRollbackResponses() of DoCreateNetworkInstanceRollback")
236                 
237                 try {
238                         // validate PO network rollback response
239                         String rollbackNetworkErrorMessages = ""
240                         String rollbackNetworkReturnCode = "200"
241                         if (execution.getVariable(Prefix + "rollbackNetworkRequest") != null) {
242                                 rollbackNetworkReturnCode = execution.getVariable(Prefix + "rollbackNetworkReturnCode")
243                                 String rollbackNetworkResponse = execution.getVariable(Prefix + "rollbackNetworkResponse")
244                                 msoLogger.debug(" NetworkRollback Code - " + rollbackNetworkReturnCode)
245                                 msoLogger.debug(" NetworkRollback Response - " + rollbackNetworkResponse)
246                                 if (rollbackNetworkReturnCode != "200") {
247                                         rollbackNetworkErrorMessages = " + PO Network rollback failed. "
248                                 } else {
249                                         rollbackNetworkErrorMessages = " + PO Network rollback completed."
250                                 }
251                         }
252                         
253                         // validate SDNC rollback response
254                         String rollbackSdncErrorMessages = ""
255                         String rollbackSDNCReturnCode = "200"
256                         if (execution.getVariable(Prefix + "rollbackSDNCRequest") != null) {
257                                 rollbackSDNCReturnCode = execution.getVariable(Prefix + "rollbackSDNCReturnCode")
258                                 String rollbackSDNCResponse = execution.getVariable(Prefix + "rollbackSDNCResponse")
259                                 String rollbackSDNCReturnInnerCode = ""
260                                 SDNCAdapterUtils sdncAdapterUtils = new SDNCAdapterUtils(this)
261                                 rollbackSDNCResponse = rollbackSDNCResponse
262                                 rollbackSDNCResponse = rollbackSDNCResponse.replace('$', '').replace('<?xml version="1.0" encoding="UTF-8"?>', "")
263                                 if (rollbackSDNCReturnCode == "200") {
264                                         if (utils.nodeExists(rollbackSDNCResponse, "response-code")) {
265                                                 rollbackSDNCReturnInnerCode = utils.getNodeText(rollbackSDNCResponse, "response-code")
266                                                 if (rollbackSDNCReturnInnerCode == "200" || rollbackSDNCReturnInnerCode == "" || rollbackSDNCReturnInnerCode == "0") {
267                                                     rollbackSdncErrorMessages = " + SNDC assign rollback completed."
268                                                 } else {
269                                                         rollbackSdncErrorMessages = " + SDNC assign rollback failed. "
270                                                 }
271                                         } else {
272                                                   rollbackSdncErrorMessages = " + SNDC assign rollback completed."
273                                         }  
274                                  } else {
275                                           rollbackSdncErrorMessages = " + SDNC assign rollback failed. "
276                              }
277                                 msoLogger.debug(" SDNC assign rollback Code - " + rollbackSDNCReturnCode)
278                                 msoLogger.debug(" SDNC assign rollback  Response - " + rollbackSDNCResponse)
279                         }       
280
281                         // validate SDNC activate rollback response
282                         String rollbackActivateSdncErrorMessages = ""
283                         String rollbackActivateSDNCReturnCode = "200"
284                         if (execution.getVariable(Prefix + "rollbackActivateSDNCRequest") != null) {
285                                 rollbackActivateSDNCReturnCode = execution.getVariable(Prefix + "rollbackActivateSDNCReturnCode")
286                                 String rollbackActivateSDNCResponse = execution.getVariable(Prefix + "rollbackActivateSDNCResponse")
287                                 String rollbackActivateSDNCReturnInnerCode = ""
288                                 rollbackActivateSDNCResponse = rollbackActivateSDNCResponse
289                                 rollbackActivateSDNCResponse = rollbackActivateSDNCResponse.replace('$', '').replace('<?xml version="1.0" encoding="UTF-8"?>', "")
290                                 if (rollbackActivateSDNCReturnCode == "200") {
291                                         if (utils.nodeExists(rollbackActivateSDNCResponse, "response-code")) {
292                                                 rollbackActivateSDNCReturnInnerCode = utils.getNodeText(rollbackActivateSDNCResponse, "response-code")
293                                                 if (rollbackActivateSDNCReturnInnerCode == "200" || rollbackActivateSDNCReturnInnerCode == "" || rollbackActivateSDNCReturnInnerCode == "0") {
294                                                    rollbackActivateSdncErrorMessages = " + SNDC activate rollback completed."
295                                                 } else {
296                                                         rollbackActivateSdncErrorMessages = " + SDNC activate rollback failed. "
297                                                 }
298                                         } else {
299                                                  rollbackActivateSdncErrorMessages = " + SNDC activate rollback completed."
300                                         }
301                                 } else {
302                                           rollbackActivateSdncErrorMessages = " + SDNC activate rollback failed. "
303                                 }
304                                 msoLogger.debug(" SDNC activate rollback Code - " + rollbackActivateSDNCReturnCode)
305                                 msoLogger.debug(" SDNC activate rollback  Response - " + rollbackActivateSDNCResponse)
306                         }       
307
308
309                         String statusMessage = ""
310                         int errorCode = 7000
311                         msoLogger.debug("*** fullRollback? : " + execution.getVariable(Prefix + "fullRollback"))
312                         if (execution.getVariable(Prefix + "fullRollback") == false) { 
313                                 // original WorkflowException, 
314                                 WorkflowException wfe = execution.getVariable(Prefix + "WorkflowException") 
315                                 if (wfe != null) {
316                                    // rollback due to failure in DoCreate - Partial rollback
317                                    statusMessage = wfe.getErrorMessage()
318                                    errorCode = wfe.getErrorCode()
319                                 } else {
320                                    statusMessage = "See Previous Camunda flows for cause of Error: Undetermined Exception."
321                                    errorCode = '7000'
322                             }
323
324                                 // set if all rolledbacks are successful
325                                 if (rollbackNetworkReturnCode == "200" && rollbackSDNCReturnCode == "200" && rollbackActivateSDNCReturnCode == "200") {
326                                         execution.setVariable("rolledBack", true)
327                                         execution.setVariable("wasDeleted", true)
328                                         
329                                 } else {
330                                         execution.setVariable("rolledBack", false)
331                                         execution.setVariable("wasDeleted", true)
332                                 }
333
334                                 statusMessage = statusMessage + rollbackActivateSdncErrorMessages + rollbackNetworkErrorMessages + rollbackSdncErrorMessages
335                                 msoLogger.debug("Final DoCreateNetworkInstanceRollback status message: " + statusMessage)
336                                 String processKey = getProcessKey(execution);
337                                 WorkflowException exception = new WorkflowException(processKey, errorCode, statusMessage);
338                                 execution.setVariable("workflowException", exception);
339                                 
340                         } else { 
341                                 // rollback due to failures in Main flow (Macro) - Full rollback
342                                 // WorkflowException = null
343                             if (rollbackNetworkReturnCode == "200" && rollbackSDNCReturnCode == "200" && rollbackActivateSDNCReturnCode == "200") {
344                                         execution.setVariable("rollbackSuccessful", true)
345                                         execution.setVariable("rollbackError", false)
346                             } else {
347                                     String exceptionMessage = "Network Create Rollback was not Successful. "
348                     msoLogger.debug(exceptionMessage)
349                                         execution.setVariable("rollbackSuccessful", false)
350                                     execution.setVariable("rollbackError", true)
351                                         exceptionUtil.buildWorkflowException(execution, 7000, exceptionMessage)
352                                         throw new BpmnError("MSOWorkflowException")
353                             }
354                                   
355                         } 
356                         
357
358                 } catch (Exception ex) {
359                         String errorMessage = "See Previous Camunda flows for cause of Error: Undetermined Exception."
360                         String exceptionMessage = " Bpmn error encountered in DoCreateNetworkInstanceRollback flow. validateRollbackResponses() - " + errorMessage + ": " + ex.getMessage()
361                         msoLogger.debug(exceptionMessage)
362                         exceptionUtil.buildWorkflowException(execution, 7000, exceptionMessage)
363
364                 }
365
366         }
367
368         // *******************************
369         //     Build Error Section
370         // *******************************
371
372
373         
374         public void processJavaException(DelegateExecution execution){
375                 def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
376                 execution.setVariable("prefix",Prefix)
377                 
378                 try{
379                         msoLogger.debug("Caught a Java Exception in " + Prefix)
380                         msoLogger.debug("Started processJavaException Method")
381                         msoLogger.debug("Variables List: " + execution.getVariables())
382                         execution.setVariable("UnexpectedError", "Caught a Java Lang Exception - " + Prefix)  // Adding this line temporarily until this flows error handling gets updated
383                         exceptionUtil.buildWorkflowException(execution, 500, "Caught a Java Lang Exception")
384                         
385                 }catch(Exception e){
386                         msoLogger.debug("Caught Exception during processJavaException Method: " + e)
387                         execution.setVariable("UnexpectedError", "Exception in processJavaException method - " + Prefix)  // Adding this line temporarily until this flows error handling gets updated
388                         exceptionUtil.buildWorkflowException(execution, 500, "Exception in processJavaException method" + Prefix)
389                 }
390                 msoLogger.debug("Completed processJavaException Method in " + Prefix)
391         }
392
393 }