1{ ... }:
2{
3 name = "snapper";
4
5 nodes.machine =
6 { pkgs, lib, ... }:
7 {
8 virtualisation.emptyDiskImages = [
9 {
10 size = 4096;
11 driveConfig.deviceExtraOpts.serial = "aux";
12 }
13 ];
14
15 virtualisation.fileSystems = {
16 "/home" = {
17 device = "/dev/disk/by-id/virtio-aux";
18 fsType = "btrfs";
19 autoFormat = true;
20 };
21 };
22 services.snapper.configs.home.SUBVOLUME = "/home";
23 services.snapper.filters = "/nix";
24 };
25
26 testScript =
27 { nodes, ... }:
28 let
29 inherit (nodes.machine.services.snapper) snapshotRootOnBoot;
30 in
31 ''
32 machine.succeed("btrfs subvolume create /home/.snapshots")
33 machine.succeed("snapper -c home list")
34 machine.succeed("snapper -c home create --description empty")
35 machine.succeed("echo test > /home/file")
36 machine.succeed("snapper -c home create --description file")
37 machine.succeed("snapper -c home status 1..2")
38 machine.succeed("snapper -c home undochange 1..2")
39 machine.fail("ls /home/file")
40 machine.succeed("snapper -c home delete 2")
41 machine.succeed("systemctl --wait start snapper-timeline.service")
42 machine.succeed("systemctl --wait start snapper-cleanup.service")
43 machine.${if snapshotRootOnBoot then "succeed" else "fail"}("systemctl cat snapper-boot.service")
44 '';
45}