carlos / platform Public

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

Plain git — no account needed to clone.

Download

Download this file

1package console
2
3import (
4 "context"
5 "strings"
6 "testing"
7 "time"
8
9 "github.com/carlosframework/platform/internal/provision"
10 "github.com/carlosframework/platform/internal/release"
11)
12
13// codex R2-6: shapes that never inherit the app default are not listed;
14// a no-region socket-backed instance created after the app is.
15func TestPlacementDiscrepancyLog(t *testing.T) {
16 fx := newConsoleFixture(t)
17 fx.srv.cfg.HomeRegion = "ie"
18 created := time.Now().Add(-time.Hour)
19 fx.st.CreateAppInRegion(OpsAccountID, "blog", "p@k.dev", "uk", "chosen", created)
20 ctx := context.Background()
21 put := func(r provision.Record) {
22 r.Schema, r.App, r.Account, r.Channel, r.CreatedAt = 1, "blog", release.OpsAccount, "stable", time.Now()
23 if err := provision.CreateRecord(ctx, fx.rel, r); err != nil {
24 t.Fatal(err)
25 }
26 }
27 put(provision.Record{Host: "blog.go.tito.io", Kind: "static"})
28 put(provision.Record{Host: "svc.go.tito.io", Kind: "service", Addrs: []string{"10.0.0.4:8080"}})
29 put(provision.Record{Host: "r.go.tito.io", Region: "au", Role: "replica"})
30 put(provision.Record{Host: "pooled.go.tito.io", Pool: "tito"})
31 put(provision.Record{Host: "uk.go.tito.io", Region: "uk"})
32 put(provision.Record{Host: "drift.go.tito.io"})
33 var logs strings.Builder
34 restore := captureLogTo(&logs)
35 fx.srv.LogPlacementDiscrepancies(ctx)
36 restore()
37 out := logs.String()
38 if !strings.Contains(out, msgPlacementDiscrepancy("drift.go.tito.io", "blog", "uk")) {
39 t.Fatalf("drift not listed: %s", out)
40 }
41 for _, quiet := range []string{"blog.go.tito.io", "svc.go.tito.io", "r.go.tito.io", "pooled.go.tito.io", "uk.go.tito.io"} {
42 if strings.Contains(out, quiet+" of") {
43 t.Errorf("%s listed", quiet)
44 }
45 }
46}
47
48// A record older than its app cannot be the roll-forward's work, so it is
49// not listed.
50func TestPlacementDiscrepancyLogSkipsRecordsOlderThanTheApp(t *testing.T) {
51 fx := newConsoleFixture(t)
52 fx.st.CreateAppInRegion(OpsAccountID, "blog", "p@k.dev", "uk", "chosen", time.Now().Add(-time.Hour))
53 ctx := context.Background()
54 err := provision.CreateRecord(ctx, fx.rel, provision.Record{
55 Schema: 1, Host: "old.go.tito.io", App: "blog", Account: release.OpsAccount,
56 Channel: "stable", CreatedAt: time.Now().Add(-2 * time.Hour),
57 })
58 if err != nil {
59 t.Fatal(err)
60 }
61 var logs strings.Builder
62 restore := captureLogTo(&logs)
63 fx.srv.LogPlacementDiscrepancies(ctx)
64 restore()
65 if strings.Contains(logs.String(), "old.go.tito.io") {
66 t.Fatalf("older record listed: %s", logs.String())
67 }
68}
69
70// A bucket that cannot be listed is logged (O18) and never fails or panics:
71// the check is advisory.
72func TestPlacementDiscrepancyLogListError(t *testing.T) {
73 fx := newConsoleFixture(t)
74 fx.st.CreateAppInRegion(OpsAccountID, "blog", "p@k.dev", "uk", "chosen", time.Now())
75 fx.srv.cfg.Releases = failingList{fx.rel}
76 var logs strings.Builder
77 restore := captureLogTo(&logs)
78 fx.srv.LogPlacementDiscrepancies(context.Background())
79 restore()
80 want := "console: placement discrepancy check " + release.OpsAccount + "/blog: bucket unreachable"
81 if !strings.Contains(logs.String(), want) {
82 t.Fatalf("want %q in %s", want, logs.String())
83 }
84}
85
86// Past the cap the check says so (O9) instead of silently stopping.
87func TestPlacementDiscrepancyLogTruncated(t *testing.T) {
88 fx := newConsoleFixture(t)
89 fx.st.CreateAppInRegion(OpsAccountID, "blog", "p@k.dev", "uk", "chosen", time.Now().Add(-time.Hour))
90 ctx := context.Background()
91 for _, h := range []string{"a.go.tito.io", "b.go.tito.io"} {
92 err := provision.CreateRecord(ctx, fx.rel, provision.Record{
93 Schema: 1, Host: h, App: "blog", Account: release.OpsAccount,
94 Channel: "stable", CreatedAt: time.Now(),
95 })
96 if err != nil {
97 t.Fatal(err)
98 }
99 }
100 var logs strings.Builder
101 restore := captureLogTo(&logs)
102 fx.srv.logPlacementDiscrepancies(ctx, 1)
103 restore()
104 want := "console: placement discrepancy check " + release.OpsAccount + "/blog: only the first 1 records were checked"
105 if !strings.Contains(logs.String(), want) {
106 t.Fatalf("want %q in %s", want, logs.String())
107 }
108}
109
110// No deployment bucket: nothing to check, nothing logged.
111func TestPlacementDiscrepancyLogNoBucket(t *testing.T) {
112 fx := newConsoleFixture(t)
113 fx.srv.cfg.Releases = nil
114 var logs strings.Builder
115 restore := captureLogTo(&logs)
116 fx.srv.LogPlacementDiscrepancies(context.Background())
117 restore()
118 if logs.Len() != 0 {
119 t.Fatalf("logged: %s", logs.String())
120 }
121}
122