1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
#!/usr/bin/env python3
'''Test for serial number arithmetics when loading a zone file and storing its difference'''
import os
from dnstest.test import Test
TEMPL = """$ORIGIN %s
$TTL 3600
@ SOA dns1 hostmaster %d 10800 3600 1209600 7200
NS dns1
NS dns2
MX 10 mail
dns1 A 192.0.2.1
AAAA 2001:DB8::1
dns2 A 192.0.2.2
AAAA 2001:DB8::2
mail A 192.0.2.3
AAAA 2001:DB8::3
new A 1.1.1.%d
"""
SERIALS = {
# max incr, max value, next uniq, prev invalid
"z1.": [0, 1, 1 + 2147483647, 4294967295, 3, 2],
# next invalid
"z2.": [4294967295, 0, 1, 1 + 2147483647, 4294967294, 1 + (4294967294 + 2147483647) % 4294967296]
}
t = Test()
master = t.server("knot")
slave = t.server("knot")
refer = t.server("bind")
zones = [t.zone(z, storage=t.zones_dir, exists=False)[0] for z in SERIALS]
for dname in SERIALS:
sequence = SERIALS[dname]
for index, serial in enumerate(sequence):
fn = "%szone" % dname if index == 0 else "%szone.%d" % (dname, index)
with open(os.path.join(t.zones_dir, fn), "w") as f:
f.write(TEMPL % (dname, serial, index))
t.link(zones, master, slave, ixfr=True)
t.link(zones, refer, ixfr=True)
t.start()
master.zones_wait(zones)
slave.zones_wait(zones)
refer.zones_wait(zones)
t.xfr_diff(master, slave, zones)
t.xfr_diff(master, refer, zones)
for i in range(1, 6):
# Update zone files.
for zone in zones:
master.update_zonefile(zone, version=i, storage=t.zones_dir)
refer.update_zonefile(zone, version=i, storage=t.zones_dir)
master.reload()
refer.reload()
fix = 0
if i == 5: # Invalid serial change - zone unchanged
fix = 1;
t.sleep(1)
previous = dict()
for zone in zones:
master.zone_wait(zone, SERIALS[zone.name][i - fix], equal=True, greater=False)
slave.zone_wait(zone, SERIALS[zone.name][i - fix], equal=True, greater=False)
refer.zone_wait(zone, SERIALS[zone.name][i - fix], equal=True, greater=False)
previous[zone.name] = SERIALS[zone.name][i - 1 - fix]
t.xfr_diff(master, slave, zones)
t.xfr_diff(master, refer, zones)
t.xfr_diff(master, slave, zones, serials=previous)
t.xfr_diff(master, refer, zones, serials=previous)
t.end()
|