package hostops import ( "context" "sort" "github.com/carlosframework/platform/internal/hostactors" "github.com/carlosframework/platform/internal/hostclaim" ) func (a ProductionAuthority) StartDeleteClaim(ctx context.Context, before hostclaim.Observed, r Record, by string) (hostclaim.Observed, error) { if err := a.StartDelete(ctx, before, r); err != nil { return hostclaim.Observed{}, err } admission, err := a.admission(ctx, r.Holder.Account, r.Holder.App) if err != nil { return hostclaim.Observed{}, err } if admission.Value.Op == nil || admission.Value.Op.Kind != "deleting" || admission.Value.Op.Intent["host"] != r.Holder.Host { return hostclaim.Observed{}, ErrIdentity } id := admission.Value.Op.ID regions, boxes, err := a.Inventory(ctx, before) if err != nil { return hostclaim.Observed{}, err } roster, err := a.Directory.Read(ctx) if err != nil { return hostclaim.Observed{}, err } poolSet := map[string]bool{} for _, box := range roster.Roster.Boxes { if box.Namespace == a.Namespace { poolSet[box.Pool] = true } } var pools []string for pool := range poolSet { pools = append(pools, pool) } sort.Strings(pools) scope := hostactors.Scope{Namespace: a.Namespace, Regions: regions, Pools: pools, Participants: before.Claim.Op.Participants, ConsoleID: a.ConsoleID} if err = a.StartDelete(ctx, before, r); err != nil { return hostclaim.Observed{}, err } // Ruling 86: a delete passes the completion box it verified dead. fenced, err := a.completionFence(ctx, before.Claim) if err != nil { return hostclaim.Observed{}, err } return a.startHeldClaim(ctx, before, id, scope, func() error { if err := a.StartDelete(ctx, before, r); err != nil { return err } fresh, err := a.admission(ctx, r.Holder.Account, r.Holder.App) if err != nil { return err } if fresh.Value.AppID != admission.Value.AppID || fresh.Value.State != "closed" || fresh.Value.Op == nil || fresh.Value.Op.ID != id || fresh.Value.Op.Kind != "deleting" || fresh.Value.Op.Intent["host"] != r.Holder.Host { return ErrPending } return nil }, hostclaim.BeginDelete(id, by, r.ETag, a.Now(), regions, boxes, fenced)) }