diff --git a/libcloud/common/openstack.py b/libcloud/common/openstack.py index 74b80f3..b409ee0 100644 --- a/libcloud/common/openstack.py +++ b/libcloud/common/openstack.py @@ -259,6 +259,19 @@ class OpenStackServiceCatalog(object): raise LibcloudError('auth version "%s" not supported' % (self._auth_version)) + def get_endpoints(self, service_type=None, name=None): + eps = [] + + if '2.0' in self._auth_version: + endpoints = self._service_catalog.get(service_type, {}).get(name, {}) + elif ('1.1' in self._auth_version) or ('1.0' in self._auth_version): + endpoints = self._service_catalog.get(name, {}) + + for key, value in endpoints.items(): + eps.append(value[0]) + + return eps + def get_endpoint(self, service_type=None, name=None, region=None): if '2.0' in self._auth_version: diff --git a/libcloud/storage/drivers/cloudfiles.py b/libcloud/storage/drivers/cloudfiles.py index ba4443d..8d9477b 100644 --- a/libcloud/storage/drivers/cloudfiles.py +++ b/libcloud/storage/drivers/cloudfiles.py @@ -113,23 +113,23 @@ class CloudFilesConnection(OpenStackBaseConnection): # First, we parse out both files and cdn endpoints # for each auth version if '2.0' in self._auth_version: - ep = self.service_catalog.get_endpoint(service_type='object-store', - name='cloudFiles', - region='ORD') - cdn_ep = self.service_catalog.get_endpoint( + eps = self.service_catalog.get_endpoints(service_type='object-store', + name='cloudFiles') + cdn_eps = self.service_catalog.get_endpoints( service_type='object-store', - name='cloudFilesCDN', - region='ORD') + name='cloudFilesCDN') elif ('1.1' in self._auth_version) or ('1.0' in self._auth_version): - ep = self.service_catalog.get_endpoint(name='cloudFiles', - region='ORD') - cdn_ep = self.service_catalog.get_endpoint(name='cloudFilesCDN', - region='ORD') + eps = self.service_catalog.get_endpoints(name='cloudFiles') + cdn_eps = self.service_catalog.get_endpoints(name='cloudFilesCDN') # if this is a CDN request, return the cdn url instead if cdn_request: - ep = cdn_ep + eps = cdn_eps + if len(eps) == 0: + raise LibcloudError('Could not find specified endpoint') + + ep = eps[0] if 'publicURL' in ep: return ep['publicURL'] else: diff --git a/test/storage/test_cloudfiles.py b/test/storage/test_cloudfiles.py index 6008ae8..3d914a6 100644 --- a/test/storage/test_cloudfiles.py +++ b/test/storage/test_cloudfiles.py @@ -101,6 +101,14 @@ class CloudFilesTests(unittest.TestCase): else: self.fail('Exception was not thrown') + def test_service_catalog(self): + self.assertEqual( + 'https://storage101.ord1.clouddrive.com/v1/MossoCloudFS', + self.driver.connection.get_endpoint()) + self.assertEqual( + 'https://cdn2.clouddrive.com/v1/MossoCloudFS', + self.driver.connection.get_endpoint(cdn_request=True)) + def test_list_containers(self): CloudFilesMockHttp.type = 'EMPTY' containers = self.driver.list_containers()