package hostactors import ( "context" "github.com/carlosframework/platform/internal/hostclaim" "github.com/carlosframework/platform/internal/hostfloor" "github.com/carlosframework/platform/internal/release" "time" ) func (d Directory) ReserveLifecycle(ctx context.Context, sg release.Signer, e Evidence, scope Scope, claim hostclaim.Observed, id, op string, now time.Time) (Observed, error) { if scope.boxRelocation || scope.StarterBox != "" { return Observed{}, ErrRoster } o, err := d.Read(ctx) if err != nil { return Observed{}, err } floor, err := hostfloor.Read(ctx, d.Store, d.PublicKey, d.Bucket) if err != nil { return Observed{}, err } reports, err := Census(ctx, o, e, d.PublicKey, floor, scope, now) if err != nil { return Observed{}, err } actors := map[string]string{} for key, r := range reports { actors[key] = r.Enrollment } return d.Reserve(ctx, sg, o, Reservation{ID: id, Host: claim.Host, OpID: op, ExpectedClaimETag: claim.ETag, FloorSHA256: floor.Digest, Actors: actors, Releases: reports}, false) } func (d Directory) ReleaseFinishedHold(ctx context.Context, sg release.Signer, id string) error { o, err := d.Read(ctx) if err != nil { return err } h, ok := o.Roster.Holds[id] if !ok { return nil } claim, err := hostclaim.Read(ctx, d.Store, h.Host) if err != nil { return err } if claim.Absent || claim.ETag == h.ExpectedClaimETag { return ErrRoster } if !claim.Claim.Free() && claim.Claim.Op.Kind != hostclaim.KindServing { return ErrRoster } next := Clone(o.Roster) delete(next.Holds, id) _, err = d.Replace(ctx, sg, o, next) return err }