Skip to content

Commit 5ea0c48

Browse files
committed
Merge pull request #710 from QualiSystems/release_1.1_hotfix_2
Release 1.1 hotfix 2
2 parents 4914c9e + b8ca06d commit 5ea0c48

7 files changed

Lines changed: 85 additions & 89 deletions

File tree

package/cloudshell/cp/vcenter/commands/command_orchestrator.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ def __init__(self):
4242
:param context: models.QualiDriverModels.InitCommandContext
4343
"""
4444
self.cs_helper = CloudshellDriverHelper()
45-
pv_service = pyVmomiService(SmartConnect, Disconnect)
4645
synchronous_task_waiter = SynchronousTaskWaiter()
46+
pv_service = pyVmomiService(connect=SmartConnect, disconnect=Disconnect, task_waiter=synchronous_task_waiter)
4747
self.resource_model_parser = ResourceModelParser()
4848
port_group_name_generator = DvPortGroupNameGenerator()
4949

package/cloudshell/cp/vcenter/common/vcenter/model_auto_discovery.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
from cloudshell.cp.vcenter.common.model_factory import ResourceModelParser
1212
from cloudshell.cp.vcenter.common.vcenter.vmomi_service import pyVmomiService
1313

14+
from cloudshell.cp.vcenter.common.vcenter.task_waiter import SynchronousTaskWaiter
15+
1416
DOMAIN = 'Global'
1517
ADDRESS = 'address'
1618
USER = 'User'
@@ -31,7 +33,7 @@
3133
class VCenterAutoModelDiscovery(object):
3234
def __init__(self):
3335
self.parser = ResourceModelParser()
34-
self.pv_service = pyVmomiService(SmartConnect, Disconnect)
36+
self.pv_service = pyVmomiService(SmartConnect, Disconnect, SynchronousTaskWaiter())
3537
self.cs_helper = CloudshellDriverHelper()
3638
self.context_based_logger_factory = ContextBasedLoggerFactory()
3739

package/cloudshell/cp/vcenter/common/vcenter/task_waiter.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ def wait_for_task(self, task, logger, action_name='job', hide_result=False):
1616
:param logger:
1717
"""
1818

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

2222
if task.info.state == vim.TaskInfo.State.success:
@@ -26,7 +26,7 @@ def wait_for_task(self, task, logger, action_name='job', hide_result=False):
2626
else:
2727
out = '%s completed successfully.' % action_name
2828
logger.info(out)
29-
else:
29+
else: # error state
3030
multi_msg = ''
3131
if task.info.error.faultMessage:
3232
multi_msg = ', '.join([err.message for err in task.info.error.faultMessage])

package/cloudshell/cp/vcenter/common/vcenter/vmomi_service.py

Lines changed: 10 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from cloudshell.cp.vcenter.common.utilites.io import get_path_and_name
55
from cloudshell.cp.vcenter.common.vcenter.vm_location import VMLocation
66
from cloudshell.cp.vcenter.common.utilites.common_utils import str2bool
7-
7+
from cloudshell.cp.vcenter.common.vcenter.task_waiter import SynchronousTaskWaiter
88

99
class pyVmomiService:
1010
# region consts
@@ -18,9 +18,14 @@ class pyVmomiService:
1818

1919
# endregion
2020

21-
def __init__(self, connect, disconnect, vim_import=None):
21+
def __init__(self, connect, disconnect, task_waiter, vim_import=None):
22+
"""
23+
:param SynchronousTaskWaiter task_waiter:
24+
:return:
25+
"""
2226
self.pyvmomi_connect = connect
2327
self.pyvmomi_disconnect = disconnect
28+
self.task_waiter = task_waiter
2429
if vim_import is None:
2530
from pyVmomi import vim
2631
self.vim = vim
@@ -316,26 +321,6 @@ def get_all_items_in_vcenter(si, type_filter, root=None):
316321
container = si.content.viewManager.CreateContainerView(container=root, recursive=True)
317322
return [item for item in container.view if not type_filter or isinstance(item, type_filter)]
318323

319-
def wait_for_task(self, task, logger):
320-
""" wait for a vCenter task to finish
321-
:param task:
322-
:param logger:
323-
"""
324-
task_done = False
325-
while not task_done:
326-
if task.info.state == 'success':
327-
logger.info("Task succeeded: " + task.info.state)
328-
return task.info.result
329-
330-
if task.info.state == 'error':
331-
multi_msg = ''
332-
if task.info.error.faultMessage:
333-
multi_msg = ', '.join([err.message for err in task.info.error.faultMessage])
334-
multi_msg = multi_msg if multi_msg else task.info.error.msg
335-
logger.info(multi_msg)
336-
raise Exception(multi_msg)
337-
time.sleep(1)
338-
339324
class CloneVmParameters:
340325
"""
341326
This is clone_vm method params object
@@ -455,7 +440,7 @@ def clone_vm(self, clone_params, logger):
455440
logger.info("cloning VM...")
456441
try:
457442
task = template.Clone(folder=dest_folder, name=clone_params.vm_name, spec=clone_spec)
458-
vm = self.wait_for_task(task, logger)
443+
vm = self.task_waiter.wait_for_task(task=task, logger=logger, action_name='Clone VM')
459444

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

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

553538
task = vm.Destroy_Task()
554-
return self.wait_for_task(task, logger)
539+
return self.task_waiter.wait_for_task(task=task, logger=logger, action_name="Destroy VM")
555540

556541
def destroy_vm_by_name(self, si, vm_name, vm_path, logger):
557542
"""

package/cloudshell/tests/test_common/test_vcenter/test_task_waiter.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,21 @@ def test_wait_for_task(self):
3636

3737
self.assertEqual(res, result)
3838

39+
@patch('time.sleep', helper.change_to_success)
40+
def test_wait_for_queued_task(self):
41+
task.info = Mock(spec=vim.TaskInfo)
42+
task.info.state = vim.TaskInfo.State.queued
43+
result = 'result'
44+
task.info.result = result
45+
46+
waiter = SynchronousTaskWaiter()
47+
res = waiter.wait_for_task(task=task,
48+
logger=Mock(),
49+
action_name='job',
50+
hide_result=False)
51+
52+
self.assertEqual(res, result)
53+
3954
@patch('time.sleep', helper.change_to_success)
4055
def test_wait_for_task_result_none(self):
4156
task.info = Mock(spec=vim.TaskInfo)

0 commit comments

Comments
 (0)