Merge pull request #29213 from rallytime/vmware_utils_wait_for_task

Move _wait_for_task func from vmware cloud to vmware utils
This commit is contained in:
C. R. Oldham 2015-11-30 11:53:24 -07:00
commit 6c2e62f7d4
2 changed files with 63 additions and 40 deletions

View file

@ -676,28 +676,6 @@ def _wait_for_ip(vm_ref, max_wait):
return False
def _wait_for_task(task, vm_name, task_type, sleep_seconds=1, log_level='debug'):
time_counter = 0
starttime = time.time()
while task.info.state == 'running' or task.info.state == 'queued':
if time_counter % sleep_seconds == 0:
message = "[ {0} ] Waiting for {1} task to finish [{2} s]".format(vm_name, task_type, time_counter)
if log_level == 'info':
log.info(message)
else:
log.debug(message)
time.sleep(1.0 - ((time.time() - starttime) % 1.0))
time_counter += 1
if task.info.state == 'success':
message = "[ {0} ] Successfully completed {1} task in {2} seconds".format(vm_name, task_type, time_counter)
if log_level == 'info':
log.info(message)
else:
log.debug(message)
else:
raise Exception(task.info.error)
def _wait_for_host(host_ref, task_type, sleep_seconds=5, log_level='debug'):
time_counter = 0
starttime = time.time()
@ -1005,7 +983,11 @@ def _upg_tools_helper(vm, reboot=False):
else:
status = 'Only Linux and Windows guests are currently supported'
return status
_wait_for_task(task, vm.name, "tools upgrade", 5, "info")
salt.utils.vmware.wait_for_task(task,
vm.name,
'tools upgrade',
sleep_seconds=5,
log_level='info')
except Exception as exc:
log.error(
'Error while upgrading VMware tools on VM {0}: {1}'.format(
@ -1680,7 +1662,7 @@ def start(name, call=None):
try:
log.info('Starting VM {0}'.format(name))
task = vm["object"].PowerOn()
_wait_for_task(task, name, "power on")
salt.utils.vmware.wait_for_task(task, name, 'power on')
except Exception as exc:
log.error(
'Error while powering on VM {0}: {1}'.format(
@ -1727,7 +1709,7 @@ def stop(name, call=None):
try:
log.info('Stopping VM {0}'.format(name))
task = vm["object"].PowerOff()
_wait_for_task(task, name, "power off")
salt.utils.vmware.wait_for_task(task, name, 'power off')
except Exception as exc:
log.error(
'Error while powering off VM {0}: {1}'.format(
@ -1778,7 +1760,7 @@ def suspend(name, call=None):
try:
log.info('Suspending VM {0}'.format(name))
task = vm["object"].Suspend()
_wait_for_task(task, name, "suspend")
salt.utils.vmware.wait_for_task(task, name, 'suspend')
except Exception as exc:
log.error(
'Error while suspending VM {0}: {1}'.format(
@ -1825,7 +1807,7 @@ def reset(name, call=None):
try:
log.info('Resetting VM {0}'.format(name))
task = vm["object"].Reset()
_wait_for_task(task, name, "reset")
salt.utils.vmware.wait_for_task(task, name, 'reset')
except Exception as exc:
log.error(
'Error while resetting VM {0}: {1}'.format(
@ -1927,7 +1909,7 @@ def destroy(name, call=None):
try:
log.info('Powering Off VM {0}'.format(name))
task = vm["object"].PowerOff()
_wait_for_task(task, name, "power off")
salt.utils.vmware.wait_for_task(task, name, 'power off')
except Exception as exc:
log.error(
'Error while powering off VM {0}: {1}'.format(
@ -1941,7 +1923,7 @@ def destroy(name, call=None):
try:
log.info('Destroying VM {0}'.format(name))
task = vm["object"].Destroy_Task()
_wait_for_task(task, name, "destroy")
salt.utils.vmware.wait_for_task(task, name, 'destroy')
except Exception as exc:
log.error(
'Error while destroying VM {0}: {1}'.format(
@ -2253,11 +2235,11 @@ def create(vm_):
# apply storage DRS recommendations
task = si.content.storageResourceManager.ApplyStorageDrsRecommendation_Task(recommended_datastores.recommendations[0].key)
_wait_for_task(task, vm_name, "apply storage DRS recommendations", 5, 'info')
salt.utils.vmware.wait_for_task(task, vm_name, 'apply storage DRS recommendations', 5, 'info')
else:
# clone the VM/template
task = object_ref.Clone(folder_ref, vm_name, clone_spec)
_wait_for_task(task, vm_name, "clone", 5, 'info')
salt.utils.vmware.wait_for_task(task, vm_name, 'clone', 5, 'info')
except Exception as exc:
err_msg = 'Error creating {0}: {1}'.format(vm_['name'], exc)
log.error(
@ -2831,7 +2813,7 @@ def enter_maintenance_mode(kwargs=None, call=None):
try:
task = host_ref.EnterMaintenanceMode(timeout=0, evacuatePoweredOffVms=True)
_wait_for_task(task, host_name, "enter maintenance mode", 1)
salt.utils.vmware.wait_for_task(task, host_name, 'enter maintenance mode')
except Exception as exc:
log.error(
'Error while moving host system {0} in maintenance mode: {1}'.format(
@ -2876,7 +2858,7 @@ def exit_maintenance_mode(kwargs=None, call=None):
try:
task = host_ref.ExitMaintenanceMode(timeout=0)
_wait_for_task(task, host_name, "exit maintenance mode", 1)
salt.utils.vmware.wait_for_task(task, host_name, 'exit maintenance mode')
except Exception as exc:
log.error(
'Error while moving host system {0} out of maintenance mode: {1}'.format(
@ -3029,7 +3011,7 @@ def create_snapshot(name, kwargs=None, call=None):
try:
task = vm_ref.CreateSnapshot(snapshot_name, desc, memdump, quiesce)
_wait_for_task(task, name, "create snapshot", 5, 'info')
salt.utils.vmware.wait_for_task(task, name, 'create snapshot', 5, 'info')
except Exception as exc:
log.error(
'Error while creating snapshot of {0}: {1}'.format(
@ -3083,7 +3065,7 @@ def revert_to_snapshot(name, kwargs=None, call=None):
try:
task = vm_ref.RevertToCurrentSnapshot(suppressPowerOn=suppress_power_on)
_wait_for_task(task, name, "revert to snapshot", 5, 'info')
salt.utils.vmware.wait_for_task(task, name, 'revert to snapshot', 5, 'info')
except Exception as exc:
log.error(
@ -3127,7 +3109,7 @@ def remove_all_snapshots(name, kwargs=None, call=None):
try:
task = vm_ref.RemoveAllSnapshots()
_wait_for_task(task, name, "remove snapshots", 5, 'info')
salt.utils.vmware.wait_for_task(task, name, 'remove snapshots', 5, 'info')
except Exception as exc:
log.error(
'Error while removing snapshots on VM {0}: {1}'.format(
@ -3273,7 +3255,7 @@ def add_host(kwargs=None, call=None):
if datacenter_name:
task = datacenter_ref.hostFolder.AddStandaloneHost(spec=spec, addConnected=True)
ret = 'added host system to datacenter {0}'.format(datacenter_name)
_wait_for_task(task, host_name, "add host system", 5, 'info')
salt.utils.vmware.wait_for_task(task, host_name, 'add host system', 5, 'info')
except Exception as exc:
if isinstance(exc, vim.fault.SSLVerifyFault):
log.error('Authenticity of the host\'s SSL certificate is not verified')
@ -3327,7 +3309,7 @@ def remove_host(kwargs=None, call=None):
else:
# This is a host system that is part of a Cluster
task = host_ref.Destroy_Task()
_wait_for_task(task, host_name, "remove host", 1, 'info')
salt.utils.vmware.wait_for_task(task, host_name, 'remove host', log_level='info')
except Exception as exc:
log.error(
'Error while removing host {0}: {1}'.format(
@ -3376,7 +3358,7 @@ def connect_host(kwargs=None, call=None):
try:
task = host_ref.ReconnectHost_Task()
_wait_for_task(task, host_name, "connect host", 5, 'info')
salt.utils.vmware.wait_for_task(task, host_name, 'connect host', 5, 'info')
except Exception as exc:
log.error(
'Error while connecting host {0}: {1}'.format(
@ -3425,7 +3407,7 @@ def disconnect_host(kwargs=None, call=None):
try:
task = host_ref.DisconnectHost_Task()
_wait_for_task(task, host_name, "disconnect host", 1, 'info')
salt.utils.vmware.wait_for_task(task, host_name, 'disconnect host', log_level='info')
except Exception as exc:
log.error(
'Error while disconnecting host {0}: {1}'.format(

View file

@ -14,6 +14,7 @@ ESX, ESXi, and vCenter servers.
from __future__ import absolute_import
import atexit
import logging
import time
# Import Salt Libs
from salt.exceptions import SaltSystemExit
@ -377,3 +378,43 @@ def list_vapps(service_instance):
The Service Instance Object from which to obtain vApps.
'''
return list_objects(service_instance, vim.VirtualApp)
def wait_for_task(task, instance_name, task_type, sleep_seconds=1, log_level='debug'):
'''
Waits for a task to be completed.
task
The task to wait for.
instance_name
The name of the ESXi host, vCenter Server, or Virtual Machine that the task is being run on.
task_type
The type of task being performed. Useful information for debugging purposes.
sleep_seconds
The number of seconds to wait before querying the task again. Defaults to ``1`` second.
log_level
The level at which to log task information. Default is ``debug``, but ``info`` is also supported.
'''
time_counter = 0
start_time = time.time()
while task.info.state == 'running' or task.info.state == 'queued':
if time_counter % sleep_seconds == 0:
msg = '[ {0} ] Waiting for {1} task to finish [{2} s]'.format(instance_name, task_type, time_counter)
if log_level == 'info':
log.info(msg)
else:
log.debug(msg)
time.sleep(1.0 - ((time.time() - start_time) % 1.0))
time_counter += 1
if task.info.state == 'success':
msg = '[ {0} ] Successfully completed {1} task in {2} seconds'.format(instance_name, task_type, time_counter)
if log_level == 'info':
log.info(msg)
else:
log.debug(msg)
else:
raise Exception(task.info.error)