mirror of
https://github.com/TECHNOFAB11/disko.git
synced 2025-12-11 23:50:05 +01:00
add nixos tests for disko.config, extend/fix existing tests
This commit is contained in:
parent
a215a19759
commit
9f7f23abdb
22 changed files with 448 additions and 110 deletions
10
tests/boot-raid1.nix
Normal file
10
tests/boot-raid1.nix
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
{ pkgs ? (import <nixpkgs> { })
|
||||
, makeDiskoTest ? (pkgs.callPackage ./lib.nix { }).makeDiskoTest
|
||||
}:
|
||||
makeDiskoTest {
|
||||
disko-config = import ../example/boot-raid1.nix;
|
||||
extraTestScript = ''
|
||||
machine.succeed("test -b /dev/md/boot");
|
||||
machine.succeed("mountpoint /boot");
|
||||
'';
|
||||
}
|
||||
|
|
@ -4,8 +4,8 @@
|
|||
makeDiskoTest {
|
||||
disko-config = import ../example/btrfs-subvolumes.nix;
|
||||
extraTestScript = ''
|
||||
machine.succeed("test -e /mnt/test");
|
||||
machine.succeed("btrfs subvolume list /mnt | grep -qs 'path test$'");
|
||||
machine.succeed("test -e /test");
|
||||
machine.succeed("btrfs subvolume list / | grep -qs 'path test$'");
|
||||
'';
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -3,16 +3,23 @@
|
|||
}:
|
||||
makeDiskoTest {
|
||||
disko-config = import ../example/complex.nix;
|
||||
extraConfig = {
|
||||
fileSystems."/zfs_legacy_fs".options = [ "nofail" ]; # TODO find out why we need this!
|
||||
};
|
||||
extraTestScript = ''
|
||||
machine.succeed("test -b /dev/zroot/zfs_testvolume");
|
||||
machine.succeed("test -b /dev/md/raid1p1");
|
||||
|
||||
|
||||
machine.succeed("mountpoint /mnt");
|
||||
machine.succeed("mountpoint /mnt/zfs_fs");
|
||||
machine.succeed("mountpoint /mnt/zfs_legacy_fs");
|
||||
machine.succeed("mountpoint /mnt/ext4onzfs");
|
||||
machine.succeed("mountpoint /mnt/ext4_on_lvm");
|
||||
machine.succeed("mountpoint /zfs_fs");
|
||||
machine.succeed("mountpoint /zfs_legacy_fs");
|
||||
machine.succeed("mountpoint /ext4onzfs");
|
||||
machine.succeed("mountpoint /ext4_on_lvm");
|
||||
'';
|
||||
enableOCR = true;
|
||||
bootCommands = ''
|
||||
machine.wait_for_text("Passphrase for")
|
||||
machine.send_chars("secret\n")
|
||||
'';
|
||||
extraConfig = {
|
||||
boot.kernelModules = [ "dm-raid" "dm-mirror" ];
|
||||
|
|
|
|||
|
|
@ -1,9 +1,10 @@
|
|||
{ makeTest ? import <nixpkgs/nixos/tests/make-test-python.nix>
|
||||
, eval-config ? import <nixpkgs/nixos/lib/eval-config.nix>
|
||||
, pkgs ? (import <nixpkgs> { })
|
||||
}@args:
|
||||
let
|
||||
lib = pkgs.lib;
|
||||
makeDiskoTest = (pkgs.callPackage ./lib.nix { inherit makeTest; }).makeDiskoTest;
|
||||
makeDiskoTest = (pkgs.callPackage ./lib.nix { inherit makeTest eval-config; }).makeDiskoTest;
|
||||
|
||||
evalTest = name: configFile: let
|
||||
disko-config = import configFile;
|
||||
|
|
|
|||
|
|
@ -4,7 +4,8 @@
|
|||
makeDiskoTest {
|
||||
disko-config = import ../example/gpt-bios-compat.nix;
|
||||
extraTestScript = ''
|
||||
machine.succeed("mountpoint /mnt");
|
||||
machine.succeed("grub-install --target=i386-pc /dev/vdb");
|
||||
machine.succeed("mountpoint /");
|
||||
'';
|
||||
efi = false;
|
||||
grub-devices = [ "/dev/vdb" ];
|
||||
}
|
||||
|
|
|
|||
117
tests/lib.nix
117
tests/lib.nix
|
|
@ -1,12 +1,17 @@
|
|||
{ pkgs ? (import <nixpkgs> { })
|
||||
, makeTest ? import <nixpkgs/nixos/tests/make-test-python.nix>
|
||||
, eval-config ? import <nixpkgs/nixos/lib/eval-config.nix>
|
||||
, ...
|
||||
}:
|
||||
{
|
||||
makeDiskoTest =
|
||||
{ disko-config
|
||||
, extraTestScript
|
||||
, extraTestScript ? ""
|
||||
, bootCommands ? ""
|
||||
, extraConfig ? { }
|
||||
, grub-devices ? [ "nodev" ]
|
||||
, efi ? true
|
||||
, enableOCR ? false
|
||||
}:
|
||||
let
|
||||
lib = pkgs.lib;
|
||||
|
|
@ -15,33 +20,107 @@
|
|||
inherit pkgs;
|
||||
inherit (pkgs) system;
|
||||
};
|
||||
tsp-create = pkgs.writeScript "create" ((pkgs.callPackage ../. { }).create disko-config);
|
||||
tsp-mount = pkgs.writeScript "mount" ((pkgs.callPackage ../. { }).mount disko-config);
|
||||
num-disks = builtins.length (lib.attrNames disko-config.disk);
|
||||
disks = [ "/dev/vda" "/dev/vdb" "/dev/vdc" "/dev/vdd" "/dev/vde" "/dev/vdf" ];
|
||||
tsp-create = pkgs.writeScript "create" ((pkgs.callPackage ../. { }).create (disko-config { disks = builtins.tail disks; }));
|
||||
tsp-mount = pkgs.writeScript "mount" ((pkgs.callPackage ../. { }).mount (disko-config { disks = builtins.tail disks; }));
|
||||
tsp-config = (pkgs.callPackage ../. { }).config (disko-config { inherit disks; });
|
||||
num-disks = builtins.length (lib.attrNames (disko-config {}).disk);
|
||||
installed-system = { modulesPath, ... }: {
|
||||
imports = [
|
||||
tsp-config
|
||||
(modulesPath + "/testing/test-instrumentation.nix")
|
||||
(modulesPath + "/profiles/qemu-guest.nix")
|
||||
(modulesPath + "/profiles/minimal.nix")
|
||||
extraConfig
|
||||
];
|
||||
fileSystems."/nix/store" = {
|
||||
device = "nix-store";
|
||||
fsType = "9p";
|
||||
neededForBoot = true;
|
||||
options = [ "trans=virtio" "version=9p2000.L" "cache=loose" ];
|
||||
};
|
||||
documentation.enable = false;
|
||||
hardware.enableAllFirmware = lib.mkForce false;
|
||||
networking.hostId = "8425e349"; # from profiles/base.nix, needed for zfs
|
||||
boot.kernelParams = lib.mkAfter [ "console=tty0" ]; # needed to have serial interaction during boot
|
||||
boot.zfs.devNodes = "/dev/disk/by-uuid"; # needed because /dev/disk/by-id is empty in qemu-vms
|
||||
|
||||
boot.consoleLogLevel = lib.mkForce 100;
|
||||
boot.loader.grub = {
|
||||
devices = grub-devices;
|
||||
efiSupport = efi;
|
||||
efiInstallAsRemovable = efi;
|
||||
};
|
||||
};
|
||||
installedTopLevel = (eval-config {
|
||||
modules = [ installed-system ];
|
||||
system = "x86_64-linux";
|
||||
}).config.system.build.toplevel;
|
||||
in
|
||||
makeTest' {
|
||||
name = "disko";
|
||||
|
||||
nodes.machine =
|
||||
{ config, pkgs, modulesPath, ... }:
|
||||
inherit enableOCR;
|
||||
nodes.machine = { config, pkgs, modulesPath, ... }: {
|
||||
imports = [
|
||||
(modulesPath + "/profiles/base.nix")
|
||||
(modulesPath + "/profiles/minimal.nix")
|
||||
extraConfig
|
||||
];
|
||||
|
||||
{
|
||||
imports = [
|
||||
(modulesPath + "/profiles/installation-device.nix")
|
||||
(modulesPath + "/profiles/base.nix")
|
||||
];
|
||||
# speed-up eval
|
||||
documentation.enable = false;
|
||||
|
||||
# speed-up eval
|
||||
documentation.enable = false;
|
||||
nix.settings = {
|
||||
substituters = lib.mkForce [];
|
||||
hashed-mirrors = null;
|
||||
connect-timeout = 1;
|
||||
};
|
||||
|
||||
virtualisation.emptyDiskImages = builtins.genList (_: 512) num-disks;
|
||||
} // extraConfig;
|
||||
virtualisation.emptyDiskImages = builtins.genList (_: 4096) num-disks;
|
||||
};
|
||||
|
||||
testScript = ''
|
||||
machine.succeed("echo 'secret' > /tmp/secret.key");
|
||||
machine.succeed("${tsp-create}");
|
||||
machine.succeed("${tsp-mount}");
|
||||
machine.succeed("${tsp-mount}"); # verify that the command is idempotent
|
||||
def disks(oldmachine, num_disks):
|
||||
disk_flags = ""
|
||||
for i in range(num_disks):
|
||||
disk_flags += f' -drive file={oldmachine.state_dir}/empty{i}.qcow2,id=drive{i + 1},if=none,index={i + 1},werror=report'
|
||||
disk_flags += f' -device virtio-blk-pci,drive=drive{i + 1}'
|
||||
return disk_flags
|
||||
def create_test_machine(oldmachine=None, args={}): # taken from <nixpkgs/nixos/tests/installer.nix>
|
||||
machine = create_machine({
|
||||
"qemuFlags": "-cpu max -m 1024 -virtfs local,path=/nix/store,security_model=none,mount_tag=nix-store" + disks(oldmachine, ${toString num-disks}),
|
||||
${lib.optionalString efi ''"bios": "${pkgs.OVMF.fd}/FV/OVMF.fd",''}
|
||||
} | args)
|
||||
driver.machines.append(machine)
|
||||
return machine
|
||||
|
||||
machine.start()
|
||||
machine.succeed("echo -n 'secret' > /tmp/secret.key")
|
||||
machine.succeed("${tsp-create}")
|
||||
machine.succeed("${tsp-mount}")
|
||||
machine.succeed("${tsp-mount}") # verify that the command is idempotent
|
||||
|
||||
# mount nix-store in /mnt
|
||||
machine.succeed("mkdir -p /mnt/nix/store")
|
||||
machine.succeed("mount --bind /nix/store /mnt/nix/store")
|
||||
|
||||
machine.succeed("nix-store --load-db < ${pkgs.closureInfo {rootPaths = [installedTopLevel];}}/registration")
|
||||
|
||||
# fix "this is not a NixOS installation"
|
||||
machine.succeed("mkdir -p /mnt/etc")
|
||||
machine.succeed("touch /mnt/etc/NIXOS")
|
||||
|
||||
machine.succeed("mkdir -p /mnt/nix/var/nix/profiles")
|
||||
machine.succeed("nix-env -p /mnt/nix/var/nix/profiles/system --set ${installedTopLevel}")
|
||||
machine.succeed("NIXOS_INSTALL_BOOTLOADER=1 nixos-enter --root /mnt -- ${installedTopLevel}/bin/switch-to-configuration boot")
|
||||
machine.succeed("sync")
|
||||
machine.shutdown()
|
||||
|
||||
machine = create_test_machine(oldmachine=machine, args={ "name": "booted_machine" })
|
||||
machine.start()
|
||||
${bootCommands}
|
||||
machine.wait_for_unit("local-fs.target")
|
||||
${extraTestScript}
|
||||
'';
|
||||
};
|
||||
|
|
|
|||
|
|
@ -4,7 +4,12 @@
|
|||
makeDiskoTest {
|
||||
disko-config = import ../example/luks-lvm.nix;
|
||||
extraTestScript = ''
|
||||
machine.succeed("cryptsetup isLuks /dev/vdb2");
|
||||
machine.succeed("mountpoint /mnt/home");
|
||||
machine.succeed("cryptsetup isLuks /dev/vda2");
|
||||
machine.succeed("mountpoint /home");
|
||||
'';
|
||||
enableOCR = true;
|
||||
bootCommands = ''
|
||||
machine.wait_for_text("Passphrase for")
|
||||
machine.send_chars("secret\n")
|
||||
'';
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,9 +4,9 @@
|
|||
makeDiskoTest {
|
||||
disko-config = import ../example/lvm-raid.nix;
|
||||
extraTestScript = ''
|
||||
machine.succeed("mountpoint /mnt/home");
|
||||
machine.succeed("mountpoint /home");
|
||||
'';
|
||||
extraConfig = {
|
||||
boot.kernelModules = [ "dm-raid" "dm-mirror" ];
|
||||
boot.kernelModules = [ "dm-raid0" "dm-mirror" ];
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,6 +5,8 @@ makeDiskoTest {
|
|||
disko-config = import ../example/mdadm.nix;
|
||||
extraTestScript = ''
|
||||
machine.succeed("test -b /dev/md/raid1");
|
||||
machine.succeed("mountpoint /mnt/raid");
|
||||
machine.succeed("mountpoint /");
|
||||
'';
|
||||
efi = false;
|
||||
grub-devices = [ "/dev/vdb" "/dev/vdc" ];
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,9 +4,8 @@
|
|||
makeDiskoTest {
|
||||
disko-config = import ../example/zfs-over-legacy.nix;
|
||||
extraTestScript = ''
|
||||
machine.succeed("test -e /mnt/zfs_fs");
|
||||
machine.succeed("mountpoint /mnt");
|
||||
machine.succeed("mountpoint /mnt/zfs_fs");
|
||||
machine.succeed("test -e /zfs_fs");
|
||||
machine.succeed("mountpoint /zfs_fs");
|
||||
'';
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -3,6 +3,9 @@
|
|||
}:
|
||||
makeDiskoTest {
|
||||
disko-config = import ../example/zfs.nix;
|
||||
extraConfig = {
|
||||
fileSystems."/zfs_legacy_fs".options = [ "nofail" ]; # TODO find out why we need this!
|
||||
};
|
||||
extraTestScript = ''
|
||||
machine.succeed("test -b /dev/zvol/zroot/zfs_testvolume");
|
||||
|
||||
|
|
@ -19,9 +22,8 @@ makeDiskoTest {
|
|||
assert_property("zroot/zfs_testvolume", "volsize", "10M")
|
||||
assert_property("zroot/zfs_unmounted_fs", "mountpoint", "none")
|
||||
|
||||
machine.succeed("mountpoint /mnt");
|
||||
machine.succeed("mountpoint /mnt/zfs_fs");
|
||||
machine.succeed("mountpoint /mnt/zfs_legacy_fs");
|
||||
machine.succeed("mountpoint /mnt/ext4onzfs");
|
||||
machine.succeed("mountpoint /zfs_fs");
|
||||
machine.succeed("mountpoint /zfs_legacy_fs");
|
||||
machine.succeed("mountpoint /ext4onzfs");
|
||||
'';
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue