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