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/09/30 23:50:53 UTC

svn commit: r1392119 - in /libcloud/trunk/libcloud: compute/drivers/rackspace.py compute/drivers/rackspacenova.py compute/providers.py test/compute/test_rackspace.py test/compute/test_rackspacenova.py

Author: tomaz
Date: Sun Sep 30 21:50:52 2012
New Revision: 1392119

URL: http://svn.apache.org/viewvc?rev=1392119&view=rev
Log:
Move all of the Rackspace drivers and files in a single module, fix pep8 issues.

Removed:
    libcloud/trunk/libcloud/compute/drivers/rackspacenova.py
    libcloud/trunk/libcloud/test/compute/test_rackspacenova.py
Modified:
    libcloud/trunk/libcloud/compute/drivers/rackspace.py
    libcloud/trunk/libcloud/compute/providers.py
    libcloud/trunk/libcloud/test/compute/test_rackspace.py

Modified: libcloud/trunk/libcloud/compute/drivers/rackspace.py
URL: http://svn.apache.org/viewvc/libcloud/trunk/libcloud/compute/drivers/rackspace.py?rev=1392119&r1=1392118&r2=1392119&view=diff
==============================================================================
--- libcloud/trunk/libcloud/compute/drivers/rackspace.py (original)
+++ libcloud/trunk/libcloud/compute/drivers/rackspace.py Sun Sep 30 21:50:52 2012
@@ -17,18 +17,41 @@ Rackspace driver
 """
 from libcloud.compute.types import Provider, LibcloudError
 from libcloud.compute.base import NodeLocation
-from libcloud.compute.drivers.openstack import OpenStack_1_0_Connection,\
+from libcloud.compute.drivers.openstack import OpenStack_1_0_Connection, \
     OpenStack_1_0_NodeDriver, OpenStack_1_0_Response
+from libcloud.compute.drivers.openstack import OpenStack_1_1_Connection, \
+    OpenStack_1_1_NodeDriver
 
 from libcloud.common.rackspace import (
     AUTH_URL_US, AUTH_URL_UK)
 
 
+ENDPOINT_ARGS_MAP = {
+    'us': {
+        'dfw':  {'service_type': 'compute',
+                  'name': 'cloudServersOpenStack',
+                  'region': 'DFW'},
+        'ord':  {'service_type': 'compute',
+                  'name': 'cloudServersOpenStack',
+                  'region': 'ORD'}
+    },
+    'uk': {
+        'default':  {'service_type': 'compute',
+                     'name': 'cloudServersOpenStack',
+                     'region': 'LON'}
+    },
+    'beta': {
+        'dfw':  {'service_type': 'compute',
+                 'name': 'cloudServersPreprod',
+                 'region': 'DFW'}
+    }
+}
+
+
 class RackspaceFirstGenConnection(OpenStack_1_0_Connection):
     """
     Connection class for the Rackspace first-gen driver.
     """
-
     responseCls = OpenStack_1_0_Response
     auth_url = AUTH_URL_US
     XML_NAMESPACE = 'http://docs.rackspacecloud.com/servers/api/v1.0'
@@ -66,8 +89,9 @@ class RackspaceFirstGenNodeDriver(OpenSt
 
         self.region = region
 
-        super(RackspaceFirstGenNodeDriver, self).__init__(key=key, secret=secret,
-                       secure=secure, host=host, port=port, **kwargs)
+        super(RackspaceFirstGenNodeDriver, self).__init__(key=key,
+                      secret=secret, secure=secure, host=host,
+                      port=port, **kwargs)
 
     def list_locations(self):
         """
