carlos / platform Public

Clone
git clone https://amadan.net/carlos/platform

Plain git — no account needed to clone.

Download

Download this file

1package hostactors
2
3import (
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
11func (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}
33func (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