Merge "Use AuthRef for some client fields"

This commit is contained in:
Jenkins
2013-06-15 21:41:23 +00:00
committed by Gerrit Code Review
4 changed files with 29 additions and 24 deletions

View File

@@ -18,7 +18,7 @@
import datetime import datetime
from keystoneclient.openstack.common import timeutils from keystoneclient.openstack.common import timeutils
from keystoneclient import service_catalog
# gap, in seconds, to determine whether the given token is about to expire # gap, in seconds, to determine whether the given token is about to expire
STALE_TOKEN_DURATION = 30 STALE_TOKEN_DURATION = 30
@@ -28,6 +28,14 @@ class AccessInfo(dict):
"""An object for encapsulating a raw authentication token from keystone """An object for encapsulating a raw authentication token from keystone
and helper methods for extracting useful values from that token.""" and helper methods for extracting useful values from that token."""
def __init__(self, *args, **kwargs):
super(AccessInfo, self).__init__(*args, **kwargs)
self.service_catalog = service_catalog.ServiceCatalog(
resource_dict=self, region_name=self.get('region_name'))
def has_service_catalog(self):
return 'serviceCatalog' in self
def will_expire_soon(self, stale_duration=None): def will_expire_soon(self, stale_duration=None):
""" Determines if expiration is about to occur. """ Determines if expiration is about to occur.

View File

@@ -324,6 +324,15 @@ class HTTPClient(object):
def serialize(self, entity): def serialize(self, entity):
return json.dumps(entity) return json.dumps(entity)
@property
def service_catalog(self):
"""Returns this client's service catalog."""
return self.auth_ref.service_catalog
def has_service_catalog(self):
"""Returns True if this client provides a service catalog."""
return self.auth_ref.has_service_catalog()
def request(self, url, method, **kwargs): def request(self, url, method, **kwargs):
""" Send an http request with the specified characteristics. """ Send an http request with the specified characteristics.

View File

@@ -16,7 +16,6 @@ import logging
from keystoneclient import client from keystoneclient import client
from keystoneclient import exceptions from keystoneclient import exceptions
from keystoneclient import service_catalog
from keystoneclient.v2_0 import ec2 from keystoneclient.v2_0 import ec2
from keystoneclient.v2_0 import endpoints from keystoneclient.v2_0 import endpoints
from keystoneclient.v2_0 import roles from keystoneclient.v2_0 import roles
@@ -133,11 +132,6 @@ class Client(client.HTTPClient):
if self.management_url is None: if self.management_url is None:
self.authenticate() self.authenticate()
#TODO(heckj): move to a method on auth_ref
def has_service_catalog(self):
"""Returns True if this client provides a service catalog."""
return hasattr(self, 'service_catalog')
def process_token(self): def process_token(self):
""" Extract and process information from the new auth_ref. """ Extract and process information from the new auth_ref.
@@ -147,12 +141,20 @@ class Client(client.HTTPClient):
# list of tenants for introspection, and leave to client user # list of tenants for introspection, and leave to client user
# to determine what to do. Otherwise, load up the service catalog # to determine what to do. Otherwise, load up the service catalog
if self.auth_ref.scoped: if self.auth_ref.scoped:
if not self.auth_ref.tenant_id:
raise exceptions.AuthorizationFailure(
"Token didn't provide tenant_id")
if not self.auth_ref.user_id:
raise exceptions.AuthorizationFailure(
"Token didn't provide user_id")
if self.management_url is None and self.auth_ref.management_url: if self.management_url is None and self.auth_ref.management_url:
self.management_url = self.auth_ref.management_url[0] self.management_url = self.auth_ref.management_url[0]
self.tenant_name = self.auth_ref.tenant_name self.tenant_name = self.auth_ref.tenant_name
self.tenant_id = self.auth_ref.tenant_id self.tenant_id = self.auth_ref.tenant_id
self.user_id = self.auth_ref.user_id self.user_id = self.auth_ref.user_id
self._extract_service_catalog(self.auth_url, self.auth_ref)
self.auth_user_id = self.auth_ref.user_id
self.auth_tenant_id = self.auth_ref.tenant_id
def get_raw_token_from_identity_service(self, auth_url, username=None, def get_raw_token_from_identity_service(self, auth_url, username=None,
password=None, tenant_name=None, password=None, tenant_name=None,
@@ -201,17 +203,3 @@ class Client(client.HTTPClient):
params['auth']['tenantName'] = tenant_name params['auth']['tenantName'] = tenant_name
resp, body = self.request(url, 'POST', body=params, headers=headers) resp, body = self.request(url, 'POST', body=params, headers=headers)
return body['access'] return body['access']
# TODO(heckj): remove entirely in favor of access.AccessInfo and
# associated methods
def _extract_service_catalog(self, url, body):
""" Set the client's service catalog from the response data. """
self.service_catalog = service_catalog.ServiceCatalog(
body, region_name=self.region_name)
try:
sc = self.service_catalog.get_token()
# Save these since we have them and they'll be useful later
self.auth_tenant_id = sc.get('tenant_id')
self.auth_user_id = sc.get('user_id')
except KeyError:
raise exceptions.AuthorizationFailure()

View File

@@ -6,7 +6,7 @@ wrong the tests might raise AssertionError. I've indicated in comments the
places where actual behavior differs from the spec. places where actual behavior differs from the spec.
""" """
from keystoneclient import service_catalog from keystoneclient import access
def assert_has_keys(dict, required=[], optional=[]): def assert_has_keys(dict, required=[], optional=[]):
@@ -67,7 +67,7 @@ class FakeClient(object):
cl_obj.auth_user_id = '1' cl_obj.auth_user_id = '1'
cl_obj.tenant_id = '1' cl_obj.tenant_id = '1'
cl_obj.auth_tenant_id = '1' cl_obj.auth_tenant_id = '1'
cl_obj.service_catalog = service_catalog.ServiceCatalog({ cl_obj.auth_ref = access.AccessInfo({
"token": { "token": {
"expires": "2012-02-05T00:00:00", "expires": "2012-02-05T00:00:00",
"id": "887665443383838", "id": "887665443383838",