From cad1a6dd15ad9f8d73ade5dd22eaaf28e5e966ef Mon Sep 17 00:00:00 2001 From: Jonathan Haas Date: Sat, 18 Jul 2026 20:33:23 -0700 Subject: [PATCH] fix: make home deletion claimable --- crates/sandboxwich-api/src/handlers/leases.rs | 2 +- .../tests/http_contract/homes.rs | 47 +++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/crates/sandboxwich-api/src/handlers/leases.rs b/crates/sandboxwich-api/src/handlers/leases.rs index 26435f3..a1301a1 100644 --- a/crates/sandboxwich-api/src/handlers/leases.rs +++ b/crates/sandboxwich-api/src/handlers/leases.rs @@ -165,7 +165,7 @@ pub(crate) async fn claim_lease( .push( ") and ( - kind in ('provision_sandbox', 'run_prompt', 'stop_sandbox') + kind in ('provision_sandbox', 'run_prompt', 'stop_sandbox', 'delete_home') or exists ( select 1 from sandbox_placements p where p.sandbox_id = coalesce(jobs.sandbox_id, jobs.parent_sandbox_id) diff --git a/crates/sandboxwich-api/tests/http_contract/homes.rs b/crates/sandboxwich-api/tests/http_contract/homes.rs index 3fb9990..bcb61b6 100644 --- a/crates/sandboxwich-api/tests/http_contract/homes.rs +++ b/crates/sandboxwich-api/tests/http_contract/homes.rs @@ -169,6 +169,53 @@ async fn managed_home_delete_is_explicit_and_asynchronous() { .unwrap(); assert_eq!(deleting.home.state, HomeState::Deleting); assert_eq!(deleting.operation.unwrap().kind, OperationKind::DeleteHome); + + let registered: WorkerResponse = client + .post(format!("{}/workers/register", server.base_url)) + .json(&RegisterWorkerRequest { + name: "managed-home-delete-worker".into(), + provider: "kubernetes".into(), + capabilities: vec![ + WorkerCapability::ProvisionSandbox, + WorkerCapability::SandboxedContainer, + ], + max_concurrent_jobs: Some(1), + labels: Default::default(), + }) + .send() + .await + .unwrap() + .error_for_status() + .unwrap() + .json() + .await + .unwrap(); + let claimed: ClaimLeaseResponse = worker_client(®istered) + .post(format!( + "{}/workers/{}/leases/claim", + server.base_url, registered.worker.id + )) + .json(&ClaimLeaseRequest { + lease_seconds: Some(60), + sandbox_id: None, + kinds: Some(vec![JobKind::DeleteHome]), + }) + .send() + .await + .unwrap() + .error_for_status() + .unwrap() + .json() + .await + .unwrap(); + assert_eq!( + claimed + .lease + .expect("home delete must be claimable") + .job + .kind, + JobKind::DeleteHome + ); assert_eq!( client .delete(format!("{}/homes/{}", server.base_url, created.home.id))