carlos / platform Public

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

Plain git — no account needed to clone.

Download

Download this file

1package hostops
2
3import (
4 "context"
5 "crypto/ed25519"
6 "encoding/json"
7 "testing"
8 "time"
9
10 "github.com/carlosframework/platform/internal/release"
11)
12
13// seedPurge builds the typed-writer state the removed WriteNewPurgeJournal
14// used to fake: an open admission, a real tombstone, a reserved journal that
15// BeginPurge turns into the purging operation, then the journal advanced to
16// j.Phase. It returns the writer that owns the operation.
17func seedPurge(t *testing.T, ctx context.Context, raw release.Store, now time.Time, j PurgeJournal) *ControlWriter {
18 t.Helper()
19 pub, _, err := ed25519.GenerateKey(nil)
20 if err != nil {
21 t.Fatal(err)
22 }
23 w, err := NewControlWriter(raw, pub, func() time.Time { return now })
24 if err != nil {
25 t.Fatal(err)
26 }
27 seedAdmission(t, raw, j.Account, j.App, openAdmission(j.AppID))
28 body := []byte(`{}`)
29 etag, err := raw.Put(ctx, release.AppTombstoneKey(j.Account, j.App), body, "")
30 if err != nil {
31 t.Fatal(err)
32 }
33 target := j
34 reserved := j
35 reserved.Phase = "reserved"
36 reserved.Tombstone = PurgeObject{Key: release.AppTombstoneKey(j.Account, j.App), ETag: etag, Body: json.RawMessage(body)}
37 target.Tombstone = reserved.Tombstone
38 if reserved.Hosts == nil {
39 reserved.Hosts = map[string]PurgeHost{}
40 }
41 tag, err := w.ReservePurge(ctx, reserved, testOwner, now)
42 if err != nil {
43 t.Fatal(err)
44 }
45 if _, err = w.BeginPurge(ctx, j.Account, j.App, j.AppID, j.ID, testOwner); err != nil {
46 t.Fatal(err)
47 }
48 cur, curTag, err := ReadPurgeJournal(ctx, raw, j.Account, j.App, j.ID, j.AppID)
49 if err != nil || curTag != tag {
50 t.Fatalf("seeded journal: %v %s %s", err, curTag, tag)
51 }
52 target.AdmissionEpoch = cur.AdmissionEpoch
53 if _, err = w.SavePurgeJournal(ctx, target, curTag); err != nil {
54 t.Fatal(err)
55 }
56 return w
57}
58