Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,8 @@ def __init__(self):
:param context: models.QualiDriverModels.InitCommandContext
"""
self.cs_helper = CloudshellDriverHelper()
pv_service = pyVmomiService(SmartConnect, Disconnect)
synchronous_task_waiter = SynchronousTaskWaiter()
pv_service = pyVmomiService(connect=SmartConnect, disconnect=Disconnect, task_waiter=synchronous_task_waiter)
self.resource_model_parser = ResourceModelParser()
port_group_name_generator = DvPortGroupNameGenerator()

Expand Down
4 changes: 2 additions & 2 deletions package/cloudshell/cp/vcenter/common/vcenter/task_waiter.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ def wait_for_task(self, task, logger, action_name='job', hide_result=False):
:param logger:
"""

while task.info.state == vim.TaskInfo.State.running:
while task.info.state in [vim.TaskInfo.State.running, vim.TaskInfo.State.queued]:
time.sleep(2)

if task.info.state == vim.TaskInfo.State.success:
Expand All @@ -26,7 +26,7 @@ def wait_for_task(self, task, logger, action_name='job', hide_result=False):
else:
out = '%s completed successfully.' % action_name
logger.info(out)
else:
else: # error state
multi_msg = ''
if task.info.error.faultMessage:
multi_msg = ', '.join([err.message for err in task.info.error.faultMessage])
Expand Down
35 changes: 10 additions & 25 deletions package/cloudshell/cp/vcenter/common/vcenter/vmomi_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from cloudshell.cp.vcenter.common.utilites.io import get_path_and_name
from cloudshell.cp.vcenter.common.vcenter.vm_location import VMLocation
from cloudshell.cp.vcenter.common.utilites.common_utils import str2bool

from cloudshell.cp.vcenter.common.vcenter.task_waiter import SynchronousTaskWaiter

class pyVmomiService:
# region consts
Expand All @@ -18,9 +18,14 @@ class pyVmomiService:

# endregion

def __init__(self, connect, disconnect, vim_import=None):
def __init__(self, connect, disconnect, task_waiter, vim_import=None):
"""
:param SynchronousTaskWaiter task_waiter:
:return:
"""
self.pyvmomi_connect = connect
self.pyvmomi_disconnect = disconnect
self.task_waiter = task_waiter
if vim_import is None:
from pyVmomi import vim
self.vim = vim
Expand Down Expand Up @@ -316,26 +321,6 @@ def get_all_items_in_vcenter(si, type_filter, root=None):
container = si.content.viewManager.CreateContainerView(container=root, recursive=True)
return [item for item in container.view if not type_filter or isinstance(item, type_filter)]

def wait_for_task(self, task, logger):
""" wait for a vCenter task to finish
:param task:
:param logger:
"""
task_done = False
while not task_done:
if task.info.state == 'success':
logger.info("Task succeeded: " + task.info.state)
return task.info.result

if task.info.state == 'error':
multi_msg = ''
if task.info.error.faultMessage:
multi_msg = ', '.join([err.message for err in task.info.error.faultMessage])
multi_msg = multi_msg if multi_msg else task.info.error.msg
logger.info(multi_msg)
raise Exception(multi_msg)
time.sleep(1)

class CloneVmParameters:
"""
This is clone_vm method params object
Expand Down Expand Up @@ -455,7 +440,7 @@ def clone_vm(self, clone_params, logger):
logger.info("cloning VM...")
try:
task = template.Clone(folder=dest_folder, name=clone_params.vm_name, spec=clone_spec)
vm = self.wait_for_task(task, logger)
vm = self.task_waiter.wait_for_task(task=task, logger=logger, action_name='Clone VM')

except vim.fault.NoPermission as error:
logger.error("vcenter returned - no permission: {0}".format(error))
Expand Down Expand Up @@ -546,12 +531,12 @@ def destroy_vm(self, vm, logger):
logger.info(("The current powerState is: {0}. Attempting to power off {1}"
.format(vm.runtime.powerState, vm.name)))
task = vm.PowerOffVM_Task()
self.wait_for_task(task, logger)
self.task_waiter.wait_for_task(task=task, logger=logger, action_name="Power Off Before Destroy")

logger.info(("Destroying VM {0}".format(vm.name)))

task = vm.Destroy_Task()
return self.wait_for_task(task, logger)
return self.task_waiter.wait_for_task(task=task, logger=logger, action_name="Destroy VM")

def destroy_vm_by_name(self, si, vm_name, vm_path, logger):
"""
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,21 @@ def test_wait_for_task(self):

self.assertEqual(res, result)

@patch('time.sleep', helper.change_to_success)
def test_wait_for_queued_task(self):
task.info = Mock(spec=vim.TaskInfo)
task.info.state = vim.TaskInfo.State.queued
result = 'result'
task.info.result = result

waiter = SynchronousTaskWaiter()
res = waiter.wait_for_task(task=task,
logger=Mock(),
action_name='job',
hide_result=False)

self.assertEqual(res, result)

@patch('time.sleep', helper.change_to_success)
def test_wait_for_task_result_none(self):
task.info = Mock(spec=vim.TaskInfo)
Expand Down
Loading