summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZhiQiang Fan <zhiqiang.fan@huawei.com>2015-03-31 15:03:23 +0800
committergordon chung <gord@live.ca>2015-04-20 13:55:42 -0400
commit801f4b3e1b0f9a5f9e568659a912146ce35a47b4 (patch)
tree9b85044bfcfc6087a205d57d059c1eff6a965996
parente1439f5c726174d0ac69e328fe9ef760e00fdb4a (diff)
downloadpython-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.py4
-rw-r--r--ceilometerclient/tests/test_client.py13
-rw-r--r--ceilometerclient/tests/test_shell.py15
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):