diff --git a/keystoneclient/session.py b/keystoneclient/session.py index 32c30b7f8..61f12ea43 100644 --- a/keystoneclient/session.py +++ b/keystoneclient/session.py @@ -28,6 +28,22 @@ def request(url, method='GET', **kwargs): return Session().request(url, method=method, **kwargs) +class _FakeRequestSession(object): + """This object is a temporary hack that should be removed later. + + Keystoneclient has a cyclical dependency with its managers which is + preventing it from being cleaned up correctly. This is always bad but when + we switched to doing connection pooling this object wasn't getting cleaned + either and so we had left over TCP connections hanging around. + + Until we can fix the client cleanup we rollback the use of a requests + session and do individual connections like we used to. + """ + + def request(self, *args, **kwargs): + return requests.request(*args, **kwargs) + + class Session(object): user_agent = None @@ -75,7 +91,7 @@ class Session(object): for forever/never. (optional, default to 30) """ if not session: - session = requests.Session() + session = _FakeRequestSession() self.auth = auth self.session = session diff --git a/keystoneclient/tests/test_https.py b/keystoneclient/tests/test_https.py index 729f014b3..f9618be98 100644 --- a/keystoneclient/tests/test_https.py +++ b/keystoneclient/tests/test_https.py @@ -14,7 +14,6 @@ import mock import requests from keystoneclient import httpclient -from keystoneclient import session from keystoneclient.tests import utils @@ -50,7 +49,7 @@ class ClientTest(utils.TestCase): self.request_patcher.start() self.addCleanup(self.request_patcher.stop) - @mock.patch.object(session.requests.Session, 'request') + @mock.patch.object(requests, 'request') def test_get(self, MOCK_REQUEST): MOCK_REQUEST.return_value = FAKE_RESPONSE cl = get_authed_client() @@ -69,7 +68,7 @@ class ClientTest(utils.TestCase): # Automatic JSON parsing self.assertEqual(body, {"hi": "there"}) - @mock.patch.object(session.requests.Session, 'request') + @mock.patch.object(requests, 'request') def test_post(self, MOCK_REQUEST): MOCK_REQUEST.return_value = FAKE_RESPONSE cl = get_authed_client() @@ -86,7 +85,7 @@ class ClientTest(utils.TestCase): self.assertEqual(mock_kwargs['cert'], ('cert.pem', 'key.pem')) self.assertEqual(mock_kwargs['verify'], 'ca.pem') - @mock.patch.object(session.requests.Session, 'request') + @mock.patch.object(requests, 'request') def test_post_auth(self, MOCK_REQUEST): MOCK_REQUEST.return_value = FAKE_RESPONSE cl = httpclient.HTTPClient( diff --git a/keystoneclient/tests/test_shell.py b/keystoneclient/tests/test_shell.py index 2bf5eb862..da9875f6f 100644 --- a/keystoneclient/tests/test_shell.py +++ b/keystoneclient/tests/test_shell.py @@ -441,7 +441,7 @@ class ShellTest(utils.TestCase): 'endpoints': [], }) request_mock = mock.MagicMock(return_value=response_mock) - with mock.patch.object(session.requests.Session, 'request', + with mock.patch.object(session.requests, 'request', request_mock): shell(('--timeout 2 --os-token=blah --os-endpoint=blah' ' --os-auth-url=blah.com endpoint-list'))