1import ./make-test-python.nix (
2 { pkgs, lib, ... }:
3 {
4 name = "systemd-resolved";
5 meta.maintainers = [ lib.maintainers.elvishjerricco ];
6
7 nodes.server =
8 { lib, config, ... }:
9 let
10 exampleZone = pkgs.writeTextDir "example.com.zone" ''
11 @ SOA ns.example.com. noc.example.com. 2019031301 86400 7200 3600000 172800
12 @ A ${(lib.head config.networking.interfaces.eth1.ipv4.addresses).address}
13 @ AAAA ${(lib.head config.networking.interfaces.eth1.ipv6.addresses).address}
14 '';
15 in
16 {
17 networking.firewall.enable = false;
18 networking.useDHCP = false;
19
20 networking.interfaces.eth1.ipv6.addresses = lib.mkForce [
21 {
22 address = "fd00::1";
23 prefixLength = 64;
24 }
25 ];
26
27 services.knot = {
28 enable = true;
29 settings = {
30 server.listen = [
31 "0.0.0.0@53"
32 "::@53"
33 ];
34 template.default.storage = exampleZone;
35 zone."example.com".file = "example.com.zone";
36 };
37 };
38 };
39
40 nodes.client =
41 { nodes, ... }:
42 let
43 inherit (lib.head nodes.server.networking.interfaces.eth1.ipv4.addresses) address;
44 in
45 {
46 networking.nameservers = [ address ];
47 networking.interfaces.eth1.ipv6.addresses = lib.mkForce [
48 {
49 address = "fd00::2";
50 prefixLength = 64;
51 }
52 ];
53 services.resolved.enable = true;
54 services.resolved.fallbackDns = [ ];
55 networking.useNetworkd = true;
56 networking.useDHCP = false;
57 systemd.network.networks."40-eth0".enable = false;
58
59 testing.initrdBackdoor = true;
60 boot.initrd = {
61 systemd.enable = true;
62 systemd.initrdBin = [ pkgs.iputils ];
63 network.enable = true;
64 services.resolved.enable = true;
65 };
66 };
67
68 testScript =
69 { nodes, ... }:
70 let
71 address4 = (lib.head nodes.server.networking.interfaces.eth1.ipv4.addresses).address;
72 address6 = (lib.head nodes.server.networking.interfaces.eth1.ipv6.addresses).address;
73 in
74 ''
75 start_all()
76 server.wait_for_unit("multi-user.target")
77
78 def test_client():
79 query = client.succeed("resolvectl query example.com")
80 assert "${address4}" in query
81 assert "${address6}" in query
82 client.succeed("ping -4 -c 1 example.com")
83 client.succeed("ping -6 -c 1 example.com")
84
85 client.wait_for_unit("initrd.target")
86 test_client()
87 client.switch_root()
88
89 client.wait_for_unit("multi-user.target")
90 test_client()
91 '';
92 }
93)