2 * ============LICENSE_START=======================================================
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 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 * ============LICENSE_END=========================================================
20 package org.openecomp.mso.bpmn.infrastructure.scripts
22 import groovy.json.JsonOutput
23 import groovy.json.JsonSlurper
24 import groovy.util.Node
25 import groovy.util.XmlParser;
26 import groovy.xml.QName
28 import java.io.Serializable;
29 import java.util.UUID;
30 import org.openecomp.mso.bpmn.common.scripts.ExceptionUtil
31 import org.camunda.bpm.engine.delegate.BpmnError
32 import org.camunda.bpm.engine.impl.cmd.AbstractSetVariableCmd
33 import org.camunda.bpm.engine.delegate.DelegateExecution
34 import org.openecomp.mso.rest.APIResponse
35 import org.openecomp.mso.rest.RESTClient
36 import org.openecomp.mso.rest.RESTConfig
37 import org.openecomp.mso.bpmn.common.scripts.AbstractServiceTaskProcessor;
38 import org.openecomp.mso.bpmn.common.scripts.VidUtils;
39 import org.openecomp.mso.bpmn.core.RollbackData
40 import org.openecomp.mso.bpmn.core.WorkflowException
41 import org.openecomp.mso.bpmn.core.json.JsonUtils
42 import org.openecomp.mso.bpmn.core.domain.ModelInfo
43 import org.openecomp.mso.bpmn.core.domain.ServiceDecomposition
44 import org.openecomp.mso.bpmn.core.domain.VnfResource
45 import org.openecomp.mso.client.aai.*
47 import org.openecomp.mso.client.appc.ApplicationControllerClient;
48 import org.openecomp.mso.client.appc.ApplicationControllerSupport;
49 import org.openecomp.mso.client.aai.AAIResourcesClient
50 import org.openecomp.mso.client.aai.entities.AAIResultWrapper
51 import org.openecomp.mso.client.aai.entities.uri.AAIUri
52 import org.openecomp.mso.client.aai.entities.uri.AAIUriFactory
53 import org.onap.appc.client.lcm.model.Action;
54 import org.onap.appc.client.lcm.model.ActionIdentifiers;
55 import org.onap.appc.client.lcm.model.LockInput
56 import org.onap.appc.client.lcm.model.UnlockInput
57 import org.onap.appc.client.lcm.model.HealthCheckInput
58 import org.onap.appc.client.lcm.model.StartInput
59 import org.onap.appc.client.lcm.model.StopInput
60 import org.onap.appc.client.lcm.model.Flags
61 import org.onap.appc.client.lcm.model.Status
65 public class VnfInPlaceUpdate extends VnfCmBase {
67 ExceptionUtil exceptionUtil = new ExceptionUtil()
68 JsonUtils jsonUtils = new JsonUtils()
69 def prefix = "VnfIPU_"
72 * Initialize the flow's variables.
74 * @param execution The flow's execution instance.
76 public void initProcessVariables(DelegateExecution execution) {
77 execution.setVariable('prefix', 'VnfIPU_')
78 execution.setVariable('Request', null)
79 execution.setVariable('requestInfo', null)
80 execution.setVariable('source', null)
81 execution.setVariable('vnfInputs', null)
82 execution.setVariable('tenantId', null)
83 execution.setVariable('vnfParams', null)
84 execution.setVariable('controllerType', null)
85 execution.setVariable('UpdateVnfSuccessIndicator', false)
86 execution.setVariable('serviceType', null)
87 execution.setVariable('nfRole', null)
88 execution.setVariable('currentActivity', 'VnfIPU')
89 execution.setVariable('workStep', null)
90 execution.setVariable('failedActivity', null)
91 execution.setVariable('errorCode', "0")
92 execution.setVariable('errorText', null)
93 execution.setVariable('healthCheckIndex0', 0)
94 execution.setVariable('healthCheckIndex1', 1)
95 execution.setVariable('maxRetryCount', 3)
96 execution.setVariable("rollbackSetClosedLoopDisabledFlag", false)
97 execution.setVariable("rollbackVnfStop", false)
98 execution.setVariable("rollbackVnfLock", false)
99 execution.setVariable("rollbackQuiesceTraffic", false)
100 execution.setVariable("rollbackSetVnfInMaintenanceFlag", false)
104 * Check for missing elements in the received request.
106 * @param execution The flow's execution instance.
108 public void preProcessRequest(DelegateExecution execution) {
109 def method = getClass().getSimpleName() + '.preProcessRequest(' +
110 'execution=' + execution.getId() +
112 initProcessVariables(execution)
113 def isDebugLogEnabled = execution.getVariable('isDebugLogEnabled')
114 logDebug('Entered ' + method, isDebugLogEnabled)
116 initProcessVariables(execution)
118 def incomingRequest = execution.getVariable('bpmnRequest')
120 utils.log("DEBUG", "Incoming Infra Request: " + incomingRequest, isDebugLogEnabled)
122 def jsonSlurper = new JsonSlurper()
123 def jsonOutput = new JsonOutput()
124 Map reqMap = jsonSlurper.parseText(incomingRequest)
125 utils.log("DEBUG", " Request is in JSON format.", isDebugLogEnabled)
127 def serviceInstanceId = execution.getVariable('serviceInstanceId')
128 def vnfId = execution.getVariable('vnfId')
130 execution.setVariable('serviceInstanceId', serviceInstanceId)
131 execution.setVariable('vnfId', vnfId)
132 execution.setVariable("isVidRequest", "true")
133 execution.setVariable('serviceType', 'Mobility')
134 execution.setVariable('payload', "")
135 execution.setVariable('actionSnapshot', Action.Snapshot)
136 execution.setVariable('actionLock', Action.Lock)
137 execution.setVariable('actionUnlock', Action.Unlock)
138 execution.setVariable('actionUpgradePreCheck', Action.UpgradePreCheck)
139 execution.setVariable('actionUpgradePostCheck', Action.UpgradePostCheck)
140 execution.setVariable('actionQuiesceTraffic', Action.QuiesceTraffic)
141 execution.setVariable('actionUpgradeBackup', Action.UpgradeBackup)
142 execution.setVariable('actionUpgradeSoftware', Action.UpgradeSoftware)
143 execution.setVariable('actionResumeTraffic', Action.ResumeTraffic)
145 def controllerType = reqMap.requestDetails?.requestParameters?.controllerType
146 execution.setVariable('controllerType', controllerType)
148 utils.log("DEBUG", 'Controller Type: ' + controllerType, isDebugLogEnabled)
150 def payload = reqMap.requestDetails?.requestParameters?.payload
151 execution.setVariable('payload', payload)
153 utils.log("DEBUG", 'Processed payload: ' + payload, isDebugLogEnabled)
156 def requestId = execution.getVariable("mso-request-id")
157 execution.setVariable('requestId', requestId)
158 execution.setVariable('msoRequestId', requestId)
160 def requestorId = reqMap.requestDetails?.requestInfo?.requestorId ?: null
161 execution.setVariable('requestorId', requestorId)
163 def cloudConfiguration = reqMap.requestDetails?.cloudConfiguration
164 def lcpCloudRegionId = cloudConfiguration.lcpCloudRegionId
165 execution.setVariable('lcpCloudRegionId', lcpCloudRegionId)
166 def tenantId = cloudConfiguration.tenantId
167 execution.setVariable('tenantId', tenantId)
169 execution.setVariable("UpdateVnfInfraSuccessIndicator", false)
171 execution.setVariable("isDebugLogEnabled", isDebugLogEnabled)
173 def source = reqMap.requestDetails?.requestInfo?.source
174 execution.setVariable("source", source)
176 //For Completion Handler & Fallout Handler
178 """<request-info xmlns="http://org.openecomp/mso/infra/vnf-request/v1">
179 <request-id>${requestId}</request-id>
180 <action>UPDATE</action>
181 <source>${source}</source>
184 execution.setVariable("requestInfo", requestInfo)
186 logDebug('RequestInfo: ' + execution.getVariable("requestInfo"), isDebugLogEnabled)
188 logDebug('Exited ' + method, isDebugLogEnabled)
191 catch(groovy.json.JsonException je) {
192 utils.log("DEBUG", " Request is not in JSON format.", isDebugLogEnabled)
193 exceptionUtil.buildAndThrowWorkflowException(execution, 5000, "Invalid request format")
197 String restFaultMessage = e.getMessage()
198 utils.log("ERROR", " Exception Encountered - " + "\n" + restFaultMessage, isDebugLogEnabled)
199 exceptionUtil.buildAndThrowWorkflowException(execution, 5000, restFaultMessage)
204 * Prepare and send the sychronous response for this flow.
206 * @param execution The flow's execution instance.
208 public void sendSynchResponse(DelegateExecution execution) {
209 def method = getClass().getSimpleName() + '.sendSynchResponse(' +
210 'execution=' + execution.getId() +
212 def isDebugLogEnabled = execution.getVariable('isDebugLogEnabled')
213 logDebug('Entered ' + method, isDebugLogEnabled)
217 def requestInfo = execution.getVariable('requestInfo')
218 def requestId = execution.getVariable('requestId')
219 def source = execution.getVariable('source')
220 def progress = getNodeTextForce(requestInfo, 'progress')
221 if (progress.isEmpty()) {
224 def startTime = getNodeTextForce(requestInfo, 'start-time')
225 if (startTime.isEmpty()) {
226 startTime = System.currentTimeMillis()
229 // RESTResponse (for API Handler (APIH) Reply Task)
230 def vnfId = execution.getVariable("vnfId")
231 String synchResponse = """{"requestReferences":{"instanceId":"${vnfId}","requestId":"${requestId}"}}""".trim()
233 sendWorkflowResponse(execution, 200, synchResponse)
235 logDebug('Exited ' + method, isDebugLogEnabled)
236 } catch (BpmnError e) {
238 } catch (Exception e) {
239 logError('Caught exception in ' + method, e)
240 exceptionUtil.buildAndThrowWorkflowException(execution, 1002, 'Error in sendResponse(): ' + e.getMessage())
246 * Check if this VNF is already in maintenance in A&AI.
249 * @param execution The flow's execution instance.
251 public void checkIfVnfInMaintInAAI(DelegateExecution execution) {
252 def method = getClass().getSimpleName() + '.checkIfVnfInMaintInAAI(' +
253 'execution=' + execution.getId() +
255 def isDebugLogEnabled = execution.getVariable('isDebugLogEnabled')
256 execution.setVariable('errorCode', "0")
257 execution.setVariable("workStep", "checkIfVnfInMaintInAAI")
258 execution.setVariable("failedActivity", "AAI")
259 logDebug('Entered ' + method, isDebugLogEnabled)
262 def transactionLoggingUuid = UUID.randomUUID().toString()
263 AAIRestClientImpl client = new AAIRestClientImpl()
264 AAIValidatorImpl aaiValidator = new AAIValidatorImpl()
265 aaiValidator.setClient(client)
266 def vnfId = execution.getVariable("vnfId")
267 boolean isInMaint = aaiValidator.isVNFLocked(vnfId, transactionLoggingUuid)
268 logDebug("isInMaint result: " + isInMaint, isDebugLogEnabled)
269 execution.setVariable('isVnfInMaintenance', isInMaint)
272 execution.setVariable("errorCode", "1003")
273 execution.setVariable("errorText", "VNF is in maintenance in A&AI")
277 logDebug('Exited ' + method, isDebugLogEnabled)
278 } catch (BpmnError e) {
280 } catch (Exception e) {
281 logError('Caught exception in ' + method, e)
282 execution.setVariable("errorCode", "1002")
283 execution.setVariable("errorText", e.getMessage())
284 //exceptionUtil.buildAndThrowWorkflowException(execution, 1002, 'Error in checkIfVnfInMaintInAAI(): ' + e.getMessage())
290 * Check if this VNF's pservers are locked in A&AI.
293 * @param execution The flow's execution instance.
295 public void checkIfPserversInMaintInAAI(DelegateExecution execution) {
296 def method = getClass().getSimpleName() + '.checkIfPserversInMaintInAAI(' +
297 'execution=' + execution.getId() +
299 def isDebugLogEnabled = execution.getVariable('isDebugLogEnabled')
300 execution.setVariable('errorCode', "0")
301 logDebug('Entered ' + method, isDebugLogEnabled)
302 execution.setVariable("workStep", "checkIfPserversInMaintInAAI")
303 execution.setVariable("failedActivity", "AAI")
306 def transactionLoggingUuid = UUID.randomUUID().toString()
307 AAIRestClientImpl client = new AAIRestClientImpl()
308 AAIValidatorImpl aaiValidator = new AAIValidatorImpl()
309 aaiValidator.setClient(client)
310 def vnfId = execution.getVariable("vnfId")
311 boolean areLocked = aaiValidator.isPhysicalServerLocked(vnfId, transactionLoggingUuid)
312 logDebug("areLocked result: " + areLocked, isDebugLogEnabled)
313 execution.setVariable('arePserversLocked', areLocked)
316 execution.setVariable("errorCode", "1003")
317 execution.setVariable("errorText", "pServers are locked in A&AI")
320 logDebug('Exited ' + method, isDebugLogEnabled)
321 } catch (BpmnError e) {
323 } catch (Exception e) {
324 logError('Caught exception in ' + method, e)
325 execution.setVariable("errorCode", "1002")
326 execution.setVariable("errorText", e.getMessage())
327 //exceptionUtil.buildAndThrowWorkflowException(execution, 1002, 'Error in checkIfPserversInMaintInAAI(): ' + e.getMessage())
332 * Set inMaint flag for this VNF to the specified value in A&AI.
335 * @param execution The flow's execution instance.
336 * @param inMaint The boolean value of the flag to set
338 public void setVnfInMaintFlagInAAI(DelegateExecution execution, boolean inMaint) {
339 def method = getClass().getSimpleName() + '.setVnfInMaintFlagInAAI(' +
340 'execution=' + execution.getId() +
342 def isDebugLogEnabled = execution.getVariable('isDebugLogEnabled')
343 execution.setVariable('errorCode', "0")
344 logDebug('Entered ' + method, isDebugLogEnabled)
346 execution.setVariable("workStep", "setVnfInMaintFlagInAAI")
349 execution.setVariable("workStep", "unsetVnfInMaintFlagInAAI")
351 execution.setVariable("failedActivity", "AAI")
354 def transactionLoggingUuid = UUID.randomUUID().toString()
355 AAIRestClientImpl client = new AAIRestClientImpl()
356 AAIUpdatorImpl aaiUpdator = new AAIUpdatorImpl()
357 aaiUpdator.setClient(client)
358 def vnfId = execution.getVariable("vnfId")
360 aaiUpdator.updateVnfToLocked(vnfId, transactionLoggingUuid)
361 execution.setVariable("rollbackSetVnfInMaintenanceFlag", true)
364 aaiUpdator.updateVnfToUnLocked(vnfId, transactionLoggingUuid)
367 logDebug('Exited ' + method, isDebugLogEnabled)
368 } catch (BpmnError e) {
370 } catch (Exception e) {
371 logError('Caught exception in ' + method, e)
372 execution.setVariable("errorCode", "1002")
373 execution.setVariable("errorText", e.getMessage())
374 //exceptionUtil.buildAndThrowWorkflowException(execution, 1002, 'Error in setVnfInMaintFlagInAAI(): ' + e.getMessage())
379 * Check if VF Closed Loop Disabled in A&AI.
382 * @param execution The flow's execution instance.
384 public void checkIfClosedLoopDisabledInAAI(DelegateExecution execution) {
385 def method = getClass().getSimpleName() + '.checkIfClosedLoopDisabledInAAI(' +
386 'execution=' + execution.getId() +
388 def isDebugLogEnabled = execution.getVariable('isDebugLogEnabled')
389 execution.setVariable('errorCode', "0")
390 execution.setVariable("workStep", "checkClosedLoopDisabledFlagInAAI")
391 execution.setVariable("failedActivity", "AAI")
392 logDebug('Entered ' + method, isDebugLogEnabled)
395 def transactionLoggingUuid = UUID.randomUUID().toString()
396 def vnfId = execution.getVariable("vnfId")
397 logDebug("vnfId is: " + vnfId, isDebugLogEnabled)
398 AAIResourcesClient client = new AAIResourcesClient()
399 AAIUri genericVnfUri = AAIUriFactory.createResourceUri(AAIObjectType.GENERIC_VNF, vnfId)
400 AAIResultWrapper aaiRW = client.get(genericVnfUri)
401 Map<String, Object> result = aaiRW.asMap()
402 boolean isClosedLoopDisabled = result.getOrDefault("is-closed-loop-disabled", false)
404 logDebug("isClosedLoopDisabled result: " + isClosedLoopDisabled, isDebugLogEnabled)
405 execution.setVariable('isClosedLoopDisabled', isClosedLoopDisabled)
407 if (isClosedLoopDisabled) {
408 execution.setVariable("errorCode", "1004")
409 execution.setVariable("errorText", "closedLoop is disabled in A&AI")
412 logDebug('Exited ' + method, isDebugLogEnabled)
413 } catch (BpmnError e) {
415 } catch (Exception e) {
416 logError('Caught exception in ' + method, e)
417 execution.setVariable("errorCode", "1002")
418 execution.setVariable("errorText", e.getMessage())
423 * Set VF Closed Loop Disabled Flag in A&AI.
426 * @param execution The flow's execution instance.
428 public void setClosedLoopDisabledInAAI(DelegateExecution execution, boolean setDisabled) {
429 def method = getClass().getSimpleName() + '.setClosedLoopDisabledInAAI(' +
430 'execution=' + execution.getId() +
432 def isDebugLogEnabled = execution.getVariable('isDebugLogEnabled')
433 execution.setVariable('errorCode', "0")
435 execution.setVariable("workStep", "setClosedLoopDisabledFlagInAAI")
436 execution.setVariable("rollbackSetClosedLoopDisabledFlag", true)
439 execution.setVariable("workStep", "unsetClosedLoopDisabledFlagInAAI")
442 execution.setVariable("failedActivity", "AAI")
443 logDebug('Entered ' + method, isDebugLogEnabled)
446 def transactionLoggingUuid = UUID.randomUUID().toString()
447 def vnfId = execution.getVariable("vnfId")
448 AAIResourcesClient client = new AAIResourcesClient()
449 AAIUri genericVnfUri = AAIUriFactory.createResourceUri(AAIObjectType.GENERIC_VNF, vnfId)
451 Map<String, Boolean> request = new HashMap<>()
452 request.put("is-closed-loop-disabled", setDisabled)
453 client.update(genericVnfUri, request)
454 logDebug("set isClosedLoop to: " + setDisabled, isDebugLogEnabled)
456 logDebug('Exited ' + method, isDebugLogEnabled)
457 } catch (BpmnError e) {
459 } catch (Exception e) {
460 logError('Caught exception in ' + method, e)
461 execution.setVariable("errorCode", "1002")
462 execution.setVariable("errorText", e.getMessage())
470 * Call APP-C client to execute specified APP-C command for this VNF.
473 * @param execution The flow's execution instance.
474 * @param action The action to take in APP-C.
476 public void runAppcCommand(DelegateExecution execution, Action action) {
477 def method = getClass().getSimpleName() + '.runAppcCommand(' +
478 'execution=' + execution.getId() +
480 def isDebugLogEnabled = execution.getVariable('isDebugLogEnabled')
481 execution.setVariable('errorCode', "0")
482 logDebug('Entered ' + method, isDebugLogEnabled)
484 ApplicationControllerClient appcClient = null
487 logDebug("Running APP-C action: " + action.toString(), isDebugLogEnabled)
488 String vnfId = execution.getVariable('vnfId')
489 String msoRequestId = execution.getVariable('requestId')
490 execution.setVariable('msoRequestId', msoRequestId)
491 execution.setVariable("failedActivity", "APP-C")
493 appcClient = new ApplicationControllerClient()
494 ApplicationControllerSupport support = new ApplicationControllerSupport()
495 appcClient.appCSupport=support
496 org.springframework.test.util.ReflectionTestUtils.setField(support, "lcmModelPackage", "org.onap.appc.client.lcm.model");
497 Flags flags = new Flags();
498 ActionIdentifiers actionIdentifiers = new ActionIdentifiers();
499 actionIdentifiers.setVnfId(vnfId);
503 execution.setVariable('workStep', "LockVNF")
504 appcStatus = appcClient.runCommand(Action.Lock,actionIdentifiers,null,msoRequestId)
507 execution.setVariable('workStep', "UnlockVNF")
508 appcStatus = appcClient.runCommand(Action.Unlock,actionIdentifiers,null,msoRequestId)
510 case Action.HealthCheck:
511 def healthCheckIndex = execution.getVariable('healthCheckIndex')
512 execution.setVariable('workStep', "HealthCheckVNF" + healthCheckIndex)
513 execution.setVariable('healthCheckIndex', healthCheckIndex + 1)
514 appcStatus = appcClient.runCommand(Action.HealthCheck,actionIdentifiers,null,msoRequestId)
517 execution.setVariable('workStep', "StartVNF")
518 appcStatus = appcClient.runCommand(Action.Start,actionIdentifiers,null,msoRequestId)
521 execution.setVariable('workStep', "StopVNF")
522 appcStatus = appcClient.runCommand(Action.Stop,actionIdentifiers,null,msoRequestId)
527 logDebug("Completed AppC request", isDebugLogEnabled)
528 int appcCode = appcStatus.getCode()
529 logDebug("AppC status code is: " + appcCode, isDebugLogEnabled)
530 logDebug("AppC status message is: " + appcStatus.getMessage(), isDebugLogEnabled)
531 if (support.getCategoryOf(appcStatus) == ApplicationControllerSupport.StatusCategory.ERROR) {
532 execution.setVariable("errorCode", Integer.toString(appcCode))
533 execution.setVariable("errorText", appcStatus.getMessage())
536 logDebug('Exited ' + method, isDebugLogEnabled)
537 } catch (BpmnError e) {
538 logError('Caught exception in ' + method, e)
539 execution.setVariable("errorCode", "1002")
540 execution.setVariable("errorText", e.getMessage())
542 } catch (java.lang.NoSuchMethodError e) {
543 logError('Caught exception in ' + method, e)
544 execution.setVariable("errorCode", "1002")
545 execution.setVariable("errorText", e.getMessage())
547 } catch (Exception e) {
548 logError('Caught exception in ' + method, e)
549 execution.setVariable("errorCode", "1002")
550 execution.setVariable("errorText", e.getMessage())
556 * Placeholder for a call to APP-C client to execute specified APP-C command for this VNF.
559 * @param execution The flow's execution instance.
560 * @param action The action to take in APP-C.
562 public void runAppcCommandPlaceholder(DelegateExecution execution, String action) {
563 def method = getClass().getSimpleName() + '.runAppcCommandPlaceholder(' +
564 'execution=' + execution.getId() +
566 def isDebugLogEnabled = execution.getVariable('isDebugLogEnabled')
567 execution.setVariable('errorCode', "0")
568 logDebug('Entered ' + method, isDebugLogEnabled)
569 execution.setVariable("failedActivity", "APP-C")
570 execution.setVariable("workStep", action)
576 * Handle Abort disposition from RainyDayHandler
578 * @param execution The flow's execution instance.
580 public void abortProcessing(DelegateExecution execution) {
581 def method = getClass().getSimpleName() + '.abortProcessing(' +
582 'execution=' + execution.getId() +
584 def isDebugLogEnabled = execution.getVariable('isDebugLogEnabled')
585 logDebug('Entered ' + method, isDebugLogEnabled)
587 def errorText = execution.getVariable("errorText")
588 def errorCode = execution.getVariable("errorCode")
590 exceptionUtil.buildAndThrowWorkflowException(execution, errorCode as Integer, errorText)
594 * Increment Retry Count for Current Work Step
596 * @param execution The flow's execution instance.
598 public void incrementRetryCount(DelegateExecution execution) {
599 def method = getClass().getSimpleName() + '.incrementRetryCount(' +
600 'execution=' + execution.getId() +
602 def isDebugLogEnabled = execution.getVariable('isDebugLogEnabled')
603 logDebug('Entered ' + method, isDebugLogEnabled)
605 String retryCountVariableName = execution.getVariable("workStep") + "RetryCount"
606 execution.setVariable("retryCountVariableName", retryCountVariableName)
608 def retryCountVariable = execution.getVariable(retryCountVariableName)
611 if (retryCountVariable != null) {
612 retryCount = (int) retryCountVariable
617 execution.setVariable(retryCountVariableName, retryCount)
619 logDebug("value of " + retryCountVariableName + " is " + retryCount, isDebugLogEnabled)
620 logDebug('Exited ' + method, isDebugLogEnabled)