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 2012/12/09 06:42:25 UTC
svn commit: r1418817 - in /libcloud/trunk: ./ libcloud/compute/drivers/
libcloud/storage/ libcloud/storage/drivers/
libcloud/test/compute/fixtures/openstack/ libcloud/test/storage/
Author: tomaz
Date: Sun Dec 9 05:42:24 2012
New Revision: 1418817
URL: http://svn.apache.org/viewvc?rev=1418817&view=rev
Log:
Deprecate CLOUDFILES_US and CLOUDFILES_UK storage provider constants and
add a new CLOUDFILES constant.
Driver referenced by this constant takes a "datacenter" keyword argument
and can be one of 'ord', 'dfw' or 'lon'.
Note: Deprecated constants will continue to work for the foreseeable
future.
Modified:
libcloud/trunk/CHANGES
libcloud/trunk/libcloud/compute/drivers/ec2.py
libcloud/trunk/libcloud/storage/drivers/cloudfiles.py
libcloud/trunk/libcloud/storage/providers.py
libcloud/trunk/libcloud/storage/types.py
libcloud/trunk/libcloud/test/compute/fixtures/openstack/_v1_1__auth.json
libcloud/trunk/libcloud/test/compute/fixtures/openstack/_v2_0__auth.json
libcloud/trunk/libcloud/test/storage/test_cloudfiles.py
Modified: libcloud/trunk/CHANGES
URL: http://svn.apache.org/viewvc/libcloud/trunk/CHANGES?rev=1418817&r1=1418816&r2=1418817&view=diff
==============================================================================
--- libcloud/trunk/CHANGES (original)
+++ libcloud/trunk/CHANGES Sun Dec 9 05:42:24 2012
@@ -85,6 +85,15 @@ Changes with Apache Libcloud in developm
(LIBCLOUD-267)
[Tomaz Muraus]
+ - Deprecate CLOUDFILES_US and CLOUDFILES_UK storage provider constants and
+ add a new CLOUDFILES constant.
+ Driver referenced by this constant takes a "datacenter" keyword argument
+ and can be one of 'ord', 'dfw' or 'lon'.
+
+ Note: Deprecated constants will continue to work for the foreseeable
+ future.
+ [Tomaz Muraus]
+
*) DNS
- Update 'if type' checks in the update_record methods to behave correctly
Modified: libcloud/trunk/libcloud/compute/drivers/ec2.py
URL: http://svn.apache.org/viewvc/libcloud/trunk/libcloud/compute/drivers/ec2.py?rev=1418817&r1=1418816&r2=1418817&view=diff
==============================================================================
--- libcloud/trunk/libcloud/compute/drivers/ec2.py (original)
+++ libcloud/trunk/libcloud/compute/drivers/ec2.py Sun Dec 9 05:42:24 2012
@@ -1403,7 +1403,6 @@ class EC2NodeDriver(BaseEC2NodeDriver):
def __init__(self, key, secret=None, secure=True, host=None, port=None,
datacenter='us-east-1', **kwargs):
-
if hasattr(self, '_datacenter'):
datacenter = self._datacenter
Modified: libcloud/trunk/libcloud/storage/drivers/cloudfiles.py
URL: http://svn.apache.org/viewvc/libcloud/trunk/libcloud/storage/drivers/cloudfiles.py?rev=1418817&r1=1418816&r2=1418817&view=diff
==============================================================================
--- libcloud/trunk/libcloud/storage/drivers/cloudfiles.py (original)
+++ libcloud/trunk/libcloud/storage/drivers/cloudfiles.py Sun Dec 9 05:42:24 2012
@@ -101,13 +101,14 @@ class CloudFilesConnection(OpenStackBase
Base connection class for the Cloudfiles driver.
"""
- auth_url = AUTH_URL_US
responseCls = CloudFilesResponse
rawResponseCls = CloudFilesRawResponse
- def __init__(self, user_id, key, secure=True, **kwargs):
+ def __init__(self, user_id, key, secure=True, auth_url=AUTH_URL_US,
+ **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
@@ -130,10 +131,15 @@ class CloudFilesConnection(OpenStackBase
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()]
+
if len(eps) == 0:
+ # TODO: Better error message
raise LibcloudError('Could not find specified endpoint')
ep = eps[0]
+
if 'publicURL' in ep:
return ep['publicURL']
else:
@@ -159,22 +165,6 @@ class CloudFilesConnection(OpenStackBase
raw=raw)
-class CloudFilesUSConnection(CloudFilesConnection):
- """
- Connection class for the Cloudfiles US endpoint.
- """
-
- auth_url = AUTH_URL_US
-
-
-class CloudFilesUKConnection(CloudFilesConnection):
- """
- Connection class for the Cloudfiles UK endpoint.
- """
-
- auth_url = AUTH_URL_UK
-
-
class CloudFilesSwiftConnection(CloudFilesConnection):
"""
Connection class for the Cloudfiles Swift endpoint.
@@ -202,10 +192,7 @@ class CloudFilesSwiftConnection(CloudFil
class CloudFilesStorageDriver(StorageDriver, OpenStackDriverMixin):
"""
- Base CloudFiles driver.
-
- You should never create an instance of this class directly but use US/US
- class.
+ CloudFiles driver.
"""
name = 'CloudFiles'
website = 'http://www.rackspace.com/'
@@ -214,9 +201,27 @@ class CloudFilesStorageDriver(StorageDri
hash_type = 'md5'
supports_chunked_encoding = True
- def __init__(self, *args, **kwargs):
- OpenStackDriverMixin.__init__(self, *args, **kwargs)
- super(CloudFilesStorageDriver, self).__init__(*args, **kwargs)
+ def __init__(self, key, secret=None, secure=True, host=None, port=None,
+ datacenter='ord', **kwargs):
+ """
+ @inherits: L{StorageDriver.__init__}
+
+ @param datacenter: Datacenter ID which should be used.
+ @type datacenter: C{str}
+ """
+ if hasattr(self, '_datacenter'):
+ datacenter = self._datacenter
+
+ # This is here for backard compatibility
+ if 'ex_force_service_region' in kwargs:
+ datacenter = kwargs['ex_force_service_region']
+
+ self.datacenter = datacenter
+
+ OpenStackDriverMixin.__init__(self, (), **kwargs)
+ super(CloudFilesStorageDriver, self).__init__(key=key, secret=secret,
+ secure=secure, host=host,
+ port=port, **kwargs)
def iterate_containers(self):
response = self.connection.request('')
@@ -781,7 +786,15 @@ class CloudFilesStorageDriver(StorageDri
return obj
def _ex_connection_class_kwargs(self):
- return self.openstack_connection_kwargs()
+ kwargs = {'ex_force_service_region': self.datacenter}
+
+ if self.datacenter in ['dfw', 'ord']:
+ kwargs['auth_url'] = AUTH_URL_US
+ elif self.datacenter == 'lon':
+ kwargs['auth_url'] = AUTH_URL_UK
+
+ kwargs.update(self.openstack_connection_kwargs())
+ return kwargs
class CloudFilesUSStorageDriver(CloudFilesStorageDriver):
@@ -791,7 +804,7 @@ class CloudFilesUSStorageDriver(CloudFil
type = Provider.CLOUDFILES_US
name = 'CloudFiles (US)'
- connectionCls = CloudFilesUSConnection
+ _datacenter = 'ord'
class CloudFilesSwiftStorageDriver(CloudFilesStorageDriver):
@@ -820,7 +833,7 @@ class CloudFilesUKStorageDriver(CloudFil
type = Provider.CLOUDFILES_UK
name = 'CloudFiles (UK)'
- connectionCls = CloudFilesUKConnection
+ _datacenter = 'lon'
class FileChunkReader(object):
@@ -872,7 +885,7 @@ class ChunkStreamReader(object):
raise StopIteration
block_size = self.chunk_size
- if self.bytes_read + block_size >\
+ if self.bytes_read + block_size > \
self.end_block - self.start_block:
block_size = self.end_block - self.start_block - self.bytes_read
self.stop_iteration = True
Modified: libcloud/trunk/libcloud/storage/providers.py
URL: http://svn.apache.org/viewvc/libcloud/trunk/libcloud/storage/providers.py?rev=1418817&r1=1418816&r2=1418817&view=diff
==============================================================================
--- libcloud/trunk/libcloud/storage/providers.py (original)
+++ libcloud/trunk/libcloud/storage/providers.py Sun Dec 9 05:42:24 2012
@@ -20,10 +20,8 @@ from libcloud.storage.types import Provi
DRIVERS = {
Provider.DUMMY:
('libcloud.storage.drivers.dummy', 'DummyStorageDriver'),
- Provider.CLOUDFILES_US:
- ('libcloud.storage.drivers.cloudfiles', 'CloudFilesUSStorageDriver'),
- Provider.CLOUDFILES_UK:
- ('libcloud.storage.drivers.cloudfiles', 'CloudFilesUKStorageDriver'),
+ Provider.CLOUDFILES:
+ ('libcloud.storage.drivers.cloudfiles', 'CloudFilesStorageDriver'),
Provider.S3:
('libcloud.storage.drivers.s3', 'S3StorageDriver'),
Provider.S3_US_WEST:
@@ -46,7 +44,13 @@ DRIVERS = {
Provider.NIMBUS:
('libcloud.storage.drivers.nimbus', 'NimbusStorageDriver'),
Provider.LOCAL:
- ('libcloud.storage.drivers.local', 'LocalStorageDriver')
+ ('libcloud.storage.drivers.local', 'LocalStorageDriver'),
+
+ # Deprecated
+ Provider.CLOUDFILES_US:
+ ('libcloud.storage.drivers.cloudfiles', 'CloudFilesUSStorageDriver'),
+ Provider.CLOUDFILES_UK:
+ ('libcloud.storage.drivers.cloudfiles', 'CloudFilesUKStorageDriver')
}
Modified: libcloud/trunk/libcloud/storage/types.py
URL: http://svn.apache.org/viewvc/libcloud/trunk/libcloud/storage/types.py?rev=1418817&r1=1418816&r2=1418817&view=diff
==============================================================================
--- libcloud/trunk/libcloud/storage/types.py (original)
+++ libcloud/trunk/libcloud/storage/types.py Sun Dec 9 05:42:24 2012
@@ -45,8 +45,6 @@ class Provider(object):
@cvar LOCAL: Local storage driver
"""
DUMMY = 'dummy'
- CLOUDFILES_US = 'cloudfiles_us'
- CLOUDFILES_UK = 'cloudfiles_uk'
S3 = 's3'
S3_US_WEST = 's3_us_west'
S3_EU_WEST = 's3_eu_west'
@@ -58,6 +56,11 @@ class Provider(object):
CLOUDFILES_SWIFT = 'cloudfiles_swift'
NIMBUS = 'nimbus'
LOCAL = 'local'
+ CLOUDFILES = 'cloudfiles'
+
+ # Deperecated
+ CLOUDFILES_US = 'cloudfiles_us'
+ CLOUDFILES_UK = 'cloudfiles_uk'
class ContainerError(LibcloudError):
Modified: libcloud/trunk/libcloud/test/compute/fixtures/openstack/_v1_1__auth.json
URL: http://svn.apache.org/viewvc/libcloud/trunk/libcloud/test/compute/fixtures/openstack/_v1_1__auth.json?rev=1418817&r1=1418816&r2=1418817&view=diff
==============================================================================
--- libcloud/trunk/libcloud/test/compute/fixtures/openstack/_v1_1__auth.json (original)
+++ libcloud/trunk/libcloud/test/compute/fixtures/openstack/_v1_1__auth.json Sun Dec 9 05:42:24 2012
@@ -10,6 +10,11 @@
"region": "ORD",
"publicURL": "https://cdn2.clouddrive.com/v1/MossoCloudFS",
"v1Default": true
+ },
+ {
+ "region": "LON",
+ "publicURL": "https://cdn2.clouddrive.com/v1/MossoCloudFS",
+ "v1Default": false
}
],
"cloudFiles": [
@@ -18,6 +23,12 @@
"publicURL": "https://storage101.ord1.clouddrive.com/v1/MossoCloudFS",
"v1Default": true,
"internalURL": "https://snet-storage101.ord1.clouddrive.com/v1/MossoCloudFS"
+ },
+ {
+ "region": "LON",
+ "publicURL": "https://storage101.lon1.clouddrive.com/v1/MossoCloudFS",
+ "v1Default": false,
+ "internalURL": "https://snet-storage101.lon1.clouddrive.com/v1/MossoCloudFS"
}
],
"cloudServers": [
Modified: libcloud/trunk/libcloud/test/compute/fixtures/openstack/_v2_0__auth.json
URL: http://svn.apache.org/viewvc/libcloud/trunk/libcloud/test/compute/fixtures/openstack/_v2_0__auth.json?rev=1418817&r1=1418816&r2=1418817&view=diff
==============================================================================
--- libcloud/trunk/libcloud/test/compute/fixtures/openstack/_v2_0__auth.json (original)
+++ libcloud/trunk/libcloud/test/compute/fixtures/openstack/_v2_0__auth.json Sun Dec 9 05:42:24 2012
@@ -28,6 +28,12 @@
"tenantId": "MossoCloudFS_11111-111111111-1111111111-1111111",
"publicURL": "https://storage101.ord1.clouddrive.com/v1/MossoCloudFS_11111-111111111-1111111111-1111111",
"internalURL": "https://snet-storage101.ord1.clouddrive.com/v1/MossoCloudFS_11111-111111111-1111111111-1111111"
+ },
+ {
+ "region": "LON",
+ "tenantId": "MossoCloudFS_11111-111111111-1111111111-1111111",
+ "publicURL": "https://storage101.lon1.clouddrive.com/v1/MossoCloudFS_11111-111111111-1111111111-1111111",
+ "internalURL": "https://snet-storage101.lon1.clouddrive.com/v1/MossoCloudFS_11111-111111111-1111111111-1111111"
}
],
"name": "cloudFiles",
Modified: libcloud/trunk/libcloud/test/storage/test_cloudfiles.py
URL: http://svn.apache.org/viewvc/libcloud/trunk/libcloud/test/storage/test_cloudfiles.py?rev=1418817&r1=1418816&r2=1418817&view=diff
==============================================================================
--- libcloud/trunk/libcloud/test/storage/test_cloudfiles.py (original)
+++ libcloud/trunk/libcloud/test/storage/test_cloudfiles.py Sun Dec 9 05:42:24 2012
@@ -41,25 +41,31 @@ from libcloud.storage.types import Objec
from libcloud.storage.types import ObjectHashMismatchError
from libcloud.storage.types import InvalidContainerNameError
from libcloud.storage.drivers.cloudfiles import CloudFilesStorageDriver
+from libcloud.storage.drivers.cloudfiles import CloudFilesUSStorageDriver
+from libcloud.storage.drivers.cloudfiles import CloudFilesUKStorageDriver
from libcloud.storage.drivers.dummy import DummyIterator
from libcloud.test import StorageMockHttp, MockRawResponse # pylint: disable-msg=E0611
from libcloud.test import MockHttpTestCase # pylint: disable-msg=E0611
from libcloud.test.file_fixtures import StorageFileFixtures, OpenStackFixtures # pylint: disable-msg=E0611
-current_hash = None
-
class CloudFilesTests(unittest.TestCase):
+ driver_klass = CloudFilesStorageDriver
+ driver_args = ('dummy', 'dummy')
+ driver_kwargs = {}
+ datacenter = 'ord'
def setUp(self):
- CloudFilesStorageDriver.connectionCls.conn_classes = (
+ self.driver_klass.connectionCls.conn_classes = (
None, CloudFilesMockHttp)
- CloudFilesStorageDriver.connectionCls.rawResponseCls = \
+ self.driver_klass.connectionCls.rawResponseCls = \
CloudFilesMockRawResponse
CloudFilesMockHttp.type = None
CloudFilesMockRawResponse.type = None
- self.driver = CloudFilesStorageDriver('dummy', 'dummy')
+ self.driver = self.driver_klass(*self.driver_args,
+ **self.driver_kwargs)
+
# normally authentication happens lazily, but we force it here
self.driver.connection._populate_hosts_and_request_paths()
self._remove_test_file()
@@ -67,6 +73,23 @@ class CloudFilesTests(unittest.TestCase)
def tearDown(self):
self._remove_test_file()
+ def test_invalid_ex_force_service_region(self):
+ driver = CloudFilesStorageDriver('driver', 'dummy',
+ ex_force_service_region='invalid')
+
+ try:
+ driver.list_containers()
+ except:
+ e = sys.exc_info()[1]
+ self.assertEquals(e.value, 'Could not find specified endpoint')
+ else:
+ self.fail('Exception was not thrown')
+
+ def test_ex_force_service_region(self):
+ driver = CloudFilesStorageDriver('driver', 'dummy',
+ ex_force_service_region='ORD')
+ driver.list_containers()
+
def test_force_auth_token_kwargs(self):
base_url = 'https://cdn2.clouddrive.com/v1/MossoCloudFS'
kwargs = {
@@ -105,8 +128,10 @@ class CloudFilesTests(unittest.TestCase)
self.fail('Exception was not thrown')
def test_service_catalog(self):
+ url = 'https://storage101.%s1.clouddrive.com/v1/MossoCloudFS' % \
+ (self.datacenter)
self.assertEqual(
- 'https://storage101.ord1.clouddrive.com/v1/MossoCloudFS',
+ url,
self.driver.connection.get_endpoint())
self.driver.connection.cdn_request = True
@@ -659,7 +684,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.ord1.clouddrive.com/v1/MossoCloudFS/foo_bar_container/foo_bar_object?temp_url_expires=60&temp_url_sig=%s' % (sig)
+ temp_url = 'https://storage101.%s1.clouddrive.com/v1/MossoCloudFS/foo_bar_container/foo_bar_object?temp_url_expires=60&temp_url_sig=%s' % (self.datacenter, sig)
self.assertEquals(''.join(sorted(ret)), ''.join(sorted(temp_url)))
@@ -684,6 +709,16 @@ class CloudFilesTests(unittest.TestCase)
pass
+class CloudFilesDeprecatedUSTests(CloudFilesTests):
+ driver_klass = CloudFilesUSStorageDriver
+ datacenter = 'ord'
+
+
+class CloudFilesDeprecatedUKTests(CloudFilesTests):
+ driver_klass = CloudFilesUKStorageDriver
+ datacenter = 'lon'
+
+
class CloudFilesMockHttp(StorageMockHttp, MockHttpTestCase):
fixtures = StorageFileFixtures('cloudfiles')