| # Sandbox pool health + capacity, every 15 minutes. | |
| # NOTE: the readiness JSON puts "ready":true ~190 chars in — do NOT truncate the response | |
| # below that, or every healthy probe reads as a failure (this misdiagnosis cost hours once). | |
| while true; do | |
| CAP=$(curl -s -m 30 "$SANDBOX_BASE_URL/resources" -H "X-API-Key: $SANDBOX_API_KEY" | python3 -c " | |
| import json,sys,collections | |
| try: | |
| d=json.load(sys.stdin); c=collections.Counter(p['phase'] for p in d['sandbox_pods']) | |
| print(f\"pods={dict(c)} avail_cpu={round(d['available']['cpu'])}\") | |
| except Exception: print('capacity-unknown')" 2>/dev/null) | |
| R=$(curl -s -m 60 -X POST "$SANDBOX_BASE_URL/sandboxes" -H "X-API-Key: $SANDBOX_API_KEY" \ | |
| -H 'Content-Type: application/json' -d '{"image":"ubuntu:22.04","block_network":false,"cpu":"1","memory":"4Gi"}') | |
| ID=$(echo "$R" | python3 -c "import json,sys;print(json.load(sys.stdin).get('sandbox_id',''))" 2>/dev/null) | |
| if [ -z "$ID" ]; then | |
| echo "$(date -Is) CREATE_FAIL $CAP $(echo "$R" | head -c 120)" | |
| else | |
| S=$(date +%s) | |
| RES=$(timeout 260 curl -s "$SANDBOX_BASE_URL/sandboxes/$ID/wait?timeout=240" -H "X-API-Key: $SANDBOX_API_KEY") | |
| E=$(date +%s) | |
| case "$RES" in *'"ready":true'*) OK=READY;; *) OK=FAIL;; esac | |
| echo "$(date -Is) $OK $((E-S))s $CAP" | |
| curl -s -X DELETE "$SANDBOX_BASE_URL/sandboxes/$ID" -H "X-API-Key: $SANDBOX_API_KEY" >/dev/null | |
| fi | |
| sleep 900 | |
| done | |