1import ./make-test-python.nix (
2 { pkgs, ... }:
3 {
4 name = "litestream";
5 meta = with pkgs.lib.maintainers; {
6 maintainers = [ jwygoda ];
7 };
8
9 nodes.machine =
10 { pkgs, ... }:
11 {
12 services.litestream = {
13 enable = true;
14 settings = {
15 dbs = [
16 {
17 path = "/var/lib/grafana/data/grafana.db";
18 replicas = [
19 {
20 url = "sftp://foo:bar@127.0.0.1:22/home/foo/grafana";
21 }
22 ];
23 }
24 ];
25 };
26 };
27 systemd.services.grafana.serviceConfig.ExecStartPost =
28 "+"
29 + pkgs.writeShellScript "grant-grafana-permissions" ''
30 timeout=10
31
32 while [ ! -f /var/lib/grafana/data/grafana.db ];
33 do
34 if [ "$timeout" == 0 ]; then
35 echo "ERROR: Timeout while waiting for /var/lib/grafana/data/grafana.db."
36 exit 1
37 fi
38
39 sleep 1
40
41 ((timeout--))
42 done
43
44 find /var/lib/grafana -type d -exec chmod -v 775 {} \;
45 find /var/lib/grafana -type f -exec chmod -v 660 {} \;
46 '';
47 services.openssh = {
48 enable = true;
49 allowSFTP = true;
50 listenAddresses = [
51 {
52 addr = "127.0.0.1";
53 port = 22;
54 }
55 ];
56 };
57 services.grafana = {
58 enable = true;
59 settings = {
60 security = {
61 admin_user = "admin";
62 admin_password = "admin";
63 };
64
65 server = {
66 http_addr = "localhost";
67 http_port = 3000;
68 };
69
70 database = {
71 type = "sqlite3";
72 path = "/var/lib/grafana/data/grafana.db";
73 wal = true;
74 };
75 };
76 };
77 users.users.foo = {
78 isNormalUser = true;
79 password = "bar";
80 };
81 users.users.litestream.extraGroups = [ "grafana" ];
82 };
83
84 testScript = ''
85 start_all()
86 machine.wait_until_succeeds("test -d /home/foo/grafana")
87 machine.wait_for_open_port(3000)
88 machine.succeed("""
89 curl -sSfN -X PUT -H "Content-Type: application/json" -d '{
90 "oldPassword": "admin",
91 "newPassword": "newpass",
92 "confirmNew": "newpass"
93 }' http://admin:admin@127.0.0.1:3000/api/user/password
94 """)
95 # https://litestream.io/guides/systemd/#simulating-a-disaster
96 machine.systemctl("stop litestream.service")
97 machine.succeed(
98 "rm -f /var/lib/grafana/data/grafana.db "
99 "/var/lib/grafana/data/grafana.db-shm "
100 "/var/lib/grafana/data/grafana.db-wal"
101 )
102 machine.succeed(
103 "litestream restore /var/lib/grafana/data/grafana.db "
104 "&& chown grafana:grafana /var/lib/grafana/data/grafana.db "
105 "&& chmod 660 /var/lib/grafana/data/grafana.db"
106 )
107 machine.systemctl("restart grafana.service")
108 machine.wait_for_open_port(3000)
109 machine.succeed(
110 "curl -sSfN -u admin:newpass http://127.0.0.1:3000/api/org/users | grep admin\@localhost"
111 )
112 '';
113 }
114)