From afbb8d59f971a0c906e13179d6894596bf984d18 Mon Sep 17 00:00:00 2001 From: Daniel Maksymilian Syrnicki Date: Sat, 18 Apr 2026 13:59:42 +0200 Subject: [PATCH] fix(smoke): reuse existing PVE-side ISO instead of delete+re-upload MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The delete branch required Datastore.Allocate (or was hitting a privilege-separated token ACL edge case) and produced 403s on re-runs against the same commit SHA. Since the ISO bytes are reproducible for a given SHA — furtka-.iso is content-addressed — we can just reuse whatever is already in PVE storage instead of cycling it. Fixes the "runs-on-same-sha" re-dispatch case without needing any extra PVE permission, and shaves ~2 min off repeated smoke runs. Co-Authored-By: Claude Opus 4.7 (1M context) --- scripts/smoke-vm.sh | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/scripts/smoke-vm.sh b/scripts/smoke-vm.sh index a05527f..5166b89 100755 --- a/scripts/smoke-vm.sh +++ b/scripts/smoke-vm.sh @@ -69,22 +69,21 @@ echo "==> node=$NODE sha=$SHORT_SHA iso=$(basename "$ISO_PATH")" ISO_NAME="furtka-${SHORT_SHA}.iso" VOLID="${ISO_STORAGE}:iso/${ISO_NAME}" -# --- Step 1: upload ISO ---------------------------------------------------- -# PVE's upload endpoint errors if the file exists. Delete first so re-runs -# on the same SHA (e.g. workflow re-dispatch) work. +# --- Step 1: upload ISO (or reuse if same SHA already on PVE) --------------- +# For a given commit SHA the ISO bytes are reproducible, so if furtka-.iso +# is already in PVE storage from a prior smoke run we reuse it and skip the +# upload. Avoids DELETE-permission friction and shaves ~2 min off re-runs. if api "$API/nodes/$NODE/storage/$ISO_STORAGE/content/$VOLID" \ --output /dev/null 2>/dev/null; then - echo "==> removing stale ISO $VOLID" - api --request DELETE "$API/nodes/$NODE/storage/$ISO_STORAGE/content/$VOLID" \ - --output /dev/null + echo "==> reusing existing ISO $VOLID" +else + echo "==> uploading ISO as $ISO_NAME" + api --request POST "$API/nodes/$NODE/storage/$ISO_STORAGE/upload" \ + --form "content=iso" \ + --form "filename=@${ISO_PATH};filename=${ISO_NAME}" \ + > /dev/null fi -echo "==> uploading ISO as $ISO_NAME" -api --request POST "$API/nodes/$NODE/storage/$ISO_STORAGE/upload" \ - --form "content=iso" \ - --form "filename=@${ISO_PATH};filename=${ISO_NAME}" \ - > /dev/null - # --- Step 2: pick a free VMID in the reserved range ------------------------ # List VMs on the node, filter by range, pick the lowest integer not in use. USED="$(api "$API/nodes/$NODE/qemu" | python3 -c '