]> git.ipfire.org Git - thirdparty/knot-dns.git/commitdiff
tests: refactor server configuration routines
authorLibor Peltan <libor.peltan@nic.cz>
Tue, 30 Sep 2025 11:27:44 +0000 (13:27 +0200)
committerLibor Peltan <libor.peltan@nic.cz>
Wed, 29 Oct 2025 08:22:50 +0000 (09:22 +0100)
112 files changed:
tests-extra/tests/axfr/failover/test.py
tests-extra/tests/axfr/outdated_master/test.py
tests-extra/tests/axfr/persistence/test.py
tests-extra/tests/axfr/zone-in-journal/test.py
tests-extra/tests/axfr/zonemd/test.py
tests-extra/tests/basic/nsec/test.py
tests-extra/tests/basic/nsec3/test.py
tests-extra/tests/catalog/generate_add/test.py
tests-extra/tests/catalog/kill/test.py
tests-extra/tests/catalog/many_zones/test.py
tests-extra/tests/catalog/rapid_updates/test.py
tests-extra/tests/catalog/update_pairs/test.py
tests-extra/tests/ctl/concurrent/test.py
tests-extra/tests/ctl/txn_ixfr_zonemd/test.py
tests-extra/tests/ddns/additionals/test.py
tests-extra/tests/ddns/basic/test.py
tests-extra/tests/ddns/empty_zone/test.py
tests-extra/tests/ddns/on_slave/test.py
tests-extra/tests/ddns/zone_size/test.py
tests-extra/tests/ddns/zone_size2/test.py
tests-extra/tests/dnssec/bare_slave_signing/test.py
tests-extra/tests/dnssec/dnskey_sync/test.py
tests-extra/tests/dnssec/ds_push/test.py
tests-extra/tests/dnssec/ds_query/test.py
tests-extra/tests/dnssec/expire/test.py
tests-extra/tests/dnssec/expire2/test.py
tests-extra/tests/dnssec/full_sign_fail/test.py
tests-extra/tests/dnssec/import_bind/test.py
tests-extra/tests/dnssec/incremental_expire/test.py
tests-extra/tests/dnssec/ixfr_diff/test.py
tests-extra/tests/dnssec/key_rollovers/test.py
tests-extra/tests/dnssec/keystores/test.py
tests-extra/tests/dnssec/keytag_conflict/test.py
tests-extra/tests/dnssec/ksk_rollover/test.py
tests-extra/tests/dnssec/no_resign/test.py
tests-extra/tests/dnssec/no_resign2/test.py
tests-extra/tests/dnssec/nsec3_opt_out/test.py
tests-extra/tests/dnssec/nsec3_revert/test.py
tests-extra/tests/dnssec/nsec3_up_adjust/test.py
tests-extra/tests/dnssec/nsec_changes/test.py
tests-extra/tests/dnssec/nsec_update/test.py
tests-extra/tests/dnssec/offline_ksk/test.py
tests-extra/tests/dnssec/offline_ksk2/test.py
tests-extra/tests/dnssec/on_slave_signing/test.py
tests-extra/tests/dnssec/prerefresh/test.py
tests-extra/tests/dnssec/reproducible/test.py
tests-extra/tests/dnssec/shared_alg_roll/test.py
tests-extra/tests/dnssec/shared_alg_sync/test.py
tests-extra/tests/dnssec/start_slave_sign/test.py
tests-extra/tests/dnssec/validate/test.py
tests-extra/tests/dnssec/validate_bind/test.py
tests-extra/tests/dnssec/validate_event/test.py
tests-extra/tests/dnssec/zsk_rollover/test.py
tests-extra/tests/edns/payload_server/test.py
tests-extra/tests/events/flush/test.py
tests-extra/tests/events/soa/test.py
tests-extra/tests/ixfr/automatic_acl/test.py
tests-extra/tests/ixfr/axfr_fallback/test.py
tests-extra/tests/ixfr/axfr_style/test.py
tests-extra/tests/ixfr/bind_knot/test.py
tests-extra/tests/ixfr/from_axfr/test.py
tests-extra/tests/ixfr/insec_sec_deleg/test.py
tests-extra/tests/ixfr/ixfr_merge/test.py
tests-extra/tests/ixfr/knot_bind/test.py
tests-extra/tests/ixfr/knot_knot/test.py
tests-extra/tests/ixfr/master_pin/test.py
tests-extra/tests/ixfr/master_pin2/test.py
tests-extra/tests/ixfr/one_by_one/test.py
tests-extra/tests/ixfr/provide_ixfr/test.py
tests-extra/tests/ixfr/redundant_ixfr_ignore/test.py
tests-extra/tests/ixfr/slow/test.py
tests-extra/tests/ixfr/zone-in-journal/test.py
tests-extra/tests/ixfr/zone_size/test.py
tests-extra/tests/journal/ascii_flags/test.py
tests-extra/tests/journal/many_nsec3/test.py
tests-extra/tests/modules/dnsproxy/test.py
tests-extra/tests/modules/noudp/test.py
tests-extra/tests/modules/onlinesign/test.py
tests-extra/tests/modules/onlinesign_rollovers/test.py
tests-extra/tests/notify/retry/test.py
tests-extra/tests/quic/ddns/test.py
tests-extra/tests/quic/xfr/test.py
tests-extra/tests/records/malformed_rr/test.py
tests-extra/tests/redis/basic/test.py
tests-extra/tests/tls/ddns/test.py
tests-extra/tests/tls/xfr/test.py
tests-extra/tests/zone/backup/test.py
tests-extra/tests/zone/backup_lock/test.py
tests-extra/tests/zone/backup_nosync/test.py
tests-extra/tests/zone/difse/test.py
tests-extra/tests/zone/difse2all/test.py
tests-extra/tests/zone/dname_apex/test.py
tests-extra/tests/zone/expire/test.py
tests-extra/tests/zone/external_vldt/test.py
tests-extra/tests/zone/flush_immediate/test.py
tests-extra/tests/zone/include_from/test.py
tests-extra/tests/zone/load_nothing/test.py
tests-extra/tests/zone/max_ttl/test.py
tests-extra/tests/zone/refresh_limits/test.py
tests-extra/tests/zone/retransfer/test.py
tests-extra/tests/zone/reverse/test.py
tests-extra/tests/zone/semcheck_soft/test.py
tests-extra/tests/zone/serial_modulo/test.py
tests-extra/tests/zone/skip/test.py
tests-extra/tests/zone/timers/test.py
tests-extra/tests/zone/update_delay/test.py
tests-extra/tests/zone/zij_reload/test.py
tests-extra/tests/zone/zonemd_flush/test.py
tests-extra/tests/zone/zonemd_load/test.py
tests-extra/tools/dnstest/config.py
tests-extra/tools/dnstest/server.py
tests-extra/tools/dnstest/test.py

index 347128b8d418d5f7d95ea6b570fce0001d682a59..4a40ad118a41dcfe77393be7176eea625357d860 100644 (file)
@@ -24,16 +24,16 @@ master1 = t.server("knot")
 master2 = t.server("knot")
 slave = t.server("knot")
 
-# flush zones immediately
-for server in [master1, master2, slave]:
-    slave.zonefile_sync = "0"
-
 t.link([zone], master1, master2)
 t.link([zone], master1, slave)
 t.link([zone], master2, slave)
 
 slave.journal_db_size = 1024 * 1024
-slave.zones[zone.name].journal_content = "all"
+slave.conf_zone(zone).journal_content = "all"
+
+# flush zones immediately
+for server in [master1, master2, slave]:
+    server.conf_zone(zone).zonefile_sync = "0"
 
 t.start()
 
index 262706c9c1eed5e53141929d16a8627d1cb2ad4b..8f9fec1cf6197a3cd273561137c75731761f7680 100644 (file)
@@ -13,7 +13,7 @@ zones = t.zone_rnd(5)
 
 t.link(zones, master, slave)
 
-master.zonefile_sync = -1
+master.conf_zone(zones).zonefile_sync = -1
 
 t.start()
 serial = slave.zones_wait(zones)
index 307aa166b64e6836a22a48c023bfba8b5f3fb753..5c07cc1a145f8dc68409e9623b284296ea533c7d 100644 (file)
@@ -14,9 +14,10 @@ zone.update_soa(serial=1, refresh=600, retry=600, expire=3600)
 master = t.server("knot")
 slave = t.server("knot")
 
-slave.zonefile_sync = 24 * 60 * 60
 t.link([zone], master, slave)
 
+slave.conf_zone(zone).zonefile_sync = 24 * 60 * 60
+
 t.start()
 
 # verify zone bootstrap
index 3283134c564e17e605bffd80a73feabc19fdb3ae..98f5593c8d76701ce877e4d1f0e880d501e1a5ee 100644 (file)
@@ -11,9 +11,11 @@ slave = t.server("knot")
 
 zone = t.zone("example.com.")
 
-t.link(zone, master, slave, journal_content="all")
-slave.zonefile_sync = "-1"
-slave.zonefile_load = "none"
+t.link(zone, master, slave)
+
+slave.conf_zone(zone).journal_content = "all"
+slave.conf_zone(zone).zonefile_sync = "-1"
+slave.conf_zone(zone).zonefile_load = "none"
 
 t.start()
 
index 046bf4695339508e8bbe53d27c26df2c404126eb..1da799ef9e9419c0355b0d1a811432413281a9f9 100644 (file)
@@ -15,9 +15,9 @@ t.link(zone, master, slave)
 
 slave.dnssec(zone).enable = True
 
-master.zonemd_verify = True
-slave.zonemd_verify = True
-slave.zonemd_generate = random.choice(["zonemd-sha384", "zonemd-sha512"])
+master.conf_zone(zone).zonemd_verify = True
+slave.conf_zone(zone).zonemd_verify = True
+slave.conf_zone(zone).zonemd_generate = random.choice(["zonemd-sha384", "zonemd-sha512"])
 
 t.start()
 
index e333d269297f8d475014ed180ec780d3504fe655..f3ddeb0b95a316fa4b4459f48a24160baa86b38b 100644 (file)
@@ -8,13 +8,14 @@ t = Test()
 
 knot = t.server("knot")
 knot.DIG_TIMEOUT = 2
-knot.tcp_reuseport = True
 bind = t.server("bind")
 zone = t.zone("example.", "example.zone.nsec", storage=".")
 
 t.link(zone, knot)
 t.link(zone, bind)
 
+knot.conf_srv().tcp_reuseport = True
+
 t.start()
 
 # B1. Answer.
index 0dd1be56b3d271641b27475de5efb9dbe7312bb2..a645b9b994c13ba189cea694333095add2aaa612 100644 (file)
@@ -8,13 +8,14 @@ t = Test()
 
 knot = t.server("knot")
 knot.DIG_TIMEOUT = 2
-knot.tcp_reuseport = True
 bind = t.server("bind")
 zone = t.zone("example.", "example.zone.nsec3", storage=".")
 
 t.link(zone, knot)
 t.link(zone, bind)
 
+knot.conf_srv().tcp_reuseport = True
+
 t.start()
 knot.zone_wait(zone)
 bind.zone_wait(zone)
index 143a9f94993a2032099182c2073289b23328716d..a43eb4c3b664279c3f6655203413dcc5aac3401c 100644 (file)
@@ -32,8 +32,6 @@ t = Test()
 master = t.server("knot")
 slave = t.server("knot")
 
-master.zonefile_sync = "0" # Not needed, just to ensure catalog with up-to-date zone file.
-
 (cat0, memb0) = add_catalog(t, master, slave)
 
 t.start()
index c546c62e676c96b12d98502f80634cdd74c38b6c..f145c6895f5626b5c7c3bceb6015557bac081d1b 100644 (file)
@@ -17,13 +17,14 @@ t.link(catz + stuckzone, master)
 
 master.cat_interpret(catz)
 
-master.zones[catz[0].name].journal_content = "all"
+master.conf_zone(catz).journal_content = "all"
 
 master.dnssec(stuckzone).enable = True
 master.dnssec(stuckzone).single_type_signing = True
-master.dnssec(stuckzone).ds_push = stuck_parent
 master.dnssec(stuckzone).propagation_delay = 1
-master.tcp_remote_io_timeout = 40000
+master.conf_zone(stuckzone).ds_push = [ stuck_parent ]
+
+master.conf_srv().tcp_remote_io_timeout = 40000
 
 master.gen_confile()
 master.key_gen(stuckzone[0].name, ksk="true", zsk="true", active="+0")
index 504bbdd7f7d008625206573f0c28f27da3304bb8..6f685430ecd8c535debfada83ed46d1188c33947 100644 (file)
@@ -28,12 +28,12 @@ master.cat_generate(cz)
 slave.cat_interpret(cz)
 
 slave.dnssec(catz[0]).enable = DNSSEC
-slave.dnssec(catz[0]).alg = "ECDSAP256SHA256"
-slave.zones[catz[0].name].journal_content = "all"
+slave.dnssec(catz[0]).algorithm = "ECDSAP256SHA256"
+slave.conf_zone(catz).journal_content = "all"
 slave.journal_db_size = 200 * 1024 * 1024
 
 if master.valgrind:
-    master.tcp_idle_timeout = 15000
+    master.conf_srv().tcp_idle_timeout = 15000
 
 t.start()
 
index 17924c09a77830c85ea6d3245ba4eaa9e3268200..da508aa4c972e4d550321f3753839f3cf9e6ba52 100644 (file)
@@ -17,15 +17,14 @@ UPDATES = 132
 t = Test(stress=False)
 
 knot = t.server("knot")
-
-if knot.valgrind:
-    knot.semantic_check = False
-
 catz = t.zone("catalog1.", storage=".")
 
 t.link(catz, knot)
 knot.cat_interpret(catz)
 
+if knot.valgrind:
+    knot.conf_zone(catz).semantic_checks = False
+
 os.mkdir(knot.dir + "/catalog")
 
 t.start()
index 3bddc4ed25af17ca86568cbd82efff9fe1804914..b4626ade9eee72900d419baaa1028443c05d10e6 100644 (file)
@@ -39,18 +39,19 @@ def check_catalog_db(server, memb_name):
 t = Test()
 
 knot = t.server("knot")
-knot.bg_workers = 4
-
-knot.semantic_check = False
 
 catz = t.zone("catalog1.", storage=".")
 rzone = t.zone(".") # to slow down background workers
 rzone[0].update_rnd() # it needs to be larger, slower
 
-t.link(catz, knot, journal_content = "none")
-t.link(rzone, knot, journal_content = "none")
+t.link(catz, knot)
+t.link(rzone, knot)
 knot.cat_interpret(catz)
 
+knot.conf_srv().background_workers = 4
+knot.conf_zone(catz + rzone).journal_content = "none"
+knot.conf_zone(catz + rzone).semantic_checks = False
+
 catalog_dir = os.path.join(knot.dir, "catalog")
 os.mkdir(catalog_dir)
 for zf in glob.glob(t.data_dir + "/*.zone"):
@@ -62,8 +63,8 @@ for z in rzone:
     knot.dnssec(z).signing_threads = "2"
     if not knot.valgrind: # it would be too slow with valgrind
         knot.dnssec(z).nsec3 = True
-        knot.dnssec(z).nsec3_iters = "65000"
-        knot.dnssec(z).alg = "rsasha512"
+        knot.dnssec(z).nsec3_iterations = "65000"
+        knot.dnssec(z).algorithm = "rsasha512"
         knot.dnssec(z).zsk_size = "4096"
 
 # Whether to test a property change instead of add/del.
index 8193a82ae432bfeb60413ebf4f90931abe60889a..89b5964ef58c488f22514604d92b57ef00087d06 100644 (file)
@@ -136,9 +136,9 @@ for z in zones:
     master.dnssec(z).nsec3 = True
 
 for s in [ master, slave ]:
-    s.bg_workers = 3
-    s.udp_workers = 1
-    s.tcp_workers = 1
+    s.conf_srv().background_workers = 3
+    s.conf_srv().udp_workers = 1
+    s.conf_srv().tcp_workers = 1
 
 t.start()
 slave.zones_wait(zones)
index 461233d7239ceccfbdd31dc4d0c3d99f43896efe..1d2122770b23e00917201d9622a838fae2456d93 100644 (file)
@@ -15,7 +15,7 @@ ZONE = zones[0].name
 
 t.link(zones, master, slave, ixfr=True)
 
-slave.zonemd_generate = "zonemd-sha512"
+slave.conf_zone(zones).zonemd_generate = "zonemd-sha512"
 
 t.start()
 
index 87ea5e22054f80242a9cd8854a2be390ef466d6a..9b51de109eed90772175a96afc468e59cae3016f 100644 (file)
@@ -57,7 +57,10 @@ t = Test(stress=False)
 
 master = t.server("knot")
 zones = t.zone("example.")
-t.link(zones, master, journal_content="all")
+
+t.link(zones, master)
+
+master.conf_zone(zones).journal_content = "all"
 
 t.start()
 
index 367eea2d05a9e745821537dd8e4968341e4d643e..8d6fe63c958dfe2dede91d42d8123c758f913b1b 100644 (file)
@@ -710,7 +710,7 @@ master_nsec3 = t.server("knot")
 t.link(zone, master_nsec3, ddns=True)
 master_nsec3.dnssec(zone).enable = True
 master_nsec3.dnssec(zone).nsec3 = True
-master_nsec3.dnssec(zone).nsec3_salt_len = 8
+master_nsec3.dnssec(zone).nsec3_salt_length = 8
 master_nsec3.dnssec(zone).nsec3_opt_out = (random.random() < 0.5)
 
 t.start()
index c53707aa29d52f0a38a2b48a0f685b2b58ed2a50..343f3fd74aba137930b8f7277fa2477940b967d8 100644 (file)
@@ -19,11 +19,11 @@ if random.choice([False, True]):
     master.dnssec(zone).enable = True
 
 if random.choice([False, True]):
-    master.zones[ZONE].journal_content = "all"
+    master.conf_zone(zone).journal_content = "all"
 
 if random.choice([False, True]):
-    master.zonemd_generate = "zonemd-sha512"
-    slave.zonemd_verify = True
+    master.conf_zone(zone).zonemd_generate = "zonemd-sha512"
+    slave.conf_zone(zone).zonemd_verify = True
 
 t.start()
 
index 44ef87a3c32475c7c4688a3d4b41895ce6b8ecd6..d7faebe0d183b856a5204550c456bdfb992cb1c6 100644 (file)
@@ -15,7 +15,7 @@ zone = t.zone("example.com.")
 t.link(zone, master, slave, ddns=True)
 
 slave.dnssec(zone).enable = True
-slave.ddns_master = ""
+slave.conf_zone(zone).ddns_master = ""
 
 t.start()
 
index ec608e1bdb8bbe6cfb687834e33c7112167254b9..08f7dc68a27ccc384fde38750ff32fda46800064 100644 (file)
@@ -8,9 +8,10 @@ t = Test()
 
 master = t.server("knot")
 zone = t.zone("example.com.")
-master.zone_size_limit = 500
-
 t.link(zone, master, ddns=True)
