Update Rackspace DNS driver to support 'region' argument.
Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/0e7ffc9f Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/0e7ffc9f Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/0e7ffc9f Branch: refs/heads/trunk Commit: 0e7ffc9f50bc97fe3281d3ba6cf5c516b8a1bd3f Parents: 56b1348 Author: Tomaz Muraus <[email protected]> Authored: Mon Oct 14 22:23:22 2013 +0200 Committer: Tomaz Muraus <[email protected]> Committed: Mon Oct 14 22:23:22 2013 +0200 ---------------------------------------------------------------------- libcloud/dns/drivers/rackspace.py | 81 ++++++++++++-------- libcloud/dns/providers.py | 14 ++-- libcloud/dns/types.py | 7 +- .../test/dns/fixtures/rackspace/auth_2_0.json | 71 ----------------- libcloud/test/dns/test_rackspace.py | 20 +---- 5 files changed, 65 insertions(+), 128 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/libcloud/blob/0e7ffc9f/libcloud/dns/drivers/rackspace.py ---------------------------------------------------------------------- diff --git a/libcloud/dns/drivers/rackspace.py b/libcloud/dns/drivers/rackspace.py index 973d158..d685745 100644 --- a/libcloud/dns/drivers/rackspace.py +++ b/libcloud/dns/drivers/rackspace.py @@ -25,7 +25,7 @@ import copy from libcloud.common.base import PollingConnection from libcloud.common.types import LibcloudError from libcloud.utils.misc import merge_valid_keys, get_new_obj -from libcloud.common.rackspace import AUTH_URL_US, AUTH_URL_UK +from libcloud.common.rackspace import AUTH_URL from libcloud.compute.drivers.openstack import OpenStack_1_1_Connection from libcloud.compute.drivers.openstack import OpenStack_1_1_Response @@ -77,6 +77,13 @@ class RackspaceDNSConnection(OpenStack_1_1_Connection, PollingConnection): poll_interval = 2.5 timeout = 30 + auth_url = AUTH_URL + _auth_version = '2.0' + + def __init__(self, *args, **kwargs): + self.region = kwargs.pop('region', None) + super(RackspaceDNSConnection, self).__init__(*args, **kwargs) + def get_poll_request_kwargs(self, response, context, request_kwargs): job_id = response.object['jobId'] kwargs = {'action': '/status/%s' % (job_id), @@ -92,50 +99,45 @@ class RackspaceDNSConnection(OpenStack_1_1_Connection, PollingConnection): return status == 'COMPLETED' def get_endpoint(self): - """ - FIXME: - Dirty, dirty hack. DNS doesn't get returned in the auth 1.1 service - catalog, so we build it from the servers url. - """ - - if self._auth_version == "1.1": - ep = self.service_catalog.get_endpoint(name="cloudServers") - - return self._construct_dns_endpoint_from_servers_endpoint(ep) - elif "2.0" in self._auth_version: - ep = self.service_catalog.get_endpoint(name="cloudServers", - service_type="compute", + if '2.0' in self._auth_version: + ep = self.service_catalog.get_endpoint(name='cloudDNS', + service_type='rax:dns', region=None) - - return self._construct_dns_endpoint_from_servers_endpoint(ep) else: raise LibcloudError("Auth version %s not supported" % (self._auth_version)) - def _construct_dns_endpoint_from_servers_endpoint(self, ep): - if 'publicURL' in ep: - return ep['publicURL'].replace("servers", "dns") - else: - raise LibcloudError('Could not find specified endpoint') - + public_url = ep.get('publicURL', None) -class RackspaceUSDNSConnection(RackspaceDNSConnection): - auth_url = AUTH_URL_US + # This is a nasty hack, but because of how global auth and old accounts + # work, there is no way around it. + if self.region == 'us': + # Old UK account, which only has us endpoint in the catalog + public_url = public_url.replace('https://lon.dns.api', + 'https://dns.api') + if self.region == 'uk': + # Old US account, which only has uk endpoint in the catalog + public_url = public_url.replace('https://dns.api', + 'https://lon.dns.api') - -class RackspaceUKDNSConnection(RackspaceDNSConnection): - auth_url = AUTH_URL_UK + return public_url class RackspaceDNSDriver(DNSDriver, OpenStackDriverMixin): + name = 'Rackspace DNS' website = 'http://www.rackspace.com/' + type = Provider.RACKSPACE + connectionCls = RackspaceDNSConnection - def __init__(self, *args, **kwargs): - OpenStackDriverMixin.__init__(self, *args, **kwargs) - super(RackspaceDNSDriver, self).__init__(*args, **kwargs) + def __init__(self, key, secret=None, secure=True, host=None, port=None, + region='us', **kwargs): + if region not in ['us', 'uk']: + raise ValueError('Invalid region: %s' % (region)) - def _ex_connection_class_kwargs(self): - return self.openstack_connection_kwargs() + OpenStackDriverMixin.__init__(self, **kwargs) + super(RackspaceDNSDriver, self).__init__(key=key, secret=secret, + host=host, port=port, + region=region) RECORD_TYPE_MAP = { RecordType.A: 'A', @@ -381,14 +383,25 @@ class RackspaceDNSDriver(DNSDriver, OpenStackDriverMixin): name = name.replace('.%s' % (domain), '') return name + def _ex_connection_class_kwargs(self): + kwargs = self.openstack_connection_kwargs() + kwargs['region'] = self.region + return kwargs + class RackspaceUSDNSDriver(RackspaceDNSDriver): name = 'Rackspace DNS (US)' type = Provider.RACKSPACE_US - connectionCls = RackspaceUSDNSConnection + + def __init__(self, *args, **kwargs): + kwargs['region'] = 'us' + super(RackspaceUSDNSDriver, self).__init__(*args, **kwargs) class RackspaceUKDNSDriver(RackspaceDNSDriver): name = 'Rackspace DNS (UK)' type = Provider.RACKSPACE_UK - connectionCls = RackspaceUKDNSConnection + + def __init__(self, *args, **kwargs): + kwargs['region'] = 'uk' + super(RackspaceUKDNSDriver, self).__init__(*args, **kwargs) http://git-wip-us.apache.org/repos/asf/libcloud/blob/0e7ffc9f/libcloud/dns/providers.py ---------------------------------------------------------------------- diff --git a/libcloud/dns/providers.py b/libcloud/dns/providers.py index bdd704e..e3a0f82 100644 --- a/libcloud/dns/providers.py +++ b/libcloud/dns/providers.py @@ -24,16 +24,20 @@ DRIVERS = { ('libcloud.dns.drivers.linode', 'LinodeDNSDriver'), Provider.ZERIGO: ('libcloud.dns.drivers.zerigo', 'ZerigoDNSDriver'), - Provider.RACKSPACE_US: - ('libcloud.dns.drivers.rackspace', 'RackspaceUSDNSDriver'), - Provider.RACKSPACE_UK: - ('libcloud.dns.drivers.rackspace', 'RackspaceUKDNSDriver'), + Provider.RACKSPACE: + ('libcloud.dns.drivers.rackspace', 'RackspaceDNSDriver'), Provider.HOSTVIRTUAL: ('libcloud.dns.drivers.hostvirtual', 'HostVirtualDNSDriver'), Provider.ROUTE53: ('libcloud.dns.drivers.route53', 'Route53DNSDriver'), Provider.GANDI: - ('libcloud.dns.drivers.gandi', 'GandiDNSDriver') + ('libcloud.dns.drivers.gandi', 'GandiDNSDriver'), + + # Deprecated + Provider.RACKSPACE_US: + ('libcloud.dns.drivers.rackspace', 'RackspaceUSDNSDriver'), + Provider.RACKSPACE_UK: + ('libcloud.dns.drivers.rackspace', 'RackspaceUKDNSDriver') } http://git-wip-us.apache.org/repos/asf/libcloud/blob/0e7ffc9f/libcloud/dns/types.py ---------------------------------------------------------------------- diff --git a/libcloud/dns/types.py b/libcloud/dns/types.py index 4698e5f..a08f1b0 100644 --- a/libcloud/dns/types.py +++ b/libcloud/dns/types.py @@ -30,13 +30,16 @@ __all__ = [ class Provider(object): DUMMY = 'dummy' LINODE = 'linode' + RACKSPACE = 'rackspace' ZERIGO = 'zerigo' - RACKSPACE_US = 'rackspace_us' - RACKSPACE_UK = 'rackspace_uk' ROUTE53 = 'route53' HOSTVIRTUAL = 'hostvirtual' GANDI = 'gandi' + # Deprecated + RACKSPACE_US = 'rackspace_us' + RACKSPACE_UK = 'rackspace_uk' + class RecordType(object): """ http://git-wip-us.apache.org/repos/asf/libcloud/blob/0e7ffc9f/libcloud/test/dns/fixtures/rackspace/auth_2_0.json ---------------------------------------------------------------------- diff --git a/libcloud/test/dns/fixtures/rackspace/auth_2_0.json b/libcloud/test/dns/fixtures/rackspace/auth_2_0.json deleted file mode 100644 index 05edc47..0000000 --- a/libcloud/test/dns/fixtures/rackspace/auth_2_0.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "access": { - "token": { - "id": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "expires": "2012-03-14T08:10:14.000-05:00" - }, - "serviceCatalog": [ - { - "endpoints": [ - { - "region": "DFW", - "tenantId": "MossoCloudFS_bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "publicURL": "https://storage101.dfw1.clouddrive.com/v1/MossoCloudFS_bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "internalURL": "https://snet-storage101.dfw1.clouddrive.com/v1/MossoCloudFS_bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" - } - ], - "name": "cloudFiles", - "type": "object-store" - }, - { - "endpoints": [ - { - "region": "DFW", - "tenantId": "11111", - "publicURL": "https://dfw.servers.api.rackspacecloud.com/v2/11111", - "versionInfo": "https://dfw.servers.api.rackspacecloud.com/v2/", - "versionList": "https://dfw.servers.api.rackspacecloud.com/", - "versionId": "2" - } - ], - "name": "cloudServersOpenStack", - "type": "compute" - }, - { - "endpoints": [ - { - "tenantId": "11111", - "publicURL": "https://servers.api.rackspacecloud.com/v1.0/11111", - "versionInfo": "https://servers.api.rackspacecloud.com/v1.0/", - "versionList": "https://servers.api.rackspacecloud.com/", - "versionId": "1.0" - } - ], - "name": "cloudServers", - "type": "compute" - }, - { - "endpoints": [ - { - "region": "DFW", - "tenantId": "MossoCloudFS_bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "publicURL": "https://cdn1.clouddrive.com/v1/MossoCloudFS_bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" - } - ], - "name": "cloudFilesCDN", - "type": "object-store" - } - ], - "user": { - "id": "9586", - "roles": [ - { - "id": "identity:default", - "description": "Default Role.", - "name": "identity:default" - } - ], - "name": "libclouduser" - } - } -} http://git-wip-us.apache.org/repos/asf/libcloud/blob/0e7ffc9f/libcloud/test/dns/test_rackspace.py ---------------------------------------------------------------------- diff --git a/libcloud/test/dns/test_rackspace.py b/libcloud/test/dns/test_rackspace.py index 48fec06..d3ca78e 100644 --- a/libcloud/test/dns/test_rackspace.py +++ b/libcloud/test/dns/test_rackspace.py @@ -30,6 +30,7 @@ from libcloud.test.secrets import DNS_PARAMS_RACKSPACE class RackspaceUSTests(unittest.TestCase): klass = RackspaceUSDNSDriver + endpoint_url = 'https://dns.api.rackspacecloud.com/v1.0/11111' def setUp(self): self.klass.connectionCls.conn_classes = ( @@ -70,8 +71,7 @@ class RackspaceUSTests(unittest.TestCase): driver = self.klass(*DNS_PARAMS_RACKSPACE, **kwargs) driver.connection._populate_hosts_and_request_paths() - self.assertEqual('https://dns.api.rackspacecloud.com/v1.0/11111', - driver.connection.get_endpoint()) + self.assertEquals(self.endpoint_url, driver.connection.get_endpoint()) def test_list_record_types(self): record_types = self.driver.list_record_types() @@ -310,26 +310,14 @@ class RackspaceUSTests(unittest.TestCase): 'foo.bar') -class RackspaceUK1Tests(RackspaceUSTests): +class RackspaceUKTests(RackspaceUSTests): klass = RackspaceUKDNSDriver - + endpoint_url = 'https://lon.dns.api.rackspacecloud.com/v1.0/11111' class RackspaceMockHttp(MockHttp): fixtures = DNSFileFixtures('rackspace') base_headers = {'content-type': 'application/json'} - - def _v1_1_auth(self, method, url, body, headers): - body = self.fixtures.load('auth_1_1.json') - # fake auth token response - headers = {'content-length': '657', 'vary': 'Accept,Accept-Encoding', - 'server': 'Apache/2.2.13 (Red Hat)', - 'connection': 'Keep-Alive', - 'date': 'Sat, 29 Oct 2011 19:29:45 GMT', - 'content-type': 'application/json'} - return (httplib.OK, body, headers, - httplib.responses[httplib.OK]) - def _v2_0_tokens(self, method, url, body, headers): body = self.fixtures.load('auth_2_0.json') headers = {
