From 8311708907604f473dbc56e10b9da61670540241 Mon Sep 17 00:00:00 2001 From: Sergey Kraynev Date: Fri, 21 Nov 2014 09:57:23 -0500 Subject: [PATCH] Using correct keyword for region in v3 Keystone v3 and v2 have different keywords in endpoint dictionary. This patch adds ability for keystone client for correct work with old and new API. Change-Id: I886b4c7ac3cbe08ac1b88f490e9ca92a90256961 Closes-Bug: #1364463 --- keystoneclient/fixture/v3.py | 3 +- keystoneclient/service_catalog.py | 6 +++- keystoneclient/tests/unit/test_fixtures.py | 3 +- .../tests/unit/v3/test_service_catalog.py | 28 +++++++++++++++++++ 4 files changed, 37 insertions(+), 3 deletions(-) diff --git a/keystoneclient/fixture/v3.py b/keystoneclient/fixture/v3.py index b4cd0df4b..4f3d1f14b 100644 --- a/keystoneclient/fixture/v3.py +++ b/keystoneclient/fixture/v3.py @@ -28,7 +28,8 @@ class _Service(dict): def add_endpoint(self, interface, url, region=None): data = {'interface': interface, 'url': url, - 'region': region} + 'region': region, + 'region_id': region} self.setdefault('endpoints', []).append(data) return data diff --git a/keystoneclient/service_catalog.py b/keystoneclient/service_catalog.py index 7c9085b36..e94268525 100644 --- a/keystoneclient/service_catalog.py +++ b/keystoneclient/service_catalog.py @@ -49,6 +49,9 @@ class ServiceCatalog(object): # to calls made to the service_catalog. Provide appropriate warning. return self._region_name + def _get_endpoint_region(self, endpoint): + return endpoint.get('region_id') or endpoint.get('region') + @abc.abstractmethod def get_token(self): """Fetch token details from service catalog. @@ -130,7 +133,8 @@ class ServiceCatalog(object): if (endpoint_type and not self._is_endpoint_type_match(endpoint, endpoint_type)): continue - if region_name and region_name != endpoint.get('region'): + if (region_name and + region_name != self._get_endpoint_region(endpoint)): continue sc[st].append(endpoint) diff --git a/keystoneclient/tests/unit/test_fixtures.py b/keystoneclient/tests/unit/test_fixtures.py index 8080c8238..f136e7020 100644 --- a/keystoneclient/tests/unit/test_fixtures.py +++ b/keystoneclient/tests/unit/test_fixtures.py @@ -233,5 +233,6 @@ class V3TokenTests(utils.TestCase): self.assertEqual(service_type, service['type']) for interface, url in six.iteritems(endpoints): - endpoint = {'interface': interface, 'url': url, 'region': region} + endpoint = {'interface': interface, 'url': url, + 'region': region, 'region_id': region} self.assertIn(endpoint, service['endpoints']) diff --git a/keystoneclient/tests/unit/v3/test_service_catalog.py b/keystoneclient/tests/unit/v3/test_service_catalog.py index a187302a3..da5e03659 100644 --- a/keystoneclient/tests/unit/v3/test_service_catalog.py +++ b/keystoneclient/tests/unit/v3/test_service_catalog.py @@ -216,3 +216,31 @@ class ServiceCatalogTest(utils.TestCase): self.assertRaises(exceptions.EndpointNotFound, ab_sc.url_for, service_type='compute', service_name='NotExist', endpoint_type='public') + + +class ServiceCatalogV3Test(ServiceCatalogTest): + + def test_building_a_service_catalog(self): + auth_ref = access.AccessInfo.factory(self.RESPONSE, + self.AUTH_RESPONSE_BODY) + sc = auth_ref.service_catalog + + self.assertEqual(sc.url_for(service_type='compute'), + 'https://compute.north.host/novapi/public') + self.assertEqual(sc.url_for(service_type='compute', + endpoint_type='internal'), + 'https://compute.north.host/novapi/internal') + + self.assertRaises(exceptions.EndpointNotFound, sc.url_for, 'region_id', + 'South', service_type='compute') + + def test_service_catalog_endpoints(self): + auth_ref = access.AccessInfo.factory(self.RESPONSE, + self.AUTH_RESPONSE_BODY) + sc = auth_ref.service_catalog + + public_ep = sc.get_endpoints(service_type='compute', + endpoint_type='public') + self.assertEqual(public_ep['compute'][0]['region_id'], 'North') + self.assertEqual(public_ep['compute'][0]['url'], + 'https://compute.north.host/novapi/public')