+
+master.conf_zone(zone).zone_max_size = 500
+
 t.start()
 
 master.zones_wait(zone)
index 362cc689709a68eeda291207bd5bffa99ed9d817..e02a572f90f42942536da3923eecd332879a906c 100644 (file)
@@ -10,9 +10,10 @@ t = Test()
 
 master = t.server("knot")
 zone = t.zone("example.com.")
-master.zone_size_limit = 5000
-
 t.link(zone, master, ddns=True)
+
+master.conf_zone(zone).zone_max_size = 5000
+
 t.start()
 
 master.zones_wait(zone)
@@ -36,7 +37,7 @@ next_step = random.choice([2, 3])
 # Step 2. Check possibly dead pointer in additionals_tree (server would crash).
 
 if next_step == 2:
-    master.zone_size_limit = 10000
+    master.conf_zone(zone).zone_max_size = 10000
     master.gen_confile()
     master.reload()
 
@@ -51,7 +52,7 @@ if next_step == 3:
     soa1 = resp.soa_serial()
 
     master.stop()
-    master.zone_size_limit = 10000
+    master.conf_zone(zone).zone_max_size = 10000
     master.gen_confile()
     master.start() # let the changesets from journal apply
     master.zones_wait(zone)
index 501a9db31198d78b0c3c2069789be510ce153a7d..dd48120e4cf532401312eda5bba99f1f80199281 100644 (file)
@@ -10,9 +10,10 @@ t = Test()
 
 master = t.server("knot")
 slave = t.server("knot")
-slave.zonefile_sync = "-1"
 zone = t.zone_rnd(1, dnssec=False)
 t.link(zone, master, slave)
+
+slave.conf_zone(zone).zonefile_sync = "-1"
 slave.dnssec(zone).enable = True
 
 t.start()
index 412d4d29a6574d1c34344335abc04537b9a8f36f..b438799ab68e86414365d93665a0ab885a23502a 100644 (file)
@@ -68,26 +68,26 @@ def check_same_dnskey(server1, server2, server3, tst, tries=20):
 
 def configure_dnssec(server1, master, server2, server3, roll):
     t.link(zone, master, server1, ddns=True)
-    server1.tcp_remote_io_timeout = 1500
+    server1.conf_srv().tcp_remote_io_timeout = 1500
     if DNSKEY_MASTER < 2:
-        server1.ddns_master = ""
+        server1.conf_zone(zone).ddns_master = ""
     if DNSKEY_MASTER > 0:
-        server1.ixfr_benevolent = True
+        server1.conf_zone(list(server1.zones.keys())).ixfr_benevolent = True
 
     server_mod = int(server1.name[-1]) - 2
 
     server1.dnssec(zone).enable = True
     server1.dnssec(zone).single_type_signing = (roll == 2)
     server1.dnssec(zone).propagation_delay = 4
-    server1.dnssec(zone).ksk_sbm_timeout = 4
-    server1.dnssec(zone).dnskey_mgmt = "incremental"
+    server1.conf_ss("submission", zone).timeout = 4
+    server1.dnssec(zone).dnskey_management = "incremental"
     server1.dnssec(zone).delete_delay = 4
-    server1.dnssec(zone).cds_publish = ("always" if CDS else "none")
+    server1.dnssec(zone).cds_cdnskey_publish = ("always" if CDS else "none")
     server1.dnssec(zone).keytag_modulo = "%d/3" % server_mod
     if DNSKEY_MASTER == 1:
-        server1.dnssec(zone).dnskey_sync = [ master ]
+        server1.conf_ss("dnskey-sync", zone).remote = [ master ]
     else:
-        server1.dnssec(zone).dnskey_sync = [ server2, server3 ] if SIGNERS3 else [ server2 ]
+        server1.conf_ss("dnskey-sync", zone).remote = [ server2, server3 ] if SIGNERS3 else [ server2 ]
 
 t = Test()
 
index 66514c00366a31a9521a60d0005cd4839999920d..a252e33db4dc2374b6ab06ceddf6d12c72af9d91 100644 (file)
@@ -112,20 +112,21 @@ child = t.server("knot")
 child_zone = t.zone(ZONE, file_name=child_zf)
 t.link(child_zone, child)
 
-child.zonefile_sync = 24 * 60 * 60
+child.conf_zone(child_zone).zonefile_sync = 24 * 60 * 60
 
 child.dnssec(child_zone).enable = True
 child.dnssec(child_zone).manual = False
-child.dnssec(child_zone).alg = "ECDSAP256SHA256"
+child.dnssec(child_zone).algorithm = "ECDSAP256SHA256"
 child.dnssec(child_zone).dnskey_ttl = 2
 child.dnssec(child_zone).zsk_lifetime = 99999
 child.dnssec(child_zone).ksk_lifetime = 300 # this can be possibly left also infinity
 child.dnssec(child_zone).propagation_delay = 4
-child.dnssec(child_zone).ksk_sbm_check = [ parent ]
-child.dnssec(child_zone).ksk_sbm_check_interval = 2
-child.dnssec(child_zone).ds_push = parent
 child.dnssec(child_zone).ksk_shared = True
-child.dnssec(child_zone).cds_publish = "always"
+child.dnssec(child_zone).cds_cdnskey_publish = "always"
+
+child.conf_zone(child_zone).ds_push = [ parent ]
+child.conf_ss("submission", child_zone).parent = [ parent ]
+child.conf_ss("submission", child_zone).check_interval = 2
 
 #t.start()
 t.generate_conf()
@@ -144,7 +145,7 @@ resp.check_count(1, rtype="DS")
 if resp.resp.answer[0].ttl != child.dnssec(child_zone).dnskey_ttl:
     set_err("DS TTL")
 
-child.dnssec(child_zone).ds_push = "" # empty list []
+child.conf_zone(child_zone).ds_push = [ ]
 child.gen_confile()
 child.reload()
 child.ctl("zone-key-rollover %s ksk" % child_zone[0].name)
index 651d677f02731ce4aaa1779650c5e41d94d317b6..0a37e418bc4500a0d126ef9fef7a20a0ef741323 100644 (file)
@@ -58,7 +58,7 @@ def wait_for_count(t, server, rrtype, count, timeout):
         if rtime > timeout:
             break
 
-t = Test()
+t = Test(tsig=False)
 
 parent = t.server("knot")
 parent_zone = t.zone("com.", storage=".")
@@ -66,8 +66,9 @@ t.link(parent_zone, parent)
 
 #parent.dnssec(parent_zone).enable = True
 
+CHILDZ = "example.com."
 child = t.server("knot")
-child_zone = t.zone("example.com.", storage=".")
+child_zone = t.zone(CHILDZ, storage=".")
 t.link(child_zone, child)
 
 def cds_submission():
@@ -77,16 +78,16 @@ def cds_submission():
     up.add(ZONE, 7, "DS", cds_rdata)
     up.send("NOERROR")
 
-child.zonefile_sync = 24 * 60 * 60
+child.conf_zone(child_zone).zonefile_sync = 24 * 60 * 60
 
 child.dnssec(child_zone).enable = True
 child.dnssec(child_zone).manual = False
-child.dnssec(child_zone).alg = "ECDSAP384SHA384"
+child.dnssec(child_zone).algorithm = "ECDSAP384SHA384"
 child.dnssec(child_zone).dnskey_ttl = 2
 child.dnssec(child_zone).zsk_lifetime = 99999
 child.dnssec(child_zone).ksk_lifetime = 9999
 child.dnssec(child_zone).propagation_delay = 4
-child.dnssec(child_zone).ksk_sbm_check_interval = 2
+child.conf_ss("submission", child_zone).check_interval = 2
 
 # parameters
 ZONE = "example.com."
@@ -96,7 +97,7 @@ child.zone_wait(child_zone)
 
 cds_submission()
 
-child.dnssec(child_zone).ksk_sbm_check = [ parent ]
+child.conf_ss("submission", child_zone).parent = [ parent ]
 child.dnssec(child_zone).ksk_lifetime = 13
 child.gen_confile()
 
@@ -105,7 +106,7 @@ child.reload()
 wait_for_count(t, child, "DNSKEY", 3, 20) # initiation of KSK rollover means the initial submission was successful
 check_zone(child, child_zone, 3, 2, 0, 1, "KSK rollover start")
 
-child.dnssec(child_zone).ksk_sbm_check = [ ]
+child.conf_ss("submission", child_zone).parent = [ ]
 child.dnssec(child_zone).ksk_lifetime = 150
 child.gen_confile()
 
@@ -115,7 +116,7 @@ t.sleep(6)
 cds_submission()
 t.sleep(1)
 
-child.dnssec(child_zone).ksk_sbm_check = [ parent ]
+child.conf_ss("submission", child_zone).parent = [ parent ]
 child.gen_confile()
 
 child.reload()
index 93e2ea5361157c4dbcc638438994cb2f03fb222c..2171c20dbb7f531ab684b98bb304f02301970d34 100644 (file)
@@ -17,7 +17,7 @@ for z in zones:
     master.dnssec(z).enable = True
     master.dnssec(z).rrsig_lifetime = 10
     master.dnssec(z).rrsig_refresh = 1
-    master.dnssec(z).rrsig_prerefresh = 1
+    master.dnssec(z).rrsig_pre_refresh = 1
 
 t.start()
 
index f4bcff6723e0f258f09fa5a85339fc28010618cc..926e33d050bf784ede6ff78b47d882f2d7aa1a07 100644 (file)
@@ -17,7 +17,7 @@ for z in zones:
     master.dnssec(z).enable = True
     master.dnssec(z).rrsig_lifetime = 40
     master.dnssec(z).rrsig_refresh = 5
-    master.dnssec(z).rrsig_prerefresh = 0
+    master.dnssec(z).rrsig_pre_refresh = 0
     master.dnssec(z).propagation_delay = 0
 
 def send_ddns(server, zone, data):
index b8007d5a8c2cd18b077cce6ff899bd5b4f3f2bd8..879da141d8b244576fbfa74bca912e50a3614139 100644 (file)
@@ -16,9 +16,9 @@ for z in zone:
     server.dnssec(z).enable = True
     server.dnssec(z).rrsig_lifetime = 20
     server.dnssec(z).rrsig_refresh = 10
-    server.dnssec(z).rrsig_prerefresh = 4
+    server.dnssec(z).rrsig_pre_refresh = 4
 
-server.journal_max_usage = 128*1024
+server.conf_zone(zone).journal_max_usage = 128*1024
 
 t.start()
 
index da5c39bd423aa3060ea69e0a25db55bc30fd9c43..0107b29e52065d5ae1257753ce15803d4fa94acf 100644 (file)
@@ -73,8 +73,8 @@ def knot_dnskey_checks(t, msg, zones, timeout):
             same_dnskey_count(t, bind, knot, knot.zones[z.name], i, msg, timeout)
 
 def clone_policy(zone):
-    knot.zones[zone.name].dnssec = copy.copy(bind.zones[zone.name].dnssec)
-    knot.zones[zone.name].dnssec.ksk_lifetime -= 2 * int(knot.zones[zone.name].dnssec.dnskey_ttl)
+    knot.conf["policy"][zone.name] = copy.copy(bind.conf["policy"][zone.name])
+    knot.dnssec(zone).ksk_lifetime -= 2 * int(knot.dnssec(zone).dnskey_ttl)
 
 def knot_import_zone(zone):
     if zone.name not in knot.zones:
@@ -95,8 +95,8 @@ for z in zones:
     bind.dnssec(z).ksk_lifetime = 40
     bind.dnssec(z).rrsig_lifetime = "8"
     bind.dnssec(z).rrsig_refresh = "4"
-    bind.dnssec(z).rrsig_prerefresh = "1"
-    bind.dnssec(z).ksk_sbm_check_interval = 1
+    bind.dnssec(z).rrsig_pre_refresh = "1"
+    bind.conf["submission"][z.name] = { "check-interval": 1 }
 
 t.generate_conf()
 bind.start()
index 462a7e534139f9c4f162b928dfe26aba155fe4ea..95e16bbf513dd94eb64f07b279d5cbfe8d1620d8 100644 (file)
@@ -21,9 +21,9 @@ t.link(zone, master, slave, ddns=True)
 
 ZONE = zone[0].name
 
-slave.zonefile_sync = "-1"
+slave.conf_zone(zone).zonefile_sync = "-1"
 if FAIL2ROLL:
-    slave.journal_max_usage = 128 * 1024
+    slave.conf_zone(zone).journal_max_usage = 128 * 1024
 
 slave.dnssec(zone).enable = True
 slave.dnssec(zone).dnskey_ttl = 3
index bcf025c694a6bc7cea70ebf3ede073bb89b4f2f5..0d0f8b62e33b67f8f7de1854ead5075fec4a4296 100644 (file)
@@ -13,12 +13,12 @@ if not master.valgrind:
   zones = t.zone_rnd(12)
 else:
   zones = t.zone_rnd(4, records=100)
-  slave.tcp_remote_io_timeout = 20000
+  slave.conf_srv().tcp_remote_io_timeout = 20000
   master.ctl_params_append = ["-t", "30"]
 
 t.link(zones, master, slave, ixfr=True)
 
-master.semantic_check = False
+master.conf_zone(zones).semantic_checks = False
 master.zonefile_sync = "-1"
 for zone in zones:
   master.dnssec(zone).enable = True
