1{ system ? builtins.currentSystem,
2 config ? {},
3 pkgs ? import ../.. { inherit system config; }
4}:
5
6with import ../lib/testing-python.nix { inherit system pkgs; };
7
8let
9
10 makeZfsTest = name:
11 { kernelPackage ? if enableUnstable then pkgs.linuxPackages_latest else pkgs.linuxPackages
12 , enableUnstable ? false
13 , extraTest ? ""
14 }:
15 makeTest {
16 name = "zfs-" + name;
17 meta = with pkgs.lib.maintainers; {
18 maintainers = [ adisbladis ];
19 };
20
21 machine = { pkgs, lib, ... }:
22 let
23 usersharePath = "/var/lib/samba/usershares";
24 in {
25 virtualisation.emptyDiskImages = [ 4096 ];
26 networking.hostId = "deadbeef";
27 boot.kernelPackages = kernelPackage;
28 boot.supportedFilesystems = [ "zfs" ];
29 boot.zfs.enableUnstable = enableUnstable;
30
31 services.samba = {
32 enable = true;
33 extraConfig = ''
34 registry shares = yes
35 usershare path = ${usersharePath}
36 usershare allow guests = yes
37 usershare max shares = 100
38 usershare owner only = no
39 '';
40 };
41 systemd.services.samba-smbd.serviceConfig.ExecStartPre =
42 "${pkgs.coreutils}/bin/mkdir -m +t -p ${usersharePath}";
43
44 environment.systemPackages = [ pkgs.parted ];
45
46 # Setup regular fileSystems machinery to ensure forceImportAll can be
47 # tested via the regular service units.
48 virtualisation.fileSystems = {
49 "/forcepool" = {
50 device = "forcepool";
51 fsType = "zfs";
52 options = [ "noauto" ];
53 };
54 };
55
56 # forcepool doesn't exist at first boot, and we need to manually test
57 # the import after tweaking the hostId.
58 systemd.services.zfs-import-forcepool.wantedBy = lib.mkVMOverride [];
59 systemd.targets.zfs.wantedBy = lib.mkVMOverride [];
60 boot.zfs.forceImportAll = true;
61 # /dev/disk/by-id doesn't get populated in the NixOS test framework
62 boot.zfs.devNodes = "/dev/disk/by-uuid";
63 };
64
65 testScript = ''
66 machine.succeed(
67 "modprobe zfs",
68 "zpool status",
69 "ls /dev",
70 "mkdir /tmp/mnt",
71 "udevadm settle",
72 "parted --script /dev/vdb mklabel msdos",
73 "parted --script /dev/vdb -- mkpart primary 1024M -1s",
74 "udevadm settle",
75 "zpool create rpool /dev/vdb1",
76 "zfs create -o mountpoint=legacy rpool/root",
77 # shared datasets cannot have legacy mountpoint
78 "zfs create rpool/shared_smb",
79 "mount -t zfs rpool/root /tmp/mnt",
80 "udevadm settle",
81 # wait for samba services
82 "systemctl is-system-running --wait",
83 "zfs set sharesmb=on rpool/shared_smb",
84 "zfs share rpool/shared_smb",
85 "smbclient -gNL localhost | grep rpool_shared_smb",
86 "umount /tmp/mnt",
87 "zpool destroy rpool",
88 "udevadm settle",
89 )
90
91 machine.succeed(
92 'echo password | zpool create -o altroot="/tmp/mnt" '
93 + "-O encryption=aes-256-gcm -O keyformat=passphrase rpool /dev/vdb1",
94 "zfs create -o mountpoint=legacy rpool/root",
95 "mount -t zfs rpool/root /tmp/mnt",
96 "udevadm settle",
97 "umount /tmp/mnt",
98 "zpool destroy rpool",
99 "udevadm settle",
100 )
101
102 with subtest("boot.zfs.forceImportAll works"):
103 machine.succeed(
104 "rm /etc/hostid",
105 "zgenhostid deadcafe",
106 "zpool create forcepool /dev/vdb1 -O mountpoint=legacy",
107 )
108 machine.shutdown()
109 machine.start()
110 machine.succeed("udevadm settle")
111 machine.fail("zpool import forcepool")
112 machine.succeed(
113 "systemctl start zfs-import-forcepool.service",
114 "mount -t zfs forcepool /tmp/mnt",
115 )
116 '' + extraTest;
117
118 };
119
120
121in {
122
123 stable = makeZfsTest "stable" { };
124
125 unstable = makeZfsTest "unstable" {
126 enableUnstable = true;
127 };
128
129 installer = (import ./installer.nix { }).zfsroot;
130}