package hostops import ( "errors" "testing" "github.com/carlosframework/platform/internal/hostclaim" ) func TestPurgeRetirementRequiresFree(t *testing.T) { holder := &hostclaim.Holder{Incarnation: "old"} p := PurgeHost{Holder: holder, FreeFromGen: 10} c := hostclaim.Claim{Gen: 11, Holder: holder, RetiredIncarnations: []string{"old"}, Op: hostclaim.Op{Kind: hostclaim.KindParking, ID: "purge"}, Obligations: []hostclaim.Obligation{{ID: "park", Op: "purge", Kind: "park-local", Box: "box", Owner: "box:box", Retirement: "retirement"}}} if purgeHostFreed(c, p) { t.Fatal("history bypassed unfinished parking") } c.Obligations = nil if purgeHostFreed(c, p) { t.Fatal("empty chores bypassed FreeAfterPark") } c.Holder = nil c.Op = hostclaim.Op{} if !purgeHostFreed(c, p) { t.Fatal("completed free not recognized") } c.Holder = &hostclaim.Holder{Incarnation: "successor"} if !purgeHostFreed(c, p) { t.Fatal("successor hid completed retirement") } c.RetiredIncarnations = nil p.FreeFromGen = 0 if purgeHostFreed(c, p) { t.Fatal("unproven successor accepted") } } func TestRetirePurgeHostsDoesNotCompleteParking(t *testing.T) { f := newFixture(t) host := "one.bab.example.com" record := f.record(t, host) before, err := hostclaim.Read(f.ctx, f.store, host) if err != nil { t.Fatal(err) } obs, err := hostclaim.Update(f.ctx, f.store, before, hostclaim.BeginCreate(record.Holder, record.Body, "create", "test", f.now)) if err != nil { t.Fatal(err) } obs, err = hostclaim.Update(f.ctx, f.store, obs, hostclaim.CompleteCreate("create", "box-a")) if err != nil { t.Fatal(err) } obs, err = hostclaim.Update(f.ctx, f.store, obs, hostclaim.BeginDelete("purge", "test", "record-tag", f.now, nil, nil, "")) if err != nil { t.Fatal(err) } obs, err = hostclaim.Update(f.ctx, f.store, obs, hostclaim.ToParking("purge", nil, nil, f.c.NewID)) if err != nil { t.Fatal(err) } if len(obs.Claim.Obligations) == 0 { t.Fatal("fixture has no outstanding parking") } j := PurgeJournal{V: 1, Purge: Purge{ID: "purge", Phase: "torn-down"}, Account: "bab", App: "jam", AppID: "app-id", Hosts: map[string]PurgeHost{host: {Holder: obs.Claim.Holder}}} f.c.Control = seedPurge(t, f.ctx, f.store, f.now, j) if err = f.c.RetirePurgeHosts(f.ctx, "bab", "jam", "purge", "app-id"); !errors.Is(err, ErrPending) { t.Fatalf("parking completion: %v", err) } saved, _, err := ReadPurgeJournal(f.ctx, f.store, "bab", "jam", "purge", "app-id") if err != nil { t.Fatal(err) } if saved.Hosts[host].Retired { t.Fatal("journal completed before freeing") } }