Author: tomaz
Date: Thu Jan 31 02:44:27 2013
New Revision: 1440820
URL: http://svn.apache.org/viewvc?rev=1440820&view=rev
Log:
Backport commit 1440817 from trunk:
Add new DNS driver for Gandi.net provider.
Also perform pep8 cleanup on the existing compute driver tests.
Contributed by John Carr, part of LIBCLOUD-281.
Added:
libcloud/branches/0.12.x/libcloud/dns/drivers/gandi.py
- copied unchanged from r1440817,
libcloud/trunk/libcloud/dns/drivers/gandi.py
libcloud/branches/0.12.x/libcloud/test/common/test_gandi.py
- copied unchanged from r1440817,
libcloud/trunk/libcloud/test/common/test_gandi.py
libcloud/branches/0.12.x/libcloud/test/dns/fixtures/gandi/
- copied from r1440817, libcloud/trunk/libcloud/test/dns/fixtures/gandi/
libcloud/branches/0.12.x/libcloud/test/dns/fixtures/gandi/create_record.xml
- copied unchanged from r1440817,
libcloud/trunk/libcloud/test/dns/fixtures/gandi/create_record.xml
libcloud/branches/0.12.x/libcloud/test/dns/fixtures/gandi/create_zone.xml
- copied unchanged from r1440817,
libcloud/trunk/libcloud/test/dns/fixtures/gandi/create_zone.xml
libcloud/branches/0.12.x/libcloud/test/dns/fixtures/gandi/delete_record.xml
- copied unchanged from r1440817,
libcloud/trunk/libcloud/test/dns/fixtures/gandi/delete_record.xml
libcloud/branches/0.12.x/libcloud/test/dns/fixtures/gandi/delete_record_doesnotexist.xml
- copied unchanged from r1440817,
libcloud/trunk/libcloud/test/dns/fixtures/gandi/delete_record_doesnotexist.xml
libcloud/branches/0.12.x/libcloud/test/dns/fixtures/gandi/delete_zone.xml
- copied unchanged from r1440817,
libcloud/trunk/libcloud/test/dns/fixtures/gandi/delete_zone.xml
libcloud/branches/0.12.x/libcloud/test/dns/fixtures/gandi/delete_zone_fail.xml
- copied unchanged from r1440817,
libcloud/trunk/libcloud/test/dns/fixtures/gandi/delete_zone_fail.xml
libcloud/branches/0.12.x/libcloud/test/dns/fixtures/gandi/get_zone.xml
- copied unchanged from r1440817,
libcloud/trunk/libcloud/test/dns/fixtures/gandi/get_zone.xml
libcloud/branches/0.12.x/libcloud/test/dns/fixtures/gandi/list_records.xml
- copied unchanged from r1440817,
libcloud/trunk/libcloud/test/dns/fixtures/gandi/list_records.xml
libcloud/branches/0.12.x/libcloud/test/dns/fixtures/gandi/list_records_empty.xml
- copied unchanged from r1440817,
libcloud/trunk/libcloud/test/dns/fixtures/gandi/list_records_empty.xml
libcloud/branches/0.12.x/libcloud/test/dns/fixtures/gandi/list_zones.xml
- copied unchanged from r1440817,
libcloud/trunk/libcloud/test/dns/fixtures/gandi/list_zones.xml
libcloud/branches/0.12.x/libcloud/test/dns/fixtures/gandi/new_version.xml
- copied unchanged from r1440817,
libcloud/trunk/libcloud/test/dns/fixtures/gandi/new_version.xml
libcloud/branches/0.12.x/libcloud/test/dns/test_gandi.py
- copied unchanged from r1440817,
libcloud/trunk/libcloud/test/dns/test_gandi.py
Modified:
libcloud/branches/0.12.x/ (props changed)
libcloud/branches/0.12.x/CHANGES
libcloud/branches/0.12.x/libcloud/common/gandi.py
libcloud/branches/0.12.x/libcloud/dns/providers.py
libcloud/branches/0.12.x/libcloud/dns/types.py
libcloud/branches/0.12.x/libcloud/test/compute/test_gandi.py
libcloud/branches/0.12.x/libcloud/test/secrets.py-dist
Propchange: libcloud/branches/0.12.x/
------------------------------------------------------------------------------
Merged /libcloud/trunk:r1440817
Modified: libcloud/branches/0.12.x/CHANGES
URL:
http://svn.apache.org/viewvc/libcloud/branches/0.12.x/CHANGES?rev=1440820&r1=1440819&r2=1440820&view=diff
==============================================================================
--- libcloud/branches/0.12.x/CHANGES (original)
+++ libcloud/branches/0.12.x/CHANGES Thu Jan 31 02:44:27 2013
@@ -154,6 +154,9 @@ Changes with Apache Libcloud 0.12.0:
- Finish Amazon Route53 driver. (LIBCLOUD-132)
[John Carr]
+ - Add new driver for Gandi provider (https://www.gandi.net). (LIBCLOUD-281)
+ [John Carr]
+
*) Load-Balancer
- Add new driver for AWS Elastic Load Balancing service. (LIBCLOUD-169)
Modified: libcloud/branches/0.12.x/libcloud/common/gandi.py
URL:
http://svn.apache.org/viewvc/libcloud/branches/0.12.x/libcloud/common/gandi.py?rev=1440820&r1=1440819&r2=1440820&view=diff
==============================================================================
--- libcloud/branches/0.12.x/libcloud/common/gandi.py (original)
+++ libcloud/branches/0.12.x/libcloud/common/gandi.py Thu Jan 31 02:44:27 2013
@@ -93,7 +93,15 @@ class GandiConnection(ConnectionKey):
return getattr(self._proxy, method)(self.key, *args)
except xmlrpclib.Fault:
e = sys.exc_info()[1]
- raise GandiException(1001, e)
+ self.parse_error(e.faultCode, e.faultString)
+ raise GandiException(1001, e.faultString)
+
+ def parse_error(self, code, message):
+ """
+ This hook allows you to inspect any xmlrpclib errors and
+ potentially raise a more useful and specific exception.
+ """
+ pass
class BaseGandiDriver(object):
@@ -121,8 +129,8 @@ class BaseGandiDriver(object):
self.connection.driver = self
# Specific methods for gandi
- def _wait_operation(self, id, \
- timeout=DEFAULT_TIMEOUT, check_interval=DEFAULT_INTERVAL):
+ def _wait_operation(self, id, timeout=DEFAULT_TIMEOUT,
+ check_interval=DEFAULT_INTERVAL):
""" Wait for an operation to succeed"""
for i in range(0, timeout, check_interval):
@@ -131,7 +139,7 @@ class BaseGandiDriver(object):
if op['step'] == 'DONE':
return True
- if op['step'] in ['ERROR', 'CANCEL']:
+ if op['step'] in ['ERROR', 'CANCEL']:
return False
except (KeyError, IndexError):
pass
@@ -172,8 +180,9 @@ class BaseObject(object):
Note, for example, that this example will always produce the
same UUID!
"""
- return hashlib.sha1(b("%s:%s:%s" % \
- (self.uuid_prefix, self.id, self.driver.type))).hexdigest()
+ hashstring = "%s:%s:%s" % \
+ (self.uuid_prefix, self.id, self.driver.type)
+ return hashlib.sha1(b(hashstring)).hexdigest()
class IPAddress(BaseObject):
@@ -202,7 +211,7 @@ class NetworkInterface(BaseObject):
uuid_prefix = 'if:'
def __init__(self, id, state, mac_address, driver,
- ips=None, node_id=None, extra=None):
+ ips=None, node_id=None, extra=None):
super(NetworkInterface, self).__init__(id, state, driver)
self.mac = mac_address
self.ips = ips or {}
@@ -225,5 +234,6 @@ class Disk(BaseObject):
self.extra = extra or {}
def __repr__(self):
- return (('<Disk: id=%s, name=%s, state=%s, size=%s, driver=%s ...>')
+ return (
+ ('<Disk: id=%s, name=%s, state=%s, size=%s, driver=%s ...>')
% (self.id, self.name, self.state, self.size, self.driver.name))
Modified: libcloud/branches/0.12.x/libcloud/dns/providers.py
URL:
http://svn.apache.org/viewvc/libcloud/branches/0.12.x/libcloud/dns/providers.py?rev=1440820&r1=1440819&r2=1440820&view=diff
==============================================================================
--- libcloud/branches/0.12.x/libcloud/dns/providers.py (original)
+++ libcloud/branches/0.12.x/libcloud/dns/providers.py Thu Jan 31 02:44:27 2013
@@ -32,6 +32,8 @@ DRIVERS = {
('libcloud.dns.drivers.hostvirtual', 'HostVirtualDNSDriver'),
Provider.ROUTE53:
('libcloud.dns.drivers.route53', 'Route53DNSDriver'),
+ Provider.GANDI:
+ ('libcloud.dns.drivers.gandi', 'GandiDNSDriver')
}
Modified: libcloud/branches/0.12.x/libcloud/dns/types.py
URL:
http://svn.apache.org/viewvc/libcloud/branches/0.12.x/libcloud/dns/types.py?rev=1440820&r1=1440819&r2=1440820&view=diff
==============================================================================
--- libcloud/branches/0.12.x/libcloud/dns/types.py (original)
+++ libcloud/branches/0.12.x/libcloud/dns/types.py Thu Jan 31 02:44:27 2013
@@ -35,6 +35,7 @@ class Provider(object):
RACKSPACE_UK = 'rackspace_uk'
ROUTE53 = 'route53'
HOSTVIRTUAL = 'hostvirtual'
+ GANDI = 'gandi'
class RecordType(object):
@@ -57,6 +58,8 @@ class RecordType(object):
REDIRECT = 13
GEO = 14
URL = 15
+ WKS = 16
+ LOC = 17
@classmethod
def __repr__(self, value):
@@ -67,7 +70,7 @@ class RecordType(object):
class ZoneError(LibcloudError):
error_type = 'ZoneError'
kwargs = ('zone_id', )
-
+
def __init__(self, value, driver, zone_id):
self.zone_id = zone_id
super(ZoneError, self).__init__(value=value, driver=driver)
Modified: libcloud/branches/0.12.x/libcloud/test/compute/test_gandi.py
URL:
http://svn.apache.org/viewvc/libcloud/branches/0.12.x/libcloud/test/compute/test_gandi.py?rev=1440820&r1=1440819&r2=1440820&view=diff
==============================================================================
--- libcloud/branches/0.12.x/libcloud/test/compute/test_gandi.py (original)
+++ libcloud/branches/0.12.x/libcloud/test/compute/test_gandi.py Thu Jan 31
02:44:27 2013
@@ -21,7 +21,7 @@ import string
from libcloud.utils.py3 import httplib
from libcloud.utils.py3 import xmlrpclib
-from libcloud.compute.drivers.gandi import GandiNodeDriver as Gandi
+from libcloud.compute.drivers.gandi import GandiNodeDriver
from libcloud.compute.base import StorageVolume
from libcloud.common.gandi import GandiException
from libcloud.compute.types import NodeState
@@ -30,32 +30,113 @@ from xml.etree import ElementTree as ET
from libcloud.test import MockHttp
from libcloud.test.file_fixtures import ComputeFileFixtures
from libcloud.test.secrets import GANDI_PARAMS
+from libcloud.test.common.test_gandi import MockGandiTransport, BaseGandiTests
-class MockGandiTransport(xmlrpclib.Transport):
+class GandiMockHttp(MockHttp):
- def request(self, host, handler, request_body, verbose=0):
- self.verbose = 0
- method = ET.XML(request_body).find('methodName').text
- mock = GandiMockHttp(host, 80)
- mock.request('POST', "%s/%s" % (handler, method))
- resp = mock.getresponse()
-
- if sys.version[0] == '2' and sys.version[2] == '7':
- response = self.parse_response(resp)
- else:
- response = self.parse_response(resp.body)
- return response
+ fixtures = ComputeFileFixtures('gandi')
+ def _xmlrpc__datacenter_list(self, method, url, body, headers):
+ body = self.fixtures.load('datacenter_list.xml')
+ return (httplib.OK, body, {}, httplib.responses[httplib.OK])
-class GandiTests(unittest.TestCase):
+ def _xmlrpc__image_list(self, method, url, body, headers):
+ body = self.fixtures.load('image_list_dc0.xml')
+ return (httplib.OK, body, {}, httplib.responses[httplib.OK])
- node_name = 'test2'
+ def _xmlrpc__vm_list(self, method, url, body, headers):
+ body = self.fixtures.load('vm_list.xml')
+ return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+ def _xmlrpc__ip_list(self, method, url, body, headers):
+ body = self.fixtures.load('ip_list.xml')
+ return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+ def _xmlrpc__account_info(self, method, url, body, headers):
+ body = self.fixtures.load('account_info.xml')
+ return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+ def _xmlrpc__vm_info(self, method, url, body, headers):
+ body = self.fixtures.load('vm_info.xml')
+ return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+ def _xmlrpc__vm_delete(self, method, url, body, headers):
+ body = self.fixtures.load('vm_delete.xml')
+ return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+ def _xmlrpc__operation_info(self, method, url, body, headers):
+ body = self.fixtures.load('operation_info.xml')
+ return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+ def _xmlrpc__vm_create_from(self, method, url, body, headers):
+ body = self.fixtures.load('vm_create_from.xml')
+ return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+ def _xmlrpc__vm_reboot(self, method, url, body, headers):
+ body = self.fixtures.load('vm_reboot.xml')
+ return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+ def _xmlrpc__vm_stop(self, method, url, body, headers):
+ body = self.fixtures.load('vm_stop.xml')
+ return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+ def _xmlrpc__iface_list(self, method, url, body, headers):
+ body = self.fixtures.load('iface_list.xml')
+ return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+ def _xmlrpc__disk_list(self, method, url, body, headers):
+ body = self.fixtures.load('disk_list.xml')
+ return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+ def _xmlrpc__vm_iface_attach(self, method, url, body, headers):
+ body = self.fixtures.load('iface_attach.xml')
+ return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+ def _xmlrpc__vm_iface_detach(self, method, url, body, headers):
+ body = self.fixtures.load('iface_detach.xml')
+ return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+ def _xmlrpc__vm_disk_attach(self, method, url, body, headers):
+ body = self.fixtures.load('disk_attach.xml')
+ return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+ def _xmlrpc__vm_disk_detach(self, method, url, body, headers):
+ body = self.fixtures.load('disk_detach.xml')
+ return (httplib.OK, body, {}, httplib.responses[httplib.OK])
- def setUp(self):
- Gandi.connectionCls.proxyCls.transportCls = \
- [MockGandiTransport, MockGandiTransport]
- self.driver = Gandi(*GANDI_PARAMS)
+ def _xmlrpc__disk_create(self, method, url, body, headers):
+ body = self.fixtures.load('disk_create.xml')
+ return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+ def _xmlrpc__disk_create_from(self, method, url, body, headers):
+ body = self.fixtures.load('disk_create_from.xml')
+ return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+ def _xmlrpc__disk_info(self, method, url, body, headers):
+ body = self.fixtures.load('disk_info.xml')
+ return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+ def _xmlrpc__disk_update(self, method, url, body, headers):
+ body = self.fixtures.load('disk_update.xml')
+ return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+ def _xmlrpc__disk_delete(self, method, url, body, headers):
+ body = self.fixtures.load('disk_delete.xml')
+ return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+
+class DummyTransport(MockGandiTransport):
+ mockCls = GandiMockHttp
+
+
+class GandiTests(BaseGandiTests):
+
+ driverCls = GandiNodeDriver
+ transportCls = DummyTransport
+ params = GANDI_PARAMS
+
+ node_name = 'test2'
def test_list_nodes(self):
nodes = self.driver.list_nodes()
@@ -64,12 +145,12 @@ class GandiTests(unittest.TestCase):
def test_list_locations(self):
loc = list(filter(lambda x: 'france' in x.country.lower(),
- self.driver.list_locations()))[0]
+ self.driver.list_locations()))[0]
self.assertEqual(loc.country, 'France')
def test_list_images(self):
loc = list(filter(lambda x: 'france' in x.country.lower(),
- self.driver.list_locations()))[0]
+ self.driver.list_locations()))[0]
images = self.driver.list_images(loc)
self.assertTrue(len(images) > 2)
@@ -79,7 +160,8 @@ class GandiTests(unittest.TestCase):
def test_destroy_node_running(self):
nodes = self.driver.list_nodes()
- test_node = list(filter(lambda x: x.state == NodeState.RUNNING,
nodes))[0]
+ test_node = list(filter(lambda x: x.state == NodeState.RUNNING,
+ nodes))[0]
self.assertTrue(self.driver.destroy_node(test_node))
def test_destroy_node_halted(self):
@@ -90,29 +172,34 @@ class GandiTests(unittest.TestCase):
def test_reboot_node(self):
nodes = self.driver.list_nodes()
- test_node = list(filter(lambda x: x.state == NodeState.RUNNING,
nodes))[0]
+ test_node = list(filter(lambda x: x.state == NodeState.RUNNING,
+ nodes))[0]
self.assertTrue(self.driver.reboot_node(test_node))
def test_create_node(self):
login = 'libcloud'
passwd = ''.join(random.choice(string.ascii_letters)
- for i in range(10))
+ for i in range(10))
+
# Get france datacenter
loc = list(filter(lambda x: 'france' in x.country.lower(),
- self.driver.list_locations()))[0]
+ self.driver.list_locations()))[0]
+
# Get a debian image
images = self.driver.list_images(loc)
images = [x for x in images if x.name.lower().startswith('debian')]
img = list(filter(lambda x: '5' in x.name, images))[0]
+
# Get a configuration size
size = self.driver.list_sizes()[0]
node = self.driver.create_node(name=self.node_name, login=login,
- password=passwd, image=img, location=loc, size=size)
+ password=passwd, image=img,
+ location=loc, size=size)
self.assertEqual(node.name, self.node_name)
def test_create_volume(self):
loc = list(filter(lambda x: 'france' in x.country.lower(),
- self.driver.list_locations()))[0]
+ self.driver.list_locations()))[0]
volume = self.driver.create_volume(
size=1024, name='libcloud', location=loc)
self.assertEqual(volume.name, 'libcloud')
@@ -125,7 +212,7 @@ class GandiTests(unittest.TestCase):
def test_destroy_volume(self):
volumes = self.driver.list_volumes()
test_vol = list(filter(lambda x: x.name == 'test_disk',
- volumes))[0]
+ volumes))[0]
self.assertTrue(self.driver.destroy_volume(test_vol))
def test_attach_volume(self):
@@ -160,104 +247,12 @@ class GandiTests(unittest.TestCase):
disks = self.driver.list_volumes()
self.assertTrue(self.driver.ex_snapshot_disk(disks[2]))
self.assertRaises(GandiException,
- self.driver.ex_snapshot_disk, disks[0])
+ self.driver.ex_snapshot_disk, disks[0])
def test_ex_update_disk(self):
disks = self.driver.list_volumes()
self.assertTrue(self.driver.ex_update_disk(disks[0], new_size=4096))
-class GandiMockHttp(MockHttp):
-
- fixtures = ComputeFileFixtures('gandi')
-
- def _xmlrpc__datacenter_list(self, method, url, body, headers):
- body = self.fixtures.load('datacenter_list.xml')
- return (httplib.OK, body, {}, httplib.responses[httplib.OK])
-
- def _xmlrpc__image_list(self, method, url, body, headers):
- body = self.fixtures.load('image_list_dc0.xml')
- return (httplib.OK, body, {}, httplib.responses[httplib.OK])
-
- def _xmlrpc__vm_list(self, method, url, body, headers):
- body = self.fixtures.load('vm_list.xml')
- return (httplib.OK, body, {}, httplib.responses[httplib.OK])
-
- def _xmlrpc__ip_list(self, method, url, body, headers):
- body = self.fixtures.load('ip_list.xml')
- return (httplib.OK, body, {}, httplib.responses[httplib.OK])
-
- def _xmlrpc__account_info(self, method, url, body, headers):
- body = self.fixtures.load('account_info.xml')
- return (httplib.OK, body, {}, httplib.responses[httplib.OK])
-
- def _xmlrpc__vm_info(self, method, url, body, headers):
- body = self.fixtures.load('vm_info.xml')
- return (httplib.OK, body, {}, httplib.responses[httplib.OK])
-
- def _xmlrpc__vm_delete(self, method, url, body, headers):
- body = self.fixtures.load('vm_delete.xml')
- return (httplib.OK, body, {}, httplib.responses[httplib.OK])
-
- def _xmlrpc__operation_info(self, method, url, body, headers):
- body = self.fixtures.load('operation_info.xml')
- return (httplib.OK, body, {}, httplib.responses[httplib.OK])
-
- def _xmlrpc__vm_create_from(self, method, url, body, headers):
- body = self.fixtures.load('vm_create_from.xml')
- return (httplib.OK, body, {}, httplib.responses[httplib.OK])
-
- def _xmlrpc__vm_reboot(self, method, url, body, headers):
- body = self.fixtures.load('vm_reboot.xml')
- return (httplib.OK, body, {}, httplib.responses[httplib.OK])
-
- def _xmlrpc__vm_stop(self, method, url, body, headers):
- body = self.fixtures.load('vm_stop.xml')
- return (httplib.OK, body, {}, httplib.responses[httplib.OK])
-
- def _xmlrpc__iface_list(self, method, url, body, headers):
- body = self.fixtures.load('iface_list.xml')
- return (httplib.OK, body, {}, httplib.responses[httplib.OK])
-
- def _xmlrpc__disk_list(self, method, url, body, headers):
- body = self.fixtures.load('disk_list.xml')
- return (httplib.OK, body, {}, httplib.responses[httplib.OK])
-
- def _xmlrpc__vm_iface_attach(self, method, url, body, headers):
- body = self.fixtures.load('iface_attach.xml')
- return (httplib.OK, body, {}, httplib.responses[httplib.OK])
-
- def _xmlrpc__vm_iface_detach(self, method, url, body, headers):
- body = self.fixtures.load('iface_detach.xml')
- return (httplib.OK, body, {}, httplib.responses[httplib.OK])
-
- def _xmlrpc__vm_disk_attach(self, method, url, body, headers):
- body = self.fixtures.load('disk_attach.xml')
- return (httplib.OK, body, {}, httplib.responses[httplib.OK])
-
- def _xmlrpc__vm_disk_detach(self, method, url, body, headers):
- body = self.fixtures.load('disk_detach.xml')
- return (httplib.OK, body, {}, httplib.responses[httplib.OK])
-
- def _xmlrpc__disk_create(self, method, url, body, headers):
- body = self.fixtures.load('disk_create.xml')
- return (httplib.OK, body, {}, httplib.responses[httplib.OK])
-
- def _xmlrpc__disk_create_from(self, method, url, body, headers):
- body = self.fixtures.load('disk_create_from.xml')
- return (httplib.OK, body, {}, httplib.responses[httplib.OK])
-
- def _xmlrpc__disk_info(self, method, url, body, headers):
- body = self.fixtures.load('disk_info.xml')
- return (httplib.OK, body, {}, httplib.responses[httplib.OK])
-
- def _xmlrpc__disk_update(self, method, url, body, headers):
- body = self.fixtures.load('disk_update.xml')
- return (httplib.OK, body, {}, httplib.responses[httplib.OK])
-
- def _xmlrpc__disk_delete(self, method, url, body, headers):
- body = self.fixtures.load('disk_delete.xml')
- return (httplib.OK, body, {}, httplib.responses[httplib.OK])
-
if __name__ == '__main__':
sys.exit(unittest.main())
Modified: libcloud/branches/0.12.x/libcloud/test/secrets.py-dist
URL:
http://svn.apache.org/viewvc/libcloud/branches/0.12.x/libcloud/test/secrets.py-dist?rev=1440820&r1=1440819&r2=1440820&view=diff
==============================================================================
--- libcloud/branches/0.12.x/libcloud/test/secrets.py-dist (original)
+++ libcloud/branches/0.12.x/libcloud/test/secrets.py-dist Thu Jan 31 02:44:27
2013
@@ -54,3 +54,4 @@ DNS_PARAMS_ZERIGO = ('email', 'api token
DNS_PARAMS_RACKSPACE = ('user', 'key')
DNS_PARAMS_HOSTVIRTUAL = ('key',)
DNS_PARAMS_ROUTE53 = ('access_id', 'secret')
+DNS_GANDI = ('user', )