Repository: libcloud Updated Branches: refs/heads/trunk 63b8045b0 -> 7132cb223
Add utility get_regions and get_service_names function to the OpenStackServiceCatalog class. Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/7132cb22 Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/7132cb22 Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/7132cb22 Branch: refs/heads/trunk Commit: 7132cb2234f4e90664e2808f6ddd16fa23bcdb8c Parents: 63b8045 Author: Tomaz Muraus <[email protected]> Authored: Mon Aug 4 18:56:40 2014 +0200 Committer: Tomaz Muraus <[email protected]> Committed: Mon Aug 4 20:36:30 2014 +0200 ---------------------------------------------------------------------- CHANGES.rst | 4 +++ libcloud/common/openstack.py | 44 ++++++++++++++++++++++++++++ libcloud/test/compute/test_openstack.py | 32 ++++++++++++++++---- 3 files changed, 74 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/libcloud/blob/7132cb22/CHANGES.rst ---------------------------------------------------------------------- diff --git a/CHANGES.rst b/CHANGES.rst index 6de450b..92980a8 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -33,6 +33,10 @@ Compute (GITHUB-339) [Eric Johnson] +- Add utility ``get_regions`` and ``get_service_names`` methods to the + ``OpenStackServiceCatalog`` class. + [Andrew Mann, Tomaz Muraus] + Loadbalancer ~~~~~~~~~~~~ http://git-wip-us.apache.org/repos/asf/libcloud/blob/7132cb22/libcloud/common/openstack.py ---------------------------------------------------------------------- diff --git a/libcloud/common/openstack.py b/libcloud/common/openstack.py index 26bf692..73bd27e 100644 --- a/libcloud/common/openstack.py +++ b/libcloud/common/openstack.py @@ -378,6 +378,50 @@ class OpenStackServiceCatalog(object): else: return {} + def get_regions(self): + """ + Retrieve a list of all the available regions. + + :rtype: ``list`` of ``str`` + """ + regions = set() + + catalog_items = self._service_catalog.items() + + if '2.0' in self._auth_version: + for service_type, services_by_name in catalog_items: + items = services_by_name.items() + for service_name, endpoints_by_region in items: + for region in endpoints_by_region.keys(): + if region: + regions.add(region) + elif ('1.1' in self._auth_version) or ('1.0' in self._auth_version): + for service_name, endpoints_by_region in catalog_items: + for region in endpoints_by_region.keys(): + if region: + regions.add(region) + + return list(regions) + + def get_service_names(self, service_type, region=None): + """ + Retrieve list of service names that match service type and region + + :rtype: ``list`` of ``str`` + """ + names = set() + + if '2.0' in self._auth_version: + named_entries = self._service_catalog.get(service_type, {}) + for (name, region_entries) in named_entries.items(): + # Support None for region to return the first found + if region is None or region in region_entries.keys(): + names.add(name) + else: + raise ValueError('Unsupported version: %s' % (self._auth_version)) + + return list(names) + def _parse_auth_v1(self, service_catalog): for service, endpoints in service_catalog.items(): http://git-wip-us.apache.org/repos/asf/libcloud/blob/7132cb22/libcloud/test/compute/test_openstack.py ---------------------------------------------------------------------- diff --git a/libcloud/test/compute/test_openstack.py b/libcloud/test/compute/test_openstack.py index 6f5af3c..e097128 100644 --- a/libcloud/test/compute/test_openstack.py +++ b/libcloud/test/compute/test_openstack.py @@ -92,26 +92,46 @@ class OpenStackServiceCatalogTests(unittest.TestCase): OpenStackBaseConnection.conn_classes = (OpenStackMockHttp, OpenStackMockHttp) - def test_connection_get_service_catalog(self): connection = OpenStackBaseConnection(*OPENSTACK_PARAMS) connection.auth_url = "https://auth.api.example.com" connection._ex_force_base_url = "https://www.foo.com" connection.driver = OpenStack_1_0_NodeDriver(*OPENSTACK_PARAMS) - result = connection.get_service_catalog() - catalog = result.get_catalog() - endpoints = result.get_endpoints('cloudFilesCDN', 'cloudFilesCDN') - public_urls = result.get_public_urls('cloudFilesCDN', 'cloudFilesCDN') + self.service_catalog = connection.get_service_catalog() + self.catalog = self.service_catalog.get_catalog() + + def test_connection_get_service_catalog(self): + endpoints = self.service_catalog.get_endpoints('cloudFilesCDN', 'cloudFilesCDN') + public_urls = self.service_catalog.get_public_urls('cloudFilesCDN', 'cloudFilesCDN') expected_urls = [ 'https://cdn2.clouddrive.com/v1/MossoCloudFS', 'https://cdn2.clouddrive.com/v1/MossoCloudFS' ] - self.assertTrue('cloudFilesCDN' in catalog) + self.assertTrue('cloudFilesCDN' in self.catalog) self.assertEqual(len(endpoints), 2) self.assertEqual(public_urls, expected_urls) + def test_get_regions(self): + regions = self.service_catalog.get_regions() + self.assertEqual(regions, ['ORD', 'LON']) + + def test_get_service_names(self): + OpenStackBaseConnection.conn_classes = (OpenStack_2_0_MockHttp, + OpenStack_2_0_MockHttp) + OpenStackBaseConnection._auth_version = '2.0' + + connection = OpenStackBaseConnection(*OPENSTACK_PARAMS) + connection.auth_url = "https://auth.api.example.com" + connection._ex_force_base_url = "https://www.foo.com" + connection.driver = OpenStack_1_0_NodeDriver(*OPENSTACK_PARAMS) + + service_catalog = connection.get_service_catalog() + + service_names = service_catalog.get_service_names(service_type='object-store') + self.assertEqual(service_names, ['cloudFiles']) + class OpenStackAuthConnectionTests(unittest.TestCase): # TODO refactor and move into libcloud/test/common
