VMware: correct logic to pass ESXi SSL thumbprint (#47600)

Due to refactoring of task_error and wait_for_task method,
SSL thumbprint was lost in error message. This fixes the
retry mechanism of AddHost task.

Fixes: #47563

Signed-off-by: Abhijeet Kasurde <akasurde@redhat.com>
This commit is contained in:
Abhijeet Kasurde 2018-10-29 20:59:11 +05:30 committed by GitHub
parent 524c5190b8
commit e7c83d6aa9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 12 additions and 4 deletions

View file

@ -32,7 +32,8 @@ from ansible.module_utils.basic import env_fallback
class TaskError(Exception): class TaskError(Exception):
pass def __init__(self, *args, **kwargs):
super(TaskError, self).__init__(*args, **kwargs)
def wait_for_task(task, max_backoff=64, timeout=3600): def wait_for_task(task, max_backoff=64, timeout=3600):
@ -56,12 +57,15 @@ def wait_for_task(task, max_backoff=64, timeout=3600):
return True, task.info.result return True, task.info.result
if task.info.state == vim.TaskInfo.State.error: if task.info.state == vim.TaskInfo.State.error:
error_msg = task.info.error error_msg = task.info.error
host_thumbprint = None
try: try:
error_msg = error_msg.msg error_msg = error_msg.msg
if hasattr(task.info.error, 'thumbprint'):
host_thumbprint = task.info.error.thumbprint
except AttributeError: except AttributeError:
pass pass
finally: finally:
raise_from(TaskError(error_msg), task.info.error) raise_from(TaskError(error_msg, host_thumbprint), task.info.error)
if task.info.state in [vim.TaskInfo.State.running, vim.TaskInfo.State.queued]: if task.info.state in [vim.TaskInfo.State.running, vim.TaskInfo.State.queued]:
sleep_time = min(2 ** failure_counter + randint(1, 1000) / 1000, max_backoff) sleep_time = min(2 ** failure_counter + randint(1, 1000) / 1000, max_backoff)
time.sleep(sleep_time) time.sleep(sleep_time)

View file

@ -259,10 +259,14 @@ class VMwareHost(PyVmomi):
return success, result return success, result
except TaskError as task_error_exception: except TaskError as task_error_exception:
task_error = task_error_exception.args[0] task_error = task_error_exception.args[0]
if self.esxi_ssl_thumbprint == '' and isinstance(task_error, vim.fault.SSLVerifyFault): if len(task_error_exception.args) == 2:
host_thumbprint = task_error_exception.args[1]
else:
host_thumbprint = None
if self.esxi_ssl_thumbprint == '' and host_thumbprint:
# User has not specified SSL Thumbprint for ESXi host, # User has not specified SSL Thumbprint for ESXi host,
# try to grab it using SSLVerifyFault exception # try to grab it using SSLVerifyFault exception
host_connect_spec.sslThumbprint = task_error.thumbprint host_connect_spec.sslThumbprint = host_thumbprint
else: else:
self.module.fail_json(msg="Failed to add host %s to vCenter: %s" % (self.esxi_hostname, self.module.fail_json(msg="Failed to add host %s to vCenter: %s" % (self.esxi_hostname,
to_native(task_error))) to_native(task_error)))