carlos / platform Public

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

Plain git — no account needed to clone.

Download

Download this file

1//go:build linux
2
3package host
4
5import (
6 "os"
7 "path/filepath"
8 "testing"
9
10 "github.com/carlosframework/platform/internal/instancectl"
11 "golang.org/x/sys/unix"
12)
13
14func TestServingParkRebootVolumeIdentity(t *testing.T) {
15 for _, serial := range []string{"vol0123456789abcdef0", "vol11111111111111111", ""} {
16 t.Run("serial-"+serial, func(t *testing.T) {
17 f, r := servingRebootRecordFixture(t, "complete")
18 servingRenumberHistory(t, f, &r)
19 f.fs.volume = func(uint64) string { return serial }
20 root := &servingParkRoot{ledger: f.ledger}
21 if err := root.commitServingReboot(t.Context(), r.Authorization.ID); err != nil {
22 t.Fatal("retention recovery", err)
23 }
24 current, err := f.ledger.read(r.Authorization.ID)
25 if err != nil {
26 t.Fatal(err)
27 }
28 if current.Source.BootID != servingOtherBoot {
29 t.Fatal("serving authority not rebound")
30 }
31 b, err := servingParkReadBinding(f.disk, "retirement-"+r.Authorization.ID)
32 if err != nil || b == nil {
33 t.Fatal(err)
34 }
35 if (b.Volume != "") != (serial == "vol0123456789abcdef0") {
36 t.Fatal("wrong destructive binding", b)
37 }
38 if serial != "vol0123456789abcdef0" {
39 if err := f.ledger.maintainParks(t.Context(), func() error { return instancectl.ErrDiskFull }); err == nil {
40 t.Fatal("pressure deleted retained volume")
41 }
42 f.retained(r.Authorization, "last database", r.ReapAfter)
43 }
44 f.now = r.ReapAfter
45 err = f.ledger.reapLocked(t.Context(), r.Authorization.ID)
46 if serial == "vol0123456789abcdef0" {
47 if err != nil {
48 t.Fatal("same volume reap", err)
49 }
50 if _, err := os.Stat(f.path(r.Authorization, "")); !os.IsNotExist(err) {
51 t.Fatal("park survived", err)
52 }
53 } else {
54 if err == nil {
55 t.Fatal("destructive clone/unreadable rebind")
56 }
57 f.retained(r.Authorization, "last database", r.ReapAfter)
58 // A later readable serial does not silently re-enroll a retained park.
59 f.fs.volume = func(uint64) string { return "vol0123456789abcdef0" }
60 f.fs.boot = func() (string, error) { return "33333333-3333-4333-8333-333333333333", nil }
61 if err := root.commitServingReboot(t.Context(), r.Authorization.ID); err != nil {
62 t.Fatal(err)
63 }
64 b, err := servingParkReadBinding(f.disk, "retirement-"+r.Authorization.ID)
65 if err != nil || b == nil || b.Volume != "" {
66 t.Fatal("automatic re-enrollment", b, err)
67 }
68 if err := f.ledger.reapLocked(t.Context(), r.Authorization.ID); err == nil {
69 t.Fatal("retained park gained deletion authority")
70 }
71 }
72 })
73 }
74}
75
76func TestServingParkKernelVolumeResolution(t *testing.T) {
77 sys := t.TempDir()
78 disk := filepath.Join(sys, "devices", "nvme0n1")
79 part := filepath.Join(disk, "nvme0n1p1")
80 if err := os.MkdirAll(filepath.Join(disk, "device"), 0700); err != nil {
81 t.Fatal(err)
82 }
83 if err := os.Mkdir(part, 0700); err != nil {
84 t.Fatal(err)
85 }
86 if err := os.WriteFile(filepath.Join(part, "partition"), []byte("1\n"), 0600); err != nil {
87 t.Fatal(err)
88 }
89 links := filepath.Join(sys, "dev", "block")
90 if err := os.MkdirAll(links, 0700); err != nil {
91 t.Fatal(err)
92 }
93 for name, target := range map[string]string{"259:0": disk, "259:1": part} {
94 if err := os.Symlink(target, filepath.Join(links, name)); err != nil {
95 t.Fatal(err)
96 }
97 }
98 serial := filepath.Join(disk, "device", "serial")
99 for _, raw := range []string{"vol-0123456789abcdef0\n", " vol0123456789abcdef0 ", "bad", "vol../escape", "vol", "vol0123456789abcdefg"} {
100 if err := os.WriteFile(serial, []byte(raw), 0600); err != nil {
101 t.Fatal(err)
102 }
103 for _, minor := range []uint32{0, 1} {
104 got := servingParkVolumeAt(sys, unix.Mkdev(259, minor))
105 want := ""
106 if raw == "vol-0123456789abcdef0\n" || raw == " vol0123456789abcdef0 " {
107 want = "vol0123456789abcdef0"
108 }
109 if got != want {
110 t.Fatal(raw, minor, got, want)
111 }
112 }
113 }
114 if err := os.Remove(serial); err != nil {
115 t.Fatal(err)
116 }
117 if servingParkVolumeAt(sys, unix.Mkdev(259, 1)) != "" || servingParkVolumeAt(sys, unix.Mkdev(7, 0)) != "" {
118 t.Fatal("unreadable disk/loop supplied identity")
119 }
120}
121