| 1 | package hostactors |
| 2 | |
| 3 | import ( |
| 4 | "context" |
| 5 | "github.com/carlosframework/platform/internal/hostclaim" |
| 6 | "github.com/carlosframework/platform/internal/hostfloor" |
| 7 | "github.com/carlosframework/platform/internal/release" |
| 8 | "time" |
| 9 | ) |
| 10 | |
| 11 | 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) { |
| 12 | if scope.boxRelocation || scope.StarterBox != "" { |
| 13 | return Observed{}, ErrRoster |
| 14 | } |
| 15 | o, err := d.Read(ctx) |
| 16 | if err != nil { |
| 17 | return Observed{}, err |
| 18 | } |
| 19 | floor, err := hostfloor.Read(ctx, d.Store, d.PublicKey, d.Bucket) |
| 20 | if err != nil { |
| 21 | return Observed{}, err |
| 22 | } |
| 23 | reports, err := Census(ctx, o, e, d.PublicKey, floor, scope, now) |
| 24 | if err != nil { |
| 25 | return Observed{}, err |
| 26 | } |
| 27 | actors := map[string]string{} |
| 28 | for key, r := range reports { |
| 29 | actors[key] = r.Enrollment |
| 30 | } |
| 31 | 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) |
| 32 | } |
| 33 | func (d Directory) ReleaseFinishedHold(ctx context.Context, sg release.Signer, id string) error { |
| 34 | o, err := d.Read(ctx) |
| 35 | if err != nil { |
| 36 | return err |
| 37 | } |
| 38 | h, ok := o.Roster.Holds[id] |
| 39 | if !ok { |
| 40 | return nil |
| 41 | } |
| 42 | claim, err := hostclaim.Read(ctx, d.Store, h.Host) |
| 43 | if err != nil { |
| 44 | return err |
| 45 | } |
| 46 | if claim.Absent || claim.ETag == h.ExpectedClaimETag { |
| 47 | return ErrRoster |
| 48 | } |
| 49 | if !claim.Claim.Free() && claim.Claim.Op.Kind != hostclaim.KindServing { |
| 50 | return ErrRoster |
| 51 | } |
| 52 | next := Clone(o.Roster) |
| 53 | delete(next.Holds, id) |
| 54 | _, err = d.Replace(ctx, sg, o, next) |
| 55 | return err |
| 56 | } |
| 57 | |