You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@libcloud.apache.org by to...@apache.org on 2014/08/04 20:45:26 UTC

git commit: Add utility get_regions and get_service_names function to the OpenStackServiceCatalog class.

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 <to...@apache.org>
Authored: Mon Aug 4 18:56:40 2014 +0200
Committer: Tomaz Muraus <to...@apache.org>
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