summaryrefslogtreecommitdiff
path: root/keystoneclient/httpclient.py
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2013-12-11 03:57:36 +0000
committerGerrit Code Review <review@openstack.org>2013-12-11 03:57:36 +0000
commit581265448cf40caddb71678a52335f8f0f49d45d (patch)
treed708853bb1e0662d1e9ac61185d86bc0fbfae8b5 /keystoneclient/httpclient.py
parentfd9673bd6a4a9acfccd1175826519a13a1036378 (diff)
parentd4c06d3035fa2910bc421d2196f2c0bf76f77cdb (diff)
downloadpython-keystoneclient-581265448cf40caddb71678a52335f8f0f49d45d.tar.gz
Merge "Properly handle Regions in keystoneclient"
Diffstat (limited to 'keystoneclient/httpclient.py')
-rw-r--r--keystoneclient/httpclient.py38
1 files changed, 23 insertions, 15 deletions
diff --git a/keystoneclient/httpclient.py b/keystoneclient/httpclient.py
index 9daeeb9..a0dcf24 100644
--- a/keystoneclient/httpclient.py
+++ b/keystoneclient/httpclient.py
@@ -139,6 +139,7 @@ class HTTPClient(object):
self.project_domain_id = None
self.project_domain_name = None
+ self.region_name = None
self.auth_url = None
self._endpoint = None
self._management_url = None
@@ -162,6 +163,8 @@ class HTTPClient(object):
self._management_url = self.auth_ref.management_url[0]
self.auth_token = self.auth_ref.auth_token
self.trust_id = self.auth_ref.trust_id
+ if self.auth_ref.has_service_catalog():
+ self.region_name = self.auth_ref.service_catalog.region_name
else:
self.auth_ref = None
@@ -218,7 +221,8 @@ class HTTPClient(object):
self.auth_token_from_user = None
if endpoint:
self._endpoint = endpoint.rstrip('/')
- self.region_name = region_name
+ if region_name:
+ self.region_name = region_name
if not session:
verify = cacert or True
@@ -304,7 +308,8 @@ class HTTPClient(object):
user_id=None, domain_name=None, domain_id=None,
project_name=None, project_id=None, user_domain_id=None,
user_domain_name=None, project_domain_id=None,
- project_domain_name=None, trust_id=None):
+ project_domain_name=None, trust_id=None,
+ region_name=None):
"""Authenticate user.
Uses the data provided at instantiation to authenticate against
@@ -363,6 +368,7 @@ class HTTPClient(object):
project_domain_name = project_domain_name or self.project_domain_name
trust_id = trust_id or self.trust_id
+ region_name = region_name or self.region_name
if not token:
token = self.auth_token_from_user
@@ -391,10 +397,14 @@ class HTTPClient(object):
new_token_needed = True
kwargs['password'] = password
resp, body = self.get_raw_token_from_identity_service(**kwargs)
- self.auth_ref = access.AccessInfo.factory(resp, body)
+
+ # TODO(jamielennox): passing region_name here is wrong but required
+ # for backwards compatibility. Deprecate and provide warning.
+ self.auth_ref = access.AccessInfo.factory(resp, body,
+ region_name=region_name)
else:
self.auth_ref = auth_ref
- self.process_token()
+ self.process_token(region_name=region_name)
if new_token_needed:
self.store_auth_ref_into_keyring(keyring_key)
return True
@@ -449,7 +459,7 @@ class HTTPClient(object):
except Exception as e:
_logger.warning("Failed to store token into keyring %s" % (e))
- def process_token(self):
+ def process_token(self, region_name=None):
"""Extract and process information from the new auth_ref.
And set the relevant authentication information.
@@ -461,8 +471,14 @@ class HTTPClient(object):
if not self.auth_ref.tenant_id:
raise exceptions.AuthorizationFailure(
"Token didn't provide tenant_id")
- if self.auth_ref.management_url:
- self._management_url = self.auth_ref.management_url[0]
+ try:
+ self._management_url = self.auth_ref.service_catalog.url_for(
+ service_type='identity',
+ endpoint_type='admin',
+ region_name=region_name or self.region_name)
+ except exceptions.EndpointNotFound:
+ _logger.warning("Failed to retrieve management_url from token")
+
self.project_name = self.auth_ref.tenant_name
self.project_id = self.auth_ref.tenant_id
@@ -511,14 +527,6 @@ class HTTPClient(object):
"""
raise NotImplementedError
- def _extract_service_catalog(self, url, body):
- """Set the client's service catalog from the response data.
-
- Not implemented here because data returned may be API
- version-specific.
- """
- raise NotImplementedError
-
def serialize(self, entity):
return jsonutils.dumps(entity)