]> granicus.if.org Git - pdns/commitdiff
API: Don't require nameservers list for Slave zones
authorChristian Hofstaedtler <christian@hofstaedtler.name>
Tue, 20 May 2014 10:08:07 +0000 (12:08 +0200)
committerChristian Hofstaedtler <christian@hofstaedtler.name>
Tue, 20 May 2014 10:08:07 +0000 (12:08 +0200)
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.

pdns/ws-auth.cc
regression-tests.api/test_Zones.py

index c1e05f95a509224e9e9c72583a2a42cc34c2abcd..2c5bb967318f2b4f2054c1a26097a393b5107d7d 100644 (file)
@@ -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
index ed643759b9e94bc5f442f0c823fa5ad518cf4f5e..955bcdae7ef586c1c75e42c0b4cc58ef7646ffa3 100644 (file)
@@ -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']