From 0c50c04b4c24fc7f45f2a5cef9a753208696bb92 Mon Sep 17 00:00:00 2001 From: Natalie Date: Sat, 27 Jun 2026 14:51:06 -0400 Subject: [PATCH] feat(infra): dist:prune to delete superseded golden snapshots Incremental rebuilds accumulate snapshots (~$0.40/mo each). dist:prune keeps the newest N (default 2: current + one rollback); dist:image reminds you to run it. Co-Authored-By: Claude Opus 4.8 --- scripts/run/dist.sh | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/scripts/run/dist.sh b/scripts/run/dist.sh index 78b16b17..7a05a1ec 100755 --- a/scripts/run/dist.sh +++ b/scripts/run/dist.sh @@ -52,6 +52,7 @@ cmd_dist() { Distributed test/train fleet (DigitalOcean). Set TF_VAR_do_token first. ./run dist:check offline: fmt + validate + mocked test (no token/spend) ./run dist:image [--cold] (re)build golden image — incremental by default (~3-8min vs ~20 cold) + ./run dist:prune [keep=2] delete superseded golden snapshots (~$0.40/mo each) ./run dist:up [size] [region] e.g. ./run dist:up 10 ./run dist:sim [turn_limit] [--destroy-after] ./run dist:train [--destroy-after] @@ -106,6 +107,20 @@ cmd_dist_image() { fi export PKR_VAR_base_image="$base" ( cd "$root/infra/packer" && packer init golden-image.pkr.hcl >/dev/null && packer build golden-image.pkr.hcl ) + echo "tip: each rebuild leaves a snapshot (~\$0.40/mo) — './run dist:prune' deletes superseded ones." +} + +cmd_dist_prune() { + # Delete superseded golden snapshots, keeping the newest N (default 2). + local keep="${1:-2}" pat old id + pat="$(cat ~/.vault/do_pat_mc 2>/dev/null)" + [ -n "$pat" ] || { echo "no ~/.vault/do_pat_mc" >&2; return 1; } + old="$(curl -s -H "Authorization: Bearer $pat" "https://api.digitalocean.com/v2/snapshots?resource_type=droplet&per_page=200" \ + | python3 -c "import sys,json;s=[x for x in json.load(sys.stdin)['snapshots'] if x['name'].startswith('mc-golden')];s.sort(key=lambda x:x['created_at']);[print(x['id']) for x in s[:-${keep}]]" 2>/dev/null)" + [ -n "$old" ] || { echo "nothing to prune (<= $keep golden snapshots)"; return 0; } + for id in $old; do + curl -s -o /dev/null -w " pruned golden snapshot $id: http %{http_code}\n" -X DELETE -H "Authorization: Bearer $pat" "https://api.digitalocean.com/v2/snapshots/$id" + done } cmd_dist_up() {