diff options
author | Zuul <zuul@review.openstack.org> | 2018-06-29 07:37:39 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2018-06-29 07:37:39 +0000 |
commit | eb97c69a3cada69845a1136661646851ec4a5ce0 (patch) | |
tree | 02477412f9172db6059a593e753f5060cbe9d7fd | |
parent | e8bb5f5e5d049bc07115fb6ddfd73a6e8202a325 (diff) | |
parent | 11908250549fed549169519d411394296fb4a57b (diff) | |
download | python-swiftclient-eb97c69a3cada69845a1136661646851ec4a5ce0.tar.gz |
Merge "Make OS_AUTH_URL work in DevStack by default"
-rw-r--r-- | swiftclient/client.py | 7 | ||||
-rw-r--r-- | tests/unit/test_swiftclient.py | 47 |
2 files changed, 53 insertions, 1 deletions
diff --git a/swiftclient/client.py b/swiftclient/client.py index 4518808..cc2a124 100644 --- a/swiftclient/client.py +++ b/swiftclient/client.py @@ -17,6 +17,7 @@ OpenStack Swift client library used internally """ import socket +import re import requests import logging import warnings @@ -38,6 +39,7 @@ from swiftclient.utils import ( # Default is 100, increase to 256 http_client._MAXHEADERS = 256 +VERSIONFUL_AUTH_PATH = re.compile('v[2-3](?:\.0)?$') AUTH_VERSIONS_V1 = ('1.0', '1', 1) AUTH_VERSIONS_V2 = ('2.0', '2', 2) AUTH_VERSIONS_V3 = ('3.0', '3', 3) @@ -555,7 +557,10 @@ def get_auth_keystone(auth_url, user, key, os_options, **kwargs): # Add the version suffix in case of versionless Keystone endpoints. If # auth_version is also unset it is likely that it is v3 - if len(urlparse(auth_url).path) <= 1: + if not VERSIONFUL_AUTH_PATH.match( + urlparse(auth_url).path.rstrip('/').rsplit('/', 1)[-1]): + # Normalize auth_url to end in a slash because urljoin + auth_url = auth_url.rstrip('/') + '/' if auth_version and auth_version in AUTH_VERSIONS_V2: auth_url = urljoin(auth_url, "v2.0") else: diff --git a/tests/unit/test_swiftclient.py b/tests/unit/test_swiftclient.py index 52153dc..009a026 100644 --- a/tests/unit/test_swiftclient.py +++ b/tests/unit/test_swiftclient.py @@ -597,6 +597,53 @@ class TestGetAuth(MockHttpTest): self.assertEqual('http://auth_url/v2.0', fake_ks.calls[0].get('auth_url')) + def test_get_auth_keystone_versionful(self): + fake_ks = FakeKeystone(endpoint='http://some_url', token='secret') + + with mock.patch('swiftclient.client._import_keystone_client', + _make_fake_import_keystone_client(fake_ks)): + c.get_auth_keystone('http://auth_url/v3', 'user', 'key', + {}, auth_version='3') + self.assertEqual(1, len(fake_ks.calls)) + self.assertEqual('http://auth_url/v3', + fake_ks.calls[0].get('auth_url')) + + def test_get_auth_keystone_devstack_versionful(self): + fake_ks = FakeKeystone( + endpoint='http://storage.example.com/v1/AUTH_user', token='secret') + with mock.patch('swiftclient.client._import_keystone_client', + _make_fake_import_keystone_client(fake_ks)): + c.get_auth_keystone('https://192.168.8.8/identity/v3', + 'user', 'key', {}, auth_version='3') + self.assertEqual(1, len(fake_ks.calls)) + self.assertEqual('https://192.168.8.8/identity/v3', + fake_ks.calls[0].get('auth_url')) + + def test_get_auth_keystone_devstack_versionless(self): + fake_ks = FakeKeystone( + endpoint='http://storage.example.com/v1/AUTH_user', token='secret') + with mock.patch('swiftclient.client._import_keystone_client', + _make_fake_import_keystone_client(fake_ks)): + c.get_auth_keystone('https://192.168.8.8/identity', + 'user', 'key', {}, auth_version='3') + self.assertEqual(1, len(fake_ks.calls)) + self.assertEqual('https://192.168.8.8/identity/v3', + fake_ks.calls[0].get('auth_url')) + + def test_auth_keystone_url_some_junk_nonsense(self): + fake_ks = FakeKeystone( + endpoint='http://storage.example.com/v1/AUTH_user', + token='secret') + with mock.patch('swiftclient.client._import_keystone_client', + _make_fake_import_keystone_client(fake_ks)): + c.get_auth_keystone('http://blah.example.com/v2moo', + 'user', 'key', {}, auth_version='3') + self.assertEqual(1, len(fake_ks.calls)) + # v2 looks sorta version-y, but it's not an exact match, so this is + # probably about just as bad as anything else we might guess at + self.assertEqual('http://blah.example.com/v2moo/v3', + fake_ks.calls[0].get('auth_url')) + def test_auth_with_session(self): mock_session = mock.MagicMock() mock_session.get_endpoint.return_value = 'http://storagehost/v1/acct' |