vuls: init at 0.27.0
[NixPkgs.git] / nixos / tests / litestream.nix
bloba281d8538694cf79ff1a1bc28daa7fc63205c780
1 import ./make-test-python.nix ({ pkgs, ...} : {
2   name = "litestream";
3   meta = with pkgs.lib.maintainers; {
4     maintainers = [ jwygoda ];
5   };
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
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
32           sleep 1
34           ((timeout--))
35         done
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           };
53           server = {
54             http_addr = "localhost";
55             http_port = 3000;
56           };
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     };
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   '';