diff options
author | ZhiQiang Fan <zhiqiang.fan@huawei.com> | 2015-03-31 15:03:23 +0800 |
---|---|---|
committer | gordon chung <gord@live.ca> | 2015-04-20 13:55:42 -0400 |
commit | 801f4b3e1b0f9a5f9e568659a912146ce35a47b4 (patch) | |
tree | 9b85044bfcfc6087a205d57d059c1eff6a965996 | |
parent | e1439f5c726174d0ac69e328fe9ef760e00fdb4a (diff) | |
download | python-ceilometerclient-801f4b3e1b0f9a5f9e568659a912146ce35a47b4.tar.gz |
Add timeout for keystoneclient session
Currently, we only apply timeout on ceilometer api, but not on keystone
api as well, this is not consistent. Keystone api may be slow, or worse,
stuck, then ceilometerclient will not return timely. This issue has caused
availability problem in our environment when ceilometer alarm service
has been running for a long time.
Change-Id: I0d5f82ff9cf4132a1de2f0b649908483326e116e
Closes-Bug: #1436249
(cherry picked from commit 44af2d4087815d5d451305b549f91ab6130528c0)
-rw-r--r-- | ceilometerclient/client.py | 4 | ||||
-rw-r--r-- | ceilometerclient/tests/test_client.py | 13 | ||||
-rw-r--r-- | ceilometerclient/tests/test_shell.py | 15 |
3 files changed, 29 insertions, 3 deletions
diff --git a/ceilometerclient/client.py b/ceilometerclient/client.py index 78b4059..0df6822 100644 --- a/ceilometerclient/client.py +++ b/ceilometerclient/client.py @@ -66,6 +66,7 @@ def _get_keystone_session(**kwargs): auth_url = kwargs.pop('auth_url', None) project_id = kwargs.pop('project_id', None) project_name = kwargs.pop('project_name', None) + timeout = kwargs.get('timeout') if insecure: verify = False @@ -78,7 +79,7 @@ def _get_keystone_session(**kwargs): cert = (cert, key) # create the keystone client session - ks_session = session.Session(verify=verify, cert=cert) + ks_session = session.Session(verify=verify, cert=cert, timeout=timeout) v2_auth_url, v3_auth_url = _discover_auth_versions(ks_session, auth_url) username = kwargs.pop('username', None) @@ -180,6 +181,7 @@ class AuthPlugin(auth.BaseAuthPlugin): self.opts.get('insecure')), 'endpoint_type': self.opts.get('endpoint_type'), 'region_name': self.opts.get('region_name'), + 'timeout': http_client.timeout, } # retrieve session diff --git a/ceilometerclient/tests/test_client.py b/ceilometerclient/tests/test_client.py index b5ec4c3..56fa298 100644 --- a/ceilometerclient/tests/test_client.py +++ b/ceilometerclient/tests/test_client.py @@ -12,6 +12,7 @@ import types +from keystoneclient import session as ks_session import mock from ceilometerclient import client @@ -135,6 +136,18 @@ class ClientTest(utils.BaseTestCase): def test_v2_client_timeout_valid_value(self): self._test_v2_client_timeout_integer(30, 30) + @mock.patch.object(ks_session, 'Session') + def test_v2_client_timeout_keystone_seesion(self, mocked_session): + mocked_session.side_effect = RuntimeError('Stop!') + env = FAKE_ENV.copy() + env['timeout'] = 5 + del env['auth_plugin'] + del env['token'] + client = self.create_client(env) + self.assertRaises(RuntimeError, client.alarms.list) + args, kwargs = mocked_session.call_args + self.assertEqual(5, kwargs['timeout']) + def test_v2_client_cacert_in_verify(self): env = FAKE_ENV.copy() env['cacert'] = '/path/to/cacert' diff --git a/ceilometerclient/tests/test_shell.py b/ceilometerclient/tests/test_shell.py index c3a138e..078191f 100644 --- a/ceilometerclient/tests/test_shell.py +++ b/ceilometerclient/tests/test_shell.py @@ -176,6 +176,15 @@ class ShellTimeoutTest(ShellTestBase): '0 must be greater than 0') self._test_timeout('0', expected_msg) + @mock.patch.object(ks_session, 'Session') + def test_timeout_kesytone_session(self, mocked_session): + mocked_session.side_effect = exc.HTTPUnauthorized("FAIL") + self.make_env(FAKE_V2_ENV) + args = ['--debug', '--timeout', '5', 'alarm-list'] + self.assertRaises(exc.CommandError, ceilometer_shell.main, args) + args, kwargs = mocked_session.call_args + self.assertEqual(5, kwargs.get('timeout')) + class ShellInsecureTest(ShellTestBase): @@ -193,7 +202,8 @@ class ShellInsecureTest(ShellTestBase): self.make_env(FAKE_V2_ENV) args = ['--debug', '--os-insecure', 'true', 'alarm-list'] self.assertRaises(exc.CommandError, ceilometer_shell.main, args) - mocked_session.assert_called_with(verify=False, cert='') + args, kwargs = mocked_session.call_args + self.assertEqual(False, kwargs.get('verify')) @mock.patch.object(api_client, 'HTTPClient') def test_insecure_false_ceilometer(self, mocked_client): @@ -209,7 +219,8 @@ class ShellInsecureTest(ShellTestBase): self.make_env(FAKE_V2_ENV) args = ['--debug', '--os-insecure', 'false', 'alarm-list'] self.assertRaises(exc.CommandError, ceilometer_shell.main, args) - mocked_session.assert_called_with(verify=True, cert='') + args, kwargs = mocked_session.call_args + self.assertEqual(True, kwargs.get('verify')) class ShellEndpointTest(ShellTestBase): |