Skip to content

Commit b3e1e01

Browse files
committed
fix(islo): keep explicit lease ids authoritative
1 parent f56dfd1 commit b3e1e01

2 files changed

Lines changed: 30 additions & 7 deletions

File tree

internal/providers/islo/backend.go

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -412,6 +412,18 @@ func resolveIsloLeaseID(id, repoRoot string, reclaim bool) (string, string, stri
412412
if id == "" {
413413
return "", "", "", exit(2, "provider=islo requires a Crabbox-created sandbox name, lease id, or slug")
414414
}
415+
if strings.HasPrefix(id, isloLeasePrefix) {
416+
name := strings.TrimPrefix(id, isloLeasePrefix)
417+
if !isCrabboxIsloSandboxName(name) {
418+
return "", "", "", exit(4, "islo lease %q is not a Crabbox-owned sandbox", id)
419+
}
420+
if claim, ok, err := resolveExactIsloLeaseClaim(id); err != nil {
421+
return "", "", "", err
422+
} else if ok {
423+
return claim.LeaseID, name, blank(claim.Slug, newLeaseSlug(claim.LeaseID)), nil
424+
}
425+
return id, name, newLeaseSlug(id), nil
426+
}
415427
if claim, ok, err := resolveIsloClaim(id); err != nil {
416428
return "", "", "", err
417429
} else if ok {
@@ -422,20 +434,24 @@ func resolveIsloLeaseID(id, repoRoot string, reclaim bool) (string, string, stri
422434
}
423435
return claim.LeaseID, strings.TrimPrefix(claim.LeaseID, isloLeasePrefix), blank(claim.Slug, newLeaseSlug(claim.LeaseID)), nil
424436
}
425-
if strings.HasPrefix(id, isloLeasePrefix) {
426-
name := strings.TrimPrefix(id, isloLeasePrefix)
427-
if !isCrabboxIsloSandboxName(name) {
428-
return "", "", "", exit(4, "islo lease %q is not a Crabbox-owned sandbox", id)
429-
}
430-
return id, name, newLeaseSlug(id), nil
431-
}
432437
if !isCrabboxIsloSandboxName(id) {
433438
return "", "", "", exit(4, "islo sandbox %q is not claimed by Crabbox; use a Crabbox slug or %s<crabbox-sandbox-name>", id, isloLeasePrefix)
434439
}
435440
leaseID := isloLeasePrefix + id
436441
return leaseID, id, newLeaseSlug(leaseID), nil
437442
}
438443

444+
func resolveExactIsloLeaseClaim(leaseID string) (core.LeaseClaim, bool, error) {
445+
claim, ok, err := resolveLeaseClaim(leaseID)
446+
if err != nil {
447+
return claim, ok, err
448+
}
449+
if ok && claim.Provider == isloProvider && claim.LeaseID == leaseID {
450+
return claim, true, nil
451+
}
452+
return core.LeaseClaim{}, false, nil
453+
}
454+
439455
func isloCleanupCommand(leaseID string) string {
440456
return fmt.Sprintf("crabbox stop --provider %s %s", isloProvider, shellQuote(leaseID))
441457
}

internal/providers/islo/backend_test.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,13 @@ func TestResolveIsloLeaseIDIgnoresSyntheticSlugCollision(t *testing.T) {
157157
if leaseID != "isb_crabbox-repo-abcdef" || name != "crabbox-repo-abcdef" || slug == "isb-crabbox-repo-abcdef" {
158158
t.Fatalf("lease=%q name=%q slug=%q", leaseID, name, slug)
159159
}
160+
leaseID, name, slug, err = resolveIsloLeaseID("isb_crabbox-repo-abcdef", root, false)
161+
if err != nil {
162+
t.Fatal(err)
163+
}
164+
if leaseID != "isb_crabbox-repo-abcdef" || name != "crabbox-repo-abcdef" || slug == "isb-crabbox-repo-abcdef" {
165+
t.Fatalf("explicit lease=%q name=%q slug=%q", leaseID, name, slug)
166+
}
160167
}
161168

162169
func TestIsloCleanupCommandQuotesLeaseID(t *testing.T) {

0 commit comments

Comments
 (0)