#!/usr/bin/env bash # Run a test script inside a throwaway overlay of the golden image, injecting a # fresh nina binary so we test the latest build without rebaking the golden. # The script's serial output is captured (this command's stdout); the overlay is # discarded afterward, leaving the golden untouched. # # Usage: run-in-vm.sh # Tunables via env: MEM_MB (2048), SMP (2), RUN_TIMEOUT (1800) set -euo pipefail GOLDEN="${1:?usage: run-in-vm.sh }" NINA="${2:?need nina binary}" SCRIPT="${3:?need test script}" MEM_MB="${MEM_MB:-2048}" SMP="${SMP:-2}" RUN_TIMEOUT="${RUN_TIMEOUT:-1800}" for f in "$GOLDEN" "$NINA" "$SCRIPT"; do [ -f "$f" ] || { echo "missing: $f" >&2; exit 1; }; done work="$(mktemp -d)" trap 'rm -rf "$work"' EXIT seed="$work/seed"; mkdir -p "$seed" cp "$NINA" "$seed/nina" cp "$SCRIPT" "$seed/runtest.sh" SEED_ISO="$work/seed.iso" hdiutil makehybrid -quiet -iso -joliet -default-volume-name NINASEED -o "$SEED_ISO" "$seed" overlay="$work/overlay.qcow2" qemu-img create -f qcow2 -b "$(cd "$(dirname "$GOLDEN")" && pwd)/$(basename "$GOLDEN")" -F qcow2 "$overlay" >/dev/null echo "throwaway overlay: $overlay (backing: $GOLDEN)" export RV_OVERLAY="$overlay" RV_SEED="$SEED_ISO" RV_MEM="$MEM_MB" RV_SMP="$SMP" RV_TIMEOUT="$RUN_TIMEOUT" expect -c ' set timeout 600 set overlay $env(RV_OVERLAY) set seed $env(RV_SEED) set mem $env(RV_MEM) set smp $env(RV_SMP) set runto $env(RV_TIMEOUT) spawn qemu-system-x86_64 \ -machine q35 -accel tcg -cpu max -smp $smp -m $mem \ -drive file=$overlay,if=virtio,format=qcow2 \ -drive file=$seed,media=cdrom,readonly=on \ -netdev user,id=n0 -device virtio-net-pci,netdev=n0 \ -nographic expect { timeout { puts "\n!! no autologin on serial"; exit 2 } "automatic login" {} } sleep 6 send "mkdir -p /mnt-seed && mount /dev/sr0 /mnt-seed && install -m755 /mnt-seed/nina /root/nina && echo KILN_RUN_BEGIN\r" expect { timeout { puts "\n!! seed/nina setup failed"; exit 3 } "KILN_RUN_BEGIN" {} } send "sh /mnt-seed/runtest.sh; echo KILN_RUN_END_RC=\$?\r" set timeout $runto expect { timeout { puts "\n!! test script timed out"; exit 4 } -re {KILN_RUN_END_RC=[0-9]+} {} } send "poweroff\r" set timeout 120 expect eof ' echo "=== overlay discarded; golden unchanged ==="