interactive-vm: convert into NixOS module

This commit is contained in:
Michael Hoang 2024-09-08 03:29:33 +10:00
parent ba66c22ec1
commit 0943a50ee7
3 changed files with 44 additions and 46 deletions

View file

@ -16,8 +16,6 @@ let
# a version of makeDiskImage which runs outside of the store # a version of makeDiskImage which runs outside of the store
makeDiskImagesScript = args: (import ./make-disk-image.nix ({ inherit diskoLib; } // args)).impure; makeDiskImagesScript = args: (import ./make-disk-image.nix ({ inherit diskoLib; } // args)).impure;
makeVMRunner = args: import ./interactive-vm.nix ({ inherit diskoLib; } // args);
testLib = import ./tests.nix { inherit lib makeTest eval-config; }; testLib = import ./tests.nix { inherit lib makeTest eval-config; };
# like lib.types.oneOf but instead of a list takes an attrset # like lib.types.oneOf but instead of a list takes an attrset
# uses the field "type" to find the correct type in the attrset # uses the field "type" to find the correct type in the attrset

View file

@ -1,10 +1,9 @@
{ nixosConfig # We need to specify extendModules here to ensure that it is available
, diskoLib # in args for makeDiskImages
, pkgs ? nixosConfig.pkgs { diskoLib, modulesPath, config, pkgs, lib, extendModules, ... }@args:
}:
let let
lib = pkgs.lib; vm_disko = (diskoLib.testLib.prepareDiskoConfig config diskoLib.testLib.devices).disko;
vm_disko = (diskoLib.testLib.prepareDiskoConfig nixosConfig.config diskoLib.testLib.devices).disko;
cfg_ = (lib.evalModules { cfg_ = (lib.evalModules {
modules = lib.singleton { modules = lib.singleton {
# _file = toString input; # _file = toString input;
@ -22,7 +21,7 @@ let
}).config; }).config;
disks = lib.attrValues cfg_.disko.devices.disk; disks = lib.attrValues cfg_.disko.devices.disk;
diskoImages = diskoLib.makeDiskImages { diskoImages = diskoLib.makeDiskImages {
nixosConfig = nixosConfig; nixosConfig = args;
copyNixStore = false; copyNixStore = false;
extraConfig = { extraConfig = {
disko.devices = cfg_.disko.devices; disko.devices = cfg_.disko.devices;
@ -45,40 +44,38 @@ let
driveExtraOpts.werror = "report"; driveExtraOpts.werror = "report";
}) })
(builtins.tail disks); (builtins.tail disks);
in nixosConfig.extendModules {
modules = [
({ modulesPath, config, pkgs, ... }: {
imports = [
(modulesPath + "/virtualisation/qemu-vm.nix")
];
virtualisation.useEFIBoot = config.disko.tests.efi; diskoBasedConfiguration = {
virtualisation.memorySize = config.disko.memSize; # generated from disko config
virtualisation.useDefaultFilesystems = false; virtualisation.fileSystems = cfg_.disko.devices._config.fileSystems;
virtualisation.diskImage = null; boot = cfg_.disko.devices._config.boot or { };
virtualisation.qemu.drives = [ rootDisk ] ++ otherDisks; swapDevices = cfg_.disko.devices._config.swapDevices or [ ];
boot.zfs.devNodes = "/dev/disk/by-uuid"; # needed because /dev/disk/by-id is empty in qemu-vms };
boot.zfs.forceImportAll = true; in
{
system.build.vmWithDisko = pkgs.writers.writeDashBin "disko-vm" '' imports = [
set -efux (modulesPath + "/virtualisation/qemu-vm.nix")
export tmp=$(mktemp -d) diskoBasedConfiguration
trap 'rm -rf "$tmp"' EXIT
${lib.concatMapStringsSep "\n" (disk: ''
${pkgs.qemu}/bin/qemu-img create -f qcow2 \
-b ${diskoImages}/${disk.name}.qcow2 \
-F qcow2 "$tmp"/${disk.name}.qcow2
'') disks}
set +f
${config.system.build.vm}/bin/run-*-vm
'';
})
{
# generated from disko config
virtualisation.fileSystems = cfg_.disko.devices._config.fileSystems;
boot = cfg_.disko.devices._config.boot or { };
swapDevices = cfg_.disko.devices._config.swapDevices or [ ];
}
nixosConfig.config.disko.tests.extraConfig
]; ];
virtualisation.useEFIBoot = config.disko.tests.efi;
virtualisation.memorySize = config.disko.memSize;
virtualisation.useDefaultFilesystems = false;
virtualisation.diskImage = null;
virtualisation.qemu.drives = [ rootDisk ] ++ otherDisks;
boot.zfs.devNodes = "/dev/disk/by-uuid"; # needed because /dev/disk/by-id is empty in qemu-vms
boot.zfs.forceImportAll = true;
system.build.vmWithDisko = pkgs.writers.writeDashBin "disko-vm" ''
set -efux
export tmp=$(mktemp -d)
trap 'rm -rf "$tmp"' EXIT
${lib.concatMapStringsSep "\n" (disk: ''
${pkgs.qemu}/bin/qemu-img create -f qcow2 \
-b ${diskoImages}/${disk.name}.qcow2 \
-F qcow2 "$tmp"/${disk.name}.qcow2
'') disks}
set +f
${config.system.build.vm}/bin/run-*-vm
'';
} }

View file

@ -8,9 +8,12 @@ let
}; };
cfg = config.disko; cfg = config.disko;
vmVariantWithDisko = diskoLib.makeVMRunner { vmVariantWithDisko = extendModules {
inherit pkgs; modules = [
nixosConfig = args; ./lib/interactive-vm.nix
{ _module.args = { inherit diskoLib; }; }
config.disko.tests.extraConfig
];
}; };
in in
{ {