From 22e4cc909e5c169a461f639c09313d30d996536e Mon Sep 17 00:00:00 2001
From: Brian McDaniel <brian.mcdaniel@rackspace.com>
Date: Mon, 23 Jul 2012 16:54:01 -0400
Subject: [PATCH] Add support for Rackspace Nova ORD endpoint.

---
 libcloud/compute/drivers/rackspacenova.py          |   15 +++++++++++++++
 libcloud/compute/providers.py                      |    2 ++
 libcloud/compute/types.py                          |    2 ++
 .../compute/fixtures/openstack/_v2_0__auth.json    |    8 ++++++++
 libcloud/test/compute/test_rackspacenova.py        |   20 +++++++-------------
 5 files changed, 34 insertions(+), 13 deletions(-)

diff --git libcloud/compute/drivers/rackspacenova.py libcloud/compute/drivers/rackspacenova.py
index acebf87..7e67936 100644
--- libcloud/compute/drivers/rackspacenova.py
+++ libcloud/compute/drivers/rackspacenova.py
@@ -74,6 +74,21 @@ class RackspaceNovaDfwNodeDriver(OpenStack_1_1_NodeDriver):
     api_name = 'rackspacenovadfw'
 
 
+class RackspaceNovaOrdConnection(RackspaceNovaConnection):
+
+    get_endpoint_args = {'service_type': 'compute',
+                         'name': 'cloudServersOpenStack',
+                         'region': 'ORD'}
+
+
+class RackspaceNovaOrdNodeDriver(OpenStack_1_1_NodeDriver):
+    name = 'RackspaceNovaord'
+    website = 'http://www.rackspace.com/'
+    connectionCls = RackspaceNovaOrdConnection
+    type = Provider.RACKSPACE_NOVA_ORD
+    api_name = 'rackspacenovaord'
+
+
 class RackspaceNovaLonNodeDriver(OpenStack_1_1_NodeDriver):
     name = 'RackspaceNovalon'
     website = 'http://www.rackspace.com/'
diff --git libcloud/compute/providers.py libcloud/compute/providers.py
index 86a48fc..32b291e 100644
--- libcloud/compute/providers.py
+++ libcloud/compute/providers.py
@@ -111,6 +111,8 @@ DRIVERS = {
         ('libcloud.compute.drivers.rackspacenova', 'RackspaceNovaBetaNodeDriver'),
     Provider.RACKSPACE_NOVA_DFW:
         ('libcloud.compute.drivers.rackspacenova', 'RackspaceNovaDfwNodeDriver'),
+    Provider.RACKSPACE_NOVA_ORD:
+        ('libcloud.compute.drivers.rackspacenova', 'RackspaceNovaOrdNodeDriver'),
     Provider.RACKSPACE_NOVA_LON:
         ('libcloud.compute.drivers.rackspacenova', 'RackspaceNovaLonNodeDriver'),
     Provider.LIBVIRT:
diff --git libcloud/compute/types.py libcloud/compute/types.py
index 00e1f72..80f228a 100644
--- libcloud/compute/types.py
+++ libcloud/compute/types.py
@@ -63,6 +63,7 @@ class Provider(object):
     @cvar CLOUDSIGMA_US: CloudSigma US Las Vegas
     @cvar RACKSPACE_NOVA_BETA: Rackspace Nova Private Beta (ORD)
     @cvar RACKSPACE_NOVA_DFW: Rackspace Nova Private DFW (DFW)
+    @cvar RACKSPACE_NOVA_ORD: Rackspace Nova Private ORD (ORD)
     @cvar RACKSPACE_NOVA_LON: Rackspace Nova Private LON (LON)
     @cvar LIBVIRT: Libvirt driver
     @cvar JOYENT: Joyent driver
@@ -122,6 +123,7 @@ class Provider(object):
     KTUCLOUD = 47
     RACKSPACE_NOVA_LON = 48
     GRIDSPOT = 49
+    RACKSPACE_NOVA_ORD = 50
 
 
 class NodeState(object):
diff --git libcloud/test/compute/fixtures/openstack/_v2_0__auth.json libcloud/test/compute/fixtures/openstack/_v2_0__auth.json
index 6290b39..3d586ed 100644
--- libcloud/test/compute/fixtures/openstack/_v2_0__auth.json
+++ libcloud/test/compute/fixtures/openstack/_v2_0__auth.json
@@ -71,6 +71,14 @@
                         "versionInfo": "https://dfw.servers.api.rackspacecloud.com/v2/",
                         "versionList": "https://dfw.servers.api.rackspacecloud.com/",
                         "versionId": "2"
+                    },
+                    {
+                        "region": "ORD",
+                        "tenantId": "613469",
+                        "publicURL": "https://ord.servers.api.rackspacecloud.com/v2/1337",
+                        "versionInfo": "https://ord.servers.api.rackspacecloud.com/v2/",
+                        "versionList": "https://ord.servers.api.rackspacecloud.com/",
+                        "versionId": "2"
                     }
                 ],
                 "name": "cloudServersOpenStack",
diff --git libcloud/test/compute/test_rackspacenova.py libcloud/test/compute/test_rackspacenova.py
index 6bdc663..dd7a5b0 100644
--- libcloud/test/compute/test_rackspacenova.py
+++ libcloud/test/compute/test_rackspacenova.py
@@ -19,6 +19,7 @@ from libcloud.utils.py3 import method_type
 from libcloud.utils.py3 import httplib
 from libcloud.compute.drivers.rackspacenova import RackspaceNovaBetaNodeDriver, \
                                                    RackspaceNovaDfwNodeDriver, \
+                                                   RackspaceNovaOrdNodeDriver, \
                                                    RackspaceNovaLonNodeDriver
 from libcloud.test.compute.test_openstack import OpenStack_1_1_Tests, OpenStack_1_1_MockHttp
 from libcloud.pricing import clear_pricing_data
@@ -48,13 +49,6 @@ class RackspaceNovaLonMockHttp(RackspaceNovaMockHttp):
         return (httplib.OK, body, self.json_content_headers, httplib.responses[httplib.OK])
 
 
-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 = RackspaceNovaBetaNodeDriver
@@ -103,10 +97,10 @@ class RackspaceNovaDfwTests(OpenStack_1_1_Tests):
         self.assertEqual('https://dfw.servers.api.rackspacecloud.com/v2/1337', self.driver.connection.get_endpoint())
 
 
-class RackspaceNovaLonTests(OpenStack_1_1_Tests):
+class RackspaceNovaOrdTests(OpenStack_1_1_Tests):
 
-    driver_klass = RackspaceNovaLonNodeDriver
-    driver_type = RackspaceNovaLonNodeDriver
+    driver_klass = RackspaceNovaOrdNodeDriver
+    driver_type = RackspaceNovaOrdNodeDriver
     driver_args = RACKSPACE_NOVA_PARAMS + ('1.1',)
     driver_kwargs = {'ex_force_auth_version': '2.0'}
 
@@ -115,8 +109,8 @@ class RackspaceNovaLonTests(OpenStack_1_1_Tests):
         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_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()
@@ -124,7 +118,7 @@ class RackspaceNovaLonTests(OpenStack_1_1_Tests):
         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())
+        self.assertEqual('https://ord.servers.api.rackspacecloud.com/v2/1337', self.driver.connection.get_endpoint())
 
 
 class RackspaceNovaLonTests(OpenStack_1_1_Tests):
-- 
1.7.9.5

