1# This test runs PowerDNS authoritative server with the
2# generic MySQL backend (gmysql) to connect to a
3# MariaDB server using UNIX sockets authentication.
4
5import ./make-test-python.nix ({ pkgs, lib, ... }: {
6 name = "powerdns";
7
8 nodes.server = { ... }: {
9 services.powerdns.enable = true;
10 services.powerdns.extraConfig = ''
11 launch=gmysql
12 gmysql-user=pdns
13 '';
14
15 services.mysql = {
16 enable = true;
17 package = pkgs.mariadb;
18 ensureDatabases = [ "powerdns" ];
19 ensureUsers = lib.singleton
20 { name = "pdns";
21 ensurePermissions = { "powerdns.*" = "ALL PRIVILEGES"; };
22 };
23 };
24
25 environment.systemPackages = with pkgs;
26 [ dnsutils powerdns mariadb ];
27 };
28
29 testScript = ''
30 import re
31
32 with subtest("PowerDNS database exists"):
33 server.wait_for_unit("mysql")
34 server.succeed("echo 'SHOW DATABASES;' | sudo -u pdns mysql -u pdns >&2")
35
36 with subtest("Loading the MySQL schema works"):
37 server.succeed(
38 "sudo -u pdns mysql -u pdns -D powerdns <"
39 "${pkgs.powerdns}/share/doc/pdns/schema.mysql.sql"
40 )
41
42 with subtest("PowerDNS server starts"):
43 server.wait_for_unit("pdns")
44 server.succeed("dig version.bind txt chaos @127.0.0.1 >&2")
45
46 with subtest("Adding an example zone works"):
47 # Extract configuration file needed by pdnsutil
48 unit = server.succeed("systemctl cat pdns")
49 conf = re.search("(--config-dir=[^ ]+)", unit).group(1)
50 pdnsutil = "sudo -u pdns pdnsutil " + conf
51 server.succeed(f"{pdnsutil} create-zone example.com ns1.example.com")
52 server.succeed(f"{pdnsutil} add-record example.com ns1 A 192.168.1.2")
53
54 with subtest("Querying the example zone works"):
55 reply = server.succeed("dig +noall +answer ns1.example.com @127.0.0.1")
56 assert (
57 "192.168.1.2" in reply
58 ), f""""
59 The reply does not contain the expected IP address:
60 Expected:
61 ns1.example.com. 3600 IN A 192.168.1.2
62 Reply:
63 {reply}"""
64 '';
65})