-
Notifications
You must be signed in to change notification settings - Fork 26
/
Copy pathtest_dnsutil.py
90 lines (76 loc) · 3.95 KB
/
test_dnsutil.py
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
87
88
89
90
import pathlib
from typing import Optional
import dnsutil
def test_resolv_conf_parse_file(tmp_path: pathlib.Path) -> None:
def _rc(content: str | bytes) -> tuple[list[str], list[str]]:
filename = str(tmp_path / "rcfile")
if isinstance(content, str):
content = content.encode('utf-8')
with open(filename, "wb") as f:
f.write(content)
rcdata = dnsutil._resolvconf_parse_file(filename)
return (rcdata.nameservers, rcdata.searches)
assert _rc("nameserver 1.2.3.4") == (["1.2.3.4"], [])
assert _rc("nameserver 1::04") == (["1::4"], [])
assert _rc("nameserver 1::04") == (["1::4"], [])
assert _rc("nameserver1::04") == ([], [])
assert _rc("nameserver\t1::04") == (["1::4"], [])
assert _rc("\n\tnameserver\t1::04\t\n") == (["1::4"], [])
assert _rc(b"nameserver\t1::0\xca4") == ([], [])
assert _rc(b"nameserver\t1::0\xca4\nnameserver 1.2.3.4 ") == (["1.2.3.4"], [])
assert _rc("search foo.com bar.com\nnameserver 1.2.3.4\n") == (["1.2.3.4"], ["foo.com", "bar.com"])
assert _rc("search foo.com bar.com\n\nsearch xxx\nnameserver 1.2.3.4\n") == (["1.2.3.4"], ["xxx"])
def test_dnsmasq_servers_parse() -> None:
def _update(old_content: bytes, cluster_name: Optional[str], api_vip: Optional[str] = None) -> tuple[bytes, list[bytes]]:
content, entries = dnsutil._dnsmasq_servers_content_update(old_content, cluster_name, api_vip)
assert content
assert isinstance(content, bytes)
assert isinstance(entries, list)
# Reimplement the parsing, and see that we get the same result
found_entries = []
for line in content.split(b'\n'):
assert line == line.strip()
if not line:
continue
if line.startswith(b'#'):
assert line == b"#" or line.startswith(b"# ")
continue
assert line.startswith(b"server=/")
found_entries.append(line)
assert entries == found_entries
# parsing the content again, should yield the same entries.
entries2 = dnsutil._dnsmasq_servers_content_parse(content)
assert isinstance(entries, list)
assert entries == entries2
# Calling update on the new content, must give the identical output.
content3, entries3 = dnsutil._dnsmasq_servers_content_update(content, cluster_name, api_vip)
assert content3
assert isinstance(content3, bytes)
assert isinstance(entries3, list)
assert content3 == content
assert entries3 == entries
return content, entries
content, entries = _update(b"", "cluster1", "192.168.122.2")
assert content == (
b'# Written by cluster-deployment-automation for resolving cluster names.\n'
b'# This file is passed to dnsmasq via the --servers-file= option\n'
b'#\n'
b'# You can reload after changes with\n'
b'# systemctl restart dnsmasq.service\n'
b'# systemctl kill -s SIGHUP dnsmasq.service\n'
b'server=/*.api.cluster1.redhat.com/*.api-int.cluster1.redhat.com/#\n'
b'server=/apps.cluster1.redhat.com/api.cluster1.redhat.com/api-int.cluster1.redhat.com/192.168.122.2\n'
)
assert entries == [
b'server=/*.api.cluster1.redhat.com/*.api-int.cluster1.redhat.com/#',
b'server=/apps.cluster1.redhat.com/api.cluster1.redhat.com/api-int.cluster1.redhat.com/192.168.122.2',
]
content2, entries2 = _update(content, "cluster2", "192.168.123.2")
assert entries2 == [
b'server=/*.api.cluster1.redhat.com/*.api-int.cluster1.redhat.com/#',
b'server=/*.api.cluster2.redhat.com/*.api-int.cluster2.redhat.com/#',
b'server=/apps.cluster1.redhat.com/api.cluster1.redhat.com/api-int.cluster1.redhat.com/192.168.122.2',
b'server=/apps.cluster2.redhat.com/api.cluster2.redhat.com/api-int.cluster2.redhat.com/192.168.123.2',
]
content, entries = _update(b"", "cluster1", None)
assert entries == []