@@ -84,3 +108,56 @@ class RackspaceFirstGenNodeDriver(OpenSt
             locations = [NodeLocation(0, 'Rackspace UK London', 'UK', self)]
 
         return locations
+
+
+class RackspaceConnection(OpenStack_1_1_Connection):
+    """
+    Connection class for the Rackspace next-gen OpenStack base driver.
+    """
+    get_endpoint_args = {}
+
+    def get_endpoint(self):
+        if not self.get_endpoint_args:
+            raise LibcloudError(
+                'RackspaceConnection must have get_endpoint_args set')
+
+        # Only support auth 2.0_*
+        if '2.0' in self._auth_version:
+            ep = self.service_catalog.get_endpoint(**self.get_endpoint_args)
+        else:
+            raise LibcloudError(
+                'Auth version "%s" not supported' % (self._auth_version))
+
+        # It's possible to authenticate but the service catalog not have
+        # the correct endpoint for this driver, so we throw here.
+        if 'publicURL' in ep:
+            return ep['publicURL']
+        else:
+            raise LibcloudError('Could not find specified endpoint')
+
+
+class RackspaceNodeDriver(OpenStack_1_1_NodeDriver):
+    name = 'Rackspace Cloud'
+    website = 'http://www.rackspace.com'
+    connectionCls = RackspaceConnection
+    type = Provider.RACKSPACE
+    api_name = None
+
+    def __init__(self, key, secret=None, secure=True, host=None, port=None,
+                 region='us', datacenter='dfw', **kwargs):
+        if region not in ['us', 'uk']:
+            raise ValueError('Invalid region: %s' % (region))
+
+        if region == 'us' and datacenter not in ['dfw', 'ord']:
+            raise ValueError('Invalid datacenter: %s' % (datacenter))
+        elif region in ['uk']:
+            datacenter = 'default'
+
+        self.connectionCls.get_endpoint_args = \
+                ENDPOINT_ARGS_MAP[region][datacenter]
+
+        self.region = region
+        self.datacenter = datacenter
+
+        super(RackspaceNodeDriver, self).__init__(key=key, secret=secret,
+                       secure=secure, host=host, port=port, **kwargs)

Modified: libcloud/trunk/libcloud/compute/providers.py
URL: http://svn.apache.org/viewvc/libcloud/trunk/libcloud/compute/providers.py?rev=1392119&r1=1392118&r2=1392119&view=diff
==============================================================================
--- libcloud/trunk/libcloud/compute/providers.py (original)
+++ libcloud/trunk/libcloud/compute/providers.py Sun Sep 30 21:50:52 2012
@@ -64,7 +64,7 @@ DRIVERS = {
     Provider.GOGRID:
         ('libcloud.compute.drivers.gogrid', 'GoGridNodeDriver'),
     Provider.RACKSPACE:
-        ('libcloud.compute.drivers.rackspacenova', 'RackspaceNodeDriver'),
+        ('libcloud.compute.drivers.rackspace', 'RackspaceNodeDriver'),
     Provider.RACKSPACE_FIRST_GEN:
         ('libcloud.compute.drivers.rackspace', 'RackspaceFirstGenNodeDriver'),
     Provider.SLICEHOST:

Modified: libcloud/trunk/libcloud/test/compute/test_rackspace.py
URL: http://svn.apache.org/viewvc/libcloud/trunk/libcloud/test/compute/test_rackspace.py?rev=1392119&r1=1392118&r2=1392119&view=diff
==============================================================================
--- libcloud/trunk/libcloud/test/compute/test_rackspace.py (original)
+++ libcloud/trunk/libcloud/test/compute/test_rackspace.py Sun Sep 30 21:50:52 2012
@@ -15,9 +15,16 @@
 import sys
 import unittest
 
+from libcloud.utils.py3 import method_type
+from libcloud.utils.py3 import httplib
 from libcloud.compute.drivers.rackspace import RackspaceFirstGenNodeDriver
+from libcloud.compute.drivers.rackspace import RackspaceNodeDriver
 from libcloud.test.compute.test_openstack import OpenStack_1_0_Tests
+from libcloud.test.compute.test_openstack import OpenStack_1_1_Tests, \
+                                                 OpenStack_1_1_MockHttp
+from libcloud.pricing import clear_pricing_data
 
+from libcloud.test.secrets import RACKSPACE_NOVA_PARAMS
 from libcloud.test.secrets import RACKSPACE_PARAMS
 
 
@@ -53,5 +60,143 @@ class RackspaceusFirstGenUkTests(OpenSta
             self.assertTrue(size.price > 0)
 
 
+class RackspaceNovaMockHttp(OpenStack_1_1_MockHttp):
+    def __init__(self, *args, **kwargs):
+        super(RackspaceNovaMockHttp, self).__init__(*args, **kwargs)
+
+        methods1 = OpenStack_1_1_MockHttp.__dict__
+
+        names1 = [m for m in methods1 if m.find('_v1_1') == 0]
+
+        for name in names1:
+            method = methods1[name]
+            new_name = name.replace('_v1_1_slug_', '_v2_1337_')
+            setattr(self, new_name, method_type(method, self,
+                RackspaceNovaMockHttp))
+
+
+class RackspaceNovaLonMockHttp(RackspaceNovaMockHttp):
+
+    def _v2_0_tokens(self, method, url, body, headers):
+        body = self.auth_fixtures.load('_v2_0__auth_lon.json')
+        return (httplib.OK, body, self.json_content_headers,
+                httplib.responses[httplib.OK])
+
+
+"""
+class RackspaceNovaBetaTests(OpenStack_1_1_Tests):
+
+    driver_klass = RackspaceNodeDriver
+    driver_type = RackspaceNodeDriver
+    driver_args = RACKSPACE_NOVA_PARAMS
+    driver_kwargs = {'region': 'beta', 'ex_force_auth_version': '2.0'}
+
+    @classmethod
+    def create_driver(self):
+        return self.driver_type(*self.driver_args, **self.driver_kwargs)
+
+    def setUp(self):
+        self.driver_klass.connectionCls.conn_classes = (RackspaceNovaMockHttp,
+                                                        RackspaceNovaMockHttp)
+        self.driver_klass.connectionCls.auth_url = \
+                "https://auth.api.example.com/v2.0/"
+        self.driver = self.create_driver()
+        # normally authentication happens lazily, but we force it here
+        self.driver.connection._populate_hosts_and_request_paths()
+        clear_pricing_data()
+        self.node = self.driver.list_nodes()[1]
+
+    def test_service_catalog(self):
+        self.assertEqual(
+            'https://preprod.dfw.servers.api.rackspacecloud.com/v2/1337',
+            self.driver.connection.get_endpoint())
+"""
+
+
+class RackspaceNovaDfwTests(OpenStack_1_1_Tests):
+
+    driver_klass = RackspaceNodeDriver
+    driver_type = RackspaceNodeDriver
+    driver_args = RACKSPACE_NOVA_PARAMS
+    driver_kwargs = {'region': 'us', 'datacenter': 'dfw',
+                     'ex_force_auth_version': '2.0'}
+
+    @classmethod
+    def create_driver(self):
+        return self.driver_type(*self.driver_args, **self.driver_kwargs)
+
+    def setUp(self):
+        self.driver_klass.connectionCls.conn_classes = (RackspaceNovaMockHttp,
+                                                        RackspaceNovaMockHttp)
+        self.driver_klass.connectionCls.auth_url = \
+                'https://auth.api.example.com/v2.0/'
+        self.driver = self.create_driver()
+        # normally authentication happens lazily, but we force it here
+        self.driver.connection._populate_hosts_and_request_paths()
+        clear_pricing_data()
+        self.node = self.driver.list_nodes()[1]
+
+    def test_service_catalog(self):
+        self.assertEqual(
+                'https://dfw.servers.api.rackspacecloud.com/v2/1337',
+                self.driver.connection.get_endpoint())
+
+
+class RackspaceNovaOrdTests(OpenStack_1_1_Tests):
+
+    driver_klass = RackspaceNodeDriver
+    driver_type = RackspaceNodeDriver
+    driver_args = RACKSPACE_NOVA_PARAMS
+    driver_kwargs = {'region': 'us', 'datacenter': 'ord',
+                     'ex_force_auth_version': '2.0'}
+
+    @classmethod
+    def create_driver(self):
+        return self.driver_type(*self.driver_args, **self.driver_kwargs)
+
+    def setUp(self):
+        self.driver_klass.connectionCls.conn_classes = (RackspaceNovaMockHttp,
+                                                        RackspaceNovaMockHttp)
+        self.driver_klass.connectionCls.auth_url = \
+                'https://auth.api.example.com/v2.0/'
+        self.driver = self.create_driver()
+        # normally authentication happens lazily, but we force it here
+        self.driver.connection._populate_hosts_and_request_paths()
+        clear_pricing_data()
+        self.node = self.driver.list_nodes()[1]
+
+    def test_service_catalog(self):
+        self.assertEqual('https://ord.servers.api.rackspacecloud.com/v2/1337',
+                         self.driver.connection.get_endpoint())
+
+
+class RackspaceNovaLonTests(OpenStack_1_1_Tests):
+
+    driver_klass = RackspaceNodeDriver
+    driver_type = RackspaceNodeDriver
+    driver_args = RACKSPACE_NOVA_PARAMS
+    driver_kwargs = {'region': 'uk', 'datacenter': 'ord',
+                     'ex_force_auth_version': '2.0'}
+
+    @classmethod
+    def create_driver(self):
+        return self.driver_type(*self.driver_args, **self.driver_kwargs)
+
+    def setUp(self):
+        self.driver_klass.connectionCls.conn_classes = \
+                (RackspaceNovaLonMockHttp, RackspaceNovaLonMockHttp)
+        self.driver_klass.connectionCls.auth_url = \
+                'https://lon.auth.api.example.com/v2.0/'
+        self.driver = self.create_driver()
+        # normally authentication happens lazily, but we force it here
+        self.driver.connection._populate_hosts_and_request_paths()
+        clear_pricing_data()
+        self.node = self.driver.list_nodes()[1]
+
+    def test_service_catalog(self):
+        self.assertEqual('https://lon.servers.api.rackspacecloud.com/v2/1337',
+                         self.driver.connection.get_endpoint())
+
+
 if __name__ == '__main__':
     sys.exit(unittest.main())