notes: 2.3.0 -> 2.3.1 (#352950)
[NixPkgs.git] / nixos / tests / os-prober.nix
blob034de0620d885735dbc8727b03a315bf8656eff4
1 import ./make-test-python.nix ({pkgs, lib, ...}:
2 let
3   # A filesystem image with a (presumably) bootable debian
4   debianImage = pkgs.vmTools.diskImageFuns.debian11i386 {
5     # os-prober cannot detect systems installed on disks without a partition table
6     # so we create the disk ourselves
7     createRootFS = with pkgs; ''
8       ${parted}/bin/parted --script /dev/vda mklabel msdos
9       ${parted}/sbin/parted --script /dev/vda -- mkpart primary ext2 1M -1s
10       mkdir /mnt
11       ${e2fsprogs}/bin/mkfs.ext4 -O '^metadata_csum_seed' /dev/vda1
12       ${util-linux}/bin/mount -t ext4 /dev/vda1 /mnt
14       if test -e /mnt/.debug; then
15         exec ${bash}/bin/sh
16       fi
17       touch /mnt/.debug
19       mkdir /mnt/proc /mnt/dev /mnt/sys
20     '';
21     extraPackages = [
22       # /etc/os-release
23       "base-files"
24       # make the disk bootable-looking
25       "grub2" "linux-image-686"
26     ];
27     # install grub
28     postInstall = ''
29       ln -sf /proc/self/mounts > /etc/mtab
30       PATH=/usr/bin:/bin:/usr/sbin:/sbin $chroot /mnt \
31         grub-install /dev/vda --force
32       PATH=/usr/bin:/bin:/usr/sbin:/sbin $chroot /mnt \
33         update-grub
34     '';
35   };
37   # a part of the configuration of the test vm
38   simpleConfig = {
39     boot.loader.grub = {
40       enable = true;
41       useOSProber = true;
42       device = "/dev/vda";
43       # vda is a filesystem without partition table
44       forceInstall = true;
45     };
46     nix.settings = {
47       substituters = lib.mkForce [];
48       hashed-mirrors = null;
49       connect-timeout = 1;
50     };
51     # save some memory
52     documentation.enable = false;
53   };
54   # /etc/nixos/configuration.nix for the vm
55   configFile = pkgs.writeText "configuration.nix"  ''
56     {config, pkgs, lib, ...}: ({
57     imports =
58           [ ./hardware-configuration.nix
59             <nixpkgs/nixos/modules/testing/test-instrumentation.nix>
60           ];
61     } // lib.importJSON ${
62       pkgs.writeText "simpleConfig.json" (builtins.toJSON simpleConfig)
63     })
64   '';
65 in {
66   name = "os-prober";
68   nodes.machine = { config, pkgs, ... }: (simpleConfig // {
69       imports = [ ../modules/profiles/installation-device.nix
70                   ../modules/profiles/base.nix ];
71       virtualisation.memorySize = 1300;
72       # To add the secondary disk:
73       virtualisation.qemu.options = [ "-drive index=2,file=${debianImage}/disk-image.qcow2,read-only,if=virtio" ];
75       # The test cannot access the network, so any packages
76       # nixos-rebuild needs must be included in the VM.
77       system.extraDependencies = with pkgs;
78         [
79           bintools
80           brotli
81           brotli.dev
82           brotli.lib
83           desktop-file-utils
84           docbook5
85           docbook_xsl_ns
86           grub2
87           kbd
88           kbd.dev
89           kmod.dev
90           libarchive
91           libarchive.dev
92           libxml2.bin
93           libxslt.bin
94           nixos-artwork.wallpapers.simple-dark-gray-bottom
95           ntp
96           perlPackages.ListCompare
97           perlPackages.XMLLibXML
98           python3
99           shared-mime-info
100           stdenv
101           sudo
102           texinfo
103           unionfs-fuse
104           xorg.lndir
106           # add curl so that rather than seeing the test attempt to download
107           # curl's tarball, we see what it's trying to download
108           curl
109         ];
110   });
112   testScript = ''
113     machine.start()
114     machine.succeed("udevadm settle")
115     machine.wait_for_unit("multi-user.target")
116     print(machine.succeed("lsblk"))
118     # check that os-prober works standalone
119     machine.succeed(
120         "${pkgs.os-prober}/bin/os-prober | grep /dev/vdb1"
121     )
123     # rebuild and test that debian is available in the grub menu
124     machine.succeed("nixos-generate-config")
125     machine.copy_from_host(
126         "${configFile}",
127         "/etc/nixos/configuration.nix",
128     )
129     machine.succeed("nixos-rebuild boot --show-trace >&2")
131     machine.succeed("egrep 'menuentry.*debian' /boot/grub/grub.cfg")
132   '';