From: Christian Hofstaedtler Date: Tue, 20 May 2014 10:08:07 +0000 (+0200) Subject: API: Don't require nameservers list for Slave zones X-Git-Tag: rec-3.6.0-rc1~16^2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=refs%2Fpull%2F1423%2Fhead;p=thirdparty%2Fpdns.git API: Don't require nameservers list for Slave zones When creating a Slave zone, it usually doesn't make a lot of sense to create NS records, as they'll be overwritten by the slaving mechanism anyway. This allows not passing 'nameservers' in at all. Fixes PowerDNS/pdnsapi#2. --- diff --git a/pdns/ws-auth.cc b/pdns/ws-auth.cc index c1e05f95a5..2c5bb96731 100644 --- a/pdns/ws-auth.cc +++ b/pdns/ws-auth.cc @@ -488,10 +488,10 @@ static void apiServerZones(HttpRequest* req, HttpResponse* resp) { throw ApiException("Domain '"+zonename+"' already exists"); // validate 'kind' is set - stringFromJson(document, "kind"); + DomainInfo::DomainKind zonekind = DomainInfo::stringToKind(stringFromJson(document, "kind")); const Value &nameservers = document["nameservers"]; - if (!nameservers.IsArray()) + if (!nameservers.IsArray() && zonekind != DomainInfo::Slave) throw ApiException("Nameservers list must be given (but can be empty if NS records are supplied)"); string soa_edit_api_kind; @@ -549,12 +549,14 @@ static void apiServerZones(HttpRequest* req, HttpResponse* resp) { } // create NS records if nameservers are given - for (SizeType i = 0; i < nameservers.Size(); ++i) { - if (!nameservers[i].IsString()) - throw ApiException("Nameservers must be strings"); - rr.content = nameservers[i].GetString(); - rr.qtype = "NS"; - new_records.push_back(rr); + if (nameservers.IsArray()) { + for (SizeType i = 0; i < nameservers.Size(); ++i) { + if (!nameservers[i].IsString()) + throw ApiException("Nameservers must be strings"); + rr.content = nameservers[i].GetString(); + rr.qtype = "NS"; + new_records.push_back(rr); + } } // no going back after this diff --git a/regression-tests.api/test_Zones.py b/regression-tests.api/test_Zones.py index ed643759b9..955bcdae7e 100644 --- a/regression-tests.api/test_Zones.py +++ b/regression-tests.api/test_Zones.py @@ -34,7 +34,10 @@ class AuthZones(ApiTestCase): 'nameservers': ['ns1.example.com', 'ns2.example.com'] } for k, v in kwargs.items(): - payload[k] = v + if v is None: + del payload[k] + else: + payload[k] = v print payload r = self.session.post( self.url("/servers/localhost/zones"), @@ -148,6 +151,13 @@ class AuthZones(ApiTestCase): headers={'content-type': 'application/json'}) self.assertEquals(r.status_code, 422) + def test_create_slave_zone(self): + # Test that nameservers can be absent for slave zones. + payload, data = self.create_zone(kind='Slave', nameservers=None, masters=['127.0.0.2']) + for k in ('name', 'masters', 'kind'): + self.assertIn(k, data) + self.assertEquals(data[k], payload[k]) + def test_get_zone_with_symbols(self): payload, data = self.create_zone(name='foo/bar.'+unique_zone_name()) name = payload['name']