forked from tim/k3s-ansible
feat(ci): optimize Molecule VM creation
- reuse validated runner-owned Vagrant linked-clone masters\n- create the default guests in bounded two-machine batches\n- capture create timing and runner utilization diagnostics
This commit is contained in:
committed by
Techno Tim
parent
57f234c8da
commit
10bde4eff0
+81
@@ -0,0 +1,81 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -Eeuo pipefail
|
||||
|
||||
repo_root="$(git rev-parse --show-toplevel)"
|
||||
fixture="$(mktemp -d)"
|
||||
trap 'rm -rf -- "$fixture"' EXIT
|
||||
|
||||
mock_bin="$fixture/bin"
|
||||
mock_state="$fixture/state"
|
||||
mock_home="$fixture/home"
|
||||
mock_vagrant_home="$fixture/vagrant-home"
|
||||
mock_box_dir="$mock_vagrant_home/boxes/generic-VAGRANTSLASH-ubuntu2204/4.3.12/amd64/virtualbox"
|
||||
mock_vbox_root="$mock_home/VirtualBox VMs"
|
||||
mock_master_root="$mock_home/.cache/k3s-ci/vagrant-masters"
|
||||
lock_file="$fixture/vagrant-boxes.lock"
|
||||
mkdir -p -- "$mock_bin" "$mock_state" "$mock_box_dir" "$mock_vbox_root"
|
||||
printf '%s\n' 'generic/ubuntu2204 4.3.12 amd64' > "$lock_file"
|
||||
ln -s "$repo_root/.github/scripts/test-fixtures/mock-vboxmanage" "$mock_bin/VBoxManage"
|
||||
ln -s "$repo_root/.github/scripts/test-fixtures/mock-vagrant" "$mock_bin/vagrant"
|
||||
ln -s "$repo_root/.github/scripts/test-fixtures/mock-flock" "$mock_bin/flock"
|
||||
|
||||
export PATH="$mock_bin:$PATH"
|
||||
export HOME="$mock_home"
|
||||
export VAGRANT_HOME="$mock_vagrant_home"
|
||||
export VAGRANT_BOX_LOCK_FILE="$lock_file"
|
||||
export K3S_CI_REPOSITORY_ROOT="$repo_root"
|
||||
export K3S_CI_VAGRANT_MASTER_ROOT="$mock_master_root"
|
||||
export K3S_CI_VIRTUALBOX_ROOT="$mock_vbox_root"
|
||||
export MOCK_VBOX_STATE="$mock_state"
|
||||
export MOCK_VBOX_ROOT="$mock_vbox_root"
|
||||
export MOCK_BOX_DIR="$mock_box_dir"
|
||||
export MOCK_VBOX_LOG="$fixture/vbox.log"
|
||||
export MOCK_VAGRANT_LOG="$fixture/vagrant.log"
|
||||
: > "$MOCK_VBOX_LOG"
|
||||
: > "$MOCK_VAGRANT_LOG"
|
||||
|
||||
unowned_uuid='99999999-9999-4999-8999-999999999999'
|
||||
printf '%s\n' "$unowned_uuid" > "$mock_box_dir/master_id"
|
||||
|
||||
script="$repo_root/.github/scripts/prepare-vagrant-box-masters.sh"
|
||||
first_output="$fixture/first-output"
|
||||
second_output="$fixture/second-output"
|
||||
third_output="$fixture/third-output"
|
||||
|
||||
"$script" > "$first_output"
|
||||
mapping_file="$mock_master_root/generic_ubuntu2204-4.3.12-amd64.uuid"
|
||||
test -s "$mapping_file"
|
||||
cmp -s "$mapping_file" "$mock_box_dir/master_id"
|
||||
grep -Fq 'Created and recorded owned master' "$first_output"
|
||||
grep -Fq 'modifyvm' "$MOCK_VBOX_LOG"
|
||||
grep -Fq 'setextradata' "$MOCK_VBOX_LOG"
|
||||
if grep -Fq "$unowned_uuid" "$MOCK_VBOX_LOG"; then
|
||||
printf 'unowned cached master UUID was unexpectedly inspected or modified\n' >&2
|
||||
exit 1
|
||||
fi
|
||||
if grep -Eq 'unregistervm|closemedium' "$MOCK_VBOX_LOG"; then
|
||||
printf 'master preparation invoked a destructive VirtualBox command\n' >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
: > "$MOCK_VAGRANT_LOG"
|
||||
"$script" > "$second_output"
|
||||
grep -Fq 'Reusing owned master' "$second_output"
|
||||
if grep -Fq 'up ' "$MOCK_VAGRANT_LOG"; then
|
||||
printf 'valid owned master was unexpectedly rebuilt\n' >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
stale_uuid="$(tr -d '[:space:]' < "$mapping_file")"
|
||||
rm -f -- "$mock_state/vm-$stale_uuid"
|
||||
: > "$MOCK_VAGRANT_LOG"
|
||||
"$script" > "$third_output"
|
||||
grep -Fq 'rebuilding without deleting any VM or disk' "$third_output"
|
||||
grep -Fq 'up ' "$MOCK_VAGRANT_LOG"
|
||||
if grep -Eq 'unregistervm|closemedium' "$MOCK_VBOX_LOG"; then
|
||||
printf 'stale master recovery invoked a destructive VirtualBox command\n' >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
printf 'Vagrant box master preparation fixture test passed\n'
|
||||
Reference in New Issue
Block a user