diff options
author | Christian Schwede <cschwede@redhat.com> | 2017-06-13 10:51:33 +0200 |
---|---|---|
committer | Christian Schwede <cschwede@redhat.com> | 2017-06-13 10:55:50 +0200 |
commit | 2ff3102cf779a507af8fa39296154a17a60f540a (patch) | |
tree | fb4e2cbe15d3b1f6f6324a16f1d7c4ee95829bca /swiftclient/client.py | |
parent | f18d070b0be3511ecb86c3299469024132561bc8 (diff) | |
download | python-swiftclient-2ff3102cf779a507af8fa39296154a17a60f540a.tar.gz |
Add support for versionless endpoints
Newer deployments are using versionless Keystone endpoints, and most
OpenStack clients already support this.
This patch enables this for Swift: if an auth_url without any path
component is found, it assumes a versionless endpoint will be used.
In this case the v3 suffix will be appended to the path if none
auth_version is set, and v2.0 is appended if auth_version requires v2.
Closes-Bug: 1554885
Related-Bug: 1691106
Change-Id: If7ecb67776cb77828f93ad8278cc5040015216b7
Diffstat (limited to 'swiftclient/client.py')
-rw-r--r-- | swiftclient/client.py | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/swiftclient/client.py b/swiftclient/client.py index 80b6eda..54d2c80 100644 --- a/swiftclient/client.py +++ b/swiftclient/client.py @@ -25,7 +25,7 @@ from distutils.version import StrictVersion from requests.exceptions import RequestException, SSLError from six.moves import http_client from six.moves.urllib.parse import quote as _quote, unquote -from six.moves.urllib.parse import urlparse, urlunparse +from six.moves.urllib.parse import urljoin, urlparse, urlunparse from time import sleep, time import six @@ -550,9 +550,22 @@ def get_auth_keystone(auth_url, user, key, os_options, **kwargs): insecure = kwargs.get('insecure', False) timeout = kwargs.get('timeout', None) - auth_version = kwargs.get('auth_version', '2.0') + auth_version = kwargs.get('auth_version', None) debug = logger.isEnabledFor(logging.DEBUG) + # 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 auth_version and auth_version in AUTH_VERSIONS_V2: + auth_url = urljoin(auth_url, "v2.0") + else: + auth_url = urljoin(auth_url, "v3") + auth_version = '3' + logger.debug("Versionless auth_url - using %s as endpoint" % auth_url) + + # Legacy default if not set + if auth_version is None: + auth_version = 'v2.0' ksclient, exceptions = _import_keystone_client(auth_version) try: |