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')