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