| 1 | package hostops |
| 2 | |
| 3 | import ( |
| 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. |
| 17 | func 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 | |