simplify runInLinuxVM test

This commit is contained in:
Jörg Thalheim
2024-12-06 16:07:04 +01:00
committed by Mic92
parent 9da6036958
commit 54008e2ac6

View File

@@ -3,109 +3,25 @@
perSystem = perSystem =
{ {
self', self',
inputs',
lib, lib,
pkgs,
... ...
}: }:
let
pkgs = inputs'.nixpkgs.legacyPackages;
images = {
"ubuntu-22-04" = {
image = import <nix/fetchurl.nix> {
url = "https://app.vagrantup.com/generic/boxes/ubuntu2204/versions/4.1.12/providers/libvirt.box";
hash = "sha256-HNll0Qikw/xGIcogni5lz01vUv+R3o8xowP2EtqjuUQ=";
};
rootDisk = "box.img";
system = "x86_64-linux";
package = self'.checks.package-gui-installer-deb;
installCmd = "dpkg -i package/*.deb";
};
};
makeTest =
imageName: testName:
let
image = images.${imageName};
in
pkgs.runCommand "package-${testName}-install-test-${imageName}"
{ {
buildInputs = [ checks = lib.mkIf (pkgs.hostPlatform.system == "x86_64-linux") {
pkgs.qemu_kvm deb-gui-install-test = pkgs.vmTools.runInLinuxVM (
pkgs.openssh pkgs.runCommand "deb-gui-install-test" { } ''
]; ${pkgs.dpkg}/bin/dpkg -i ${self'.checks.package-gui-installer-deb}/*.deb
image = image.image; ls -la /usr/bin/clan-app
postBoot = image.postBoot or ""; ${pkgs.expect}/bin/expect -c '
installCmd = image.installCmd; spawn /usr/bin/clan-app
package = image.package; expect "Clan requires Nix to be installed. Would you like to install it now? (y/n)"
} send "n"
'' expect "Clan cannot run without Nix. Exiting."
shopt -s nullglob '
echo "Unpacking Vagrant box $image..."
tar xvf $image
image_type=$(qemu-img info ${image.rootDisk} | sed 's/file format: \(.*\)/\1/; t; d')
qemu-img create -b ./${image.rootDisk} -F "$image_type" -f qcow2 ./disk.qcow2
extra_qemu_opts="${image.extraQemuOpts or ""}"
# Add the config disk, required by the Ubuntu images.
config_drive=$(echo *configdrive.vmdk || true)
if [[ -n $config_drive ]]; then
extra_qemu_opts+=" -drive id=disk2,file=$config_drive,if=virtio"
fi
echo "Starting qemu..."
qemu-kvm -m 4096 -nographic \
-drive id=disk1,file=./disk.qcow2,if=virtio \
-netdev user,id=net0,restrict=yes,hostfwd=tcp::20022-:22 -device virtio-net-pci,netdev=net0 \
$extra_qemu_opts &
qemu_pid=$!
trap "kill $qemu_pid" EXIT
if ! [ -e ./vagrant_insecure_key ]; then
cp ${./vagrant_insecure_key} vagrant_insecure_key
fi
chmod 0400 ./vagrant_insecure_key
ssh_opts="-o StrictHostKeyChecking=no -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedKeyTypes=+ssh-rsa -i ./vagrant_insecure_key"
ssh="ssh -p 20022 -q $ssh_opts vagrant@localhost"
echo "Waiting for SSH..."
for ((i = 0; i < 120; i++)); do
echo "[ssh] Trying to connect..."
if $ssh -- true; then
echo "[ssh] Connected!"
break
fi
if ! kill -0 $qemu_pid; then
echo "qemu died unexpectedly"
exit 1
fi
sleep 1
done
if [[ -n $postBoot ]]; then
echo "Running post-boot commands..."
$ssh "set -ex; $postBoot"
fi
echo "Copying package..."
scp -r -P 20022 $ssh_opts $package vagrant@localhost:package
echo "Installing Package..."
$ssh "set -eux; $installScript"
touch $out touch $out
''; ''
in );
{ };
checks = lib.mapAttrs' (imageName: _image: {
name = "package-gui-install-test-${imageName}";
value = makeTest imageName "gui";
}) images;
}; };
} }