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 "encoding/base64"
5 "os"
6 "os/exec"
7 "path/filepath"
8 "strings"
9 "testing"
10
11 "github.com/carlosframework/platform/internal/activator"
12 "github.com/carlosframework/platform/internal/release"
13 "github.com/carlosframework/platform/internal/rootstate"
14)
15
16func TestPlan14Fix4AdoptPerHostFailureExitsZero(t *testing.T) {
17 if os.Getenv("PLAN14_FIX4_ADOPT_CHILD") == "1" {
18 args := []string{"-registry", os.Getenv("PLAN14_FIX4_REGISTRY")}
19 if os.Getenv("PLAN14_FIX4_STAGE") == "1" {
20 args = append(args, "-stage-only")
21 }
22 runAdoptWithEnsureSystemUnits(args, nil, func() {}, noCensusAdoptSource(func() (rootstate.Store, error) { return &rollbackMemory{files: map[string][]byte{}}, nil }))
23 return
24 }
25 if os.Geteuid() == 0 {
26 t.Skip("fixture exercises the local registry as an unprivileged user")
27 }
28 for _, stage := range []bool{false, true} {
29 for _, crash := range []bool{false, true} {
30 t.Run(map[bool]string{false: "hourly", true: "stage"}[stage]+map[bool]string{false: "/restart-error", true: "/rollback-error"}[crash], func(t *testing.T) {
31 e, rt, u, _, pub := plan14AdoptionFixture(t)
32 rt.Unit = activator.UnitName(rt.Host)
33 if err := e.root.reg.Upsert(rt); err != nil {
34 t.Fatal(err)
35 }
36 dir := t.TempDir()
37 if err := os.Mkdir(filepath.Join(dir, "data"), 0755); err != nil {
38 t.Fatal(err)
39 }
40 bucket := filepath.Join(dir, "bucket")
41 store := release.NewDirStore(bucket)
42 keys, err := e.store.List(t.Context(), "")
43 if err != nil {
44 t.Fatal(err)
45 }
46 for _, key := range keys {
47 raw, _, err := e.store.Get(t.Context(), key)
48 if err != nil {
49 t.Fatal(err)
50 }
51 if _, err := store.Put(t.Context(), key, raw, ""); err != nil {
52 t.Fatal(err)
53 }
54 }
55 stub := `#!/bin/sh
56case "$1" in
57 show)
58 if [ -f "$PLAN14_FIX4_EFFECT" ]; then
59 printf 'ActiveState=failed\nSubState=failed\nMainPID=0\n'
60 else
61 printf 'Id=console.service\nActiveState=active\nSubState=running\nMainPID=1\nInvocationID=old\nExecStart={ path=%s ; }\n' "$PLAN14_FIX4_LIVE"
62 fi ;;
63 try-restart)
64 if [ "$PLAN14_FIX4_CRASH" = 1 ]; then : > "$PLAN14_FIX4_EFFECT"; exit 0; fi
65 exit 1 ;;
66 start|restart) exit 1 ;;
67 *) exit 0 ;;
68esac
69`
70 if err := os.WriteFile(filepath.Join(dir, "systemctl"), []byte(stub), 0755); err != nil {
71 t.Fatal(err)
72 }
73 cmd := exec.Command(os.Args[0], "-test.run=^TestPlan14Fix4AdoptPerHostFailureExitsZero$", "-test.v")
74 cmd.Dir = dir
75 bit := func(v bool) string {
76 if v {
77 return "1"
78 }
79 return "0"
80 }
81 cmd.Env = isolatedAdoptOrderEnv(t,
82 "PATH="+dir+":"+os.Getenv("PATH"), "PLAN14_FIX4_ADOPT_CHILD=1", "PLAN14_FIX4_STAGE="+bit(stage), "PLAN14_FIX4_CRASH="+bit(crash),
83 "PLAN14_FIX4_REGISTRY="+e.root.reg.Path(), "PLAN14_FIX4_EFFECT="+filepath.Join(dir, "effect"), "PLAN14_FIX4_LIVE="+release.LiveLink(u.opt, rt.Host),
84 "CARLOS_DATA_DIR="+filepath.Join(dir, "data"), "CARLOS_OPT_DIR="+u.opt, "CARLOS_DEPLOYMENT_DIR="+bucket, "CARLOS_DEPLOYMENT_BUCKET=",
85 "CARLOS_HOST_CLAIM=", "CARLOS_REGION_HA=", "CARLOS_MOVES_PHASE1=", "CARLOS_SECRETS_KEY=", "CARLOS_RELEASE_PUBKEY="+base64.StdEncoding.EncodeToString(pub),
86 )
87 out, err := cmd.CombinedOutput()
88 if err != nil || !strings.Contains(string(out), "update to v2 failed") || !strings.Contains(string(out), "may be serving nothing") {
89 t.Fatalf("per-host failure exit=%v\n%s", err, out)
90 }
91 if crash && !strings.Contains(string(out), "did not come up") {
92 t.Fatal("crash did not take D1 rollback", string(out))
93 }
94 if live, err := release.LiveVersion(u.opt, rt.Host); err != nil || live != "v1" {
95 t.Fatal(live, err)
96 }
97 })
98 }
99 }
100}
101