]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Allow null nameserver for jinja2 test-zone templates
authorEvan Hunt <each@isc.org>
Wed, 15 Jul 2026 22:03:50 +0000 (15:03 -0700)
committerEvan Hunt <each@isc.org>
Wed, 22 Jul 2026 01:11:46 +0000 (18:11 -0700)
It is now possible to generate a zone file from a jinja2 template that
isn't written to a nameserver directory, but to "zones/" in the top
level of the system test directory, by specifying the server name
"NO_NS" instead of NS1, NS2, etc. This can be used for testing command
line tools such as dnssec-verify on generated zone files, without
starting an unnecessary name server.

bin/tests/system/_common/zones/ns.partial.db.j2
bin/tests/system/_common/zones/soa.partial.db.j2
bin/tests/system/isctest/template.py
bin/tests/system/isctest/zone.py

index 27a2c2ecbb78dc5f8dd3282e2c76de7b93bb37d3..5c0198b0368bb2929a8f822f7cd1685917aff40c 100644 (file)
@@ -1,2 +1,7 @@
+{% if ns.name != "." %}
 @zone.name@.                   NS      @zone.ns.name@.@zone.name@.
 @zone.ns.name@.@zone.name@.                    A       @zone.ns.ip@
+{% else %}
+@zone.name@.                   NS      @zone.name@.
+@zone.name@.                   A       127.0.0.1
+{% endif %}
index fe3a0cb3d8a62de0d071dd93352afc436dac76ab..7a084c4b0d7b96fc35bb1894b5788222540f7f3f 100644 (file)
@@ -2,7 +2,11 @@
 $ORIGIN @zone.name@.
 {% endif %}
 $TTL 300
+{% if zone.ns.name == "." %}
+{% raw %}@{% endraw %}                 IN SOA  @zone.name@. . (
+{% else %}
 {% raw %}@{% endraw %}                 IN SOA  @zone.ns.name@.@zone.name@. . (
+{% endif %}
                                1               ; serial
                                20              ; refresh (20 seconds)
                                20              ; retry (20 seconds)
index 0198af3d3d00437e198e7d233853ee65f3a31dd4..e0606fb0fb47b49f056b0b10357e0931bc5047b2 100644 (file)
@@ -93,10 +93,10 @@ class TemplateEngine:
             data = {**self.env_vars, **data}
 
         # directory-specific "ns" var
-        assert "ns" not in data, '"ns" variable is reserved for nameserver data'
-        match = NS_DIR_RE.search(output)
-        if match:
-            data["ns"] = Nameserver(match.group(1))
+        if "ns" not in data:
+            match = NS_DIR_RE.search(output)
+            if match:
+                data["ns"] = Nameserver(match.group(1))
 
         debug("rendering template `%s` to file `%s`", template, output)
         stream = self.j2env.get_template(template).stream(data)
@@ -145,6 +145,7 @@ NS8 = Nameserver("ns8")
 NS9 = Nameserver("ns9")
 NS10 = Nameserver("ns10")
 NS11 = Nameserver("ns11")
+NO_NS = Nameserver(".", 0, "", "")
 
 
 @dataclass
index 7790fa87f899ca267bb470cbca92fe0deaae51a0..9bfcf86cff94b6cdc8310b687a19d7fdf662f6c4 100644 (file)
@@ -473,6 +473,7 @@ class Zone:
 
         data = {
             "zone": self,
+            "ns": self.ns,
             "delegations": self.delegations,
         }
         templates.render(str(output), data, template=template)