summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRadoslav Gerganov <rgerganov@vmware.com>2018-08-31 09:48:23 +0300
committerRadoslav Gerganov <rgerganov@vmware.com>2018-08-31 09:48:23 +0300
commita47f0d0c4f766219bf61d122205c05034a97399c (patch)
tree0ac93070106050e304d519557bc856eb4c246e4f
parent577dc74e442a1fd82b30d9edcc85bd5b3491f45a (diff)
downloadoslo-vmware-a47f0d0c4f766219bf61d122205c05034a97399c.tar.gz
Check if there is a context set before updating the store
There are cases when there is no request context set when calling an async task in vCenter. Don't update the local store in those cases. Change-Id: Ieef237bd5de0ad1c12afbf57426c29e3ca678dfc
-rw-r--r--oslo_vmware/api.py3
-rw-r--r--oslo_vmware/tests/test_api.py30
2 files changed, 32 insertions, 1 deletions
diff --git a/oslo_vmware/api.py b/oslo_vmware/api.py
index a86ecef..76cbeba 100644
--- a/oslo_vmware/api.py
+++ b/oslo_vmware/api.py
@@ -407,7 +407,8 @@ class VMwareAPISession(object):
:param task: managed object reference of the task
:param ctx: request context for the corresponding task
"""
- ctx.update_store()
+ if ctx is not None:
+ ctx.update_store()
try:
# we poll tasks too often, so skip logging the opID as it generates
# too much noise in the logs
diff --git a/oslo_vmware/tests/test_api.py b/oslo_vmware/tests/test_api.py
index e555155..4ec682c 100644
--- a/oslo_vmware/tests/test_api.py
+++ b/oslo_vmware/tests/test_api.py
@@ -427,6 +427,36 @@ class VMwareAPISessionTest(base.TestCase):
mock_curr_ctx.assert_called_once()
self.assertEqual(3, ctx.update_store.call_count)
+ @mock.patch.object(context, 'get_current', return_value=None)
+ def test_wait_for_task_no_ctx(self, mock_curr_ctx):
+ api_session = self._create_api_session(True)
+ task_info_list = [('queued', 0), ('running', 40), ('success', 100)]
+ task_info_list_size = len(task_info_list)
+
+ def invoke_api_side_effect(module, method, *args, **kwargs):
+ (state, progress) = task_info_list.pop(0)
+ task_info = mock.Mock()
+ task_info.progress = progress
+ task_info.queueTime = datetime(2016, 12, 6, 15, 29, 43, 79060)
+ task_info.completeTime = datetime(2016, 12, 6, 15, 29, 50, 79060)
+ task_info.state = state
+ return task_info
+
+ api_session.invoke_api = mock.Mock(side_effect=invoke_api_side_effect)
+ task = mock.Mock()
+ with mock.patch.object(greenthread, 'sleep'):
+ ret = api_session.wait_for_task(task)
+ self.assertEqual('success', ret.state)
+ self.assertEqual(100, ret.progress)
+ api_session.invoke_api.assert_called_with(vim_util,
+ 'get_object_property',
+ api_session.vim, task,
+ 'info',
+ skip_op_id=True)
+ self.assertEqual(task_info_list_size,
+ api_session.invoke_api.call_count)
+ mock_curr_ctx.assert_called_once()
+
@mock.patch.object(context, 'get_current')
def test_wait_for_task_with_error_state(self, mock_curr_ctx):
api_session = self._create_api_session(True)