From 44396c93b451cd09c64285c470e5f628a91af868 Mon Sep 17 00:00:00 2001 From: Radoslav Gerganov Date: Tue, 7 Aug 2018 12:26:34 +0300 Subject: Set request context when polling vCenter tasks There are various useful log messages which come when polling vCenter tasks which are missing request context and thus are hard to correlate to API requests. This patch fixes this by passing the request context to the async jobs which poll the vCenter tasks. Change-Id: I8efbc343e5073d3deb18b5f87c378c271ea4d816 --- lower-constraints.txt | 1 + oslo_vmware/api.py | 8 ++++++-- oslo_vmware/tests/test_api.py | 20 ++++++++++++++++---- requirements.txt | 1 + test-requirements.txt | 1 + 5 files changed, 25 insertions(+), 6 deletions(-) diff --git a/lower-constraints.txt b/lower-constraints.txt index c8b5333..c4088ea 100644 --- a/lower-constraints.txt +++ b/lower-constraints.txt @@ -29,6 +29,7 @@ netifaces==0.10.4 openstackdocstheme==1.18.1 oslo.concurrency==3.26.0 oslo.config==5.2.0 +oslo.context==2.19.2 oslo.i18n==3.15.3 oslo.utils==3.33.0 pbr==2.0.0 diff --git a/oslo_vmware/api.py b/oslo_vmware/api.py index 4224a96..a86ecef 100644 --- a/oslo_vmware/api.py +++ b/oslo_vmware/api.py @@ -24,6 +24,7 @@ in case of connection problems or server API call overload. import logging from oslo_concurrency import lockutils +from oslo_context import context from oslo_utils import excutils from oslo_utils import reflection import six @@ -390,12 +391,13 @@ class VMwareAPISession(object): :raises: VimException, VimFaultException, VimAttributeException, VimSessionOverLoadException, VimConnectionException """ - loop = loopingcall.FixedIntervalLoopingCall(self._poll_task, task) + ctx = context.get_current() + loop = loopingcall.FixedIntervalLoopingCall(self._poll_task, task, ctx) evt = loop.start(self._task_poll_interval) LOG.debug("Waiting for the task: %s to complete.", task) return evt.wait() - def _poll_task(self, task): + def _poll_task(self, task, ctx): """Poll the given task until completion. If the task completes successfully, the method returns the task info @@ -403,7 +405,9 @@ class VMwareAPISession(object): exception is set in the event. :param task: managed object reference of the task + :param ctx: request context for the corresponding task """ + 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 b3e11db..e555155 100644 --- a/oslo_vmware/tests/test_api.py +++ b/oslo_vmware/tests/test_api.py @@ -24,6 +24,7 @@ import mock import six import suds +from oslo_context import context from oslo_vmware import api from oslo_vmware import exceptions from oslo_vmware import pbm @@ -393,7 +394,10 @@ class VMwareAPISessionTest(base.TestCase): 'api') self.assertEqual(fault_list, ex.fault_list) - def test_wait_for_task(self): + @mock.patch.object(context, 'get_current') + def test_wait_for_task(self, mock_curr_ctx): + ctx = mock.Mock() + mock_curr_ctx.return_value = 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) @@ -420,8 +424,11 @@ class VMwareAPISessionTest(base.TestCase): skip_op_id=True) self.assertEqual(task_info_list_size, api_session.invoke_api.call_count) + mock_curr_ctx.assert_called_once() + self.assertEqual(3, ctx.update_store.call_count) - def test_wait_for_task_with_error_state(self): + @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) task_info_list = [('queued', 0), ('running', 40), ('error', -1)] task_info_list_size = len(task_info_list) @@ -446,8 +453,10 @@ class VMwareAPISessionTest(base.TestCase): skip_op_id=True) self.assertEqual(task_info_list_size, api_session.invoke_api.call_count) + mock_curr_ctx.assert_called_once() - def test_wait_for_task_with_invoke_api_exception(self): + @mock.patch.object(context, 'get_current') + def test_wait_for_task_with_invoke_api_exception(self, mock_curr_ctx): api_session = self._create_api_session(True) api_session.invoke_api = mock.Mock( side_effect=exceptions.VimException(None)) @@ -461,6 +470,7 @@ class VMwareAPISessionTest(base.TestCase): api_session.vim, task, 'info', skip_op_id=True) + mock_curr_ctx.assert_called_once() def test_wait_for_lease_ready(self): api_session = self._create_api_session(True) @@ -551,9 +561,11 @@ class VMwareAPISessionTest(base.TestCase): ): fake_task = mock.Mock() fake_task.value = 'task-1' + ctx = mock.Mock() self.assertRaises(expected_exception, api_session._poll_task, - fake_task) + fake_task, + ctx) def test_poll_task_well_known_exceptions(self): for k, v in six.iteritems(exceptions._fault_classes_registry): diff --git a/requirements.txt b/requirements.txt index fb82a56..472831a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -20,3 +20,4 @@ eventlet!=0.18.3,!=0.20.1,>=0.18.2 # MIT requests>=2.14.2 # Apache-2.0 urllib3>=1.21.1 # MIT oslo.concurrency>=3.26.0 # Apache-2.0 +oslo.context>=2.19.2 # Apache-2.0 diff --git a/test-requirements.txt b/test-requirements.txt index 6bd3fc0..044e616 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -22,3 +22,4 @@ reno>=2.5.0 # Apache-2.0 bandit>=1.1.0 # Apache-2.0 ddt>=1.0.1 # MIT +oslo.context>=2.19.2 # Apache-2.0 -- cgit v1.2.1