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 "crypto/ed25519"
6 "crypto/rand"
7 "github.com/carlosframework/platform/internal/release"
8 "strings"
9 "testing"
10)
11
12func fixture(t *testing.T) (Directory, release.Signer, Observed) {
13 t.Helper()
14 pub, key, err := ed25519.GenerateKey(rand.Reader)
15 if err != nil {
16 t.Fatal(err)
17 }
18 s := release.NewDirStore(t.TempDir())
19 sg := release.RootSigner(key)
20 r := Roster{V: 1, DeploymentBucket: "bucket", Revision: 1, Boxes: map[string]Box{"box": {Enrollment: strings.Repeat("a", 32), Namespace: "platform", BoxID: "box", Label: "label", Region: "ie", Pool: "default", Cloud: Cloud{Provider: "aws", Account: "123", Region: "eu-west-1", InstanceID: "i-box"}, EvidenceSHA256: strings.Repeat("b", 64), State: "active", LossIDs: []string{}}}, Consoles: map[string]Console{}, Holds: map[string]Reservation{}, Activations: map[string]Reservation{}}
21 raw, err := release.SignRootEnvelope(sg, r)
22 if err != nil {
23 t.Fatal(err)
24 }
25 etag, err := s.Put(context.Background(), Key, raw, "")
26 if err != nil {
27 t.Fatal(err)
28 }
29 return Directory{s, pub, "bucket"}, sg, Observed{r, etag}
30}
31func TestDirectoryFreshQuarantineAndCAS(t *testing.T) {
32 ctx := context.Background()
33 d, sg, o := fixture(t)
34 first, err := d.Lookup(ctx, "box")
35 if err != nil || first.State != "active" {
36 t.Fatal(first, err)
37 }
38 changed, err := d.Quarantine(ctx, sg, o, "box", first.Enrollment, "loss-1")
39 if err != nil {
40 t.Fatal(err)
41 }
42 got, err := d.Lookup(ctx, "box")
43 if err != nil || got.State != "quarantined" || got.QuarantineRevision != 1 {
44 t.Fatal(got, err)
45 }
46 if _, err = d.Quarantine(ctx, sg, o, "box", first.Enrollment, "loss-2"); err == nil {
47 t.Fatal("stale CAS accepted")
48 }
49 next := Clone(changed.Roster)
50 b := next.Boxes["box"]
51 b.Cloud.InstanceID = "i-other"
52 next.Boxes["box"] = b
53 if _, err = d.Replace(ctx, sg, changed, next); err == nil {
54 t.Fatal("cloud binding changed")
55 }
56}
57func TestReservationsExcludeBothOrders(t *testing.T) {
58 ctx := context.Background()
59 for _, activationFirst := range []bool{true, false} {
60 d, sg, o := fixture(t)
61 en := o.Roster.Boxes["box"].Enrollment
62 h := Reservation{ID: "hold", Host: "app.example", OpID: "op", ExpectedClaimETag: "etag", FloorSHA256: strings.Repeat("f", 64), Actors: map[string]string{"box:box": en}, Releases: map[string]Report{"box:box": {Enrollment: en}}}
63 a := h
64 a.ID = "activation"
65 a.Hashes = map[string][]string{"box:box": {strings.Repeat("a", 64), strings.Repeat("b", 64), strings.Repeat("c", 64)}}
66 first, second := h, a
67 if activationFirst {
68 first, second = a, h
69 }
70 next, err := d.Reserve(ctx, sg, o, first, activationFirst)
71 if err != nil {
72 t.Fatal(err)
73 }
74 if _, err = d.Reserve(ctx, sg, next, second, !activationFirst); err == nil {
75 t.Fatal("overlap accepted")
76 }
77 }
78}
79