diff --git a/libcloud/compute/drivers/rackspacenova.py b/libcloud/compute/drivers/rackspacenova.py index da13c59..f23b625 100644 --- a/libcloud/compute/drivers/rackspacenova.py +++ b/libcloud/compute/drivers/rackspacenova.py @@ -56,6 +56,13 @@ class RackspaceNovaDfwConnection(RackspaceNovaConnection): 'region': 'DFW'} +class RackspaceNovaLonConnection(RackspaceNovaConnection): + + get_endpoint_args = {'service_type': 'compute', + 'name': 'cloudServersOpenStack', + 'region': 'LON'} + + class RackspaceNovaDfwNodeDriver(OpenStack_1_1_NodeDriver): name = 'RackspaceNovadfw' website = 'http://www.rackspace.com/' @@ -64,6 +71,14 @@ class RackspaceNovaDfwNodeDriver(OpenStack_1_1_NodeDriver): api_name = 'rackspacenovadfw' +class RackspaceNovaLonNodeDriver(OpenStack_1_1_NodeDriver): + name = 'RackspaceNovalon' + website = 'http://www.rackspace.com/' + connectionCls = RackspaceNovaLonConnection + type = Provider.RACKSPACE_NOVA_LON + api_name = 'rackspacenovalon' + + class RackspaceNovaBetaNodeDriver(OpenStack_1_1_NodeDriver): name = 'RackspaceNovaBeta' website = 'http://www.rackspace.com/' diff --git a/libcloud/compute/providers.py b/libcloud/compute/providers.py index c6c2b30..b005d22 100644 --- a/libcloud/compute/providers.py +++ b/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_LON: + ('libcloud.compute.drivers.rackspacenova', 'RackspaceNovaLonNodeDriver'), Provider.LIBVIRT: ('libcloud.compute.drivers.libvirt_driver', 'LibvirtNodeDriver'), Provider.JOYENT: diff --git a/libcloud/compute/types.py b/libcloud/compute/types.py index 3d1076f..bb20876 100644 --- a/libcloud/compute/types.py +++ b/libcloud/compute/types.py @@ -62,6 +62,8 @@ class Provider(object): @cvar CLOUDSTACK: CloudStack @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_LON: Rackspace Nova Private LON (LON) @cvar LIBVIRT: Libvirt driver @cvar JOYENT: Joyent driver @cvar VCL: VCL driver @@ -117,6 +119,7 @@ class Provider(object): JOYENT = 45 VCL = 46 KTUCLOUD=47 + RACKSPACE_NOVA_LON = 48 class NodeState(object): diff --git a/test/compute/fixtures/openstack/_v2_0__auth_lon.json b/test/compute/fixtures/openstack/_v2_0__auth_lon.json index e69de29..9ec07b1 100644 --- a/test/compute/fixtures/openstack/_v2_0__auth_lon.json +++ b/test/compute/fixtures/openstack/_v2_0__auth_lon.json @@ -0,0 +1,103 @@ +{ + "access": { + "token": { + "id": "aaaaaaaaaaaa-bbb-cccccccccccccc", + "expires": "2011-11-23T21:00:14.000-06:00" + }, + "serviceCatalog": [ + { + "endpoints": [ + { + "region": "ORD", + "tenantId": "MossoCloudFS_11111-111111111-1111111111-1111111", + "publicURL": "https://cdn2.clouddrive.com/v1/MossoCloudFS_11111-111111111-1111111111-1111111", + "version": { + "versionInfo": "https://cdn2.clouddrive.com/v1/", + "versionList": "https://cdn2.clouddrive.com/", + "versionId": "1" + } + } + ], + "name": "cloudFilesCDN", + "type": "object-store" + }, + { + "endpoints": [ + { + "region": "ORD", + "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" + } + ], + "name": "cloudFiles", + "type": "object-store" + }, + { + "endpoints": [ + { + "tenantId": "1337", + "publicURL": "https://servers.api.rackspacecloud.com/v1.0/1337", + "version": { + "versionInfo": "https://servers.api.rackspacecloud.com/v1.0/", + "versionList": "https://servers.api.rackspacecloud.com/", + "versionId": "1.0" + } + } + ], + "name": "cloudServers", + "type": "compute" + }, + { + "endpoints": [ + { + "region": "RegionOne", + "tenantId": "1337", + "publicURL": "https://127.0.0.1/v2/1337", + "versionInfo": "https://127.0.0.1/v2/", + "versionList": "https://127.0.0.1/", + "versionId": "2" + } + ], + "name": "nova", + "type": "compute" + }, + { + "endpoints": [ + { + "region": "LON", + "tenantId": "613469", + "publicURL": "https://lon.servers.api.rackspacecloud.com/v2/1337", + "versionInfo": "https://lon.servers.api.rackspacecloud.com/v2/", + "versionList": "https://lon.servers.api.rackspacecloud.com/", + "versionId": "2" + } + ], + "name": "cloudServersOpenStack", + "type": "compute" + }, + { + "endpoints": [ + { + "region": "LON", + "tenantId": "1337", + "publicURL": "https://preprod.lon.servers.api.rackspacecloud.com/v2/1337" + } + ], + "name": "cloudServersPreprod", + "type": "compute" + } + ], + "user": { + "id": "7", + "roles": [ + { + "id": "identity:default", + "description": "Default Role.", + "name": "identity:default" + } + ], + "name": "testuser" + } + } +} diff --git a/test/compute/test_rackspacenova.py b/test/compute/test_rackspacenova.py index 1fd8002..8f538f4 100644 --- a/test/compute/test_rackspacenova.py +++ b/test/compute/test_rackspacenova.py @@ -12,13 +12,15 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. +import httplib import sys import unittest from libcloud.utils.py3 import method_type from libcloud.compute.drivers.rackspacenova import RackspaceNovaBetaNodeDriver, \ - RackspaceNovaDfwNodeDriver + RackspaceNovaDfwNodeDriver, \ + RackspaceNovaLonNodeDriver from test.compute.test_openstack import OpenStack_1_1_Tests, OpenStack_1_1_MockHttp from libcloud.pricing import clear_pricing_data @@ -40,6 +42,13 @@ class RackspaceNovaMockHttp(OpenStack_1_1_MockHttp): 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 = RackspaceNovaBetaNodeDriver @@ -88,5 +97,29 @@ 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): + + driver_klass = RackspaceNovaLonNodeDriver + driver_type = RackspaceNovaLonNodeDriver + driver_args = RACKSPACE_NOVA_PARAMS + ('1.1',) + driver_kwargs = {'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())