package hostops import ( "context" "errors" "os" "github.com/carlosframework/platform/internal/hostclaim" "github.com/carlosframework/platform/internal/provision" ) func (c Controller) RetireRecord(ctx context.Context, ref provision.RetireRef) error { if err := c.ready(); err != nil { return err } key := provision.RecordKey(ref.Account, ref.App, ref.Host) if ref.Family == "sidecar" { key = provision.SidecarRecordKey(ref.Account, ref.App, ref.Name) } rec, rerr := ReadRecord(ctx, c.Store, key) if rerr != nil && !errors.Is(rerr, os.ErrNotExist) { return rerr } obs, err := hostclaim.Read(ctx, c.Store, ref.Host) if err != nil { return err } if obs.Absent { if errors.Is(rerr, os.ErrNotExist) { return nil } return ErrPending } h := obs.Claim.Holder if h == nil { if rerr == nil { _, err = RemoveOrphan(ctx, c.Store, rec) return err } if obs.Claim.Free() { return nil } return ErrPending } if h.Key != key || h.Family != ref.Family || h.Account != ref.Account || h.App != ref.App || (ref.Incarnation != "" && ref.Incarnation != h.Incarnation) { return ErrIdentity } if rerr == nil && !matches(rec, h) { return ErrIdentity } switch obs.Claim.Op.Kind { case hostclaim.KindServing: if rerr != nil { return ErrPending } // Old-console deletion needs operator recovery. obs, err = c.BeginRetire(ctx, key, ref.By, h.Incarnation) if err != nil { return err } return c.Retire(ctx, ref.Host, obs.Claim.Op.ID) case hostclaim.KindDeleting: return c.Retire(ctx, ref.Host, obs.Claim.Op.ID) case hostclaim.KindParking: if len(obs.Claim.Obligations) != 0 { return ErrPending } return c.Free(ctx, ref.Host, obs.Claim.Op.ID) default: return ErrPending // A purge is driven by its journal, never this path. } }