index f1337450effc08c6147101eb3b67412ed747c80b..e1658fde990e514257c811e9eca8c84f6b99c5a6 100644 (file)
@@ -160,7 +160,7 @@ def watch_alg_rollover(t, server, zone, slave, before_keys, after_keys, desc, se
 
     if set_stss is not None:
         server.dnssec(zone).single_type_signing = set_stss
-    server.dnssec(zone).alg = set_alg
+    server.dnssec(zone).algorithm = set_alg
     server.gen_confile()
     server.reload()
 
@@ -239,7 +239,7 @@ def watch_ksk_rollover(t, server, zone, slave, before_keys, after_keys, total_ke
         wait_for_count(t, server, "DNSKEY", after_keys, 14, 20, msg)
     check_zone(server, zone, slave, after_keys, 1, 1, 1, msg)
 
-t = Test()
+t = Test(tsig=False) # the facility of DS Query does not work with TSIG
 
 parent = t.server("knot")
 parent_zone = t.zone("com.", storage=".")
@@ -260,27 +260,27 @@ def cds_submission():
         up.add(ZONE, 7, "DS", rd.to_text())
     up.send("NOERROR")
 
-child.zonefile_sync = 24 * 60 * 60
+child.conf_zone(child_zone).zonefile_sync = 24 * 60 * 60
 
 child.dnssec(child_zone).enable = True
 child.dnssec(child_zone).manual = False
-child.dnssec(child_zone).alg = "ECDSAP384SHA384"
+child.dnssec(child_zone).algorithm = "ECDSAP384SHA384"
 child.dnssec(child_zone).dnskey_ttl = 2
 child.dnssec(child_zone).zsk_lifetime = 99999
 child.dnssec(child_zone).ksk_lifetime = 300 # this can be possibly left also infinity
 child.dnssec(child_zone).delete_delay = DELETE_DELAY
-child.dnssec(child_zone).dnskey_mgmt = "incremental" if INCREMENTAL else "full"
+child.dnssec(child_zone).dnskey_management = "incremental" if INCREMENTAL else "full"
 child.dnssec(child_zone).propagation_delay = 11
-child.dnssec(child_zone).ksk_sbm_check = [ parent ]
-child.dnssec(child_zone).ksk_sbm_check_interval = 2
-child.dnssec(child_zone).ksk_sbm_delay = 6
 child.dnssec(child_zone).ksk_shared = True
-child.dnssec(child_zone).cds_publish = "always"
+child.dnssec(child_zone).cds_cdnskey_publish = "always"
 if DOUBLE_DS:
-    child.dnssec(child_zone).cds_publish = "double-ds"
-child.dnssec(child_zone).cds_digesttype = CDS_DT
+    child.dnssec(child_zone).cds_cdnskey_publish = "double-ds"
+child.dnssec(child_zone).cds_digest_type = CDS_DT
+child.conf_ss("submission", child_zone).parent = [ parent ]
+child.conf_ss("submission", child_zone).check_interval = 2
+child.conf_ss("submission", child_zone).parent_delay = 6
 
-slave.dnssec(child_zone).validate = True
+slave.conf_zone(child_zone).dnssec_validation = True
 
 # parameters
 ZONE = "example.com."
index 7f93f37708c38f2db9731bdb7d78bf292105fad0..6c628aa4deef763d4f073494a00a6e34db96905e 100644 (file)
@@ -27,7 +27,7 @@ t.link(zone, server)
 
 server.dnssec(zone).enable = True
 server.dnssec(zone).propagation_delay = 1
-server.dnssec(zone).keystores = [ "keys1", "keys2" ]
+server.dnssec(zone).keystore = [ "keys1", "keys2" ]
 
 t.start()
 serial = server.zone_wait(zone)
@@ -35,7 +35,7 @@ serial = server.zone_wait(zone)
 check_key_count(server, "keys1", 2)
 check_key_count(server, "keys2", 0)
 
-server.dnssec(zone).keystores = [ "keys2", "keys1" ]
+server.dnssec(zone).keystore = [ "keys2", "keys1" ]
 server.gen_confile()
 server.reload()
 server.ctl("zone-key-rollover %s zsk" % zone[0].name)
@@ -61,7 +61,7 @@ serial = server.zone_wait(zone, serial)
 server.flush(zone[0], wait=True)
 server.zone_verify(zone[0])
 
-server.dnssec(zone).keystores = [ "keys0ksk", "keys1", "keys2" ]
+server.dnssec(zone).keystore = [ "keys0ksk", "keys1", "keys2" ]
 server.gen_confile()
 server.reload()
 
index 2fcbfc8815bd0876253258991fe1a85618f808c4..022e69349f7084b0dfc0eb3dbdb9eb617f908c3b 100644 (file)
@@ -45,10 +45,10 @@ knot.dnssec(zone).enable = True
 knot.dnssec(zone).manual = True
 knot.dnssec(zone).rrsig_lifetime = 50
 knot.dnssec(zone).rrsig_refresh = 2
-knot.dnssec(zone).rrsig_prerefresh = 1
+knot.dnssec(zone).rrsig_pre_refresh = 1
 knot.dnssec(zone).dnskey_ttl = 1
 knot.dnssec(zone).propagation_delay = 1
-knot.zonefile_sync = "0"
+knot.conf_zone(zone).zonefile_sync = "0"
 
 # install KASP db (one always enabled, one for testing)
 keydir = knot.keydir
index c2771a60e68d3b1389727dc39fe35b7cd90b7abe..7b302272b5ef67ab4754aecf5aafbd915fadc649 100644 (file)
@@ -137,7 +137,7 @@ def watch_ksk_rollover(t, server, zone, before_keys, after_keys, total_keys, des
     wait_for_count(t, server, "DNSKEY", after_keys, 10, 20, msg) # ds_ttl
     check_zone(server, zone, server, after_keys, 1, 0, 1, msg)
 
-t = Test()
+t = Test(tsig=False)
 
 parent = t.server("knot")
 parent_zone = t.zone("com.", storage=".")
@@ -159,9 +159,9 @@ def cds_submission():
 child.dnssec(child_zone).enable = True
 child.dnssec(child_zone).dnskey_ttl = 6
 child.dnssec(child_zone).propagation_delay = 11
-child.dnssec(child_zone).ksk_sbm_check = [ parent ]
-child.dnssec(child_zone).ksk_sbm_check_interval = 3
-child.dnssec(child_zone).cds_publish = "rollover"
+child.dnssec(child_zone).cds_cdnskey_publish = "rollover"
+child.conf_ss("submission", child_zone).parent = [ parent ]
+child.conf_ss("submission", child_zone).check_interval = 3
 
 t.start()
 child.zone_wait(child_zone)
index 161d3617fbadb5a7ecaddc26993a65259ed74bd0..7d1d71a18987089e436af5cfd4130d2d4733bb31 100644 (file)
@@ -32,15 +32,15 @@ t.link(nsec_zone, master)
 t.link(nsec3_zone, master)
 t.link(static_zone, master)
 
-master.dnssec(nsec_zone).alg = "rsasha1"
-master.dnssec(nsec3_zone).alg = "rsasha1"
+master.dnssec(nsec_zone).algorithm = "rsasha1"
+master.dnssec(nsec3_zone).algorithm = "rsasha1"
 master.dnssec(nsec3_zone).nsec3 = True
-master.dnssec(nsec3_zone).nsec3_iters = 0
-master.dnssec(nsec3_zone).nsec3_salt_len = 0
-master.dnssec(static_zone).alg = "ecdsap256sha256"
-master.dnssec(nsec_zone).cds_publish = "rollover"
-master.dnssec(nsec3_zone).cds_publish = "rollover"
-master.dnssec(static_zone).cds_publish = "rollover"
+master.dnssec(nsec3_zone).nsec3_iterations = 0
+master.dnssec(nsec3_zone).nsec3_salt_length = 0
+master.dnssec(static_zone).algorithm = "ecdsap256sha256"
+master.dnssec(nsec_zone).cds_cdnskey_publish = "rollover"
+master.dnssec(nsec3_zone).cds_cdnskey_publish = "rollover"
+master.dnssec(static_zone).cds_cdnskey_publish = "rollover"
 
 # install KASP db
 keydir = master.keydir
index 4d2b020e5b1f450b696a9818462f76f40b44426e..1b37bca730fd763ce4b59bdee600030d015f75b6 100644 (file)
@@ -11,10 +11,11 @@ master = t.server("knot")
 
 zone = t.zone("example.com.", storage=".")
 
-t.link(zone, master, ixfr=True, journal_content="all")
+t.link(zone, master, ixfr=True)
 
+master.conf_zone(zone).journal_content = "all"
 master.dnssec(zone).enable = True
-master.dnssec(zone).repro_sign = True
+master.dnssec(zone).reproducible_signing = True
 
 t.start()
 
index 22bbe1ef9b6d7507958e80cb6ef93107318a387d..e4d72719f670b2ed3c02c6427a148fb32ae6208c 100644 (file)
@@ -38,8 +38,8 @@ t.link(zone, master)
 
 master.dnssec(zone).enable = True
 master.dnssec(zone).nsec3 = True
-master.dnssec(zone).nsec3_iters = 2
-master.dnssec(zone).nsec3_salt_len = 8
+master.dnssec(zone).nsec3_iterations = 2
+master.dnssec(zone).nsec3_salt_length = 8
 master.dnssec(zone).nsec3_opt_out = False
 
 t.start()
index 02d702ebb7ccb19c9278b0060245c2a681c1c1d6..8561d2bc612fd33152f0c601c161d470bd4bce5c 100644 (file)
@@ -11,7 +11,7 @@ zone = t.zone_rnd(1, records=200)
 
 t.link(zone, master)
 
-master.journal_max_usage = 51200 # the creation of NSEC3 tree fails on ESPACE
+master.conf_zone(zone).journal_max_usage = 51200 # the creation of NSEC3 tree fails on ESPACE
 
 t.start()
 master.zone_wait(zone)
index 4207b765d660c9d9ea7459e637a6b296b1b6885d..6367210d86408cc383065925c3c5d1b82f1432f7 100644 (file)
@@ -17,8 +17,8 @@ t.link(zones, master, slave)
 for zone in zones:
     master.dnssec(zone).enable = True
     master.dnssec(zone).nsec3 = True
-    master.dnssec(zone).nsec3_iters = 2
-    master.dnssec(zone).nsec3_salt_len = 10
+    master.dnssec(zone).nsec3_iterations = 2
+    master.dnssec(zone).nsec3_salt_length = 10
     master.dnssec(zone).nsec3_opt_out = True
 
 t.start()
index 524a90f3440e1523593780302e5cfc82ec66eed2..b4863e20366c45134d247d1cc5e5be957b6fafd5 100644 (file)
@@ -8,7 +8,7 @@ from dnstest.utils import *
 from dnstest.test import Test
 
 def check_salt(server, zone):
-  expect_salt_len = server.dnssec(zone).nsec3_salt_len * 2 # *2 because we get hex string
+  expect_salt_len = server.dnssec(zone).nsec3_salt_length * 2 # *2 because we get hex string
   if expect_salt_len == 0:
       expect_salt_len = 1 # there will be a dash
 
@@ -47,8 +47,8 @@ master.check_nsec(zone2, nonsec=True)
 master.dnssec(zone1).enable = True
 master.dnssec(zone2).enable = True
 master.dnssec(zone2).nsec3 = True
-master.dnssec(zone2).nsec3_iters = 2
-master.dnssec(zone2).nsec3_salt_len = 2
+master.dnssec(zone2).nsec3_iterations = 2
+master.dnssec(zone2).nsec3_salt_length = 2
 master.gen_confile()
 master.reload()
 
@@ -84,11 +84,11 @@ master.zone_verify(zone2)
 
 # Reconfigure autosigning.
 master.dnssec(zone1).nsec3 = True
-master.dnssec(zone1).nsec3_iters = 2
-master.dnssec(zone1).nsec3_salt_len = 2
+master.dnssec(zone1).nsec3_iterations = 2
+master.dnssec(zone1).nsec3_salt_length = 2
 master.dnssec(zone2).nsec3 = True
-master.dnssec(zone2).nsec3_iters = 1
-master.dnssec(zone2).nsec3_salt_len = 0
+master.dnssec(zone2).nsec3_iterations = 1
+master.dnssec(zone2).nsec3_salt_length = 0
 master.gen_confile()
 # Intentionally restarted to ensure the zone file is fully loaded.
 master.stop()
@@ -127,8 +127,8 @@ master.zone_verify(zone2)
 
 # Reconfigure autosigning.
 master.dnssec(zone1).nsec3 = True
-master.dnssec(zone1).nsec3_iters = 1
-master.dnssec(zone1).nsec3_salt_len = 0
+master.dnssec(zone1).nsec3_iterations = 1
+master.dnssec(zone1).nsec3_salt_length = 0
 master.dnssec(zone2).nsec3 = False
 master.gen_confile()
 master.reload()
index b4764d27fd105f1461f02003496a1f7acc4c8903..a9cc39176603cde1b9a9cb33912fa20d954eef7f 100644 (file)
@@ -61,12 +61,12 @@ master.disable_notify = True
 for zone in zones:
     master.dnssec(zone).enable = True
     master.dnssec(zone).nsec3 = random.choice([True, False])
-    master.dnssec(zone).nsec3_iters = 2
-    master.dnssec(zone).nsec3_salt_len = random.choice([0, 1, 9, 64, 128, 255])
+    master.dnssec(zone).nsec3_iterations = 2
+    master.dnssec(zone).nsec3_salt_length = random.choice([0, 1, 9, 64, 128, 255])
     master.dnssec(zone).nsec3_opt_out = (random.random() < 0.5)
 
     if not slave.valgrind:
-        slave.dnssec(zone).validate = True
+        slave.conf_zone(zone).dnssec_validation = True
         slave.dnssec(zone).nsec3 = master.dnssec(zone).nsec3
         slave.dnssec(zone).nsec3_opt_out = master.dnssec(zone).nsec3_opt_out
 
@@ -187,7 +187,7 @@ if slave.log_search("no such record in zone found") or slave.log_search("fallbac
 
 # update salt with keymgr and see if zone correctly re-NSEC3-d after update
 for z in zones1:
-    salt = "-" if master.dnssec(z).nsec3_salt_len == 0 else "fe" * master.dnssec(z).nsec3_salt_len
+    salt = "-" if master.dnssec(z).nsec3_salt_length == 0 else "fe" * master.dnssec(z).nsec3_salt_length
     Keymgr.run_check(master.confile, z.name, "nsec3-salt", salt)
     up = master.update(z)
     up.add("abc." + z.name, 3600, "A", "1.2.3.4")
index 808ea5e79c8ab4499a642f79f23b28fddf72031a..539e9d248d8cc694c0a1854d605c7410850fa5fb 100644 (file)
@@ -129,12 +129,12 @@ if ON_SLAVE:
     master = t.server("knot")
     t.link(zone, master, knot)
     if not IXFR:
-        master.zones[ZONE].journal_content = "none"
+        master.conf_zone(zone).journal_content = "none"
 else:
     master = t.server("dummy")
     t.link(zone, knot)
 
-knot.zonefile_sync = 24 * 60 * 60
+knot.conf_zone(zone).zonefile_sync = 24 * 60 * 60
 
 # ZSK side
 knot.dnssec(zone).enable = True
@@ -144,13 +144,13 @@ knot.dnssec(zone).dnskey_ttl = 2
 knot.dnssec(zone).zone_max_ttl = 3
 knot.dnssec(zone).keytag_modulo = "0/2"
 # optional
-knot.dnssec(zone).alg = "ECDSAP384SHA384"
+knot.dnssec(zone).algorithm = "ECDSAP384SHA384"
 knot.dnssec(zone).zsk_lifetime = STARTUP + 6 * TICK # see ksk1 lifetime
 knot.dnssec(zone).propagation_delay = TICK - 2
-knot.dnssec(zone).cds_publish = "rollover"
+knot.dnssec(zone).cds_cdnskey_publish = "rollover"
 knot.dnssec(zone).rrsig_lifetime = 15
 knot.dnssec(zone).rrsig_refresh = 6
-knot.dnssec(zone).rrsig_prerefresh = 1
+knot.dnssec(zone).rrsig_pre_refresh = 1
 # options without any effect
 knot.dnssec(zone).ksk_lifetime = NONSENSE
 
@@ -167,10 +167,10 @@ signer.dnssec(zone).offline_ksk = True
 signer.dnssec(zone).rrsig_refresh = 2
 signer.dnssec(zone).keytag_modulo = "1/2"
 # optional
-signer.dnssec(zone).alg = "ECDSAP384SHA384"
-signer.dnssec(zone).cds_publish = random.choice(["none", "rollover"])
+signer.dnssec(zone).algorithm = "ECDSAP384SHA384"
+signer.dnssec(zone).cds_cdnskey_publish = random.choice(["none", "rollover"])
 signer.dnssec(zone).rrsig_lifetime = 6
-signer.dnssec(zone).rrsig_prerefresh = 1
+signer.dnssec(zone).rrsig_pre_refresh = 1
 # options without any effect
 signer.dnssec(zone).dnskey_ttl = int(NONSENSE / 10)
 signer.dnssec(zone).zone_max_ttl = NONSENSE
index 80abb133b9a971bd3b272cb0ffc5b9c78c6110e5..f5820a9dd6f12e1a5c06e1346961de08e89629ed 100644 (file)
@@ -56,7 +56,7 @@ ZONE = "example.com."
 zone = t.zone(ZONE)
 t.link(zone, knot)
 
-knot.zonefile_sync = 24 * 60 * 60
+knot.conf_zone(zone).zonefile_sync = 24 * 60 * 60
 
 # ZSK side
 knot.dnssec(zone).enable = True
index 27eadd2e1a367395a8b4feabb1f552e2a9e57f37..f7c007cdee28405548b47b356d2260639ae7b86a 100644 (file)
@@ -32,8 +32,8 @@ def test_one(master, slave, zone, master_policy, slave_policy, initial_serial):
     slave.stop()
     server_purge(slave, zone)
     master.zones[zone[0].name].zfile.update_soa(serial=initial_serial)
-    master.serial_policy = master_policy
-    slave.serial_policy = slave_policy
+    master.conf_zone(zone).serial_policy = master_policy
+    slave.conf_zone(zone).serial_policy = slave_policy
     master.gen_confile()
     slave.gen_confile()
     master.start()
index 4d6b62fb9b32667e4c8e2882bbdf6c3df048a436..0627d16a2834b2afb3605287133c300b47246b67 100644 (file)
@@ -13,7 +13,7 @@ t.link(zone, master)
 
 master.dnssec(zone).enable = True
 master.dnssec(zone).rrsig_lifetime = 20
-master.dnssec(zone).rrsig_prerefresh = 4
+master.dnssec(zone).rrsig_pre_refresh = 4
 master.dnssec(zone).propagation_delay = 1
 master.dnssec(zone).dnskey_ttl = 1
 
index 1ed0fdbedc95da9b56757b2c294a8cd430547213..4c913df7f4f7de1bcf1b2d1c3fe2e9f71b5e19e6 100644 (file)
@@ -37,8 +37,8 @@ for z in zone:
     for s in [slave1, slave2]:
         s.dnssec(z).enable = True
         s.dnssec(z).manual = True
-        s.dnssec(z).alg = alg['name']
-        s.dnssec(z).repro_sign = not alg['always_reproducible']
+        s.dnssec(z).algorithm = alg['name']
+        s.dnssec(z).reproducible_signing = not alg['always_reproducible']
 
 slave1.gen_confile() # needed for keymgr
 
index 155cf1ad1ab21f95aafed7c7f8288e69702fa5e8..8408bfb1b4ad063cf58c981de9afb11ac3ed3a21 100644 (file)
@@ -43,7 +43,7 @@ t.link(zones, knot)
 for z in zones:
     knot.dnssec(z).enable = True
     knot.dnssec(z).ksk_shared = True
-    knot.dnssec(z).alg = "ECDSAP256SHA256"
+    knot.dnssec(z).algorithm = "ECDSAP256SHA256"
     knot.dnssec(z).shared_policy_with = zones[0].name
 
 t.start()
@@ -61,8 +61,8 @@ for z in zones:
 
 # perform algorithm rollover
 for z in zones:
-    knot.dnssec(z).alg = "ECDSAP384SHA384"
-    knot.dnssec(z).ksk_sbm_timeout = 10
+    knot.dnssec(z).algorithm = "ECDSAP384SHA384"
+    knot.conf_ss("submission", z).timeout = 10
     knot.dnssec(z).propagation_delay = 5
 
 knot.gen_confile()
@@ -88,8 +88,8 @@ t.link(zones_add, knot)
 for z in zones_add:
     knot.dnssec(z).enable = True
     knot.dnssec(z).ksk_shared = True
-    knot.dnssec(z).alg = "ECDSAP384SHA384"
-    knot.dnssec(z).ksk_sbm_timeout = 10
+    knot.dnssec(z).algorithm = "ECDSAP384SHA384"
+    knot.conf_ss("submission", z).timeout = 10
     knot.dnssec(z).propagation_delay = 5
     knot.dnssec(z).shared_policy_with = zones[0].name
 
index 6ecdba875a55e4606c8d07cf16bd69236c0469c1..9bb3675e72173bc51e80d7e9b2b22f8436709ab5 100644 (file)
@@ -24,7 +24,7 @@ z0name = zones[0].name
 for z in zones:
     knot.dnssec(z).enable = (z.name == z0name)
     knot.dnssec(z).ksk_shared = True
-    knot.dnssec(z).alg = "ECDSAP256SHA256"
+    knot.dnssec(z).algorithm = "ECDSAP256SHA256"
     knot.dnssec(z).shared_policy_with = zones[0].name
 
 t.start()
@@ -32,9 +32,8 @@ knot.zones_wait(zones)
 
 for z in zones:
     check_zone(knot, z, 1 if z.name == z0name else 0, "initial sign")
-    knot.dnssec(z).disable = knot.dnssec(z).enable
-    knot.dnssec(z).enable = True
-    knot.dnssec(z).alg = "ECDSAP384SHA384"
+    knot.dnssec(z).enable = not knot.dnssec(z).enable
+    knot.dnssec(z).algorithm = "ECDSAP384SHA384"
 
 knot.gen_confile()
 knot.reload()
index 1d3afe61071fea73695234069c592a94f76885c9..45ffdb404770f4585072ef3c2267bf2b67db1cf9 100644 (file)
@@ -16,17 +16,16 @@ zone = t.zone("example.") # has SOA serial lower than @now
 
 t.link(zone, master, slave, ddns=True)
 
-master.serial_policy = random.choice(["increment", "unixtime", "dateserial"])
-slave.serial_policy = random.choice(["increment", "unixtime", "dateserial"])
+master.conf_zone(zone).serial_policy = random.choice(["increment", "unixtime", "dateserial"])
+slave.conf_zone(zone).serial_policy = random.choice(["increment", "unixtime", "dateserial"])
 
 slave.dnssec(zone).nsec3 = random.choice([False, True])
 
-slave.zonefile_load = random.choice(["none", "whole"])
-for z in zone:
-    slave.zones[z.name].journal_content = random.choice(["all", "none", "changes"])
+slave.conf_zone(zone).zonefile_load = random.choice(["none", "whole"])
+slave.conf_zone(zone).journal_content = random.choice(["all", "none", "changes"])
 
 cold_reload = random.choice([False, True])
-if slave.zonefile_load == "none" and slave.zones[zone[0].name].journal_content != "all":
+if slave.conf_zone(zone[0]).zonefile_load == "none" and slave.conf_zone(zone[0]).journal_content != "all":
     cold_reload = False
 
 t.start()
index ecb383610885d99003e4382eedec3a2fb730750d..8b183515891eebd661ee230698802079376a87cc 100644 (file)
@@ -23,12 +23,7 @@ zones_unsigned = t.zone("example.com.")
 zones = zones_ok + zones_ok3 + zones_nok + zones_nok3
 t.link(zones + zones_unsigned, master, slave, ixfr=True)
 
-for z in zones_ok + zones_nok:
-    slave.dnssec(z).validate = True
-for z in zones_ok3 + zones_nok3:
-    slave.dnssec(z).validate = True
-for z in zones_unsigned:
-    slave.dnssec(z).validate = True
+slave.conf_zone(zones_ok + zones_nok + zones_ok3 + zones_nok3 + zones_unsigned).dnssec_validation = True
 
 t.start()
 
index 67fe66569b1621a8bf00e1e8e12d5986579a2328..c5e4b2e3f02f925260162fd8321e48d2021b1d22 100644 (file)
@@ -17,7 +17,7 @@ t.link(zones, master, slave, ixfr=True, ddns=True)
 
 for z in zones:
     master.dnssec(z).enable = True
-    slave.dnssec(z).validate = True
+    slave.conf_zone(z).dnssec_validation = True
 
 for z in zones_nsec3:
     master.dnssec(z).nsec3 = True
index 35b7e97c482aaf103e059879e407053f1dff93cc..9a64b3b4df01d31b775c7ceb54fd4f72caa76d2d 100644 (file)
@@ -22,7 +22,7 @@ for z in zones:
     master.dnssec(z).enable = True
     master.dnssec(z).rrsig_lifetime = 10
     master.dnssec(z).rrsig_refresh = 1
-    master.dnssec(z).rrsig_prerefresh = 1
+    master.dnssec(z).rrsig_pre_refresh = 1
 
 t.start()
 
@@ -43,8 +43,7 @@ dig_multi(slave, zones, "SERVFAIL")
 # SCENARIO II -- configured  dnssec-validation
 master.start()
 slave.stop()
-for z in zones:
-    slave.dnssec(z).validate = True
+slave.conf_zone(zones).dnssec_validation = True
 slave.gen_confile()
 slave.start()
 serials = slave.zones_wait(zones, serials)
index 7de1fb4751ca4bb91418839ebc8ea9b9acbb6ab0..aa8ce122ccfbc98c02ef5b910a8922a871cd62c2 100644 (file)
@@ -67,8 +67,8 @@ master = t.server("knot")
 zone = t.zone("example.com.", storage=".")
 t.link(zone, unsigned_master, master, ddns=True)
 
-unsigned_master.zones[zone[0].name].journal_content = "none"
-master.ixfr_from_axfr = True
+unsigned_master.conf_zone(zone).journal_content = "none"
+master.conf_zone(zone).ixfr_from_axfr = True
 
 master.dnssec(zone).enable = True
 master.dnssec(zone).manual = False
@@ -76,7 +76,7 @@ master.dnssec(zone).dnskey_ttl = 3
 master.dnssec(zone).zsk_lifetime = 16
 master.dnssec(zone).propagation_delay = 3
 master.dnssec(zone).nsec3 = True
-master.dnssec(zone).nsec3_salt_len = 8
+master.dnssec(zone).nsec3_salt_length = 8
 master.dnssec(zone).nsec3_salt_lifetime = -1
 
 t.start()
index 72d45b2f75218b32d676f576dd24fc68d2266135..6a4be037659b3919acdf75ffccd79b5e33c05b18 100644 (file)
@@ -10,13 +10,13 @@ server4 = t.server("knot", address=4)
 server6 = t.server("knot", address=6)
 zone = t.zone("flags.")
 
-# Set common payload limit.
-server4.udp_max_payload = 1220
-server6.udp_max_payload = 1220
-
 t.link(zone, server4)
 t.link(zone, server6)
 
+# Set common payload limit.
+server4.conf_srv().udp_max_payload = 1220
+server6.conf_srv().udp_max_payload = 1220
+
 t.start()
 
 # Check common limit if 1220 fits and 1221 does not.
@@ -33,13 +33,13 @@ resp = server6.dig("1221resp.flags", "TXT", udp=True, bufsize=4096)
 resp.check(flags="TC")
 
 # Set IP family specific limit.
-server4.udp_max_payload_ipv4 = 1220
-server4.udp_max_payload_ipv6 = 1221 # Should not affect IPv4
-server4.udp_max_payload      = 1221 # Should not override IPv4 specific
+server4.conf_srv().udp_max_payload_ipv4 = 1220
+server4.conf_srv().udp_max_payload_ipv6 = 1221 # Should not affect IPv4
+server4.conf_srv().udp_max_payload      = 1221 # Should not override IPv4 specific
 
-server6.udp_max_payload_ipv6 = 1220
-server6.udp_max_payload_ipv4 = 1221 # Should not affect IPv6
-server6.udp_max_payload      = 1221 # Should not override IPv6 specific
+server6.conf_srv().udp_max_payload_ipv6 = 1220
+server6.conf_srv().udp_max_payload_ipv4 = 1221 # Should not affect IPv6
+server6.conf_srv().udp_max_payload      = 1221 # Should not override IPv6 specific
 
 server4.gen_confile()
 server4.reload()
index 3c0c0740ec79c6ea5879a1c45ad87913f6b41603..6cdb956ca5613a33a88ab3eed8d09f3a7deddb67 100644 (file)
@@ -12,11 +12,12 @@ t = Test()
 
 master = t.server("bind")
 slave = t.server("knot")
-slave.zonefile_sync = "5s"
 
 zone = t.zone("example.")
 t.link(zone, master, slave)
 
+slave.conf_zone(zone).zonefile_sync = "5s"
+
 zone_path = slave.zones[zone[0].name].zfile.path
 
 t.start()
@@ -51,7 +52,7 @@ if prev_mtime == last_mtime:
     set_err("NO POST-TRANSFER FLUSH")
 
 # Set the zonefile-sync parameter to 60s and update master - should not flush
-slave.zonefile_sync = "60s"
+slave.conf_zone(zone).zonefile_sync = "60s"
 slave.gen_confile()
 slave.reload()
 t.sleep(FLUSH_SLEEP) # ~ 15s wait for master to start
@@ -64,7 +65,7 @@ if os.stat(zone_path).st_mtime != last_mtime:
     set_err("SOON POST-RELOAD FLUSH")
 
 # Set the zonefile-sync parameter to 1s - should flush
-slave.zonefile_sync = "1s"
+slave.conf_zone(zone).zonefile_sync = "1s"
 slave.gen_confile()
 slave.reload()
 t.sleep(1.5)
index 373a062301ff64a79080b6e0f7de77f61671c169..36c9fb7d0d9385f37c17e4b96bf40b80a2febab1 100644 (file)
@@ -32,7 +32,7 @@ def create_servers(t, count, zone):
         master.disable_notify = True
 
         slave = t.server("knot")
-        slave.tcp_remote_io_timeout = "1000"
+        slave.conf_srv().tcp_remote_io_timeout = "1000"
 
         t.link(zone, master, slave)
 
index 6fb7117f349d80241812a449d7b6f47bd1c64db2..2e37508fecfdcddb5f84a04f3d6550e5d59d9e93 100644 (file)
@@ -25,11 +25,11 @@ master = t.server("knot", tsig=TSIG)
 slave = t.server("knot", tsig=TSIG)
 zones = t.zone("example.com.")
 
-master.auto_acl = MASTER_AUTO
-slave.auto_acl = SLAVE_AUTO
-
 t.link(zones, master, slave, ixfr=True)
 
+master.conf_srv().automatic_acl = MASTER_AUTO
+slave.conf_srv().automatic_acl = SLAVE_AUTO
+
 t.start()
 
 # Wait for AXFR to slave server.
index ac2f590cfb48308272168bef55f62332a202c567..cab45b4eebadee35ab3562e25f88e2b2efeac566 100644 (file)
@@ -15,7 +15,7 @@ t.link(zone, master, slave, ixfr=True)
 for z in zone:
     master.dnssec(z).enable = True
 master.disable_notify = True
-slave.zones[zone[0].name].retry_max = 10
+slave.conf_zone(zone).retry_max_interval = 10
 
 t.start()
 
index 2ce5005bff049302769a095db8da32f6fb04f7d3..51614bc67fbaa475582a8e987eb5000bfe5e547f 100644 (file)
@@ -11,7 +11,9 @@ master = t.server("knot")
 slave = t.server("knot")
 zone = t.zone("xfr", storage=".")
 
-t.link(zone, master, slave, journal_content="none")
+t.link(zone, master, slave)
+
+master.conf_zone(zone).journal_content = "none"
 
 t.start()
 
index 39cc4a7259ba83f9f29a91dfebb9d75530493a9c..6c904bfe3359077bbaa5cce79297310cf3e428ef 100644 (file)
@@ -12,8 +12,8 @@ zones = t.zone_rnd(5, records=50) + t.zone("records.")
 
 t.link(zones, master, slave, ixfr=True)
 
-slave.tcp_io_timeout = 3000
-slave.tcp_remote_io_timeout = 8000
+slave.conf_srv().tcp_io_timeout = 3000
+slave.conf_srv().tcp_remote_io_timeout = 8000
 
 t.start()
 
index 7ff7aa3e920ddf04b1fc428a187028c00f6951d1..96ea47f9bb6857d2db0a6a3628b51a12cb9caf80 100644 (file)
@@ -14,11 +14,11 @@ zone = t.zone("xfr", storage=".")
 t.link(zone, master, slave)
 t.link(zone, slave, sub_slave)
 
-slave.ixfr_from_axfr = True
+slave.conf_zone(zone).ixfr_from_axfr = True
 
 t.start()
 
-serial = master.zones_wait(zone)
+serial = sub_slave.zones_wait(zone)
 serial_init = serial
 
 # update zone with small change
@@ -37,8 +37,8 @@ t.xfr_diff(slave, sub_slave, zone, serial_init)
 
 # test case 2: generate+verify ZONEMD
 
-slave.zonemd_generate = "zonemd-sha384"
-sub_slave.zonemd_verify = True
+slave.conf_zone(zone).zonemd_generate = "zonemd-sha384"
+sub_slave.conf_zone(zone).zonemd_verify = True
 
 slave.gen_confile()
 sub_slave.gen_confile()
@@ -58,7 +58,7 @@ t.xfr_diff(slave, sub_slave, zone, serial_init)
 
 for z in zone:
     slave.dnssec(z).enable = True
-    sub_slave.dnssec(z).validate = True
+    sub_slave.conf_zone(z).dnssec_validation = True
 
 slave.gen_confile()
 sub_slave.gen_confile()
index e0a1b9f9c714e15b9d9ccd8f871ccde67fe65c1d..d3849d02b710cdb1c75dcfeddea23a5cb9ef97b8 100644 (file)
@@ -15,13 +15,13 @@ t.link(zones, master)
 master.dnssec(zones[0]).enable = True
 master.dnssec(zones[0]).nsec3 = True
 master.dnssec(zones[0]).nsec3_opt_out = True
-master.dnssec(zones[0]).nsec3_iters = 1
+master.dnssec(zones[0]).nsec3_iterations = 1
 
 t.start()
 
 master.zones_wait(zones)
 
-master.dnssec(zones[0]).nsec3_iters = 2
+master.dnssec(zones[0]).nsec3_iterations = 2
 master.gen_confile()
 master.reload()
 t.sleep(8)
@@ -35,7 +35,7 @@ resp = master.dig("b.example.", "NS", dnssec=True)
 resp.check_count(0, rtype="NSEC3", section="authority")
 
 if random.random() < 0.5:
-    master.dnssec(zones[0]).nsec3_iters = 3
+    master.dnssec(zones[0]).nsec3_iterations = 3
     master.gen_confile()
     master.reload()
     t.sleep(6)
index b95bad6b2d1f27737e9f421c064e7101ed95e33d..65b324a69e94054481a6f5bf0ee2fc94e7760118 100644 (file)
@@ -16,12 +16,12 @@ t.link(zones, s1, s2, ixfr=True)
 t.link(zones, s2, s3, ixfr=True)
 
 if not s1.valgrind:
-    s2.tcp_remote_io_timeout = 8000
-    s3.tcp_remote_io_timeout = 8000
+    s2.conf_srv().tcp_remote_io_timeout = 8000
+    s3.conf_srv().tcp_remote_io_timeout = 8000
 else:
-    s1.tcp_remote_io_timeout = 45000
-    s2.tcp_remote_io_timeout = 45000
-    s3.tcp_remote_io_timeout = 45000
+    s1.conf_srv().tcp_remote_io_timeout = 45000
+    s2.conf_srv().tcp_remote_io_timeout = 45000
+    s3.conf_srv().tcp_remote_io_timeout = 45000
     s1.ctl_params_append = ["-t", "45"]
     s2.ctl_params_append = ["-t", "45"]
     s3.ctl_params_append = ["-t", "45"]
index 5b50a39c5e0629934e46fd489b691ddce5e9f2d7..8fb28107ac475618c70780c9e348d27d02c5305f 100644 (file)
@@ -12,7 +12,7 @@ zones = t.zone_rnd(5, records=50) + t.zone("records.")
 
 t.link(zones, master, slave, ixfr=True)
 
-master.tcp_io_timeout = 3000
+master.conf_srv().tcp_io_timeout = 3000
 
 t.start()
 
index 7f61183ec798394c177a924a2b9a5bd85b1db21d..9cba351143bf1e9560dd730f6e417280dbd8abde 100644 (file)
@@ -19,12 +19,12 @@ zones = t.zone_rnd(5, records=50) + t.zone("records.")
 t.link(zones, master, slave, ixfr=True)
 
 if master.valgrind:
-    master.semantic_check = False
-    slave.semantic_check = False
+    master.conf_zone(zones).semantic_checks = False
+    slave.conf_zone(zones).semantic_checks = False
 
-master.tcp_io_timeout = 3000
-slave.tcp_io_timeout = 3000
-slave.tcp_remote_io_timeout = 8000
+master.conf_srv().tcp_io_timeout = 3000
+slave.conf_srv().tcp_io_timeout = 3000
+slave.conf_srv().tcp_remote_io_timeout = 8000
 
 t.start()
 
index 70c777ed47c184b4f084b4367b5480ee6fc9355e..1152b497fa07cea8ea1c1952218b750f7ef82cd2 100644 (file)
@@ -20,7 +20,7 @@ zone = zones[0]
 
 t.link(zones, masterA, slave, ixfr=True)
 
-slave.master_pin_tol = PERIOD
+slave.conf_zone(zones).master_pin_tolerance = PERIOD
 
 masterA.disable_notify = DISABLE_NOTIFY
 masterB.disable_notify = DISABLE_NOTIFY
index 28538e8e8a7f5c26354a7be1c0b8674466a46842..aa8a6a6b9cf3a43d9b3beaf035a49470e14d1fdd 100644 (file)
@@ -47,10 +47,10 @@ t.link(zones, masterA, slave, ixfr=True)
 t.link(zones, masterB, slave, ixfr=True)
 
 for m in [ masterA, masterB ]:
-    m.serial_policy = "unixtime"
-    m.zonefile_load = "difference-no-serial"
-    m.dnssec(zone).enable = True
-    m.zones[zone.name].journal_content = "all"
+    m.conf_zone(zones).serial_policy = "unixtime"
+    m.conf_zone(zones).zonefile_load = "difference-no-serial"
+    m.dnssec(zones).enable = True
+    m.conf_zone(zones).journal_content = "all"
 
 masterB.zones[zone.name].serial_modulo = str(-PIN)
 
index 351dad8c36fb536cd2559a5e85a03fb56cbc0130..cbe9df5c51e0b904e2b688294f89f4c8ad1f1d5c 100644 (file)
@@ -14,7 +14,7 @@ zones = t.zone_rnd(3, records=50)
 
 t.link(zones, master, slave, ixfr=True)
 
-slave.ixfr_by_one = "on"
+slave.conf_zone(zones).ixfr_by_one = True
 
 t.start()
 
index 950fe10c8702a0fe765222a0a5c3dd7e8637a614..71e83aae4fdac48ffbda01b9bb52a3470ef87f9f 100644 (file)
@@ -22,7 +22,7 @@ master.reload()
 slave.zones_wait(zone, serial_init)
 
 # Disable IXFR and check AXFR-style IXFR.
-master.provide_ixfr = False
+master.conf_zone(zone).provide_ixfr = False
 master.gen_confile()
 master.reload()
 master.zones_wait(zone, serial_init)
@@ -30,7 +30,7 @@ master.zones_wait(zone, serial_init)
 t.check_axfr_style_ixfr(master, zone[0].name, serial_init[zone[0].name])
 
 # Enable IXFR and compare with slave.
-master.provide_ixfr = True
+master.conf_zone(zone).provide_ixfr = True
 master.gen_confile()
 master.reload()
 master.zones_wait(zone, serial_init)
index e476b6df3ba32fc3209fc27151d354984037fca9..c554178f3ef793f663ebff49cf38db30eaaf496b 100644 (file)
@@ -20,7 +20,7 @@ zone = t.zone("existing.", storage=".")
 t.link(zone, master, slave, ixfr=True)
 
 if IGNORE:
-    slave.ixfr_benevolent = True
+    slave.conf_zone(zone).ixfr_benevolent = True
 
 slave.update_zonefile(zone, version="slave0")
 
index 31f8baeaf636a25c9778b8fba3d54049099d87bf..2987cced388d3b5930e79427c6865a5cb9bfe3f8 100644 (file)
@@ -21,8 +21,8 @@ master.dnssec(zone_slow).enable = True
 
 MSGDELAY = 90
 
-master.tcp_remote_io_timeout = 4000
-master.tcp_io_timeout = 4000
+master.conf_srv().tcp_remote_io_timeout = 4000
+master.conf_srv().tcp_io_timeout = 4000
 
 def slow_ixfr(server, zname, serial):
     server.kdig(zname, "IXFR=" + str(serial), msgdelay=MSGDELAY)
index a614cb1c328132e249392332a49ae8cbbc3e6c68..dcf19e8fb5583ea174692e216ae368efebcb248b 100644 (file)
@@ -13,17 +13,14 @@ zone = t.zone_rnd(1, records=100, dnssec=False)
 
 t.link(zone, master, slave)
 
-for z in master.zones:
-    slave.zones[z].journal_content = "none"
-
-for z in slave.zones:
-    slave.zones[z].journal_content = "all"
-
 slave.max_journal_usage = 150 * 1024
 
-master.zonefile_sync = "0"
-slave.zonefile_sync = "-1"
-slave.zonefile_load = "none"
+master.conf_zone(zone).zonefile_sync = "0"
+master.conf_zone(zone).journal_content = "none"
+
+slave.conf_zone(zone).zonefile_sync = "-1"
+slave.conf_zone(zone).zonefile_load = "none"
+slave.conf_zone(zone).journal_content = "all"
 
 master.dnssec(zone).enable = "true"
 
index fe77c7893a12844f546c9f28df6bc3111063c9c8..690445ab9b13566aa4e263622380902ea775cb61 100644 (file)
@@ -9,9 +9,10 @@ t = Test()
 master1 = t.server("knot")
 slave = t.server("knot")
 zone = t.zone("example.com.", storage=".", version=1)
-slave.zone_size_limit = 230
 t.link(zone, master1, slave, ixfr=True)
 
+slave.conf_zone(zone).zone_max_size = 230
+
 t.start()
 
 # Wait for zones.
index 1603f13fa4ec8b5e7c3dcbba61dcc16a873806e1..13c08a9348c3474fcf7c874f31fedcdcec46b23c 100644 (file)
@@ -16,7 +16,7 @@ t.link(zones, master, slave)
 
 master.zones[ZONE].zfile.update_soa(serial=1718378850)
 
-master.journal_max_depth = 10
+master.conf_zone(zones).journal_max_depth = 10
 
 t.start()
 serials = master.zones_wait(zones)
index 325ab4887df6c43494e74170513c2f1874dc1a5a..a396cfb07f3052cae808376c09f32c6618923cf0 100644 (file)
@@ -19,8 +19,8 @@ t.link(zones, master, slave, ixfr=True)
 
 master.journal_db_size = 200 * 1024 * 1024
 slave.journal_db_size = 200 * 1024 * 1024
-master.journal_max_usage = 100 * 1024 * 1024
-slave.journal_max_usage = 100 * 1024 * 1024
+master.conf_zone(zones).journal_max_usage = 100 * 1024 * 1024
+slave.conf_zone(zones).journal_max_usage = 100 * 1024 * 1024
 
 t.start()
 serial = slave.zones_wait(zones)
index 4a8a867a3d4a54d1d7d6585166245847d282105d..5d999e5233077fd3763c975adca5c1b9e883d1cb 100644 (file)
@@ -37,8 +37,8 @@ t.link(zone_common2, remote)
 t.link(zone_remote, remote)
 
 if local.valgrind:
-    local.semantic_check = False
-    remote.semantic_check = False
+    local.conf_zone(zone_common1 + zone_local).semantic_checks = False
+    remote.conf_zone(zone_common2 + zone_remote).semantic_checks = False
 
 def fallback_checks(server, zone_local, zone_remote, nxdomain):
     # Local preferred OK, try with local TSIG.
index 16205b57f15d544cc5ec6ef9e89e64a80b2da704..cd87a67b5badd167e3ef27ca3cb1ec612611b621 100644 (file)
@@ -15,7 +15,6 @@ t = Test(stress=False)
 ModNoudp.check()
 
 knot = t.server("knot")
-knot.udp_workers = 1
 
 zone_tc = t.zone("example.")
 zone_notc = t.zone("flags.")
@@ -24,6 +23,8 @@ zones = zone_tc + zone_notc + zone_50_50
 
 t.link(zones, knot)
 
+knot.conf_srv().udp_workers = 1
+
 knot.add_module(zone_tc,    ModNoudp())
 knot.add_module(zone_notc,  ModNoudp(allow_rate=1))
 knot.add_module(zone_50_50, ModNoudp(trunc_rate=2))
index b3878cceeea9b7f706d54582d1a7604afeaec350..c7dad10369bef1c5bee0ea231d70aebd1f60d0dc 100644 (file)
@@ -13,7 +13,9 @@ ModOnlineSign.check()
 
 knot = t.server("knot")
 zones = t.zone_rnd(4, dnssec=False, records=5)
-t.link(zones, knot, journal_content="none")
+t.link(zones, knot)
+
+knot.conf_zone(zones).journal_content = "none"
 knot.add_module(zones[0], ModOnlineSign())
 knot.add_module(zones[1], ModOnlineSign("ECDSAP384SHA384", key_size="384"))
 knot.dnssec(zones[2]).enable = True
index 2e49fa0b3151538a8de33d576562b61f64524503..d9bafb1967852307f50c704f972f06cb1eb2dc45 100644 (file)
@@ -157,7 +157,7 @@ def watch_ksk_rollover(t, server, zone, before_keys, after_keys, total_keys, des
     wait_for_dnskey_count(t, server, after_keys, 28)
     check_zone(server, zone, after_keys, 1, 1, 1, desc + ": old key removed")
 
-t = Test(stress=False)
+t = Test(stress=False, tsig=False)
 
 ModOnlineSign.check()
 
@@ -180,7 +180,8 @@ def cds_submission():
 
 child.zonefile_sync = 24 * 60 * 60
 
-child.dnssec(child_zone).ksk_sbm_check = [ parent ]
+child.conf_ss("submission", child_zone).parent = [ parent ]
+
 child.add_module(child_zone, ModOnlineSign("ECDSAP384SHA384", key_size="384", prop_delay=11, ksc = [ parent ],
                                            ksci = 2, ksk_shared=True, cds_publish="always",
                                            cds_digesttype=random.choice(["sha256", "sha384"])))
index 7af57000d068bf443303a5b303133b4712c3b20d..c2f1b8ff46a6d22d776263a886dd728db9a80e7a 100644 (file)
@@ -17,7 +17,7 @@ t.link(zone, master, slave1)
 t.link(zone, master, slave2)
 t.link(zone, master, slave3)
 
-master.zones[zone[0].name].retry_max = 10
+master.conf_zone(zone).retry_max_interval = 10
 
 t.start()
 
index f3962bb01d733e54e82c6e1bd623f022260a3294..3d226f81ca508f41d87a6b10151081732e7c7e8c 100644 (file)
@@ -25,7 +25,7 @@ t.link(zones, recver, ddns=True)
 for z in zones:
     sender.dnssec(z).enable = True
     sender.dnssec(z).propagation_delay = 4
-    sender.dnssec(z).dnskey_sync = [ recver ]
+    sender.conf_ss("dnskey-sync", z).remote = [ recver ]
     sender.dnssec(z).keytag_modulo = "0/1"
 
 sender.check_quic()
index 293076cb5ecca261be1733d1a47bb39d7bc10ddc..82808e4cea70b95efa1e8a41e1f43d3dcc436de2 100644 (file)
@@ -24,11 +24,11 @@ for z in rnd_zones:
     master.dnssec(z).enable = True
 
 if master.valgrind:
-    slave.quic_idle_close_timeout = 25 # for DoQ xfrs
-    slave.tcp_remote_io_timeout = 20000
+    slave.conf_srv().quic_idle_close_timeout = 25 # for DoQ xfrs
+    slave.conf_srv().tcp_remote_io_timeout = 20000
 if slave.valgrind:
-    master.quic_idle_close_timeout = 25 # for sending DoQ notify
-    master.tcp_remote_io_timeout = 20000
+    master.conf_srv().quic_idle_close_timeout = 25 # for sending DoQ notify
+    master.conf_srv().tcp_remote_io_timeout = 20000
 
 MSG_DENIED_NOTIFY = "ACL, denied, action notify"
 MSG_DENIED_TRANSFER = "ACL, denied, action transfer"
index 9118d907f14aaf272cae587260e4cca2be6aca9a..532819228bf0a923a38c95c892ce8a83c473e0c9 100644 (file)
@@ -17,11 +17,11 @@ zone = t.zone(ZONE)
 t.link(zone, master, slave)
 t.link(zone, zfloader)
 
-master.zonefile_load = "none"
-master.zones[ZONE].journal_content = "all"
+master.conf_zone(zone).zonefile_load = "none"
+master.conf_zone(zone).journal_content = "all"
 
-zfloader.zonefile_load = "difference-no-serial"
-zfloader.zones[ZONE].journal_content = "all"
+zfloader.conf_zone(zone).zonefile_load = "difference-no-serial"
+zfloader.conf_zone(zone).journal_content = "all"
 
 shutil.copytree(os.path.join(t.data_dir, "journal"), os.path.join(master.dir, "journal"))
 
index c140f094d5c4b86e4a947ff6e36db8ee0718275a..5e01555991182d12977a0e5bd46d88c82ea9be99 100644 (file)
@@ -15,11 +15,11 @@ zones = t.zone("example.com.")
 t.link(zones, master)
 t.link(zones, slave)
 
-master.zonefile_sync = "0"
+master.conf_zone(zones).zonefile_sync = "0"
+master.conf_zone(zones).zone_db_output = "1"
+slave.conf_zone(zones).zone_db_input = "1"
 
 for z in zones:
-    master.zones[z.name].redis_out = "1"
-    slave.zones[z.name].redis_in = "1"
     slave.zones[z.name].zfile.remove()
 
 t.start()
@@ -67,13 +67,13 @@ if uptodate_log != len(zones):
 
 # Add to DB manually. Slave will diverge from master.
 for z in zones:
-    txn = t.redis.cli("knot.upd.begin", z.name, master.zones[z.name].redis_out)
+    txn = t.redis.cli("knot.upd.begin", z.name, master.conf_zone(z).zone_db_output)
     r = t.redis.cli("knot.upd.remove", z.name, txn, "example.com. 3600 in soa dns1.example.com. hostmaster.example.com. %d 10800 3600 1209600 7200" % serials3[z.name])
     r = t.redis.cli("knot.upd.add", z.name, txn, "example.com. 3600 in soa dns1.example.com. hostmaster.example.com. %d 10800 3600 1209600 7200" % (serials3[z.name] + 1))
     r = t.redis.cli("knot.upd.add", z.name, txn, "txtadd 3600 A 1.2.3.4")
     r = t.redis.cli("knot.upd.commit", z.name, txn)
 
-    r = t.redis.cli("knot.upd.load", z.name, master.zones[z.name].redis_out, str(serials3[z.name]))
+    r = t.redis.cli("knot.upd.load", z.name, master.conf_zone(z).zone_db_output, str(serials3[z.name]))
     if not "txtadd" in r:
         set_err("NO TXTADD IN UPD")
 
index 29cbc1dcf67440371a26a83e5a9fa8a51dd6d95c..ab5d3aa393f769c0820070c7118ba64179d8919c 100644 (file)
@@ -25,7 +25,7 @@ t.link(zones, recver, ddns=True)
 for z in zones:
     sender.dnssec(z).enable = True
     sender.dnssec(z).propagation_delay = 4
-    sender.dnssec(z).dnskey_sync = [ recver ]
+    sender.conf_ss("dnskey-sync", z).remote = [ recver ]
     sender.dnssec(z).keytag_modulo = "0/1"
 
 t.start()
index ef777a35e69f7f51da423ae0fe5d17b150a9bcb6..3e6665e71a2c1dcc1415fbc78031ecf84da6027c 100644 (file)
@@ -25,13 +25,13 @@ for z in rnd_zones:
     master.dnssec(z).enable = True
 
 if master.valgrind:
-    slave.quic_idle_close_timeout = 10 # for DoQ xfrs
-    master.tcp_io_timeout = 10000
-    slave.tcp_io_timeout = 10000
-    master.tcp_remote_io_timeout = 10000
-    slave.tcp_remote_io_timeout = 10000
+    slave.conf_srv().quic_idle_close_timeout = 10 # for DoQ xfrs
+    master.conf_srv().tcp_io_timeout = 10000
+    slave.conf_srv().tcp_io_timeout = 10000
+    master.conf_srv().tcp_remote_io_timeout = 10000
+    slave.conf_srv().tcp_remote_io_timeout = 10000
 if slave.valgrind:
-    master.quic_idle_close_timeout = 10 # for sending DoQ notify
+    master.conf_srv().quic_idle_close_timeout = 10 # for sending DoQ notify
 
 MSG_DENIED_NOTIFY = "ACL, denied, action notify"
 MSG_DENIED_TRANSFER = "ACL, denied, action transfer"
index f9763661514be06b3c82654eb410479a861afc8a..29830fb82ff81bb7f0334407961bcc584ede1cf1 100644 (file)
@@ -26,15 +26,16 @@ slave = t.server("knot")
 
 t.link(zones, master, slave)
 
+slave.conf_zone(zones).journal_content = "all"
+slave.conf_zone(zones).zonefile_load = "none"
+
 for z in zones:
     if random.choice([True, False]):
         master.dnssec(z).enable = True
-        master.dnssec(z).alg = "ECDSAP256SHA256"
+        master.dnssec(z).algorithm = "ECDSAP256SHA256"
         master.dnssec(z).single_type_signing = False
     else:
         master.add_module(z, ModOnlineSign(algorithm="ECDSAP256SHA256"))
-    slave.zones[z.name].journal_content = "all"
-    slave.zonefile_load = "none"
 
 backup_dir = master.dir + "/backup"
 backup_dir2 = master.dir + "/backup2"  # Backup of a backup, for debugging.
@@ -45,8 +46,8 @@ valgrind_delay = 2 if slave.valgrind else 0  # allow a little time margin under
 valgrind_delay += 2 # even without valgrind, add some tolerance because rounding timestamps to whole seconds multiple times
 
 if master.valgrind:
-    master.semantic_check = False
-    slave.semantic_check = False
+    master.conf_zone(zones).semantic_checks = False
+    slave.conf_zone(zones).semantic_checks = False
 
 t.start()
 serials_init = slave.zones_wait(zones)
index 8db54326560f1416b2a945903c57c29d15033b87..9a4a64076e82629f61a72aca73719b80efab50d5 100644 (file)
@@ -64,8 +64,8 @@ lockfile = os.path.join(backup_dir, "lock.knot_backup")
 labelfile = os.path.join(backup_dir, "knot_backup.label")
 
 if master.valgrind:
-    master.semantic_check = False
-    master2.semantic_check = False
+    master.conf_zone(zones).semantic_checks = False
+    master2.conf_zone(zones).semantic_checks = False
 
 t.start()
 serials_init = master.zones_wait(zones)
index 7292d4fbfa0a903ef959ccc845f44926089fb0fa..e1d9f5acf4dcb09293a6418ef133dede08d414f3 100644 (file)
@@ -17,8 +17,8 @@ zone = t.zone("example.com.")
 t.link(zone, master1)
 t.link(zone, master2)
 
-master1.dnssec(zone[0]).enable = True
-master1.zonefile_sync = -1
+master1.dnssec(zone).enable = True
+master1.conf_zone(zone).zonefile_sync = -1
 
 t.start()
 
index 11003cf7668e8d07edb9faf744181f75a233311b..2f546341a722f699b1b7ff871de8fc21f98e55da 100644 (file)
@@ -40,9 +40,10 @@ start_version = random.choice([0, 2])
 knot = t.server("knot")
 zone = t.zone("example.com.", storage=".")
 t.link(zone, knot)
-knot.zonefile_sync = "-1"
-knot.zones[zone[0].name].journal_content = "all"
-knot.zonefile_load = "difference-no-serial"
+
+knot.conf_zone(zone).zonefile_sync = "-1"
+knot.conf_zone(zone).journal_content = "all"
+knot.conf_zone(zone).zonefile_load = "difference-no-serial"
 
 knot.update_zonefile(zone, version=start_version)
 
index 5d3bc8fe9eba622ad93a5d2ee2b725461ee445bf..052c7c45e7fe91232cea245aa7ff25077c5224bd 100644 (file)
@@ -19,14 +19,15 @@ detail_log("Scenario: purge_beforehand %s, cold_reload %s, zone_reload_afterward
 knot = t.server("knot")
 zone = t.zone("example.", storage=".")
 t.link(zone, knot)
+
 knot.dnssec(zone).enable = True
-knot.zonefile_sync = "-1"
+knot.conf_zone(zone).zonefile_sync = "-1"
 
 t.start()
 serial = knot.zone_wait(zone)
 
-knot.zones[zone[0].name].journal_content = "all"
-knot.zonefile_load = "difference-no-serial"
+knot.conf_zone(zone).journal_content = "all"
+knot.conf_zone(zone).zonefile_load = "difference-no-serial"
 if purge_beforehand:
     knot.ctl("zone-purge -f +expire example.")
 
index d8d9dc85185a1fd3f9ad8e269d68e6da88547f13..0ef94af282285d172890dd40253d98388f216d94 100644 (file)
@@ -14,9 +14,9 @@ zones = t.zone(ZONE, storage=".")
 
 t.link(zones, master, slave)
 
-master.zonefile_sync = 0
-master.zonefile_load = "difference-no-serial"
-master.zones[ZONE].journal_content = "all"
+master.conf_zone(zones).zonefile_sync = 0
+master.conf_zone(zones).zonefile_load = "difference-no-serial"
+master.conf_zone(zones).journal_content = "all"
 
 if random.choice([False, True]):
     master.dnssec(zones[0]).enable = True
index 00ce0e72ae7ae62b688eeea838ff644928a4a8d0..eddc18ee71de69460235351fd29dceb81fb7b735 100644 (file)
@@ -30,13 +30,13 @@ EXPIRE_SLEEP = 18
 master = t.server("knot")
 slave = t.server("knot")
 sub_slave = t.server("knot")
-slave.tcp_remote_io_timeout = "1000"
 
 t.link(zone, master, slave)
 t.link(zone, slave, sub_slave)
 
-slave.zones[zone[0].name].expire_min = 16
-sub_slave.zones[zone[0].name].expire_min = 16
+slave.conf_srv().tcp_remote_io_timeout = "1000"
+slave.conf_zone(zone).expire_min_interval = 16
+sub_slave.conf_zone(zone).expire_min_interval = 16
 
 t.start()
 
@@ -91,7 +91,7 @@ test_not_expired(zone, sub_slave)
 # expire timer difference (normally caused by multi-path propagation)
 # by lowering the expire value while keeping the serial.
 # Journal must be disabled in order to allow mangled SOA serials.
-master.zones["example."].journal_content = "none"
+master.conf_zone(zone).journal_content = "none"
 master.gen_confile()
 master.reload()
 master.ctl("zone-begin example.")
index fb31fa388def2e4a86ebb29577fef51b689491cb..82d91ab18427790ad5d052fbf6281b3df594e188 100644 (file)
@@ -39,16 +39,16 @@ def log_count_expect(server, pattern, expct):
 ZONE = zone[0].name
 LOG = "for external validation"
 
-slave.async_start = True
-slave.zones[ZONE].external = { "timeout": "10",
-                               "new": dump_file(slave, "new"),
-                               "rem": dump_file(slave, "diff"),
-                               "add": dump_file(slave, "diff") }
+slave.conf_srv().async_start = True
+slave.conf_ss("external", zone).timeout = 10
+slave.conf_ss("external", zone).dump_new_zone  = dump_file(slave, "new")
+slave.conf_ss("external", zone).dump_removals  = dump_file(slave, "diff")
+slave.conf_ss("external", zone).dump_additions = dump_file(slave, "diff")
 
 def check_diff_types(types):
-    check_zf_types(slave.zones[ZONE].external["add"], types)
+    check_zf_types(slave.conf_ss("external", zone).dump_additions, types)
 
-master.notify_delay = 0
+master.conf_zone(zone).notify_delay = 0
 master.dnssec(zone[0]).enable = False
 
 t.start()
@@ -94,7 +94,7 @@ up.send()
 serial = master.zone_wait(zone, serial)
 t.sleep(2)
 log_count_expect(slave, LOG, 3)
-t.sleep(int(slave.zones[ZONE].external["timeout"]))
+t.sleep(int(slave.conf_ss("external", zone).timeout))
 resp = slave.dig(ZONE, "SOA")
 resp.check_soa_serial(serial - 2)
 
@@ -125,7 +125,7 @@ up.add("gibon", 3600, "AAAA", "1::1")
 up.send()
 serial = master.zone_wait(zone, serial)
 
-slave.zonemd_generate = "zonemd-sha512"
+slave.conf_zone(zone).zonemd_generate = "zonemd-sha512"
 slave.gen_confile()
 t.sleep(2)
 ctl.send_block(cmd="zone-thaw", zone=ZONE)
index 9e2f1870893f4ab3124c0a6c9a8c1100d5338703..34786a94ee4a2cbe39babe2d6e1a3c2278a44930 100644 (file)
@@ -14,12 +14,12 @@ t.link(zone, master, slave, ixfr=True)
 
 master.dnssec(zone).enable = True
 
-master.zonefile_sync = 0
-slave.zonefile_sync = 0
+master.conf_zone(zone).zonefile_sync = 0
+slave.conf_zone(zone).zonefile_sync = 0
 
 if master.valgrind:
-    master.semantic_check = False
-    slave.semantic_check = False
+    master.conf_zone(zone).semantic_checks = False
+    slave.conf_zone(zone).semantic_checks = False
 
 t.start()
 
index a5e1db1ea23ecc7a246a92da8500f22b89cb141b..0cbbd14db28f7b8e0e51fe194555f2382f3ad849 100644 (file)
@@ -27,7 +27,7 @@ if tld_axfr:
 
 parent_master = master if tld_axfr else flattener
 
-flattener.zones[parent[0].name].include_from = childs
+flattener.conf_zone(parent).include_from = [ z.name for z in childs ]
 
 flattener.dnssec(parent).enable = random.choice([False, True])
 
@@ -74,11 +74,11 @@ r.check(rcode="NOERROR", rdata="added-txt")
 
 invalid_conf = random.choice(["include_self", "include_parent", "also_reverse"])
 if invalid_conf == "include_self":
-    flattener.zones[parent[0].name].include_from = parent
+    flattener.conf_zone(parent).include_from = parent[0].name
 elif invalid_conf == "include_parent":
-    flattener.zones[childs[0].name].include_from = parent
+    flattener.conf_zone(childs[0]).include_from = parent[0].name
 else:
-    flattener.zones[parent[0].name].reverse_from = childs
+    flattener.conf_zone(parent).reverse_generate = [ z.name for z in childs ]
 flattener.gen_confile()
 try:
     flattener.reload()
index 59ee3fbc67fcb81628da1c207fb5e3e6aba39d54..8628e7a172e2167a097206df0cb74a0b247973fd 100644 (file)
@@ -20,15 +20,16 @@ ZONE = zone[0].name
 for z in zone:
     slave.dnssec(z).enable = True
     slave.dnssec(z).nsec3 = True
-    slave.dnssec(z).nsec3_salt_len = 0
+    slave.dnssec(z).nsec3_salt_length = 0
     slave.dnssec(z).rrsig_lifetime = 25 if SCENARIO == 1 else 20
     slave.dnssec(z).rrsig_refresh = 5
-    slave.dnssec(z).rrsig_prerefresh = 1
+    slave.dnssec(z).rrsig_pre_refresh = 1
     slave.dnssec(z).zone_max_ttl = 4
-    slave.zones[z.name].journal_content = "all"
-slave.zonefile_sync = "-1"
-slave.zonefile_load = "none"
-slave.zonemd_generate = "zonemd-sha384"
+
+slave.conf_zone(zone).journal_content = "all"
+slave.conf_zone(zone).zonefile_sync = "-1"
+slave.conf_zone(zone).zonefile_load = "none"
+slave.conf_zone(zone).zonemd_generate = "zonemd-sha384"
 
 t.start()
 
@@ -42,7 +43,7 @@ if SCENARIO == 1:
     slave.zones_wait(zone)
 
 if SCENARIO == 2:
-    slave.zonemd_generate = "zonemd-sha512"
+    slave.conf_zone(zone).zonemd_generate = "zonemd-sha512"
     slave.gen_confile()
 
 slave.ctl("reload")
index 6eaa70d9a8bc84570120c18c59cb30504a4e7cad..425397c3dca6617b849bf284a70ad7b7a54c02e3 100644 (file)
@@ -39,8 +39,8 @@ zones = t.zone("example.com.", storage=".")
 
 t.link(zones, knot)
 
-knot.zonefile_load = "difference-no-serial"
-knot.zones[zones[0].name].journal_content = "all"
+knot.conf_zone(zones).zonefile_load = "difference-no-serial"
+knot.conf_zone(zones).journal_content = "all"
 knot.dnssec(zones).enable = True
 
 t.start()
index b8a60f643a14a12886a45f737e889f21482647ea..a520724b46100fa920a269027007fd0b96570211 100644 (file)
@@ -19,12 +19,12 @@ t.link(zones, master, slave, ixfr=True)
 
 master.disable_notify = True
 
-slave.zones[zone_min.name].refresh_min = 12
-slave.zones[zone_max.name].refresh_max = 9
-slave.zones[zone_min.name].retry_min = 12
-slave.zones[zone_max.name].retry_max = 9
-slave.zones[zone_min.name].expire_min = 24
-slave.zones[zone_max.name].expire_max = 18
+slave.conf_zone(zone_min).refresh_min_interval = 12
+slave.conf_zone(zone_max).refresh_max_interval = 9
+slave.conf_zone(zone_min).retry_min_interval = 12
+slave.conf_zone(zone_max).retry_max_interval = 9
+slave.conf_zone(zone_min).expire_min_interval = 24
+slave.conf_zone(zone_max).expire_max_interval = 18
 
 t.start()
 
index b2f3b4639d05d47172a6b07dbe4f4e224fb2ebe1..0697ee8d104909182e57a3e004d99f31e6bb5e93 100644 (file)
@@ -13,7 +13,7 @@ slave = t.server("knot")
 zone = t.zone("example.com.", storage=".")
 t.link(zone, master, slave)
 
-slave.zonefile_sync = 0
+slave.conf_zone(zone).zonefile_sync = 0
 
 # Load newer zone to the slave
 slave.update_zonefile(zone, version="slave")
index 08ad7e3bf8a031be7b3c45c7ff03a4600b66c0bb..85b69ed8fdd141f2454165ac53001b50d88ea076 100644 (file)
@@ -20,8 +20,7 @@ zones = t.zone("example.com.", storage=".") + \
         t.zone("0.8.b.d.1.0.0.2.ip6.arpa.", storage=".")
 t.link(zones, knot)
 
-knot.zones[zones[2].name].reverse_from = [ zones[0], zones[1] ]
-knot.zones[zones[3].name].reverse_from = [ zones[0], zones[1] ]
+knot.conf_zone(zones[2:]).reverse_generate = [ zones[0].name, zones[1].name ]
 
 for z in zones:
     knot.dnssec(z).enable = random.choice([False, True])
index 236ae49bf77349df5285d4730e400dc3640a1cdc..fda8dde082d45bc6de09f7fe39d0bf3e2af869f1 100644 (file)
@@ -14,8 +14,8 @@ zone = t.zone("example.com.", storage=".")
 
 t.link(zone, master, slave, ixfr=True)
 
-master.semantic_check = "soft"
-slave.semantic_check = "soft"
+master.conf_zone(zone).semantic_checks = "soft"
+slave.conf_zone(zone).semantic_checks = "soft"
 
 t.start()
 
index 8d49f1414b69c6aaffa41e850a012de020158759..7dd2dceae055e0e645e61c2186c850ca3d6e154f 100644 (file)
@@ -34,12 +34,10 @@ else:
     source = knot
     t.link(zones, knot)
 
-for z in zones:
-    knot.dnssec(z).enable = True
-    knot.zones[z.name].serial_modulo = "%d/%d" % (MODULO_A, MODULO_B)
-
-    knot.zonefile_load = "difference-no-serial"
-    knot.zones[z.name].journal_content = "all"
+knot.dnssec(zones).enable = True
+knot.conf_zone(zones).serial_modulo = "%d/%d" % (MODULO_A, MODULO_B)
+knot.conf_zone(zones).zonefile_load = "difference-no-serial"
+knot.conf_zone(zones).journal_content = "all"
 
 detail_log("SCENARIO " + SCENARIO)
 t.start()
index 33ceab8330dca911352436d7c78f5d37f56f426b..df3d9cb96ccf0c30bf46634e8f0dcdd1d61876fc 100644 (file)
@@ -13,7 +13,7 @@ t.link(zone, server)
 
 server.dnssec(zone).enable = True
 
-server.zonefile_skip = [ "aaaa", "dnssec" ]
+server.conf_zone(zone).zonefile_skip = [ "aaaa", "dnssec" ]
 
 t.start()
 
@@ -39,7 +39,7 @@ zf.check_count(0, "AAAA")
 zf.check_count(0, "RRSIG")
 zf.check_count(0, "NSEC")
 
-server.zonefile_skip = [ "a", "nsec" ]
+server.conf_zone(zone).zonefile_skip = [ "a", "nsec" ]
 server.gen_confile()
 server.reload()
 t.sleep(2)
@@ -63,9 +63,9 @@ zf.check_count(1, "AAAA")
 zf.check_count(10, "RRSIG")
 zf.check_count(0, "NSEC")
 
-server.zonefile_sync = "-1"
-server.zonefile_load = "difference-no-serial"
-server.zones[zone[0].name].journal_content = "all"
+server.conf_zone(zone).zonefile_sync = "-1"
+server.conf_zone(zone).zonefile_load = "difference-no-serial"
+server.conf_zone(zone).journal_content = "all"
 server.gen_confile()
 server.reload()
 t.sleep(1)
index 80e83852e5de14344b84eae1c0c0118fc4381be1..995390b1ff12d160a94a373b53929f2bb79cf4e5 100644 (file)
@@ -106,7 +106,7 @@ master = t.server("knot")
 slave = t.server("knot")
 
 for server in [master, slave]:
-    server.tcp_remote_io_timeout = "1000"
+    server.conf_srv().tcp_remote_io_timeout = "1000"
 
 t.link([zone], master, slave)
 master.disable_notify = True
index 3f64d246642ca0e50e106a82eb0573dc2a46790f..eff623ffa0a6fd3f7321dc266694221b286ceaf9 100644 (file)
@@ -18,11 +18,11 @@ zones = t.zone_rnd(2, records=10)
 
 t.link(zones, master, slave)
 
-master.update_delay = 6
-slave.update_delay = 6
+master.conf_zone(zones).update_delay = 6
+slave.conf_zone(zones).update_delay = 6
 
-master.serial_policy = "unixtime"
-slave.serial_policy = "unixtime"
+master.conf_zone(zones).serial_policy = "unixtime"
+slave.conf_zone(zones).serial_policy = "unixtime"
 
 for z in zones:
     master.zones[z.name].zfile.update_soa(serial=int(time.time()))
@@ -31,7 +31,7 @@ for z in zones:
 def increment_serials(server, zones, serials):
     res = serials
     for z in zones:
-        res[z.name] += server.update_delay
+        res[z.name] += server.conf_zone(zones[0]).update_delay
     return res
 
 def zones_wait_eq(server, zones, serials):
index d32ae2e3badca34e8878cfb5759dcaf3e2ce2d4a..84aa0de5844c083db01580d23444012e54aef575 100644 (file)
@@ -24,8 +24,8 @@ t.sleep(2)
 
 knot.stop()
 
-knot.zones[zone[0].name].journal_content = "all"
-knot.zonefile_load = "none"
+knot.conf_zone(zone).journal_content = "all"
+knot.conf_zone(zone).zonefile_load = "none"
 knot.gen_confile()
 
 knot.zones[zone[0].name].zfile.remove() # just to make sure
index 81fb2033e1a9e652c97afef20acfe664f5b38149..8b0cc8017aae30cc547f00e88d082e6ab31e04b8 100644 (file)
@@ -68,25 +68,25 @@ t.link(zone, master, slave, ixfr=random.choice([True, False]))
 if DNSSEC:
     for z in zone:
         master.dnssec(z).enable = True
-        slave.dnssec(z).validate = True
+        slave.conf_zone(z).dnssec_validation = True
 
-master.zonefile_sync = 0
-master.zonemd_generate = "none"
-slave.zonemd_verify = False
+master.conf_zone(zone).zonefile_sync = 0
+master.conf_zone(zone).zonemd_generate = "none"
+slave.conf_zone(zone).zonemd_verify = False
 
 t.start()
 
 serial = slave.zones_wait(zone)
 check_zonemd(master, zone, Algo.NONE)
 
-master.zonemd_generate = "zonemd-sha384"
+master.conf_zone(zone).zonemd_generate = "zonemd-sha384"
 master.gen_confile()
 master.reload()
-slave.zonemd_verify = True
+slave.conf_zone(zone).zonemd_verify = True
 check_serial_incr(slave, zone, serial, 1, "alg change")
 check_zonemd(master, zone, Algo.SHA384)
 
-master.zonemd_generate = "zonemd-sha512"
+master.conf_zone(zone).zonemd_generate = "zonemd-sha512"
 master.gen_confile()
 master.reload()
 check_serial_incr(slave, zone, serial, 1, "alg change")
@@ -118,28 +118,28 @@ master.ctl("zone-reload")
 check_serial_incr(slave, zone, serial, 2, "ZF reload")
 check_zonemd(master, zone, Algo.SHA512)
 
-slave.zonemd_verify = False
+slave.conf_zone(zone).zonemd_verify = False
 slave.gen_confile()
 slave.reload()
 
-master.zonemd_generate = "none"
+master.conf_zone(zone).zonemd_generate = "none"
 master.gen_confile()
 master.reload()
 check_zonemd(master, zone, Algo.SHA512)
 
-master.zonemd_generate = "remove"
+master.conf_zone(zone).zonemd_generate = "remove"
 master.gen_confile()
 master.reload()
 check_serial_incr(slave, zone, serial, 1, "ZONEMD remove")
 check_zonemd(master, zone, Algo.NONE)
 
 # removing when there's nothing left to remove shouldn't do anything
-master.zonemd_generate = "none"
+master.conf_zone(zone).zonemd_generate = "none"
 master.gen_confile()
 master.reload()
 check_zonemd(master, zone, Algo.NONE)
 
-master.zonemd_generate = "remove"
+master.conf_zone(zone).zonemd_generate = "remove"
 master.gen_confile()
 master.reload()
 check_zonemd(master, zone, Algo.NONE)
index 5acab70c51507e1e31c88c5cea190159c1d05eb1..1251fb9c5877a35cb3fa357fbeb3402c39434710 100644 (file)
@@ -16,9 +16,9 @@ ZONE = "example.com."
 zone = t.zone(ZONE)
 t.link(zone, master, slave)
 
-master.zonefile_sync = -1
-master.zonemd_generate = "zonemd-sha384"
-slave.zonemd_verify = True
+master.conf_zone(zone).zonefile_sync = -1
+master.conf_zone(zone).zonemd_generate = "zonemd-sha384"
+slave.conf_zone(zone).zonemd_verify = True
 
 VALIDATE_ZONEFILE = random.choice([True, False])
 backup_cnt = 0
@@ -30,9 +30,9 @@ for load in ["whole", "difference", "difference-no-serial"]:
         check_log("ZONE FILE LOAD: " + load + ", DNSSEC: " + str(dnssec) + ", valide ZF: " + str(VALIDATE_ZONEFILE))
 
         master.ctl("-f zone-purge +journal +timers +kaspdb " + ZONE)
-        master.zonefile_load = load
-        master.zones[ZONE].journal_content = "all" if load == "difference-no-serial" else "changes"
-        master.zones[ZONE].dnssec.enable = dnssec
+        master.conf_zone(zone).zonefile_load = load
+        master.conf_zone(zone).journal_content = "all" if load == "difference-no-serial" else "changes"
+        master.dnssec(zone).enable = dnssec
         master.gen_confile()
         master.stop()
         master.start()
index 86836893c1d803c8c586d7ef8fb13d13cb8f48be..e6c2989fdc57c59e73ac28780284af09d556b3d2 100644 (file)
@@ -31,6 +31,28 @@ class KnotConf(object):
         self.conf += ', '.join(str(value) for value in values)
         self.conf += "]\n"
 
+    def item_list_str(self, name, values):
+        self.conf += "        %s: [ \"" % name
+        self.conf += '\", \"'.join(str(value) for value in values)
+        self.conf += "\" ]\n"
+
+    def item_type(self, name, value):
+        if value is None:
+            return
+        elif isinstance(value, bool):
+            self.item(name, "on" if value else "off")
+        elif isinstance(value, str):
+            self.item_str(name, value)
+        elif isinstance(value, list):
+            if len(value) < 1:
+                return
+            elif isinstance(value[0], str):
+                self.item_list_str(name, value)
+            else:
+                self.item_list(name, value)
+        else:
+            self.item(name, value)
+
     def id_item(self, name, value):
         if not self.first_item:
             self.conf += "\n"
index 22fa8a1545d6d4beef4889048e7c4a398f455f96..deda3c62114d0e067302fb4aabe4bf06cd72b80a 100644 (file)
@@ -37,48 +37,36 @@ def zone_arg_check(zone):
         return zone[0]
     return zone
 
-class ZoneDnssec(object):
-    '''Zone DNSSEC signing configuration'''
-
-    def __init__(self):
-        self.enable = None
-        self.validate = None
-        self.disable = None # create the policy in config, but set dnssec-signing: off
-        self.manual = None
-        self.keystores = []
-        self.single_type_signing = None
-        self.alg = None
-        self.ksk_size = None
-        self.zsk_size = None
-        self.dnskey_ttl = None
-        self.zone_max_ttl = None
-        self.keytag_modulo = "0/1"
-        self.ksk_lifetime = None
-        self.zsk_lifetime = None
-        self.delete_delay = None
-        self.propagation_delay = None
-        self.rrsig_lifetime = None
-        self.rrsig_refresh = None
-        self.rrsig_prerefresh = None
-        self.repro_sign = None
-        self.nsec3 = None
-        self.nsec3_iters = None
-        self.nsec3_opt_out = None
-        self.nsec3_salt_lifetime = None
-        self.nsec3_salt_len = None
-        self.ksk_sbm_check = []
-        self.ksk_sbm_check_interval = None
-        self.ksk_sbm_timeout = None
-        self.ksk_sbm_delay = None
-        self.ds_push = None
-        self.dnskey_sync = None
-        self.ksk_shared = None
-        self.shared_policy_with = None
-        self.cds_publish = None
-        self.cds_digesttype = None
-        self.dnskey_mgmt = None
-        self.offline_ksk = None
-        self.signing_threads = None
+class ConfMultidict(object):
+    def __init__(self, zonenames, all_zones_conf, remotes):
+        # NOTE this works like `self.zonenames = zonenames` EXCEPT that would interfere with the redefinition of __setattr__ therefore setting thru self.__dict__ which is inertial.
+        self.__dict__['zonenames']      = zonenames       # List of names (strings!) of zones that are to be manipulated by this multidict. They SHOULD be a subset of zones configured at the server.
+        self.__dict__['all_zones_conf'] = all_zones_conf  # Whole subsection configuration of the server, which is a dict() mapping zone names to dicts of configuration options belonging to this one subsection. This covers ALL server's configured zones.
+        self.__dict__['remotes']        = remotes         # List of server remotes. These are augmented if any remote-relevant option value is configured.
+        # NOTE for configuration options not tied to any zones (e.g. 'server' subsection), the "server" string is a placeholder for zone name, so that the depth of nested dict()s is preserved.
+
+    def __getattr__(self, attr):
+        if len(self.__dict__['zonenames']) != 1:
+            raise Exception("can't read configuration of multiple zones")
+        zonename = self.__dict__['zonenames'][0]
+        try:
+            return self.__dict__['all_zones_conf'][zonename][attr]
+        except KeyError:
+            return None
+
+    def __setattr__(self, key, value):
+        if isinstance(value, list) and len(value) > 0:
+            if isinstance(value[0], Server):
+                if self.__dict__['remotes'] is not None:
+                    self.__dict__['remotes'].update(value)
+                value = [ v.name for v in value ]
+        else:
+            if isinstance(value, Server):
+                if self.__dict__['remotes'] is not None:
+                    self.__dict__['remotes'].add(value)
+                value = value.name
+        for zonename in self.__dict__['zonenames']:
+            self.__dict__['all_zones_conf'][zonename][key] = value
 
 class ZoneCatalogRole(enum.IntEnum):
     """Zone catalog roles."""
@@ -92,30 +80,17 @@ class ZoneCatalogRole(enum.IntEnum):
 class Zone(object):
     '''DNS zone description'''
 
-    def __init__(self, zone_file, ddns=False, ixfr=False, journal_content="changes"):
+    def __init__(self, zone_file, ddns=False, ixfr=False):
         self.zfile = zone_file
         self.masters = set()
         self.slaves = set()
-        self.redis_in = None
-        self.redis_out = None
-        self.serial_modulo = None
         self.ddns = ddns
         self.ixfr = ixfr
-        self.journal_content = journal_content # journal contents
         self.modules = []
-        self.reverse_from = None
-        self.include_from = None
-        self.external = None
-        self.dnssec = ZoneDnssec()
+        self.dnssec = None # TODO temporary, refactor to remove
         self.catalog_role = ZoneCatalogRole.NONE
         self.catalog_gen_name = None # Generated catalog name for this member
         self.catalog_group = None
-        self.refresh_max = None
-        self.refresh_min = None
-        self.retry_max = None
-        self.retry_min = None
-        self.expire_max = None
-        self.expire_min = None
 
     @property
     def name(self):
@@ -162,6 +137,14 @@ class Server(object):
 
         self.data_dir = None
 
+        self.conf = { "server": { "server": self.conf_defaults_server() }, # see comments at ConfMultidict
+                      "zone": dict(),
+                      "policy": dict(),
+                      "submission": dict(),
+                      "dnskey-sync": dict(),
+                      "external": dict() }
+        self.remotes = set()
+
         self.nsid = None
         self.ident = None
         self.version = None
@@ -177,12 +160,9 @@ class Server(object):
         self.cert_hostname = list()
         self.ca_file = str()
         self.cert_key_file = None # quadruple (key_file, cert_file, hostname, pin)
-        self.udp_workers = None
-        self.tcp_workers = None
-        self.bg_workers = None
         self.fixed_port = False
         self.ctlport = None
-        self.external = False
+        self.external = False # Means an externally running server
         self.ctlkey = None
         self.ctlkeyfile = None
         self.tsig = None
@@ -192,39 +172,11 @@ class Server(object):
 
         self.zones = dict()
 
-        self.tcp_reuseport = None
-        self.tcp_remote_io_timeout = None
-        self.tcp_io_timeout = None
-        self.tcp_idle_timeout = None
-        self.quic_idle_close_timeout = None
-        self.udp_max_payload = None
-        self.udp_max_payload_ipv4 = None
-        self.udp_max_payload_ipv6 = None
         self.disable_notify = None
-        self.ddns_master = None
-        self.semantic_check = True
-        self.zonefile_sync = "1d"
-        self.notify_delay = None
-        self.update_delay = None
-        self.zonefile_load = None
-        self.zonefile_skip = None
-        self.zonemd_verify = None
-        self.zonemd_generate = None
-        self.ixfr_benevolent = None
-        self.ixfr_by_one = None
-        self.ixfr_from_axfr = None
         self.journal_db_size = 20 * 1024 * 1024
-        self.journal_max_usage = 5 * 1024 * 1024
-        self.journal_max_depth = 100
         self.timer_db_size = 1 * 1024 * 1024
         self.kasp_db_size = 10 * 1024 * 1024
         self.catalog_db_size = 10 * 1024 * 1024
-        self.zone_size_limit = None
-        self.serial_policy = None
-        self.auto_acl = None
-        self.async_start = None
-        self.provide_ixfr = None
-        self.master_pin_tol = None
         self.quic_log = None
 
         self.inquirer = None
@@ -245,6 +197,31 @@ class Server(object):
 
         self.binding_errors = 0
 
+    def conf_base(self, conf_section, zones):
+        if not isinstance(zones, list):
+            zones = [ zones ]
+        zonenames = [ z if isinstance(z, str) else z.name for z in zones ]
+
+        for zn in zonenames:
+            if zn not in conf_section:
+                conf_section[zn] = dict()
+        return ConfMultidict(zonenames, conf_section, self.remotes)
+
+    def conf_ss(self, subsection, zones):
+        return self.conf_base(self.conf[subsection], zones)
+
+    def conf_zone(self, zones):
+        return self.conf_ss("zone", zones)
+
+    def conf_srv(self):
+        return self.conf_ss("server", ["server"])
+
+    def conf_defaults(self, zone_name):
+        return { "zone": dict() }
+
+    def conf_defaults_server(self):
+        return dict()
+
     def _check_socket(self, proto, port):
         if self.addr.startswith("/"):
             ux_socket = True
@@ -285,27 +262,33 @@ class Server(object):
             xdp = (random.random() < 0.8)
         return self.xdp_port if xdp else self.port
 
-    def set_master(self, zone, slave=None, ddns=False, ixfr=False, journal_content="changes"):
+    def set_new_zone(self, name, z):
+        self.zones[name] = z
+        cd = self.conf_defaults(name)
+        for subsection in cd:
+            self.conf[subsection].update(cd[subsection])
+
+    def set_master(self, zone, slave=None, ddns=False, ixfr=False):
         '''Set the server as a master for the zone'''
 
         if zone.name not in self.zones:
             master_file = zone.clone(self.dir + "/master")
-            z = Zone(master_file, ddns, ixfr, journal_content)
-            self.zones[zone.name] = z
+            z = Zone(master_file, ddns, ixfr)
+            self.set_new_zone(zone.name, z)
         else:
             z = self.zones[zone.name]
 
         if slave:
             z.slaves.add(slave)
 
-    def set_slave(self, zone, master, ddns=False, ixfr=False, journal_content="changes"):
+    def set_slave(self, zone, master, ddns=False, ixfr=False):
         '''Set the server as a slave for the zone'''
 
         slave_file = zone.clone(self.dir + "/slave", exists=False)
 
         if zone.name not in self.zones:
-            z = Zone(slave_file, ddns, ixfr, journal_content)
-            self.zones[zone.name] = z
+            z = Zone(slave_file, ddns, ixfr)
+            self.set_new_zone(zone.name, z)
         else:
             z = self.zones[zone.name]
             z.disable_master(slave_file)
@@ -1007,9 +990,7 @@ class Server(object):
         distutils.dir_util.copy_tree(zone.key_dir, self.keydir, update=True)
 
     def dnssec(self, zone):
-        zone = zone_arg_check(zone)
-
-        return self.zones[zone.name].dnssec
+        return self.conf_ss("policy", zone)
 
     def enable_nsec3(self, zone, **args):
         zone = zone_arg_check(zone)
@@ -1228,6 +1209,7 @@ class Bind(Server):
 
         for zone in sorted(self.zones):
             z = self.zones[zone]
+            z.dnssec = self.dnssec(z)
             if not z.dnssec.enable:
                 continue
 
@@ -1257,6 +1239,7 @@ class Bind(Server):
 
         for zone in sorted(self.zones):
             z = self.zones[zone]
+            z.dnssec = self.dnssec(z)
             s.begin("zone", z.name)
             s.item_str("file", z.zfile.path)
             s.item("check-names", "warn")
@@ -1331,10 +1314,15 @@ class Bind(Server):
                 s.item("inline-signing", "yes")
                 s.item("dnssec-policy", z.name)
                 s.item_str("key-directory", self.keydir)
-                if z.dnssec.ksk_sbm_check:
+                if zone in self.conf["submission"] and "parent" in self.conf["submission"][zone]:
                     parents = ""
-                    for parent in z.dnssec.ksk_sbm_check:
-                        parents += "%s port %i; " % (parent.addr, parent.port)
+                    for parent in self.conf["submission"][zone]["parent"]:
+                        parmt = None
+                        for rmt in self.remotes:
+                            if rmt.name == parent:
+                                parmt = rmt
+                        if parmt:
+                            parents += "%s port %i; " % (parmt.addr, parmt.port)
                     s.item("parental-agents", "{ %s}" % parents)
             s.end()
 
@@ -1350,6 +1338,7 @@ class Bind(Server):
     def start(self, clean=False, fatal=True):
         for zname in self.zones:
             z = self.zones[zname]
+            z.dnssec = self.dnssec(z)
             if z.dnssec.enable != True:
                 continue
 
@@ -1376,7 +1365,7 @@ class Bind(Server):
                             outf.write(line)
                 #if z.dnssec.nsec3:
                     #n3flag =  1 if z.dnssec.nsec3_opt_out else 0
-                    #n3iters = z.dnssec.nsec3_iters or 0
+                    #n3iters = z.dnssec.nsec3_iterations or 0
                     #outf.write("%s NSEC3PARAM 1 %d %d -\n" % (z.name, n3flag, n3iters)) # this does not work!
 
         super().start(clean, fatal)
@@ -1385,7 +1374,7 @@ class Bind(Server):
             z = self.zones[zname]
             if z.dnssec.nsec3:
                 n3flag =  1 if z.dnssec.nsec3_opt_out else 0
-                n3iters = z.dnssec.nsec3_iters or 0
+                n3iters = z.dnssec.nsec3_iterations or 0
                 self.ctl("signing -nsec3param 1 %d %d - %s" % (n3flag, n3iters, z.name))
 
 class Knot(Server):
@@ -1410,8 +1399,19 @@ class Knot(Server):
     def wait_function(self, wait=False): # needed for compatibility with Bind class
         pass
 
+    def conf_defaults(self, zone_name):
+        cd = { "zone": dict(), "policy": dict() }
+        cd["zone"][zone_name] = { "zonefile_sync": "1d", "semantic_checks": True, "notify_delay": random.randint(0, 1),
+                                  "journal_max_usage": 5 * 1024 * 1024, "adjust_threads": random.randint(1, 4) }
+        cd["policy"][zone_name] = { "keystore": [], "keytag_modulo": '0/1', "signing_threads": random.randint(1, 4) }
+        return cd
+
+    def conf_defaults_server(self):
+        return { "remote_pool_limit": random.randint(0, 6), "remote_retry_delay": random.choice([0, 1, 5]) }
+
     def flush(self, zone=None, wait=False):
-        params = "-f " if str(self.zonefile_sync)[0] == '-' else ""
+        one_zone = list(self.zones)[0] if zone is None and len(self.zones) > 0 else zone
+        params = "-f " if one_zone is not None and str(self.conf_zone(one_zone).zonefile_sync)[0] == '-' else ""
         if zone:
             self.ctl("%szone-flush %s" % (params, zone.name), wait=wait)
         else:
@@ -1454,10 +1454,6 @@ class Knot(Server):
             conf.item_str("secret", key.key)
             keys.add(key.name)
 
-    def _bool(self, conf, name, value):
-        if value != None:
-            conf.item_str(name, "on" if value else "off")
-
     def _str(self, conf, name, value):
         if value != None:
             conf.item_str(name, value)
@@ -1507,9 +1503,10 @@ class Knot(Server):
                 acl += ", acl_%s" % slave.name
             if slaves:
                 conf.item("notify", "[%s]" % slaves)
-        for remote in zone.dnssec.dnskey_sync if zone.dnssec.dnskey_sync else []:
-            acl += ", acl_%s_ddns" % remote.name
-        if not self.auto_acl:
+        if zone.name in self.conf["dnskey-sync"]:
+            for rmt in self.conf["dnskey-sync"][zone.name]["remote"]:
+                acl += ", acl_%s" % rmt
+        if not self.conf_srv().automatic_acl:
             conf.item("acl", "[%s]" % acl)
 
     def get_config(self):
@@ -1524,35 +1521,21 @@ class Knot(Server):
         self._on_str_hex(s, "nsid", self.nsid)
         s.item_str("rundir", self.dir)
         s.item_str("pidfile", os.path.join(self.dir, self.pidfile))
+
+        for ci, val in self.conf["server"]["server"].items():
+            s.item_type(ci.replace("_", "-"), val)
+
         if self.addr.startswith("/"):
             s.item_str("listen", "%s" % self.addr)
         else:
             s.item_str("listen", "%s@%s" % (self.addr, self.port))
+        for addr in self.addr_extra:
+            s.item_str("listen", "%s@%s" % (addr, self.port))
         if self.quic_port:
             s.item_str("listen-quic", "%s@%s" % (self.addr, self.quic_port))
         if self.tls_port:
             s.item_str("listen-tls", "%s@%s" % (self.addr, self.tls_port))
-        if self.udp_workers:
-            s.item_str("udp-workers", self.udp_workers)
-        if self.tcp_workers:
-            s.item_str("tcp-workers", self.tcp_workers)
-        if self.bg_workers:
-            s.item_str("background-workers", self.bg_workers)
 
-        for addr in self.addr_extra:
-            s.item_str("listen", "%s@%s" % (addr, self.port))
-        self._bool(s, "tcp-reuseport", self.tcp_reuseport)
-        self._str(s, "tcp-remote-io-timeout", self.tcp_remote_io_timeout)
-        self._str(s, "tcp-io-timeout", self.tcp_io_timeout)
-        self._str(s, "tcp-idle-timeout", self.tcp_idle_timeout)
-        self._str(s, "quic-idle-close-timeout", self.quic_idle_close_timeout)
-        self._str(s, "udp-max-payload", self.udp_max_payload)
-        self._str(s, "udp-max-payload-ipv4", self.udp_max_payload_ipv4)
-        self._str(s, "udp-max-payload-ipv6", self.udp_max_payload_ipv6)
-        self._str(s, "remote-pool-limit", str(random.randint(0,6)))
-        self._str(s, "remote-retry-delay", str(random.choice([0, 1, 5])))
-        self._bool(s, "automatic-acl", self.auto_acl)
-        self._bool(s, "async-start", self.async_start)
         if self.cert_key_file:
             s.item_str("key-file", self.cert_key_file[0])
             s.item_str("cert-file", self.cert_key_file[1])
@@ -1574,118 +1557,45 @@ class Knot(Server):
         s.item_str("timeout", "15")
         s.end()
 
+        all_remotes = set()
+        for zone in self.zones:
+            z = self.zones[zone]
+            all_remotes.update(z.masters)
+            all_remotes.update(z.slaves)
+        all_remotes.update(self.remotes)
+
         if self.tsig:
             keys = set() # Duplicy check.
             s.begin("key")
             self._key(s, keys, self.tsig_test, "test")
             self._key(s, keys, self.tsig, "local")
-
-            for zone in sorted(self.zones):
-                z = self.zones[zone]
-                for master in z.masters:
-                    self._key(s, keys, master.tsig, master.name)
-                for slave in z.slaves:
-                    self._key(s, keys, slave.tsig, slave.name)
-                for remote in z.dnssec.dnskey_sync if z.dnssec.dnskey_sync else []:
-                    self._key(s, keys, remote.tsig, remote.name)
+            for rmt in all_remotes:
+                self._key(s, keys, rmt.tsig, rmt.name)
             s.end()
 
-        have_remote = False
-        servers = set() # Duplicity check.
-        for zone in sorted(self.zones):
-            z = self.zones[zone]
-            for master in z.masters:
-                if master.name not in servers:
-                    if not have_remote:
-                        s.begin("remote")
-                        have_remote = True
-                    s.id_item("id", master.name)
-                    if master.quic_port or master.tls_port:
-                        s.item_str("address", "%s@%s" % (master.addr, master.tls_port or master.quic_port))
-                        s.item_str("tls" if master.tls_port else "quic", "on")
-                        if master.cert_key:
-                            s.item_str("cert-key", master.cert_key)
-                        elif master.cert_hostname:
-                            s.item_list("cert-hostname", master.cert_hostname)
-                        elif master.cert_key_file:
-                            s.item_str("cert-key", master.cert_key_file[3])
-                    else:
-                        if master.addr.startswith("/"):
-                            s.item_str("address", "%s" % master.addr)
-                        else:
-                            s.item_str("address", "%s@%s" % (master.addr, master.query_port()))
-                    if self.tsig:
-                        s.item_str("key", self.tsig.name)
-                    if self.via:
-                        s.item_str("via", self.via)
-                    if master.no_xfr_edns:
-                        s.item_str("no-edns", "on")
-                    servers.add(master.name)
-            for slave in z.slaves:
-                if slave.name not in servers:
-                    if not have_remote:
-                        s.begin("remote")
-                        have_remote = True
-                    s.id_item("id", slave.name)
-                    if slave.quic_port or slave.tls_port:
-                        s.item_str("address", "%s@%s" % (slave.addr, slave.tls_port or slave.quic_port))
-                        s.item_str("tls" if slave.tls_port else "quic", "on")
-                        if slave.cert_key:
-                            s.item_str("cert-key", slave.cert_key)
-                        elif slave.cert_hostname:
-                            s.item_list("cert-hostname", slave.cert_hostname)
-                        elif slave.cert_key_file:
-                            s.item_str("cert-key", slave.cert_key_file[3])
-                    else:
-                        if slave.addr.startswith("/"):
-                            s.item_str("address", "%s" % slave.addr)
-                        else:
-                            s.item_str("address", "%s@%s" % (slave.addr, slave.query_port()))
-                    if self.via:
-                        s.item_str("via", self.via)
-                    if self.tsig:
-                        s.item_str("key", self.tsig.name)
-                    servers.add(slave.name)
-            for parent in z.dnssec.ksk_sbm_check + [ z.dnssec.ds_push ] if z.dnssec.ds_push else z.dnssec.ksk_sbm_check:
-                if isinstance(parent, Server) and parent.name not in servers:
-                    if not have_remote:
-                        s.begin("remote")
-                        have_remote = True
-                    s.id_item("id", parent.name)
-                    if parent.addr.startswith("/"):
-                        s.item_str("address", "%s" % parent.addr)
-                    else:
-                        s.item_str("address", "%s@%s" % (parent.addr, parent.port))
-                    if self.via:
-                        s.item_str("via", self.via)
-                    servers.add(parent.name)
-            for remote in z.dnssec.dnskey_sync if z.dnssec.dnskey_sync else []:
-                if remote.name not in servers:
-                    if not have_remote:
-                        s.begin("remote")
-                        have_remote = True
-                    s.id_item("id", remote.name)
-                    if remote.quic_port or remote.tls_port:
-                        s.item_str("address", "%s@%s" % (remote.addr, remote.tls_port or remote.quic_port))
-                        s.item_str("tls" if remote.tls_port else "quic", "on")
-                        if remote.cert_key:
-                            s.item_str("cert-key", remote.cert_key)
-                        elif remote.cert_hostname:
-                            s.item_list("cert-hostname", remote.cert_hostname)
-                        elif remote.cert_key_file:
-                            s.item_str("cert-key", remote.cert_key_file[3])
-                    else:
-                        if remote.addr.startswith("/"):
-                            s.item_str("address", "%s" % remote.addr)
-                        else:
-                            s.item_str("address", "%s@%s" % (remote.addr, remote.port))
-                    if remote.via:
-                        s.item_str("via", self.via)
-                    if remote.tsig:
-                        s.item_str("key", self.tsig.name)
-                    servers.add(remote.name)
-
-        if have_remote:
+        for rmt in all_remotes:
+            s.begin("remote")
+            s.id_item("id", rmt.name)
+            if rmt.quic_port or rmt.tls_port:
+                s.item_str("address", "%s@%s" % (rmt.addr, rmt.tls_port or rmt.quic_port))
+                s.item_str("tls" if rmt.tls_port else "quic", "on")
+                if rmt.cert_key:
+                    s.item_str("cert-key", rmt.cert_key)
+                elif rmt.cert_hostname:
+                    s.item_list("cert-hostname", rmt.cert_hostname)
+                elif rmt.cert_key_file:
+                    s.item_str("cert-key", rmt.cert_key_file[3])
+            else:
+                if rmt.addr.startswith("/"):
+                    s.item_str("address", "%s" % rmt.addr)
+                else:
+                    s.item_str("address", "%s@%s" % (rmt.addr, rmt.query_port()))
+            if self.tsig:
+                s.item_str("key", self.tsig.name)
+            if self.via:
+                s.item_str("via", self.via)
+            if rmt.no_xfr_edns:
+                s.item_str("no-edns", "on")
             s.end()
 
         s.begin("acl")
@@ -1695,49 +1605,34 @@ class Knot(Server):
             s.item_str("key", self.tsig_test.name)
         s.item("action", "[transfer, notify, update]")
 
-        servers = set() # Duplicity check.
-        for zone in sorted(self.zones):
-            z = self.zones[zone]
-            for master in z.masters:
-                if master.name not in servers:
-                    s.id_item("id", "acl_%s" % master.name)
-                    if master.addr.startswith("/"):
-                        s.item_str("address", self.addr)
-                    else:
-                        s.item_str("address", master.addr)
-                    if master.tsig:
-                        s.item_str("key", master.tsig.name)
-                    if master.cert_key:
-                        s.item_str("cert-key", master.cert_key)
-                    if master.cert_hostname:
-                        s.item_list("cert-hostname", master.cert_hostname)
-                    s.item("action", "notify")
-                    servers.add(master.name)
-            for slave in z.slaves:
-                if slave.name in servers:
-                    continue
-                s.id_item("id", "acl_%s" % slave.name)
-                if slave.addr.startswith("/"):
-                    s.item_str("address", self.addr)
-                else:
-                    s.item_str("address", slave.addr)
-                if slave.tsig:
-                    s.item_str("key", slave.tsig.name)
-                if slave.cert_key:
-                    s.item_str("cert-key", slave.cert_key)
-                if slave.cert_hostname:
-                    s.item_list("cert-hostname", slave.cert_hostname)
-                s.item("action", "[transfer" + (", update" if z.ddns else "") + "]")
-                servers.add(slave.name)
-            for remote in z.dnssec.dnskey_sync if z.dnssec.dnskey_sync else []:
-                dupl_name = remote.name + "_ddns"
-                if dupl_name in servers:
-                    continue
-                s.id_item("id", "acl_%s" % dupl_name)
-                if remote.tsig:
-                    s.item_str("key", remote.tsig.name)
-                s.item("action", "update")
-                servers.add(dupl_name)
+        for rmt in all_remotes:
+            aclaction = set()
+            for zone in self.zones:
+                z = self.zones[zone]
+                if rmt in z.masters:
+                    aclaction.add("notify")
+                if rmt in z.slaves:
+                    aclaction.add("transfer")
+                    if z.ddns:
+                        aclaction.add("update")
+                if zone in self.conf["dnskey-sync"] and rmt.name in self.conf["dnskey-sync"][zone]["remote"]:
+                    aclaction.add("update")
+
+            if len(aclaction) < 1:
+                continue
+
+            s.id_item("id", "acl_%s" % rmt.name)
+            if rmt.addr.startswith("/"):
+                s.item_str("address", self.addr)
+            else:
+                s.item_str("address", rmt.addr)
+            if rmt.tsig:
+                s.item_str("key", rmt.tsig.name)
+            if rmt.cert_key:
+                s.item_str("cert-key", rmt.cert_key)
+            if rmt.cert_hostname:
+                s.item_list("cert-hostname", rmt.cert_hostname)
+            s.item_list("action", list(aclaction))
         s.end()
 
         if len(self.modules) > 0:
@@ -1750,78 +1645,24 @@ class Knot(Server):
                 for module in z.modules:
                     module.get_conf(s)
 
-        have_sbm = False
-        for zone in sorted(self.zones):
-            z = self.zones[zone]
-            if not z.dnssec.enable:
-                continue
-            if len(z.dnssec.ksk_sbm_check) < 1 and z.dnssec.ksk_sbm_timeout is None:
-                continue
-            if not have_sbm:
-                s.begin("submission")
-                have_sbm = True
-            s.id_item("id", z.name)
-            parents = ""
-            for parent in z.dnssec.ksk_sbm_check:
-                if parents:
-                    parents += ", "
-                parents += parent.name
-            if parents != "":
-                s.item("parent", "[%s]" % parents)
-            self._str(s, "check-interval", z.dnssec.ksk_sbm_check_interval)
-            if z.dnssec.ksk_sbm_timeout is not None:
-                self._str(s, "timeout", z.dnssec.ksk_sbm_timeout)
-            if z.dnssec.ksk_sbm_delay is not None:
-                self._str(s, "parent-delay", z.dnssec.ksk_sbm_delay)
-        if have_sbm:
-            s.end()
-
-        have_dnskeysync = False
-        for zone in sorted(self.zones):
-            z = self.zones[zone]
-            if not z.dnssec.enable:
-                continue
-            if z.dnssec.dnskey_sync is None:
-                continue
-            if not have_dnskeysync:
-                s.begin("dnskey-sync")
-                have_dnskeysync = True
-            s.id_item("id", z.name)
-            remotes = ""
-            for remote in z.dnssec.dnskey_sync:
-                if remotes:
-                    remotes += ", "
-                remotes += remote.name
-            if remotes != "":
-                s.item("remote", "[%s]" % remotes)
-        if have_dnskeysync:
-            s.end()
-
-        have_external = False
-        for zone in sorted(self.zones):
-            z = self.zones[zone]
-            if not z.external:
-                continue
-            if not have_external:
-                s.begin("external")
-                have_external = True
-            s.id_item("id", z.name)
-            self._str(s, "timeout", z.external["timeout"])
-            self._str(s, "dump-new-zone", z.external["new"])
-            self._str(s, "dump-removals", z.external["rem"])
-            self._str(s, "dump-additions", z.external["add"])
-        if have_external:
-            s.end()
+        for subsection in [ "submission", "dnskey-sync", "external" ]:
+            for zone in self.conf[subsection]:
+                s.begin(subsection)
+                s.id_item("id", zone)
+                for ci, val in self.conf[subsection][z.name].items():
+                    s.item_type(ci.replace("_", "-"), val)
+                s.end()
 
         have_keystore = False
         for zone in sorted(self.zones):
             z = self.zones[zone]
-            if not z.dnssec.keystores:
+            z.dnssec = self.dnssec(z)
+            if not z.dnssec.keystore:
                 continue
             if not have_keystore:
                 s.begin("keystore")
                 have_keystore = True
-            for ks in z.dnssec.keystores:
+            for ks in z.dnssec.keystore:
                 s.id_item("id", ks)
                 s.item("config", ks)
                 if ks.endswith("ksk"):
@@ -1832,53 +1673,17 @@ class Knot(Server):
         have_policy = False
         for zone in sorted(self.zones):
             z = self.zones[zone]
-            if not z.dnssec.enable and not z.dnssec.validate:
-                continue
-
-            if (z.dnssec.shared_policy_with or z.name) != z.name:
-                continue
-
-            if not have_policy:
-                s.begin("policy")
-                have_policy = True
+            z.dnssec = self.dnssec(z)
+            s.begin("policy")
             s.id_item("id", z.name)
-            self._bool(s, "manual", z.dnssec.manual)
-            self._bool(s, "single-type-signing", z.dnssec.single_type_signing)
-            if z.dnssec.keystores:
-                s.item("keystore", "[ %s ]" % ", ".join(z.dnssec.keystores))
-            self._str(s, "algorithm", z.dnssec.alg)
-            self._str(s, "ksk-size", z.dnssec.ksk_size)
-            self._str(s, "zsk-size", z.dnssec.zsk_size)
-            self._str(s, "dnskey-ttl", z.dnssec.dnskey_ttl)
-            self._str(s, "zone-max-ttl", z.dnssec.zone_max_ttl)
-            self._str(s, "keytag-modulo", z.dnssec.keytag_modulo)
-            self._str(s, "ksk-lifetime", z.dnssec.ksk_lifetime)
-            self._str(s, "zsk-lifetime", z.dnssec.zsk_lifetime)
-            self._str(s, "delete-delay", z.dnssec.delete_delay)
-            self._str(s, "propagation-delay", z.dnssec.propagation_delay)
-            self._str(s, "rrsig-lifetime", z.dnssec.rrsig_lifetime)
-            self._str(s, "rrsig-refresh", z.dnssec.rrsig_refresh)
-            self._str(s, "rrsig-pre-refresh", z.dnssec.rrsig_prerefresh)
-            self._str(s, "reproducible-signing", z.dnssec.repro_sign)
-            self._bool(s, "nsec3", z.dnssec.nsec3)
-            self._str(s, "nsec3-iterations", z.dnssec.nsec3_iters)
-            self._bool(s, "nsec3-opt-out", z.dnssec.nsec3_opt_out)
-            self._str(s, "nsec3-salt-lifetime", z.dnssec.nsec3_salt_lifetime)
-            self._str(s, "nsec3-salt-length", z.dnssec.nsec3_salt_len)
-            if len(z.dnssec.ksk_sbm_check) > 0 or z.dnssec.ksk_sbm_timeout is not None:
-                s.item("ksk-submission", z.name)
-            if z.dnssec.dnskey_sync:
-                s.item("dnskey-sync", z.name)
-            self._bool(s, "ksk-shared", z.dnssec.ksk_shared)
-            self._str(s, "cds-cdnskey-publish", z.dnssec.cds_publish)
-            if z.dnssec.cds_digesttype:
-                self._str(s, "cds-digest-type", z.dnssec.cds_digesttype)
-            self._str(s, "dnskey-management", z.dnssec.dnskey_mgmt)
-            self._bool(s, "offline-ksk", z.dnssec.offline_ksk)
-            self._str(s, "signing-threads",
-                      z.dnssec.signing_threads if z.dnssec.signing_threads is not None
-                      else str(random.randint(1,4)))
-        if have_policy:
+            for ci, val in self.conf["policy"][z.name].items():
+                if ci not in [ "enable", "shared_policy_with" ]:
+                    s.item_type(ci.replace("_", "-"), val)
+
+            if zone in self.conf["dnskey-sync"]:
+                s.item("dnskey-sync", zone)
+            if zone in self.conf["submission"]:
+                s.item("ksk-submission", zone)
             s.end()
 
         s.begin("database")
@@ -1900,22 +1705,6 @@ class Knot(Server):
         s.begin("template")
         s.id_item("id", "default")
         s.item_str("storage", self.dir)
-        s.item_str("zonefile-sync", self.zonefile_sync)
-        if self.notify_delay is None:
-            self.notify_delay = random.randint(0, 1)
-        s.item_str("notify-delay", self.notify_delay)
-        self._str(s, "update-delay", self.update_delay)
-        if self.zonemd_verify:
-            s.item_str("zonemd-verify", "on")
-        if self.zonemd_generate is not None:
-            s.item_str("zonemd-generate", self.zonemd_generate)
-        s.item_str("journal-max-usage", self.journal_max_usage)
-        s.item_str("journal-max-depth", self.journal_max_depth)
-        s.item_str("adjust-threads", str(random.randint(1,4)))
-        if self.semantic_check == "soft":
-            self._str(s, "semantic-checks", self.semantic_check)
-        else:
-            self._bool(s, "semantic-checks", self.semantic_check)
         if len(self.modules) > 0:
             modules = ""
             for module in self.modules:
@@ -1923,12 +1712,11 @@ class Knot(Server):
                     modules += ", "
                 modules += module.get_conf_ref()
             s.item("global-module", "[%s]" % modules)
-        if self.zone_size_limit:
-            s.item("zone-max-size", self.zone_size_limit)
 
         have_catalog = None
         for zone in self.zones:
             z = self.zones[zone]
+            z.dnssec = self.dnssec(z)
             if z.catalog_role in [ZoneCatalogRole.INTERPRET, ZoneCatalogRole.GENERATE]:
                 have_catalog = z
                 break
@@ -1936,12 +1724,11 @@ class Knot(Server):
             s.id_item("id", "catalog-default")
             s.item_str("file", self.dir + "/catalog/%s.zone")
             s.item_str("zonefile-load", "difference")
-            s.item_str("journal-content", z.journal_content)
+            s.item_str("journal-content", self.conf_zone(z).journal_content)
 
             # this is weird but for the sake of testing, the cataloged zones inherit dnssec policy from catalog zone
-            if z.dnssec.enable:
-                s.item_str("dnssec-signing", "off" if z.dnssec.disable else "on")
-                s.item_str("dnssec-policy", z.name)
+            s.item_str("dnssec-signing", "on" if z.dnssec.enable else "off")
+            s.item_str("dnssec-policy", z.name)
             for module in z.modules:
                 if module.conf_name == "mod-onlinesign":
                     s.item("module", "[%s]" % module.get_conf_ref())
@@ -1950,15 +1737,14 @@ class Knot(Server):
 
             s.id_item("id", "catalog-signed")
             s.item_str("file", self.dir + "/catalog/%s.zone")
-            s.item_str("journal-content", z.journal_content)
+            s.item_str("journal-content", self.conf_zone(z).journal_content)
             s.item_str("dnssec-signing", "on")
             self.config_xfr(z, s)
 
             s.id_item("id", "catalog-unsigned")
             s.item_str("file", self.dir + "/catalog/%s.zone")
-            s.item_str("journal-content", z.journal_content)
+            s.item_str("journal-content", self.conf_zone(z).journal_content)
             self.config_xfr(z, s)
-
         s.end()
 
         s.begin("zone")
@@ -1970,46 +1756,17 @@ class Knot(Server):
             s.id_item("domain", z.name)
             s.item_str("file", z.zfile.path)
 
-            self.config_xfr(z, s)
-
-            self._str(s, "zone-db-input", z.redis_in)
-            self._str(s, "zone-db-output", z.redis_out)
-
-            self._str(s, "serial-policy", self.serial_policy)
-            self._str(s, "serial-modulo", z.serial_modulo)
-            self._str(s, "ddns-master", self.ddns_master)
+            for ci, val in self.conf["zone"][z.name].items():
+                s.item_type(ci.replace("_", "-"), val)
 
-            s.item_str("journal-content", z.journal_content)
-            self._bool(s, "ixfr-benevolent", self.ixfr_benevolent)
-            self._bool(s, "ixfr-by-one", self.ixfr_by_one)
-            self._bool(s, "ixfr-from-axfr", self.ixfr_from_axfr)
-            self._bool(s, "provide-ixfr", self.provide_ixfr)
-
-            if z.reverse_from:
-                s.item("reverse-generate", "[ " + ", ".join([ x.name for x in z.reverse_from ]) + " ]")
-            if z.include_from:
-                s.item("include-from", "[ " + ", ".join([ x.name for x in z.include_from ]) + " ]")
-
-            self._str(s, "refresh-min-interval", z.refresh_min)
-            self._str(s, "refresh-max-interval", z.refresh_max)
-            self._str(s, "retry-min-interval", z.retry_min)
-            self._str(s, "retry-max-interval", z.retry_max)
-            self._str(s, "expire-min-interval", z.expire_min)
-            self._str(s, "expire-max-interval", z.expire_max)
+            self.config_xfr(z, s)
 
-            if z.external:
+            if zone in self.conf["external"]:
                 s.item("external-validation", z.name)
 
-            if self.zonefile_load is not None:
-                s.item_str("zonefile-load", self.zonefile_load)
-            elif z.ixfr:
+            if "zonefile_load" not in self.conf["zone"][zone] and z.ixfr:
                 s.item_str("zonefile-load", "difference")
 
-            if self.zonefile_skip is not None:
-                s.item_list("zonefile-skip", self.zonefile_skip)
-
-            self._str(s, "master-pin-tolerance", self.master_pin_tol)
-
             if z.catalog_role == ZoneCatalogRole.GENERATE:
                 s.item_str("catalog-role", "generate")
             elif z.catalog_role == ZoneCatalogRole.MEMBER:
@@ -2020,18 +1777,8 @@ class Knot(Server):
                 s.item_str("catalog-role", "interpret")
                 s.item("catalog-template", "[ catalog-default, catalog-signed, catalog-unsigned ]")
 
-            if z.dnssec.enable:
-                s.item_str("dnssec-signing", "off" if z.dnssec.disable else "on")
-
-            if z.dnssec.enable or z.dnssec.validate:
-                s.item_str("dnssec-policy", z.dnssec.shared_policy_with or z.name)
-
-            self._bool(s, "dnssec-validation", z.dnssec.validate)
-
-            if z.dnssec.ds_push == "":
-                s.item("ds-push", "[ ]")
-            elif z.dnssec.ds_push:
-                self._str(s, "ds-push", z.dnssec.ds_push.name)
+            s.item_str("dnssec-signing", "on" if self.dnssec(z).enable else "off")
+            s.item_str("dnssec-policy", self.dnssec(z).shared_policy_with or z.name)
 
             if len(z.modules) > 0:
                 modules = ""
index 28ac74ddee6ba0b668d47cc859993d2e71851174..c377c10535d6bad8b234161ef81a5d13e2a20e65 100644 (file)
@@ -393,16 +393,16 @@ class Test(object):
 
         return zones
 
-    def link(self, zones, master, slave=None, ddns=False, ixfr=False, journal_content="changes"):
+    def link(self, zones, master, slave=None, ddns=False, ixfr=False):
         for zone in zones:
             if master not in self.servers:
                 raise Failed("Server is out of testing scope")
-            master.set_master(zone, slave, ddns, ixfr, journal_content)
+            master.set_master(zone, slave, ddns, ixfr)
 
             if slave:
                 if slave not in self.servers:
                     raise Failed("Server is out of testing scope")
-                slave.set_slave(zone, master, ddns, ixfr, journal_content)
+                slave.set_slave(zone, master, ddns, ixfr)
 
     def _canonize_record(self, rtype, record):
         ''':-(('''