run-in-vm.sh

2.3 KB · raw

1#!/usr/bin/env bash2# Run a test script inside a throwaway overlay of the golden image, injecting a3# fresh nina binary so we test the latest build without rebaking the golden.4# The script's serial output is captured (this command's stdout); the overlay is5# discarded afterward, leaving the golden untouched.6#7# Usage: run-in-vm.sh <golden.qcow2> <nina-linux-binary> <test-script.sh>8# Tunables via env: MEM_MB (2048), SMP (2), RUN_TIMEOUT (1800)9set -euo pipefail1011GOLDEN="${1:?usage: run-in-vm.sh <golden.qcow2> <nina-bin> <test-script>}"12NINA="${2:?need nina binary}"13SCRIPT="${3:?need test script}"14MEM_MB="${MEM_MB:-2048}"15SMP="${SMP:-2}"16RUN_TIMEOUT="${RUN_TIMEOUT:-1800}"17for f in "$GOLDEN" "$NINA" "$SCRIPT"; do [ -f "$f" ] || { echo "missing: $f" >&2; exit 1; }; done1819work="$(mktemp -d)"20trap 'rm -rf "$work"' EXIT21seed="$work/seed"; mkdir -p "$seed"22cp "$NINA" "$seed/nina"23cp "$SCRIPT" "$seed/runtest.sh"24SEED_ISO="$work/seed.iso"25hdiutil makehybrid -quiet -iso -joliet -default-volume-name NINASEED -o "$SEED_ISO" "$seed"2627overlay="$work/overlay.qcow2"28qemu-img create -f qcow2 -b "$(cd "$(dirname "$GOLDEN")" && pwd)/$(basename "$GOLDEN")" -F qcow2 "$overlay" >/dev/null29echo "throwaway overlay: $overlay  (backing: $GOLDEN)"3031export RV_OVERLAY="$overlay" RV_SEED="$SEED_ISO" RV_MEM="$MEM_MB" RV_SMP="$SMP" RV_TIMEOUT="$RUN_TIMEOUT"3233expect -c '34  set timeout 60035  set overlay $env(RV_OVERLAY)36  set seed    $env(RV_SEED)37  set mem     $env(RV_MEM)38  set smp     $env(RV_SMP)39  set runto   $env(RV_TIMEOUT)4041  spawn qemu-system-x86_64 \42    -machine q35 -accel tcg -cpu max -smp $smp -m $mem \43    -drive file=$overlay,if=virtio,format=qcow2 \44    -drive file=$seed,media=cdrom,readonly=on \45    -netdev user,id=n0 -device virtio-net-pci,netdev=n0 \46    -nographic4748  expect {49    timeout { puts "\n!! no autologin on serial"; exit 2 }50    "automatic login" {}51  }52  sleep 653  send "mkdir -p /mnt-seed && mount /dev/sr0 /mnt-seed && install -m755 /mnt-seed/nina /root/nina && echo KILN_RUN_BEGIN\r"54  expect { timeout { puts "\n!! seed/nina setup failed"; exit 3 } "KILN_RUN_BEGIN" {} }55  send "sh /mnt-seed/runtest.sh; echo KILN_RUN_END_RC=\$?\r"56  set timeout $runto57  expect {58    timeout { puts "\n!! test script timed out"; exit 4 }59    -re {KILN_RUN_END_RC=[0-9]+} {}60  }61  send "poweroff\r"62  set timeout 12063  expect eof64'65echo "=== overlay discarded; golden unchanged ==="