carlos / platform Public

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

Plain git — no account needed to clone.

Download

Download this file

1package host
2
3import (
4 "context"
5 "errors"
6 "github.com/carlosframework/platform/internal/hostguard"
7 "net/http/httptest"
8 "testing"
9)
10
11type fix1LiveRecovery struct{ recoveryKernelFunc }
12
13func (fix1LiveRecovery) CheckRecoveryController(context.Context, hostguard.FenceTarget) error {
14 return ErrClaimStopControllerAlive
15}
16
17func TestPlan11Fix1PendingFenceRestartsWithLiveController(t *testing.T) {
18 f := newLaunchFixture(t, servingOp())
19 if _, err := f.root.Serve(t.Context(), f.peer, f.req); err != nil {
20 t.Fatal(err)
21 }
22 f.units.goneErr = errors.New("tenant unit still running")
23 c, req := servingStopFixture(t)
24 c.Inventory = exactFixtureInventory{c.Inventory}
25 c.Drainer = stopDrainFunc(func(context.Context, StopRequest, string) (DrainAcknowledgement, error) {
26 return DrainAcknowledgement{}, errors.New("root crashed after fence")
27 })
28 if _, err := c.FenceAndStop(t.Context(), req); err == nil {
29 t.Fatal("expected interrupted fence")
30 }
31 pending, err := c.Guard.PendingFences(t.Context())
32 if err != nil || len(pending) != 1 {
33 t.Fatalf("pending=%v err=%v", pending, err)
34 }
35 c.Kernel = claimUnitStopKernel{Journal: f.journal, Units: f.units, Inner: fix1LiveRecovery{recoveryKernelFunc(func(context.Context, hostguard.FenceTarget, StopInventory) (StopKernelEvidence, DrainAcknowledgement, error) {
36 t.Fatal("recovery ran while controller lives")
37 return StopKernelEvidence{}, DrainAcknowledgement{}, nil
38 })}}
39 h := ClaimStopHTTP{Coordinator: c}
40 if err := h.RecoverPending(t.Context()); err != nil {
41 t.Fatalf("root control cannot restart: %v", err)
42 }
43 response := httptest.NewRecorder()
44 h.ServeHTTP(response, httptest.NewRequest("GET", "/claim/stop", nil))
45 if response.Code == 0 {
46 t.Fatal("root control did not serve")
47 }
48 pending, err = c.Guard.PendingFences(t.Context())
49 if err != nil || len(pending) != 1 {
50 t.Fatalf("live fence was completed: %v %v", pending, err)
51 }
52}
53