1# Test powerdns-admin
2{ system ? builtins.currentSystem
3, config ? { }
4, pkgs ? import ../.. { inherit system config; }
5}:
6
7with import ../lib/testing-python.nix { inherit system pkgs; };
8with pkgs.lib;
9let
10 defaultConfig = ''
11 BIND_ADDRESS = '127.0.0.1'
12 PORT = 8000
13 CAPTCHA_ENABLE = False
14 '';
15
16 makeAppTest = name: configs: makeTest {
17 name = "powerdns-admin-${name}";
18 meta = with pkgs.lib.maintainers; {
19 maintainers = [ Flakebi zhaofengli ];
20 };
21
22 nodes.server = { pkgs, config, ... }: mkMerge ([
23 {
24 services.powerdns-admin = {
25 enable = true;
26 secretKeyFile = "/etc/powerdns-admin/secret";
27 saltFile = "/etc/powerdns-admin/salt";
28 };
29 # It's insecure to have secrets in the world-readable nix store, but this is just a test
30 environment.etc."powerdns-admin/secret".text = "secret key";
31 environment.etc."powerdns-admin/salt".text = "salt";
32 environment.systemPackages = [
33 (pkgs.writeShellScriptBin "run-test" config.system.build.testScript)
34 ];
35 }
36 ] ++ configs);
37
38 testScript = ''
39 server.wait_for_unit("powerdns-admin.service")
40 server.wait_until_succeeds("run-test", timeout=10)
41 '';
42 };
43
44 matrix = {
45 backend = {
46 mysql = {
47 services.powerdns-admin = {
48 config = ''
49 ${defaultConfig}
50 SQLALCHEMY_DATABASE_URI = 'mysql://powerdnsadmin@/powerdnsadmin?unix_socket=/run/mysqld/mysqld.sock'
51 '';
52 };
53 systemd.services.powerdns-admin = {
54 after = [ "mysql.service" ];
55 serviceConfig.BindPaths = "/run/mysqld";
56 };
57
58 services.mysql = {
59 enable = true;
60 package = pkgs.mariadb;
61 ensureDatabases = [ "powerdnsadmin" ];
62 ensureUsers = [
63 {
64 name = "powerdnsadmin";
65 ensurePermissions = {
66 "powerdnsadmin.*" = "ALL PRIVILEGES";
67 };
68 }
69 ];
70 };
71 };
72 postgresql = {
73 services.powerdns-admin = {
74 config = ''
75 ${defaultConfig}
76 SQLALCHEMY_DATABASE_URI = 'postgresql://powerdnsadmin@/powerdnsadmin?host=/run/postgresql'
77 '';
78 };
79 systemd.services.powerdns-admin = {
80 after = [ "postgresql.service" ];
81 serviceConfig.BindPaths = "/run/postgresql";
82 };
83
84 services.postgresql = {
85 enable = true;
86 ensureDatabases = [ "powerdnsadmin" ];
87 ensureUsers = [
88 {
89 name = "powerdnsadmin";
90 ensureDBOwnership = true;
91 }
92 ];
93 };
94 };
95 };
96 listen = {
97 tcp = {
98 services.powerdns-admin.extraArgs = [ "-b" "127.0.0.1:8000" ];
99 system.build.testScript = ''
100 set -euxo pipefail
101 curl -sSf http://127.0.0.1:8000/
102
103 # Create account to check that the database migrations ran
104 csrf_token="$(curl -sSfc session http://127.0.0.1:8000/register | grep _csrf_token | cut -d\" -f6)"
105 # Outputs 'Redirecting' if successful
106 curl -sSfb session http://127.0.0.1:8000/register \
107 -F "_csrf_token=$csrf_token" \
108 -F "firstname=first" \
109 -F "lastname=last" \
110 -F "email=a@example.com" \
111 -F "username=user" \
112 -F "password=password" \
113 -F "rpassword=password" | grep Redirecting
114
115 # Login
116 # Outputs 'Redirecting' if successful
117 curl -sSfb session http://127.0.0.1:8000/login \
118 -F "_csrf_token=$csrf_token" \
119 -F "username=user" \
120 -F "password=password" | grep Redirecting
121
122 # Check that we are logged in, this redirects to /admin/setting/pdns if we are
123 curl -sSfb session http://127.0.0.1:8000/dashboard/ | grep /admin/setting
124 '';
125 };
126 unix = {
127 services.powerdns-admin.extraArgs = [ "-b" "unix:/run/powerdns-admin/http.sock" ];
128 system.build.testScript = ''
129 curl -sSf --unix-socket /run/powerdns-admin/http.sock http://somehost/
130 '';
131 };
132 };
133 };
134in
135with matrix; {
136 postgresql = makeAppTest "postgresql" [ backend.postgresql listen.tcp ];
137 mysql = makeAppTest "mysql" [ backend.mysql listen.tcp ];
138 unix-listener = makeAppTest "unix-listener" [ backend.postgresql listen.unix ];
139}