Update Rackspace DNS driver to support 'region' argument.
Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/18baa686 Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/18baa686 Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/18baa686 Branch: refs/heads/trunk Commit: 18baa686a061aabee6d624995d74dd71eb50ce2d Parents: 0e7ffc9 Author: Tomaz Muraus <[email protected]> Authored: Mon Oct 14 22:34:24 2013 +0200 Committer: Tomaz Muraus <[email protected]> Committed: Mon Oct 14 22:35:19 2013 +0200 ---------------------------------------------------------------------- libcloud/storage/drivers/cloudfiles.py | 73 ++++++++++++--------------- libcloud/storage/types.py | 3 +- libcloud/test/storage/test_cloudfiles.py | 28 +++------- 3 files changed, 40 insertions(+), 64 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/libcloud/blob/18baa686/libcloud/storage/drivers/cloudfiles.py ---------------------------------------------------------------------- diff --git a/libcloud/storage/drivers/cloudfiles.py b/libcloud/storage/drivers/cloudfiles.py index 7505c20..b34be48 100644 --- a/libcloud/storage/drivers/cloudfiles.py +++ b/libcloud/storage/drivers/cloudfiles.py @@ -48,7 +48,7 @@ from libcloud.storage.types import InvalidContainerNameError from libcloud.common.openstack import OpenStackBaseConnection from libcloud.common.openstack import OpenStackDriverMixin -from libcloud.common.rackspace import AUTH_URL_US, AUTH_URL_UK +from libcloud.common.rackspace import AUTH_URL CDN_HOST = 'cdn.clouddrive.com' API_VERSION = 'v1.0' @@ -103,45 +103,39 @@ class CloudFilesConnection(OpenStackBaseConnection): responseCls = CloudFilesResponse rawResponseCls = CloudFilesRawResponse - def __init__(self, user_id, key, secure=True, auth_url=AUTH_URL_US, - **kwargs): + auth_url = AUTH_URL + _auth_version = '2.0' + + def __init__(self, user_id, key, secure=True, **kwargs): super(CloudFilesConnection, self).__init__(user_id, key, secure=secure, **kwargs) - self.auth_url = auth_url self.api_version = API_VERSION self.accept_format = 'application/json' self.cdn_request = False - if self._ex_force_service_region: - self.service_region = self._ex_force_service_region - def get_endpoint(self): - # First, we parse out both files and cdn endpoints - # for each auth version + region = self._ex_force_service_region.upper() + if '2.0' in self._auth_version: - eps = self.service_catalog.get_endpoints( + ep = self.service_catalog.get_endpoint( service_type='object-store', - name='cloudFiles') - cdn_eps = self.service_catalog.get_endpoints( + name='cloudFiles', + region=region) + cdn_ep = self.service_catalog.get_endpoint( service_type='object-store', - name='cloudFilesCDN') - elif ('1.1' in self._auth_version) or ('1.0' in self._auth_version): - eps = self.service_catalog.get_endpoints(name='cloudFiles') - cdn_eps = self.service_catalog.get_endpoints(name='cloudFilesCDN') + name='cloudFilesCDN', + region=region) + else: + raise LibcloudError( + 'Auth version "%s" not supported' % (self._auth_version)) # if this is a CDN request, return the cdn url instead if self.cdn_request: - eps = cdn_eps - - if self._ex_force_service_region: - eps = [ep for ep in eps if ep['region'].lower() == self._ex_force_service_region.lower()] + ep = cdn_ep - if len(eps) == 0: - # TODO: Better error message + if not ep: raise LibcloudError('Could not find specified endpoint') - ep = eps[0] - if 'publicURL' in ep: return ep['publicURL'] else: @@ -211,17 +205,15 @@ class CloudFilesStorageDriver(StorageDriver, OpenStackDriverMixin): :param region: ID of the region which should be used. :type region: ``str`` """ - if hasattr(self, '_region'): - region = self._region - # This is here for backard compatibility if 'ex_force_service_region' in kwargs: region = kwargs['ex_force_service_region'] OpenStackDriverMixin.__init__(self, (), **kwargs) super(CloudFilesStorageDriver, self).__init__(key=key, secret=secret, - secure=secure, host=host, - port=port, region=region, **kwargs) + secure=secure, host=host, + port=port, region=region, + **kwargs) def iterate_containers(self): response = self.connection.request('') @@ -656,7 +648,7 @@ class CloudFilesStorageDriver(StorageDriver, OpenStackDriverMixin): :rtype: ``list`` of :class:`Object` """ return list(self.iterate_container_objects(container, - ex_prefix=ex_prefix)) + ex_prefix=ex_prefix)) def iterate_container_objects(self, container, ex_prefix=None): """ @@ -820,15 +812,8 @@ class CloudFilesStorageDriver(StorageDriver, OpenStackDriverMixin): return obj def _ex_connection_class_kwargs(self): - kwargs = {'ex_force_service_region': self.region} - - if self.region == 'lon': - kwargs['auth_url'] = AUTH_URL_UK - else: - kwargs['auth_url'] = AUTH_URL_US - - base_kwargs = self.openstack_connection_kwargs() - kwargs.update(base_kwargs) + kwargs = self.openstack_connection_kwargs() + kwargs['ex_force_service_region'] = self.region return kwargs @@ -839,7 +824,10 @@ class CloudFilesUSStorageDriver(CloudFilesStorageDriver): type = Provider.CLOUDFILES_US name = 'CloudFiles (US)' - _region = 'ord' + + def __init__(self, *args, **kwargs): + kwargs['region'] = 'ord' + super(CloudFilesUSStorageDriver, self).__init__(*args, **kwargs) class CloudFilesSwiftStorageDriver(CloudFilesStorageDriver): @@ -868,7 +856,10 @@ class CloudFilesUKStorageDriver(CloudFilesStorageDriver): type = Provider.CLOUDFILES_UK name = 'CloudFiles (UK)' - _region = 'lon' + + def __init__(self, *args, **kwargs): + kwargs['region'] = 'lon' + super(CloudFilesUKStorageDriver, self).__init__(*args, **kwargs) class FileChunkReader(object): http://git-wip-us.apache.org/repos/asf/libcloud/blob/18baa686/libcloud/storage/types.py ---------------------------------------------------------------------- diff --git a/libcloud/storage/types.py b/libcloud/storage/types.py index bc2d0bf..6a0c82f 100644 --- a/libcloud/storage/types.py +++ b/libcloud/storage/types.py @@ -31,8 +31,7 @@ class Provider(object): Defines for each of the supported providers :cvar DUMMY: Example provider - :cvar CLOUDFILES_US: CloudFiles US - :cvar CLOUDFILES_UK: CloudFiles UK + :cvar CLOUDFILES: CloudFiles :cvar S3: Amazon S3 US :cvar S3_US_WEST: Amazon S3 US West (Northern California) :cvar S3_EU_WEST: Amazon S3 EU West (Ireland) http://git-wip-us.apache.org/repos/asf/libcloud/blob/18baa686/libcloud/test/storage/test_cloudfiles.py ---------------------------------------------------------------------- diff --git a/libcloud/test/storage/test_cloudfiles.py b/libcloud/test/storage/test_cloudfiles.py index f64f5a4..30efa12 100644 --- a/libcloud/test/storage/test_cloudfiles.py +++ b/libcloud/test/storage/test_cloudfiles.py @@ -130,7 +130,7 @@ class CloudFilesTests(unittest.TestCase): self.fail('Exception was not thrown') def test_service_catalog(self): - url = 'https://storage101.%s1.clouddrive.com/v1/MossoCloudFS' % \ + url = 'https://storage4.%s1.clouddrive.com/v1/MossoCloudFS' % \ (self.region) self.assertEqual( url, @@ -138,7 +138,7 @@ class CloudFilesTests(unittest.TestCase): self.driver.connection.cdn_request = True self.assertEqual( - 'https://cdn2.clouddrive.com/v1/MossoCloudFS', + 'https://cdn.clouddrive.com/v1/MossoCloudFS', self.driver.connection.get_endpoint()) self.driver.connection.cdn_request = False @@ -729,7 +729,7 @@ class CloudFilesTests(unittest.TestCase): "/v1/MossoCloudFS/foo_bar_container/foo_bar_object") sig = hmac.new(b('foo'), b(hmac_body), sha1).hexdigest() ret = self.driver.ex_get_object_temp_url(obj, 'GET') - temp_url = 'https://storage101.%s1.clouddrive.com/v1/MossoCloudFS/foo_bar_container/foo_bar_object?temp_url_expires=60&temp_url_sig=%s' % (self.region, sig) + temp_url = 'https://storage4.%s1.clouddrive.com/v1/MossoCloudFS/foo_bar_container/foo_bar_object?temp_url_expires=60&temp_url_sig=%s' % (self.region, sig) self.assertEqual(''.join(sorted(ret)), ''.join(sorted(temp_url))) @@ -767,24 +767,14 @@ class CloudFilesDeprecatedUKTests(CloudFilesTests): class CloudFilesMockHttp(StorageMockHttp, MockHttpTestCase): fixtures = StorageFileFixtures('cloudfiles') - auth_fixtures = OpenStackFixtures() base_headers = { 'content-type': 'application/json; charset=UTF-8'} # fake auth token response - def _v1_0(self, method, url, body, headers): + def _v2_0_tokens(self, method, url, body, headers): headers = copy.deepcopy(self.base_headers) - headers.update({ 'x-server-management-url': - 'https://servers.api.rackspacecloud.com/v1.0/slug', - 'x-auth-token': 'FE011C19', - 'x-cdn-management-url': - 'https://cdn.clouddrive.com/v1/MossoCloudFS', - 'x-storage-token': 'FE011C19', - 'x-storage-url': - 'https://storage4.clouddrive.com/v1/MossoCloudFS'}) - return (httplib.NO_CONTENT, - "", - headers, - httplib.responses[httplib.NO_CONTENT]) + body = self.fixtures.load('_v2_0__auth.json') + return (httplib.OK, body, headers, + httplib.responses[httplib.OK]) def _v1_MossoCloudFS_MALFORMED_JSON(self, method, url, body, headers): # test_invalid_json_throws_exception @@ -1026,10 +1016,6 @@ class CloudFilesMockHttp(StorageMockHttp, MockHttpTestCase): return (status_code, body, headers, httplib.responses[httplib.OK]) - def _v1_1_auth(self, method, url, body, headers): - body = self.auth_fixtures.load('_v1_1__auth.json') - return (httplib.OK, body, {'content-type': 'application/json; charset=UTF-8'}, httplib.responses[httplib.OK]) - class CloudFilesMockRawResponse(MockRawResponse):
