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 '';
14
15 makeAppTest = name: configs: makeTest {
16 name = "powerdns-admin-${name}";
17 meta = with pkgs.lib.maintainers; {
18 maintainers = [ Flakebi zhaofengli ];
19 };
20
21 nodes.server = { pkgs, config, ... }: mkMerge ([
22 {
23 services.powerdns-admin = {
24 enable = true;
25 secretKeyFile = "/etc/powerdns-admin/secret";
26 saltFile = "/etc/powerdns-admin/salt";
27 };
28 # It's insecure to have secrets in the world-readable nix store, but this is just a test
29 environment.etc."powerdns-admin/secret".text = "secret key";
30 environment.etc."powerdns-admin/salt".text = "salt";
31 environment.systemPackages = [
32 (pkgs.writeShellScriptBin "run-test" config.system.build.testScript)
33 ];
34 }
35 ] ++ configs);
36
37 testScript = ''
38 server.wait_for_unit("powerdns-admin.service")
39 server.wait_until_succeeds("run-test", timeout=10)
40 '';
41 };
42
43 matrix = {
44 backend = {
45 mysql = {
46 services.powerdns-admin = {
47 config = ''
48 ${defaultConfig}
49 SQLALCHEMY_DATABASE_URI = 'mysql://powerdnsadmin@/powerdnsadmin?unix_socket=/run/mysqld/mysqld.sock'
50 '';
51 };
52 systemd.services.powerdns-admin = {
53 after = [ "mysql.service" ];
54 serviceConfig.BindPaths = "/run/mysqld";
55 };
56
57 services.mysql = {
58 enable = true;
59 package = pkgs.mariadb;
60 ensureDatabases = [ "powerdnsadmin" ];
61 ensureUsers = [
62 {
63 name = "powerdnsadmin";
64 ensurePermissions = {
65 "powerdnsadmin.*" = "ALL PRIVILEGES";
66 };
67 }
68 ];
69 };
70 };
71 postgresql = {
72 services.powerdns-admin = {
73 config = ''
74 ${defaultConfig}
75 SQLALCHEMY_DATABASE_URI = 'postgresql://powerdnsadmin@/powerdnsadmin?host=/run/postgresql'
76 '';
77 };
78 systemd.services.powerdns-admin = {
79 after = [ "postgresql.service" ];
80 serviceConfig.BindPaths = "/run/postgresql";
81 };
82
83 services.postgresql = {
84 enable = true;
85 ensureDatabases = [ "powerdnsadmin" ];
86 ensureUsers = [
87 {
88 name = "powerdnsadmin";
89 ensurePermissions = {
90 "DATABASE powerdnsadmin" = "ALL PRIVILEGES";
91 };
92 }
93 ];
94 };
95 };
96 };
97 listen = {
98 tcp = {
99 services.powerdns-admin.extraArgs = [ "-b" "127.0.0.1:8000" ];
100 system.build.testScript = ''
101 curl -sSf http://127.0.0.1:8000/
102 '';
103 };
104 unix = {
105 services.powerdns-admin.extraArgs = [ "-b" "unix:/run/powerdns-admin/http.sock" ];
106 system.build.testScript = ''
107 curl -sSf --unix-socket /run/powerdns-admin/http.sock http://somehost/
108 '';
109 };
110 };
111 };
112in
113with matrix; {
114 postgresql = makeAppTest "postgresql" [ backend.postgresql listen.tcp ];
115 mysql = makeAppTest "mysql" [ backend.mysql listen.tcp ];
116 unix-listener = makeAppTest "unix-listener" [ backend.postgresql listen.unix ];
117}