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 "golang.org/x/sys/unix"
5 "os"
6 "path/filepath"
7 "testing"
8 "time"
9
10 "github.com/carlosframework/platform/internal/hostwrite"
11 "github.com/carlosframework/platform/internal/release"
12 "github.com/carlosframework/platform/internal/rootstate"
13)
14
15func TestPlan14ProductionReleaseInitialization(t *testing.T) {
16 if !plan14RootFixture(t) {
17 return
18 }
19 for _, mode := range []string{"fresh", "old-private", "symlink", "writable", "foreign"} {
20 t.Run(mode, func(t *testing.T) {
21 if err := os.MkdirAll("/var/lib", 0755); err != nil {
22 t.Fatal(err)
23 }
24 t.Cleanup(func() {
25 if err := os.RemoveAll(release.RootHealthyDir); err != nil {
26 t.Error(err)
27 }
28 })
29 switch mode {
30 case "old-private":
31 if err := os.Mkdir(release.RootHealthyDir, 0700); err != nil {
32 t.Fatal(err)
33 }
34 case "symlink":
35 if err := os.Symlink(t.TempDir(), release.RootHealthyDir); err != nil {
36 t.Fatal(err)
37 }
38 case "writable":
39 if err := os.Mkdir(release.RootHealthyDir, 0777); err != nil {
40 t.Fatal(err)
41 }
42 if err := os.Chmod(release.RootHealthyDir, 0777); err != nil {
43 t.Fatal(err)
44 }
45 case "foreign":
46 if err := os.Mkdir(release.RootHealthyDir, 0755); err != nil {
47 t.Fatal(err)
48 }
49 if err := unix.Mount("/foreign-dir", release.RootHealthyDir, "", unix.MS_BIND, ""); err != nil {
50 t.Fatal(err)
51 }
52 t.Cleanup(func() {
53 if err := unix.Unmount(release.RootHealthyDir, 0); err != nil {
54 t.Error(err)
55 }
56 })
57 }
58 c := productionRootRestartChecks(&fakeUnits{}, "/opt/carlos")
59 err := recoverRootRestarts(t.Context(), &fakeUnits{}, "/opt/carlos", func(string) string { return "" }, c, hostwrite.Config{})
60 good := mode == "fresh" || mode == "old-private"
61 if !good {
62 if err == nil {
63 t.Fatal("unsafe parent repaired")
64 }
65 return
66 }
67 if err != nil {
68 t.Fatal(err)
69 }
70 b := release.HealthyBuild{SHA256: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", Version: "v1", How: "live", At: time.Now()}
71 if err := release.RecordHealthy(release.RootHealthyDir, "", "console", b); err != nil {
72 t.Fatal(err)
73 }
74 if got := release.ReadHealthy(release.RootHealthyDir, "", "console"); len(got) != 1 || got[0].SHA256 != b.SHA256 {
75 t.Fatal(got)
76 }
77 if _, err := os.Stat(rootRestartState); !os.IsNotExist(err) {
78 t.Fatal("no-census initialization created restart state", err)
79 }
80 for path, mode := range map[string]os.FileMode{release.RootHealthyDir: 0755, filepath.Join(release.RootHealthyDir, "healthy"): 0755} {
81 info, err := os.Stat(path)
82 if err != nil || info.Mode().Perm() != mode {
83 t.Fatalf("%s mode: %v %v", path, info, err)
84 }
85 }
86 f, err := rootstate.OpenTrustedFile(filepath.Join(release.RootHealthyDir, "healthy", release.OpsAccount, "console.json"))
87 if err != nil {
88 t.Fatal(err)
89 }
90 f.Close()
91 })
92 }
93}
94