1{ lib, pkgs, ... }:
2{
3 name = "bees";
4
5 nodes.machine =
6 { config, pkgs, ... }:
7 {
8 virtualisation.emptyDiskImages = [
9 {
10 size = 4096;
11 driveConfig.deviceExtraOpts.serial = "aux1";
12 }
13 {
14 size = 4096;
15 driveConfig.deviceExtraOpts.serial = "aux2";
16 }
17 ];
18 virtualisation.fileSystems = {
19 "/aux1" = {
20 # filesystem configured to be deduplicated
21 device = "/dev/disk/by-id/virtio-aux1";
22 fsType = "btrfs";
23 autoFormat = true;
24 };
25 "/aux2" = {
26 # filesystem not configured to be deduplicated
27 device = "/dev/disk/by-id/virtio-aux2";
28 fsType = "btrfs";
29 autoFormat = true;
30 };
31 };
32 services.beesd.filesystems = {
33 aux1 = {
34 spec = "/dev/disk/by-id/virtio-aux1";
35 hashTableSizeMB = 16;
36 verbosity = "debug";
37 };
38 };
39 };
40
41 testScript =
42 let
43 someContentIsShared =
44 loc:
45 pkgs.writeShellScript "some-content-is-shared" ''
46 [[ $(btrfs fi du -s --raw ${lib.escapeShellArg loc}/dedup-me-{1,2} | awk 'BEGIN { count=0; } NR>1 && $3 == 0 { count++ } END { print count }') -eq 0 ]]
47 '';
48 in
49 ''
50 # shut down the instance started by systemd at boot, so we can test our test procedure
51 machine.succeed("systemctl stop beesd@aux1.service")
52
53 machine.succeed(
54 "dd if=/dev/urandom of=/aux1/dedup-me-1 bs=1M count=8",
55 "cp --reflink=never /aux1/dedup-me-1 /aux1/dedup-me-2",
56 "cp --reflink=never /aux1/* /aux2/",
57 "sync",
58 )
59 machine.fail(
60 "${someContentIsShared "/aux1"}",
61 "${someContentIsShared "/aux2"}",
62 )
63 machine.succeed("systemctl start beesd@aux1.service")
64
65 # assert that "Set Shared" column is nonzero
66 machine.wait_until_succeeds(
67 "${someContentIsShared "/aux1"}",
68 )
69 machine.fail("${someContentIsShared "/aux2"}")
70
71 # assert that 16MB hash table size requested was honored
72 machine.succeed(
73 "[[ $(stat -c %s /aux1/.beeshome/beeshash.dat) = $(( 16 * 1024 * 1024)) ]]"
74 )
75 '';
76}