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 2011/10/08 23:26:12 UTC

svn commit: r1180493 - in /libcloud/trunk/test: dns/test_zerigo.py secrets.py-dist

Author: tomaz
Date: Sat Oct  8 21:26:12 2011
New Revision: 1180493

URL: http://svn.apache.org/viewvc?rev=1180493&view=rev
Log:
Add tests for Zerigo DNS driver.

Added:
    libcloud/trunk/test/dns/test_zerigo.py
Modified:
    libcloud/trunk/test/secrets.py-dist

Added: libcloud/trunk/test/dns/test_zerigo.py
URL: http://svn.apache.org/viewvc/libcloud/trunk/test/dns/test_zerigo.py?rev=1180493&view=auto
==============================================================================
--- libcloud/trunk/test/dns/test_zerigo.py (added)
+++ libcloud/trunk/test/dns/test_zerigo.py Sat Oct  8 21:26:12 2011
@@ -0,0 +1,353 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+
+import sys
+import httplib
+import unittest
+
+from libcloud.common.types import InvalidCredsError, LibcloudError
+from libcloud.dns.types import RecordType, ZoneDoesNotExistError
+from libcloud.dns.types import RecordDoesNotExistError
+from libcloud.dns.drivers.zerigo import ZerigoDNSDriver, ZerigoError
+
+from test import MockHttp
+from test.file_fixtures import DNSFileFixtures
+from test.secrets import DNS_PARAMS_ZERIGO
+
+
+class ZerigoTests(unittest.TestCase):
+    def setUp(self):
+        ZerigoDNSDriver.connectionCls.conn_classes = (
+                None, ZerigoMockHttp)
+        ZerigoMockHttp.type = None
+        self.driver = ZerigoDNSDriver(*DNS_PARAMS_ZERIGO)
+
+    def test_invalid_credentials(self):
+        ZerigoMockHttp.type = 'INVALID_CREDS'
+
+        try:
+            list(self.driver.list_zones())
+        except InvalidCredsError:
+            pass
+        else:
+            self.fail('Exception was not thrown')
+
+    def test_list_zones_success(self):
+        zones = self.driver.list_zones()
+        self.assertEqual(len(zones), 1)
+        self.assertEqual(zones[0].domain, 'example.com')
+        self.assertEqual(zones[0].type, 'master')
+        self.assertEqual(zones[0].extra['notes'], 'test foo bar')
+
+    def test_list_zones_no_results(self):
+        ZerigoMockHttp.type = 'NO_RESULTS'
+        zones = self.driver.list_zones()
+        self.assertEqual(len(zones), 0)
+
+    def test_list_records_success(self):
+        zone = self.driver.list_zones()[0]
+        records = list(self.driver.list_records(zone=zone))
+
+        self.assertEqual(len(records), 1)
+        self.assertEqual(records[0].name, 'www')
+        self.assertEqual(records[0].type, RecordType.A)
+        self.assertEqual(records[0].data, '172.16.16.1')
+        self.assertEqual(records[0].extra['fqdn'], 'www.example.com')
+
+    def test_list_records_no_results(self):
+        zone = self.driver.list_zones()[0]
+        ZerigoMockHttp.type = 'NO_RESULTS'
+        records = list(self.driver.list_records(zone=zone))
+        self.assertEqual(len(records), 0)
+
+    def test_list_records_zone_does_not_exist(self):
+        zone = self.driver.list_zones()[0]
+
+        ZerigoMockHttp.type = 'ZONE_DOES_NOT_EXIST'
+        try:
+            records = list(self.driver.list_records(zone=zone))
+        except ZoneDoesNotExistError, e:
+            self.assertEqual(e.zone_id, zone.id)
+        else:
+            self.fail('Exception was not thrown')
+        pass
+
+    def test_get_zone_success(self):
+        zone = self.driver.get_zone(zone_id=12345678)
+
+        self.assertEqual(zone.id, '12345678')
+        self.assertEqual(zone.domain, 'example.com')
+        self.assertEqual(zone.extra['hostmaster'], 'dnsadmin@example.com')
+        self.assertEqual(zone.type, 'master')
+
+    def test_get_zone_does_not_exist(self):
+        ZerigoMockHttp.type = 'DOES_NOT_EXIST'
+
+        try:
+            zone = self.driver.get_zone(zone_id='4444')
+        except ZoneDoesNotExistError, e:
+            self.assertEqual(e.zone_id, '4444')
+        else:
+            self.fail('Exception was not thrown')
+
+    def test_get_record_success(self):
+        record = self.driver.get_record(zone_id='12345678',
+                                        record_id='23456789')
+        self.assertEqual(record.id, '23456789')
+        self.assertEqual(record.name, 'www')
+        self.assertEqual(record.type, RecordType.A)
+
+    def test_get_record_zone_does_not_exist(self):
+        ZerigoMockHttp.type = 'ZONE_DOES_NOT_EXIST'
+
+        try:
+            record = self.driver.get_record(zone_id='444', record_id='28536')
+        except ZoneDoesNotExistError:
+            pass
+        else:
+            self.fail('Exception was not thrown')
+
+    def test_get_record_record_does_not_exist(self):
+        ZerigoMockHttp.type = 'RECORD_DOES_NOT_EXIST'
+
+        try:
+            record = self.driver.get_record(zone_id='12345678',
+                                            record_id='28536')
+        except RecordDoesNotExistError:
+            pass
+        else:
+            self.fail('Exception was not thrown')
+
+    def test_create_zone_success(self):
+        ZerigoMockHttp.type = 'CREATE_ZONE'
+
+        zone = self.driver.create_zone(domain='foo.bar.com', type='master',
+                                       ttl=None, extra=None)
+        self.assertEqual(zone.id, '12345679')
+        self.assertEqual(zone.domain, 'foo.bar.com')
+
+    def test_create_zone_validaton_error(self):
+        ZerigoMockHttp.type = 'CREATE_ZONE_VALIDATION_ERROR'
+
+        try:
+            zone = self.driver.create_zone(domain='foo.bar.com', type='master',
+                                           ttl=10, extra=None)
+        except ZerigoError, e:
+            self.assertEqual(len(e.errors), 2)
+            pass
+        else:
+            self.fail('Exception was not thrown')
+
+    def test_update_zone_success(self):
+        zone = self.driver.list_zones()[0]
+        updated_zone = self.driver.update_zone(zone=zone,
+                                               ttl=10,
+                                               extra={'notes':
+                                                      'bar foo'})
+
+        self.assertEqual(zone.extra['hostmaster'], '')
+        self.assertEqual(zone.extra['notes'], 'test foo bar')
+
+        self.assertEqual(updated_zone.id, zone.id)
+        self.assertEqual(updated_zone.domain, 'example.com')
+        self.assertEqual(updated_zone.type, zone.type)
+        self.assertEqual(updated_zone.ttl, 10)
+        self.assertEqual(updated_zone.extra['notes'], 'bar foo')
+
+    def test_update_zone_domain_cannot_be_changed(self):
+        zone = self.driver.list_zones()[0]
+
+        try:
+            updated_zone = self.driver.update_zone(zone=zone,
+                                                   domain='libcloud.org')
+        except LibcloudError:
+            pass
+        else:
+            self.fail('Exception was not thrown')
+
+    def test_create_record_success(self):
+        zone = self.driver.list_zones()[0]
+
+        ZerigoMockHttp.type = 'CREATE_RECORD'
+        record = self.driver.create_record(name='www', zone=zone,
+                                           type=RecordType.A, data='127.0.0.1')
+
+        self.assertEqual(record.id, '23456780')
+        self.assertEqual(record.name, 'www')
+        self.assertEqual(record.zone, zone)
+        self.assertEqual(record.type, RecordType.A)
+        self.assertEqual(record.data, '127.0.0.1')
+
+    def test_update_record_success(self):
+        zone = self.driver.list_zones()[0]
+        record = self.driver.list_records(zone=zone)[0]
+        updated_record = self.driver.update_record(record=record, name='www',
+                                                   type=RecordType.AAAA,
+                                                   data='::1')
+
+        self.assertEqual(record.data, '172.16.16.1')
+
+        self.assertEqual(updated_record.id, record.id)
+        self.assertEqual(updated_record.name, 'www')
+        self.assertEqual(updated_record.zone, record.zone)
+        self.assertEqual(updated_record.type, RecordType.AAAA)
+        self.assertEqual(updated_record.data, '::1')
+
+    def test_delete_zone_success(self):
+        zone = self.driver.list_zones()[0]
+        status = self.driver.delete_zone(zone=zone)
+        self.assertTrue(status)
+
+    def test_delete_zone_does_not_exist(self):
+        zone = self.driver.list_zones()[0]
+
+        ZerigoMockHttp.type = 'ZONE_DOES_NOT_EXIST'
+
+        try:
+            self.driver.delete_zone(zone=zone)
+        except ZoneDoesNotExistError, e:
+            self.assertEqual(e.zone_id, zone.id)
+        else:
+            self.fail('Exception was not thrown')
+
+    def test_delete_record_success(self):
+        zone = self.driver.list_zones()[0]
+        record = self.driver.list_records(zone=zone)[0]
+        status = self.driver.delete_record(record=record)
+        self.assertTrue(status)
+
+    def test_delete_record_does_not_exist(self):
+        zone = self.driver.list_zones()[0]
+        record = self.driver.list_records(zone=zone)[0]
+
+        ZerigoMockHttp.type = 'RECORD_DOES_NOT_EXIST'
+
+        try:
+            self.driver.delete_record(record=record)
+        except RecordDoesNotExistError, e:
+            self.assertEqual(e.record_id, record.id)
+        else:
+            self.fail('Exception was not thrown')
+
+
+class ZerigoMockHttp(MockHttp):
+    fixtures = DNSFileFixtures('zerigo')
+
+    def _api_1_1_zones_xml_INVALID_CREDS(self, method, url, body, headers):
+        body = 'HTTP Basic: Access denied.\n'
+        return (httplib.UNAUTHORIZED, body, {}, httplib.responses[httplib.OK])
+
+    def _api_1_1_zones_xml(self, method, url, body, headers):
+        body = self.fixtures.load('list_zones.xml')
+        return (httplib.OK, body, {'x-query-count': 1},
+                httplib.responses[httplib.OK])
+
+    def _api_1_1_zones_xml_NO_RESULTS(self, method, url, body, headers):
+        body = self.fixtures.load('list_zones_no_results.xml')
+        return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+    def _api_1_1_zones_12345678_hosts_xml(self, method, url, body, headers):
+        body = self.fixtures.load('list_records.xml')
+        return (httplib.OK, body, {'x-query-count': 1},
+                httplib.responses[httplib.OK])
+
+    def _api_1_1_zones_12345678_hosts_xml_NO_RESULTS(self, method, url, body,
+                                                     headers):
+        body = self.fixtures.load('list_records_no_results.xml')
+        return (httplib.OK, body, {'x-query-count': 0},
+                httplib.responses[httplib.OK])
+
+    def _api_1_1_zones_12345678_hosts_xml_ZONE_DOES_NOT_EXIST(self, method,
+                                                              url, body,
+                                                              headers):
+        body = ''
+        return (httplib.NOT_FOUND, body, {}, httplib.responses[httplib.OK])
+
+    def _api_1_1_zones_12345678_xml(self, method, url, body, headers):
+        body = self.fixtures.load('get_zone.xml')
+        return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+    def _api_1_1_zones_4444_xml_DOES_NOT_EXIST(self, method, url, body,
+                                               headers):
+        body = ''
+        return (httplib.NOT_FOUND, body, {}, httplib.responses[httplib.OK])
+
+    def _api_1_1_hosts_23456789_xml(self, method, url, body, headers):
+        body = self.fixtures.load('get_record.xml')
+        return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+    def _api_1_1_zones_444_xml_ZONE_DOES_NOT_EXIST(self, method, url, body,
+                                                   headers):
+        body = ''
+        return (httplib.NOT_FOUND, body, {}, httplib.responses[httplib.OK])
+
+    def _api_1_1_zones_12345678_xml_RECORD_DOES_NOT_EXIST(self, method, url,
+                                                          body, headers):
+        body = self.fixtures.load('get_zone.xml')
+        return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+    def _api_1_1_hosts_28536_xml_RECORD_DOES_NOT_EXIST(self, method, url, body,
+                                                       headers):
+        body = ''
+        return (httplib.NOT_FOUND, body, {}, httplib.responses[httplib.OK])
+
+    def _api_1_1_zones_xml_CREATE_ZONE(self, method, url, body, headers):
+        body = self.fixtures.load('create_zone.xml')
+        return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+    def _api_1_1_zones_xml_CREATE_ZONE_VALIDATION_ERROR(self, method, url,
+                                                        body, headers):
+        body = self.fixtures.load('create_zone_validation_error.xml')
+        return (httplib.UNPROCESSABLE_ENTITY, body, {},
+                httplib.responses[httplib.OK])
+
+    def _api_1_1_zones_12345678_hosts_xml_CREATE_RECORD(self, method, url,
+                                                        body, headers):
+        body = self.fixtures.load('create_record.xml')
+        return (httplib.CREATED, body, {}, httplib.responses[httplib.OK])
+
+    def _api_1_1_zones_12345678_xml_ZONE_DOES_NOT_EXIST(self, method, url,
+                                                        body, headers):
+        body = ''
+        return (httplib.NOT_FOUND, body, {}, httplib.responses[httplib.OK])
+
+    def _api_1_1_hosts_23456789_xml_RECORD_DOES_NOT_EXIST(self, method, url,
+                                                          body, headers):
+        body = ''
+        return (httplib.NOT_FOUND, body, {}, httplib.responses[httplib.OK])
+
+    """
+    def (self, method, url, body, headers):
+        body = self.fixtures.load('.xml')
+        return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+    def (self, method, url, body, headers):
+        return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+    def (self, method, url, body, headers):
+        return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+    def (self, method, url, body, headers):
+        return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+    def (self, method, url, body, headers):
+        return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+    def (self, method, url, body, headers):
+        return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+    """
+
+
+if __name__ == '__main__':
+    sys.exit(unittest.main())

Modified: libcloud/trunk/test/secrets.py-dist
URL: http://svn.apache.org/viewvc/libcloud/trunk/test/secrets.py-dist?rev=1180493&r1=1180492&r2=1180493&view=diff
==============================================================================
--- libcloud/trunk/test/secrets.py-dist (original)
+++ libcloud/trunk/test/secrets.py-dist Sat Oct  8 21:26:12 2011
@@ -41,3 +41,4 @@ STORAGE_GOOGLE_STORAGE_PARAMS = ('key', 
 
 # DNS
 DNS_PARAMS_LINODE = ('user', 'key')
+DNS_PARAMS_ZERIGO = ('email', 'api token')