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.beans.MetaData.java_lang_Class_PersistenceDelegate
29 import java.io.Serializable;
30 import java.util.UUID;
31 import org.openecomp.mso.bpmn.common.scripts.ExceptionUtil
32 import org.camunda.bpm.engine.delegate.BpmnError
33 import org.camunda.bpm.engine.impl.cmd.AbstractSetVariableCmd
34 import org.camunda.bpm.engine.delegate.DelegateExecution
35 import org.openecomp.mso.rest.APIResponse
36 import org.openecomp.mso.rest.RESTClient
37 import org.openecomp.mso.rest.RESTConfig
38 import org.openecomp.mso.bpmn.common.scripts.AbstractServiceTaskProcessor;
39 import org.openecomp.mso.bpmn.common.scripts.VidUtils;
40 import org.openecomp.mso.bpmn.core.RollbackData
41 import org.openecomp.mso.bpmn.core.WorkflowException
42 import org.openecomp.mso.bpmn.common.scripts.ExceptionUtil
43 import org.openecomp.mso.bpmn.core.json.JsonUtils
44 import org.openecomp.mso.bpmn.core.domain.ModelInfo
45 import org.openecomp.mso.bpmn.core.domain.ServiceDecomposition
46 import org.openecomp.mso.bpmn.core.domain.VnfResource
47 import org.openecomp.mso.client.aai.*
49 import org.openecomp.mso.client.appc.ApplicationControllerClient;
50 import org.openecomp.mso.client.appc.ApplicationControllerSupport;
51 import org.openecomp.mso.client.aai.AAIResourcesClient
52 import org.openecomp.mso.client.aai.entities.AAIResultWrapper
53 import org.openecomp.mso.client.aai.entities.uri.AAIUri
54 import org.openecomp.mso.client.aai.entities.uri.AAIUriFactory
55 import org.onap.appc.client.lcm.model.Action;
56 import org.onap.appc.client.lcm.model.ActionIdentifiers;
57 import org.onap.appc.client.lcm.model.LockInput
58 import org.onap.appc.client.lcm.model.UnlockInput
59 import org.onap.appc.client.lcm.model.HealthCheckInput
60 import org.onap.appc.client.lcm.model.StartInput
61 import org.onap.appc.client.lcm.model.StopInput
62 import org.onap.appc.client.lcm.model.Flags
63 import org.onap.appc.client.lcm.model.Status
67 public class VnfInPlaceUpdate extends VnfCmBase {
69 ExceptionUtil exceptionUtil = new ExceptionUtil()
70 JsonUtils jsonUtils = new JsonUtils()
71 def prefix = "VnfIPU_"
74 * Initialize the flow's variables.
76 * @param execution The flow's execution instance.
78 public void initProcessVariables(DelegateExecution execution) {
79 execution.setVariable('prefix', 'VnfIPU_')
80 execution.setVariable('Request', null)
81 execution.setVariable('requestInfo', null)
82 execution.setVariable('source', null)
83 execution.setVariable('vnfInputs', null)
84 execution.setVariable('tenantId', null)
85 execution.setVariable('vnfParams', null)
86 execution.setVariable('UpdateVnfSuccessIndicator', false)
87 execution.setVariable('serviceType', null)
88 execution.setVariable('nfRole', null)
89 execution.setVariable('currentActivity', 'VnfIPU')
90 execution.setVariable('workStep', null)
91 execution.setVariable('failedActivity', null)
92 execution.setVariable('errorCode', "0")
93 execution.setVariable('errorText', null)
94 execution.setVariable('healthCheckIndex0', 0)
95 execution.setVariable('healthCheckIndex1', 1)
96 execution.setVariable('maxRetryCount', 3)
97 execution.setVariable("rollbackSetClosedLoopDisabledFlag", false)
98 execution.setVariable("rollbackVnfStop", false)
99 execution.setVariable("rollbackVnfLock", false)
100 execution.setVariable("rollbackQuiesceTraffic", false)
101 execution.setVariable("rollbackSetVnfInMaintenanceFlag", false)
105 * Check for missing elements in the received request.
107 * @param execution The flow's execution instance.
109 public void preProcessRequest(DelegateExecution execution) {
110 def method = getClass().getSimpleName() + '.preProcessRequest(' +
111 'execution=' + execution.getId() +
113 initProcessVariables(execution)
114 def isDebugLogEnabled = execution.getVariable('isDebugLogEnabled')
115 logDebug('Entered ' + method, isDebugLogEnabled)
117 initProcessVariables(execution)
119 def incomingRequest = execution.getVariable('bpmnRequest')
121 utils.log("DEBUG", "Incoming Infra Request: " + incomingRequest, isDebugLogEnabled)
123 def jsonSlurper = new JsonSlurper()
124 def jsonOutput = new JsonOutput()
125 Map reqMap = jsonSlurper.parseText(incomingRequest)
126 utils.log("DEBUG", " Request is in JSON format.", isDebugLogEnabled)
128 def serviceInstanceId = execution.getVariable('serviceInstanceId')
129 def vnfId = execution.getVariable('vnfId')
131 execution.setVariable('serviceInstanceId', serviceInstanceId)
132 execution.setVariable('vnfId', vnfId)
133 execution.setVariable("isVidRequest", "true")
134 execution.setVariable('serviceType', 'Mobility')
135 execution.setVariable('payload', "")
136 execution.setVariable('actionSnapshot', Action.Snapshot)
137 execution.setVariable('actionLock', Action.Lock)
138 execution.setVariable('actionUnlock', Action.Unlock)
139 execution.setVariable('actionUpgradePreCheck', Action.UpgradePreCheck)
140 execution.setVariable('actionUpgradePostCheck', Action.UpgradePostCheck)
141 execution.setVariable('actionQuiesceTraffic', Action.QuiesceTraffic)
142 execution.setVariable('actionUpgradeBackup', Action.UpgradeBackup)
143 execution.setVariable('actionUpgradeSoftware', Action.UpgradeSoftware)
144 execution.setVariable('actionResumeTraffic', Action.ResumeTraffic)
146 def payload = reqMap.requestDetails?.requestParameters?.payload
147 execution.setVariable('payload', payload)
149 utils.log("DEBUG", 'Processed payload: ' + payload, isDebugLogEnabled)
152 def requestId = execution.getVariable("mso-request-id")
153 execution.setVariable('requestId', requestId)
154 execution.setVariable('msoRequestId', requestId)
156 def requestorId = reqMap.requestDetails?.requestInfo?.requestorId ?: null
157 execution.setVariable('requestorId', requestorId)
159 def cloudConfiguration = reqMap.requestDetails?.cloudConfiguration
160 def lcpCloudRegionId = cloudConfiguration.lcpCloudRegionId
161 execution.setVariable('lcpCloudRegionId', lcpCloudRegionId)
162 def tenantId = cloudConfiguration.tenantId
163 execution.setVariable('tenantId', tenantId)
165 execution.setVariable("UpdateVnfInfraSuccessIndicator", false)
167 execution.setVariable("isDebugLogEnabled", isDebugLogEnabled)
169 def source = reqMap.requestDetails?.requestInfo?.source
170 execution.setVariable("source", source)
172 //For Completion Handler & Fallout Handler
174 """<request-info xmlns="http://org.openecomp/mso/infra/vnf-request/v1">
175 <request-id>${requestId}</request-id>
176 <action>UPDATE</action>
177 <source>${source}</source>
180 execution.setVariable("requestInfo", requestInfo)
182 logDebug('RequestInfo: ' + execution.getVariable("requestInfo"), isDebugLogEnabled)
184 logDebug('Exited ' + method, isDebugLogEnabled)
187 catch(groovy.json.JsonException je) {
188 utils.log("DEBUG", " Request is not in JSON format.", isDebugLogEnabled)
189 exceptionUtil.buildAndThrowWorkflowException(execution, 5000, "Invalid request format")
193 String restFaultMessage = e.getMessage()
194 utils.log("ERROR", " Exception Encountered - " + "\n" + restFaultMessage, isDebugLogEnabled)
195 exceptionUtil.buildAndThrowWorkflowException(execution, 5000, restFaultMessage)
200 * Prepare and send the sychronous response for this flow.
202 * @param execution The flow's execution instance.
204 public void sendSynchResponse(DelegateExecution execution) {
205 def method = getClass().getSimpleName() + '.sendSynchResponse(' +
206 'execution=' + execution.getId() +
208 def isDebugLogEnabled = execution.getVariable('isDebugLogEnabled')
209 logDebug('Entered ' + method, isDebugLogEnabled)
213 def requestInfo = execution.getVariable('requestInfo')
214 def requestId = execution.getVariable('requestId')
215 def source = execution.getVariable('source')
216 def progress = getNodeTextForce(requestInfo, 'progress')
217 if (progress.isEmpty()) {
220 def startTime = getNodeTextForce(requestInfo, 'start-time')
221 if (startTime.isEmpty()) {
222 startTime = System.currentTimeMillis()
225 // RESTResponse (for API Handler (APIH) Reply Task)
226 def vnfId = execution.getVariable("vnfId")
227 String synchResponse = """{"requestReferences":{"instanceId":"${vnfId}","requestId":"${requestId}"}}""".trim()
229 sendWorkflowResponse(execution, 200, synchResponse)
231 logDebug('Exited ' + method, isDebugLogEnabled)
232 } catch (BpmnError e) {
234 } catch (Exception e) {
235 logError('Caught exception in ' + method, e)
236 exceptionUtil.buildAndThrowWorkflowException(execution, 1002, 'Error in sendResponse(): ' + e.getMessage())
242 * Check if this VNF is already in maintenance in A&AI.
245 * @param execution The flow's execution instance.
247 public void checkIfVnfInMaintInAAI(DelegateExecution execution) {
248 def method = getClass().getSimpleName() + '.checkIfVnfInMaintInAAI(' +
249 'execution=' + execution.getId() +
251 def isDebugLogEnabled = execution.getVariable('isDebugLogEnabled')
252 execution.setVariable('errorCode', "0")
253 execution.setVariable("workStep", "checkIfVnfInMaintInAAI")
254 execution.setVariable("failedActivity", "AAI")
255 logDebug('Entered ' + method, isDebugLogEnabled)
258 def transactionLoggingUuid = UUID.randomUUID().toString()
259 AAIRestClientImpl client = new AAIRestClientImpl()
260 AAIValidatorImpl aaiValidator = new AAIValidatorImpl()
261 aaiValidator.setClient(client)
262 def vnfId = execution.getVariable("vnfId")
263 boolean isInMaint = aaiValidator.isVNFLocked(vnfId, transactionLoggingUuid)
264 logDebug("isInMaint result: " + isInMaint, isDebugLogEnabled)
265 execution.setVariable('isVnfInMaintenance', isInMaint)
268 execution.setVariable("errorCode", "1003")
269 execution.setVariable("errorText", "VNF is in maintenance in A&AI")
273 logDebug('Exited ' + method, isDebugLogEnabled)
274 } catch (BpmnError e) {
276 } catch (Exception e) {
277 logError('Caught exception in ' + method, e)
278 execution.setVariable("errorCode", "1002")
279 execution.setVariable("errorText", e.getMessage())
280 //exceptionUtil.buildAndThrowWorkflowException(execution, 1002, 'Error in checkIfVnfInMaintInAAI(): ' + e.getMessage())
286 * Check if this VNF's pservers are locked in A&AI.
289 * @param execution The flow's execution instance.
291 public void checkIfPserversInMaintInAAI(DelegateExecution execution) {
292 def method = getClass().getSimpleName() + '.checkIfPserversInMaintInAAI(' +
293 'execution=' + execution.getId() +
295 def isDebugLogEnabled = execution.getVariable('isDebugLogEnabled')
296 execution.setVariable('errorCode', "0")
297 logDebug('Entered ' + method, isDebugLogEnabled)
298 execution.setVariable("workStep", "checkIfPserversInMaintInAAI")
299 execution.setVariable("failedActivity", "AAI")
302 def transactionLoggingUuid = UUID.randomUUID().toString()
303 AAIRestClientImpl client = new AAIRestClientImpl()
304 AAIValidatorImpl aaiValidator = new AAIValidatorImpl()
305 aaiValidator.setClient(client)
306 def vnfId = execution.getVariable("vnfId")
307 boolean areLocked = aaiValidator.isPhysicalServerLocked(vnfId, transactionLoggingUuid)
308 logDebug("areLocked result: " + areLocked, isDebugLogEnabled)
309 execution.setVariable('arePserversLocked', areLocked)
312 execution.setVariable("errorCode", "1003")
313 execution.setVariable("errorText", "pServers are locked in A&AI")
316 logDebug('Exited ' + method, isDebugLogEnabled)
317 } catch (BpmnError e) {
319 } catch (Exception e) {
320 logError('Caught exception in ' + method, e)
321 execution.setVariable("errorCode", "1002")
322 execution.setVariable("errorText", e.getMessage())
323 //exceptionUtil.buildAndThrowWorkflowException(execution, 1002, 'Error in checkIfPserversInMaintInAAI(): ' + e.getMessage())
328 * Set inMaint flag for this VNF to the specified value in A&AI.
331 * @param execution The flow's execution instance.
332 * @param inMaint The boolean value of the flag to set
334 public void setVnfInMaintFlagInAAI(DelegateExecution execution, boolean inMaint) {
335 def method = getClass().getSimpleName() + '.setVnfInMaintFlagInAAI(' +
336 'execution=' + execution.getId() +
338 def isDebugLogEnabled = execution.getVariable('isDebugLogEnabled')
339 execution.setVariable('errorCode', "0")
340 logDebug('Entered ' + method, isDebugLogEnabled)
342 execution.setVariable("workStep", "setVnfInMaintFlagInAAI")
345 execution.setVariable("workStep", "unsetVnfInMaintFlagInAAI")
347 execution.setVariable("failedActivity", "AAI")
350 def transactionLoggingUuid = UUID.randomUUID().toString()
351 AAIRestClientImpl client = new AAIRestClientImpl()
352 AAIUpdatorImpl aaiUpdator = new AAIUpdatorImpl()
353 aaiUpdator.setClient(client)
354 def vnfId = execution.getVariable("vnfId")
356 aaiUpdator.updateVnfToLocked(vnfId, transactionLoggingUuid)
357 execution.setVariable("rollbackSetVnfInMaintenanceFlag", true)
360 aaiUpdator.updateVnfToUnLocked(vnfId, transactionLoggingUuid)
363 logDebug('Exited ' + method, isDebugLogEnabled)
364 } catch (BpmnError e) {
366 } catch (Exception e) {
367 logError('Caught exception in ' + method, e)
368 execution.setVariable("errorCode", "1002")
369 execution.setVariable("errorText", e.getMessage())
370 //exceptionUtil.buildAndThrowWorkflowException(execution, 1002, 'Error in setVnfInMaintFlagInAAI(): ' + e.getMessage())
375 * Check if VF Closed Loop Disabled in A&AI.
378 * @param execution The flow's execution instance.
380 public void checkIfClosedLoopDisabledInAAI(DelegateExecution execution) {
381 def method = getClass().getSimpleName() + '.checkIfClosedLoopDisabledInAAI(' +
382 'execution=' + execution.getId() +
384 def isDebugLogEnabled = execution.getVariable('isDebugLogEnabled')
385 execution.setVariable('errorCode', "0")
386 execution.setVariable("workStep", "checkClosedLoopDisabledFlagInAAI")
387 execution.setVariable("failedActivity", "AAI")
388 logDebug('Entered ' + method, isDebugLogEnabled)
391 def transactionLoggingUuid = UUID.randomUUID().toString()
392 def vnfId = execution.getVariable("vnfId")
393 logDebug("vnfId is: " + vnfId, isDebugLogEnabled)
394 AAIResourcesClient client = new AAIResourcesClient()
395 AAIUri genericVnfUri = AAIUriFactory.createResourceUri(AAIObjectType.GENERIC_VNF, vnfId)
396 AAIResultWrapper aaiRW = client.get(genericVnfUri)
397 Map<String, Object> result = aaiRW.asMap()
398 boolean isClosedLoopDisabled = result.getOrDefault("is-closed-loop-disabled", false)
400 logDebug("isClosedLoopDisabled result: " + isClosedLoopDisabled, isDebugLogEnabled)
401 execution.setVariable('isClosedLoopDisabled', isClosedLoopDisabled)
403 if (isClosedLoopDisabled) {
404 execution.setVariable("errorCode", "1004")
405 execution.setVariable("errorText", "closedLoop is disabled in A&AI")
408 logDebug('Exited ' + method, isDebugLogEnabled)
409 } catch (BpmnError e) {
411 } catch (Exception e) {
412 logError('Caught exception in ' + method, e)
413 execution.setVariable("errorCode", "1002")
414 execution.setVariable("errorText", e.getMessage())
419 * Set VF Closed Loop Disabled Flag in A&AI.
422 * @param execution The flow's execution instance.
424 public void setClosedLoopDisabledInAAI(DelegateExecution execution, boolean setDisabled) {
425 def method = getClass().getSimpleName() + '.setClosedLoopDisabledInAAI(' +
426 'execution=' + execution.getId() +
428 def isDebugLogEnabled = execution.getVariable('isDebugLogEnabled')
429 execution.setVariable('errorCode', "0")
431 execution.setVariable("workStep", "setClosedLoopDisabledFlagInAAI")
432 execution.setVariable("rollbackSetClosedLoopDisabledFlag", true)
435 execution.setVariable("workStep", "unsetClosedLoopDisabledFlagInAAI")
438 execution.setVariable("failedActivity", "AAI")
439 logDebug('Entered ' + method, isDebugLogEnabled)
442 def transactionLoggingUuid = UUID.randomUUID().toString()
443 def vnfId = execution.getVariable("vnfId")
444 AAIResourcesClient client = new AAIResourcesClient()
445 AAIUri genericVnfUri = AAIUriFactory.createResourceUri(AAIObjectType.GENERIC_VNF, vnfId)
447 Map<String, Boolean> request = new HashMap<>()
448 request.put("is-closed-loop-disabled", setDisabled)
449 client.update(genericVnfUri, request)
450 logDebug("set isClosedLoop to: " + setDisabled, isDebugLogEnabled)
452 logDebug('Exited ' + method, isDebugLogEnabled)
453 } catch (BpmnError e) {
455 } catch (Exception e) {
456 logError('Caught exception in ' + method, e)
457 execution.setVariable("errorCode", "1002")
458 execution.setVariable("errorText", e.getMessage())
466 * Call APP-C client to execute specified APP-C command for this VNF.
469 * @param execution The flow's execution instance.
470 * @param action The action to take in APP-C.
472 public void runAppcCommand(DelegateExecution execution, Action action) {
473 def method = getClass().getSimpleName() + '.runAppcCommand(' +
474 'execution=' + execution.getId() +
476 def isDebugLogEnabled = execution.getVariable('isDebugLogEnabled')
477 execution.setVariable('errorCode', "0")
478 logDebug('Entered ' + method, isDebugLogEnabled)
480 ApplicationControllerClient appcClient = null
483 logDebug("Running APP-C action: " + action.toString(), isDebugLogEnabled)
484 String vnfId = execution.getVariable('vnfId')
485 String msoRequestId = execution.getVariable('requestId')
486 execution.setVariable('msoRequestId', msoRequestId)
487 execution.setVariable("failedActivity", "APP-C")
489 appcClient = new ApplicationControllerClient()
490 ApplicationControllerSupport support = new ApplicationControllerSupport()
491 appcClient.appCSupport=support
492 org.springframework.test.util.ReflectionTestUtils.setField(support, "lcmModelPackage", "org.onap.appc.client.lcm.model");
493 Flags flags = new Flags();
494 ActionIdentifiers actionIdentifiers = new ActionIdentifiers();
495 actionIdentifiers.setVnfId(vnfId);
499 execution.setVariable('workStep', "LockVNF")
500 appcStatus = appcClient.runCommand(Action.Lock,actionIdentifiers,null,msoRequestId)
503 execution.setVariable('workStep', "UnlockVNF")
504 appcStatus = appcClient.runCommand(Action.Unlock,actionIdentifiers,null,msoRequestId)
506 case Action.HealthCheck:
507 def healthCheckIndex = execution.getVariable('healthCheckIndex')
508 execution.setVariable('workStep', "HealthCheckVNF" + healthCheckIndex)
509 execution.setVariable('healthCheckIndex', healthCheckIndex + 1)
510 appcStatus = appcClient.runCommand(Action.HealthCheck,actionIdentifiers,null,msoRequestId)
513 execution.setVariable('workStep', "StartVNF")
514 appcStatus = appcClient.runCommand(Action.Start,actionIdentifiers,null,msoRequestId)
517 execution.setVariable('workStep', "StopVNF")
518 appcStatus = appcClient.runCommand(Action.Stop,actionIdentifiers,null,msoRequestId)
523 logDebug("Completed AppC request", isDebugLogEnabled)
524 int appcCode = appcStatus.getCode()
525 logDebug("AppC status code is: " + appcCode, isDebugLogEnabled)
526 logDebug("AppC status message is: " + appcStatus.getMessage(), isDebugLogEnabled)
527 if (support.getCategoryOf(appcStatus) == ApplicationControllerSupport.StatusCategory.ERROR) {
528 execution.setVariable("errorCode", Integer.toString(appcCode))
529 execution.setVariable("errorText", appcStatus.getMessage())
532 logDebug('Exited ' + method, isDebugLogEnabled)
533 } catch (BpmnError e) {
534 logError('Caught exception in ' + method, e)
535 execution.setVariable("errorCode", "1002")
536 execution.setVariable("errorText", e.getMessage())
538 } catch (java.lang.NoSuchMethodError e) {
539 logError('Caught exception in ' + method, e)
540 execution.setVariable("errorCode", "1002")
541 execution.setVariable("errorText", e.getMessage())
543 } catch (Exception e) {
544 logError('Caught exception in ' + method, e)
545 execution.setVariable("errorCode", "1002")
546 execution.setVariable("errorText", e.getMessage())
552 * Placeholder for a call to APP-C client to execute specified APP-C command for this VNF.
555 * @param execution The flow's execution instance.
556 * @param action The action to take in APP-C.
558 public void runAppcCommandPlaceholder(DelegateExecution execution, String action) {
559 def method = getClass().getSimpleName() + '.runAppcCommandPlaceholder(' +
560 'execution=' + execution.getId() +
562 def isDebugLogEnabled = execution.getVariable('isDebugLogEnabled')
563 execution.setVariable('errorCode', "0")
564 logDebug('Entered ' + method, isDebugLogEnabled)
565 execution.setVariable("failedActivity", "APP-C")
566 execution.setVariable("workStep", action)
572 * Handle Abort disposition from RainyDayHandler
574 * @param execution The flow's execution instance.
576 public void abortProcessing(DelegateExecution execution) {
577 def method = getClass().getSimpleName() + '.abortProcessing(' +
578 'execution=' + execution.getId() +
580 def isDebugLogEnabled = execution.getVariable('isDebugLogEnabled')
581 logDebug('Entered ' + method, isDebugLogEnabled)
583 def errorText = execution.getVariable("errorText")
584 def errorCode = execution.getVariable("errorCode")
586 exceptionUtil.buildAndThrowWorkflowException(execution, errorCode as Integer, errorText)
590 * Increment Retry Count for Current Work Step
592 * @param execution The flow's execution instance.
594 public void incrementRetryCount(DelegateExecution execution) {
595 def method = getClass().getSimpleName() + '.incrementRetryCount(' +
596 'execution=' + execution.getId() +
598 def isDebugLogEnabled = execution.getVariable('isDebugLogEnabled')
599 logDebug('Entered ' + method, isDebugLogEnabled)
601 String retryCountVariableName = execution.getVariable("workStep") + "RetryCount"
602 execution.setVariable("retryCountVariableName", retryCountVariableName)
604 def retryCountVariable = execution.getVariable(retryCountVariableName)
607 if (retryCountVariable != null) {
608 retryCount = (int) retryCountVariable
613 execution.setVariable(retryCountVariableName, retryCount)
615 logDebug("value of " + retryCountVariableName + " is " + retryCount, isDebugLogEnabled)
616 logDebug('Exited ' + method, isDebugLogEnabled)