summaryrefslogtreecommitdiff
path: root/openstackclient/api
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2015-01-19 18:08:53 +0000
committerGerrit Code Review <review@openstack.org>2015-01-19 18:08:53 +0000
commitc9c28dc31d09f34e341f504fea4e719a740fdf7c (patch)
tree43fa0e221b2b9ff1cb9ef41224eba31cc9fe115a /openstackclient/api
parentab247283779090228fe66affca4bdec5e7f7471d (diff)
parentd3b87d7795356d3c4e4b6f578a1f426a74f9afbd (diff)
downloadpython-openstackclient-c9c28dc31d09f34e341f504fea4e719a740fdf7c.tar.gz
Merge "Add version url config workaround"
Diffstat (limited to 'openstackclient/api')
-rw-r--r--openstackclient/api/auth.py46
1 files changed, 45 insertions, 1 deletions
diff --git a/openstackclient/api/auth.py b/openstackclient/api/auth.py
index fa196fa4..14bb01d7 100644
--- a/openstackclient/api/auth.py
+++ b/openstackclient/api/auth.py
@@ -16,11 +16,13 @@
import argparse
import logging
+from six.moves.urllib import parse as urlparse
import stevedore
from oslo.config import cfg
from keystoneclient.auth import base
+from keystoneclient.auth.identity.generic import password as ksc_password
from openstackclient.common import exceptions as exc
from openstackclient.common import utils
@@ -73,7 +75,7 @@ def select_auth_plugin(options):
auth_plugin_name = 'v2password'
else:
# let keystoneclient figure it out itself
- auth_plugin_name = 'password'
+ auth_plugin_name = 'osc_password'
elif options.os_token:
if options.os_identity_api_version == '3':
auth_plugin_name = 'v3token'
@@ -250,3 +252,45 @@ class TokenEndpoint(base.BaseAuthPlugin):
])
return options
+
+
+class OSCGenericPassword(ksc_password.Password):
+ """Auth plugin hack to work around broken Keystone configurations
+
+ The default Keystone configuration uses http://localhost:xxxx in
+ admin_endpoint and public_endpoint and are returned in the links.href
+ attribute by the version routes. Deployments that do not set these
+ are unusable with newer keystoneclient version discovery.
+
+ """
+
+ def create_plugin(self, session, version, url, raw_status=None):
+ """Handle default Keystone endpoint configuration
+
+ Build the actual API endpoint from the scheme, host and port of the
+ original auth URL and the rest from the returned version URL.
+ """
+
+ ver_u = urlparse.urlparse(url)
+
+ # Only hack this if it is the default setting
+ if ver_u.netloc.startswith('localhost'):
+ auth_u = urlparse.urlparse(self.auth_url)
+ # from original auth_url: scheme, netloc
+ # from api_url: path, query (basically, the rest)
+ url = urlparse.urlunparse((
+ auth_u.scheme,
+ auth_u.netloc,
+ ver_u.path,
+ ver_u.params,
+ ver_u.query,
+ ver_u.fragment,
+ ))
+ LOG.debug('Version URL updated: %s' % url)
+
+ return super(OSCGenericPassword, self).create_plugin(
+ session=session,
+ version=version,
+ url=url,
+ raw_status=raw_status,
+ )