summaryrefslogtreecommitdiff
path: root/keystoneclient/service_catalog.py
diff options
context:
space:
mode:
authorJamie Lennox <jamielennox@redhat.com>2014-03-05 15:19:57 +1000
committerJamie Lennox <jamielennox@redhat.com>2014-04-10 07:05:13 +1000
commit00c05a18fa1ce224020b4d3f84f7eba002c9f091 (patch)
tree7f0278c36d0f05382ba8b46678e49f460937dc79 /keystoneclient/service_catalog.py
parentebfaf10357a0ff5f635e9ff9092adae1338f7415 (diff)
downloadpython-keystoneclient-00c05a18fa1ce224020b4d3f84f7eba002c9f091.tar.gz
Add service name to catalog
The service catalog can contain names for the services. These names can be filtered on by other clients and are going to be required if we expect to use the keystoneclient service catalog in other clients. Change-Id: Iab69d67427ed40ce2f556f9a6348f4f1d9c26b5b
Diffstat (limited to 'keystoneclient/service_catalog.py')
-rw-r--r--keystoneclient/service_catalog.py66
1 files changed, 49 insertions, 17 deletions
diff --git a/keystoneclient/service_catalog.py b/keystoneclient/service_catalog.py
index 917c598..3018e34 100644
--- a/keystoneclient/service_catalog.py
+++ b/keystoneclient/service_catalog.py
@@ -84,11 +84,15 @@ class ServiceCatalog(object):
"""
def get_endpoints(self, service_type=None, endpoint_type=None,
- region_name=None):
+ region_name=None, service_name=None):
"""Fetch and filter endpoints for the specified service(s).
Returns endpoints for the specified service (or all) containing
- the specified type (or all) and region (or all).
+ the specified type (or all) and region (or all) and service name.
+
+ If there is no name in the service catalog the service_name check will
+ be skipped. This allows compatibility with services that existed
+ before the name was available in the catalog.
"""
endpoint_type = self._normalize_endpoint_type(endpoint_type)
region_name = region_name or self._region_name
@@ -104,6 +108,21 @@ class ServiceCatalog(object):
if service_type and service_type != st:
continue
+ # NOTE(jamielennox): service_name is different. It is not available
+ # in API < v3.3. If it is in the catalog then we enforce it, if it
+ # is not then we don't because the name could be correct we just
+ # don't have that information to check against.
+ if service_name:
+ try:
+ sn = service['name']
+ except KeyError:
+ # assume that we're in v3.0-v3.2 and don't have the name in
+ # the catalog. Skip the check.
+ pass
+ else:
+ if service_name != sn:
+ continue
+
sc[st] = []
for endpoint in service.get('endpoints', []):
@@ -117,13 +136,14 @@ class ServiceCatalog(object):
return sc
def _get_service_endpoints(self, attr, filter_value, service_type,
- endpoint_type, region_name):
+ endpoint_type, region_name, service_name):
"""Fetch the endpoints of a particular service_type and handle
the filtering.
"""
sc_endpoints = self.get_endpoints(service_type=service_type,
endpoint_type=endpoint_type,
- region_name=region_name)
+ region_name=region_name,
+ service_name=service_name)
try:
endpoints = sc_endpoints[service_type]
@@ -144,7 +164,7 @@ class ServiceCatalog(object):
@utils.positional(enforcement=utils.positional.WARN)
def get_urls(self, attr=None, filter_value=None,
service_type='identity', endpoint_type='publicURL',
- region_name=None):
+ region_name=None, service_name=None):
"""Fetch endpoint urls from the service catalog.
Fetch the endpoints from the service catalog for a particular
@@ -159,6 +179,7 @@ class ServiceCatalog(object):
internal or internalURL, admin or
adminURL
:param string region_name: Region of the endpoint.
+ :param string service_name: The assigned name of the service.
:returns: tuple of urls or None (if no match found)
"""
@@ -167,7 +188,7 @@ class ServiceCatalog(object):
@utils.positional(3, enforcement=utils.positional.WARN)
def url_for(self, attr=None, filter_value=None,
service_type='identity', endpoint_type='publicURL',
- region_name=None):
+ region_name=None, service_name=None):
"""Fetch an endpoint from the service catalog.
Fetch the specified endpoint from the service catalog for
@@ -177,6 +198,14 @@ class ServiceCatalog(object):
Valid endpoint types: `public` or `publicURL`,
`internal` or `internalURL`,
`admin` or 'adminURL`
+
+ :param string attr: Endpoint attribute name.
+ :param string filter_value: Endpoint attribute value.
+ :param string service_type: Service type of the endpoint.
+ :param string endpoint_type: Type of endpoint.
+ :param string region_name: Region of the endpoint.
+ :param string service_name: The assigned name of the service.
+ :
"""
if not self.get_data():
raise exceptions.EmptyCatalog('The service catalog is empty.')
@@ -185,19 +214,20 @@ class ServiceCatalog(object):
filter_value=filter_value,
service_type=service_type,
endpoint_type=endpoint_type,
- region_name=region_name)
+ region_name=region_name,
+ service_name=service_name)
try:
return urls[0]
except Exception:
pass
- msg = '%(endpoint)s endpoint for %(service)s%(region)s not found'
- region = ' in %s region' % region_name if region_name else ''
- msg = msg % {'endpoint': endpoint_type,
- 'service': service_type,
- 'region': region}
-
+ msg = '%s endpoint for %s service' % (endpoint_type, service_type)
+ if service_name:
+ msg += ' named %s' % service_name
+ if region_name:
+ msg += ' in %s region' % region_name
+ msg += ' not found'
raise exceptions.EndpointNotFound(msg)
@abc.abstractmethod
@@ -254,13 +284,14 @@ class ServiceCatalogV2(ServiceCatalog):
@utils.positional(enforcement=utils.positional.WARN)
def get_urls(self, attr=None, filter_value=None,
service_type='identity', endpoint_type='publicURL',
- region_name=None):
+ region_name=None, service_name=None):
endpoint_type = self._normalize_endpoint_type(endpoint_type)
endpoints = self._get_service_endpoints(attr=attr,
filter_value=filter_value,
service_type=service_type,
endpoint_type=endpoint_type,
- region_name=region_name)
+ region_name=region_name,
+ service_name=service_name)
if endpoints:
return tuple([endpoint[endpoint_type] for endpoint in endpoints])
@@ -319,12 +350,13 @@ class ServiceCatalogV3(ServiceCatalog):
@utils.positional(enforcement=utils.positional.WARN)
def get_urls(self, attr=None, filter_value=None,
service_type='identity', endpoint_type='public',
- region_name=None):
+ region_name=None, service_name=None):
endpoints = self._get_service_endpoints(attr=attr,
filter_value=filter_value,
service_type=service_type,
endpoint_type=endpoint_type,
- region_name=region_name)
+ region_name=region_name,
+ service_name=service_name)
if endpoints:
return tuple([endpoint['url'] for endpoint in endpoints])