summaryrefslogtreecommitdiffstats
path: root/nixos/tests/powerdns.nix
blob: 8357007facc77397d5b7935b63ef0e6c5ac825de (plain)
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
# This test runs PowerDNS authoritative server with the
# generic MySQL backend (gmysql) to connect to a
# MariaDB server using UNIX sockets authentication.

{ pkgs, lib, ... }:
{
  name = "powerdns";

  nodes.server =
    { ... }:
    {
      services.powerdns.enable = true;
      services.powerdns.extraConfig = ''
        launch=gmysql
        gmysql-user=pdns
        zone-cache-refresh-interval=0
      '';

      services.mysql = {
        enable = true;
        package = pkgs.mariadb;
        ensureDatabases = [ "powerdns" ];
        ensureUsers = lib.singleton {
          name = "pdns";
          ensurePermissions = {
            "powerdns.*" = "ALL PRIVILEGES";
          };
        };
      };

      environment.systemPackages = with pkgs; [
        dnsutils
        pdns
        mariadb
      ];
    };

  testScript = ''
    with subtest("PowerDNS database exists"):
        server.wait_for_unit("mysql")
        server.succeed("echo 'SHOW DATABASES;' | sudo -u pdns mysql -u pdns >&2")

    with subtest("Loading the MySQL schema works"):
        server.succeed(
            "sudo -u pdns mysql -u pdns -D powerdns <"
            "${pkgs.pdns}/share/doc/pdns/schema.mysql.sql"
        )

    with subtest("PowerDNS server starts"):
        server.wait_for_unit("pdns")
        server.succeed("dig version.bind txt chaos @127.0.0.1 >&2")

    with subtest("Adding an example zone works"):
        # Extract configuration file needed by pdnsutil
        pdnsutil = "sudo -u pdns pdnsutil "
        server.succeed(f"{pdnsutil} zone  create example.com ns1.example.com")
        server.succeed(f"{pdnsutil} rrset add    example.com ns1.example.com A 192.168.1.2")

    with subtest("Querying the example zone works"):
        reply = server.succeed("dig +noall +answer ns1.example.com @127.0.0.1")
        assert (
            "192.168.1.2" in reply
        ), f""""
        The reply does not contain the expected IP address:
          Expected:
            ns1.example.com.        3600    IN      A       192.168.1.2
          Reply:
            {reply}"""
  '';
}