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