46 lines
1.6 KiB
Text
46 lines
1.6 KiB
Text
#!/usr/bin/env nu
|
|
# Destroy an ephemeral buildkit runner VM by lease_id label.
|
|
# Idempotent: exits 0 with status="not_found" when the server is already gone.
|
|
# Outputs JSON {status, lease_id, server_id?} to stdout.
|
|
|
|
use std log
|
|
|
|
def main [
|
|
--lease_id: string
|
|
]: nothing -> nothing {
|
|
if ($lease_id | is-empty) {
|
|
error make { msg: "--lease_id is required" }
|
|
}
|
|
|
|
let list_out = do {
|
|
^hcloud server list --selector $"lease_id=($lease_id)" --output json
|
|
} | complete
|
|
if $list_out.exit_code != 0 {
|
|
error make { msg: $"hcloud server list failed:\n($list_out.stderr)" }
|
|
}
|
|
|
|
let servers = $list_out.stdout | from json
|
|
if ($servers | length) == 0 {
|
|
log info $"No server found for lease_id=($lease_id) — already destroyed or never created."
|
|
{ status: "not_found", lease_id: $lease_id } | to json
|
|
return
|
|
}
|
|
|
|
if ($servers | length) > 1 {
|
|
log warning $"Multiple servers found for lease_id=($lease_id) — destroying all ($servers | length)."
|
|
}
|
|
|
|
for server in $servers {
|
|
let server_id = $server.id
|
|
let server_name = $server.name
|
|
log info $"Deleting server ($server_name) id=($server_id)..."
|
|
let del_out = do { ^hcloud server delete $server_id } | complete
|
|
if $del_out.exit_code != 0 {
|
|
error make { msg: $"hcloud server delete ($server_id) failed:\n($del_out.stderr)" }
|
|
}
|
|
log info $"Server ($server_name) id=($server_id) deleted."
|
|
}
|
|
|
|
let first_id = $servers | first | get id
|
|
{ status: "deleted", lease_id: $lease_id, server_id: $first_id } | to json
|
|
}
|