diff --git a/keystoneclient/exceptions.py b/keystoneclient/exceptions.py index f992ff306..802d3966d 100644 --- a/keystoneclient/exceptions.py +++ b/keystoneclient/exceptions.py @@ -24,6 +24,11 @@ class EndpointNotFound(Exception): pass +class EmptyCatalog(Exception): + """ The service catalog is empty. """ + pass + + class ClientException(Exception): """ The base exception class for all exceptions this library raises. diff --git a/keystoneclient/service_catalog.py b/keystoneclient/service_catalog.py index 5f20e0f38..cbe5c5de2 100644 --- a/keystoneclient/service_catalog.py +++ b/keystoneclient/service_catalog.py @@ -61,6 +61,9 @@ class ServiceCatalog(object): """ catalog = self.catalog.get('serviceCatalog', []) + if not catalog: + raise exceptions.EmptyCatalog('The service catalog is empty.') + for service in catalog: if service['type'] != service_type: continue diff --git a/keystoneclient/v2_0/client.py b/keystoneclient/v2_0/client.py index cc06d23b6..02fd59b6f 100644 --- a/keystoneclient/v2_0/client.py +++ b/keystoneclient/v2_0/client.py @@ -122,8 +122,6 @@ class Client(client.HTTPClient): sc = self.service_catalog.get_token() self.auth_token = sc['id'] # Save these since we have them and they'll be useful later - # NOTE(termie): these used to be in the token and then were removed - # ... why? self.auth_tenant_id = sc.get('tenant_id') self.auth_user_id = sc.get('user_id') except KeyError: @@ -136,6 +134,7 @@ class Client(client.HTTPClient): self.management_url = self.service_catalog.url_for( attr='region', filter_value=self.region_name, endpoint_type='adminURL') - except: - # Unscoped tokens don't return a service catalog - _logger.exception("unable to retrieve service catalog with token") + except exceptions.EmptyCatalog: + # Unscoped tokens don't return a service catalog; + # allow those to pass while any other errors bubble up. + pass