diff options
author | Radoslav Gerganov <rgerganov@vmware.com> | 2018-08-31 09:48:23 +0300 |
---|---|---|
committer | Radoslav Gerganov <rgerganov@vmware.com> | 2018-08-31 09:48:23 +0300 |
commit | a47f0d0c4f766219bf61d122205c05034a97399c (patch) | |
tree | 0ac93070106050e304d519557bc856eb4c246e4f | |
parent | 577dc74e442a1fd82b30d9edcc85bd5b3491f45a (diff) | |
download | oslo-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.py | 3 | ||||
-rw-r--r-- | oslo_vmware/tests/test_api.py | 30 |
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) |