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 security = {
48 adminUser = "admin";
49 adminPassword = "admin";
50 };
51 addr = "localhost";
52 port = 3000;
53 extraOptions = {
54 DATABASE_URL = "sqlite3:///var/lib/grafana/data/grafana.db?cache=private&mode=rwc&_journal_mode=WAL";
55 };
56 };
57 users.users.foo = {
58 isNormalUser = true;
59 password = "bar";
60 };
61 users.users.litestream.extraGroups = [ "grafana" ];
62 };
63
64 testScript = ''
65 start_all()
66 machine.wait_until_succeeds("test -d /home/foo/grafana")
67 machine.wait_for_open_port(3000)
68 machine.succeed("""
69 curl -sSfN -X PUT -H "Content-Type: application/json" -d '{
70 "oldPassword": "admin",
71 "newPassword": "newpass",
72 "confirmNew": "newpass"
73 }' http://admin:admin@127.0.0.1:3000/api/user/password
74 """)
75 # https://litestream.io/guides/systemd/#simulating-a-disaster
76 machine.systemctl("stop litestream.service")
77 machine.succeed(
78 "rm -f /var/lib/grafana/data/grafana.db "
79 "/var/lib/grafana/data/grafana.db-shm "
80 "/var/lib/grafana/data/grafana.db-wal"
81 )
82 machine.succeed(
83 "litestream restore /var/lib/grafana/data/grafana.db "
84 "&& chown grafana:grafana /var/lib/grafana/data/grafana.db "
85 "&& chmod 660 /var/lib/grafana/data/grafana.db"
86 )
87 machine.systemctl("restart grafana.service")
88 machine.wait_for_open_port(3000)
89 machine.succeed(
90 "curl -sSfN -u admin:newpass http://127.0.0.1:3000/api/org/users | grep admin\@localhost"
91 )
92 '';
93})