//go:build linux && rootrunner package host import ( "flag" "fmt" "github.com/carlosframework/platform/internal/instanceexec" "github.com/carlosframework/platform/internal/version" "os" "os/exec" "os/user" "strconv" "testing" ) // The test binary must take the same private registry entrypoint as carlos. func TestMain(m *testing.M) { // The installed carlos-dbread@ unit runs this binary as // /opt/carlos/carlos system db-worker (dbreads_rootrunner_linux_test.go). if len(os.Args) == 3 && os.Args[1] == "system" && os.Args[2] == "db-worker" { dbreadsTestWorker() return } // A tenant inside the installed tenant unit, reaching for the worker. if len(os.Args) == 2 && os.Args[1] == "dbread-tenant-witness" { dbreadsTenantWitness() return } // The agent half of the db-read root-runner tests, run as carlos. if os.Getenv("DBREAD_RUNNER_PAYLOAD") != "" { flag.Set("test.run", "^TestRootDBReadPayload$") flag.Set("test.v", "false") flag.Set("test.timeout", "5m") os.Exit(m.Run()) } if os.Getenv("PLAN14_LIFECYCLE_GUARD") == "1" && len(os.Args) > 1 { if os.Args[1] == "system" && len(os.Args) > 2 { switch os.Args[2] { case "guard-arm": version.Build = "v2.0.0" RunSystemGuardArm(os.Args[3:]) return case "guard-exec": RunSystemGuardExec(os.Args[3:]) return case "apply": RunSystemApply(os.Args[3:]) return } } if len(os.Args) == 2 && os.Args[1] == "agent" && os.Getenv("PLAN14_LIFECYCLE_AGENT") == "1" { os.Setenv("CARLOS_S3_ENDPOINT", os.Getenv("PLAN14_LIFECYCLE_DATA_ENDPOINT")) flag.Set("test.run", "^TestPlan14LifecycleEndToEndRootRunnerPayload$") flag.Set("test.v", "true") flag.Set("test.timeout", "4m") os.Exit(m.Run()) } } if os.Getenv("PLAN14_CONSOLE") == "1" { plan14ConsolePayload() return } if os.Getenv("PLAN14_TENANT_SOCKET") != "" { plan14InstalledTenant() return } if len(os.Args) > 1 { switch os.Args[1] { case "instance-exec": instanceexec.RunExec(os.Args[2:]) return case "instance-exit": instanceexec.RunExit(os.Args[2:]) return case "plan14-tenant": plan14InstalledTenant() return } } if len(os.Args) > 1 && os.Args[1] == registryChildCommand { if err := RunRegistryChild(os.Args[2:]); err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } os.Exit(0) } os.Exit(m.Run()) } func generationRunnerRegistryUser(t *testing.T) (int, int) { t.Helper() if os.Geteuid() != 0 { t.Fatal("designated runner must execute as root") } service, err := user.Lookup(serviceUser) if err != nil { if _, ok := err.(user.UnknownUserError); !ok { t.Fatal(err) } if _, err := user.LookupGroup(serviceUser); err == nil { t.Fatal("service group exists without its user") } else if _, ok := err.(user.UnknownGroupError); !ok { t.Fatal(err) } if out, err := exec.Command("useradd", "--system", "--user-group", "--no-create-home", "--shell", "/usr/sbin/nologin", serviceUser).CombinedOutput(); err != nil { t.Fatalf("create runner service user: %v %s", err, out) } t.Cleanup(func() { if out, err := exec.Command("userdel", serviceUser).CombinedOutput(); err != nil { t.Errorf("remove runner service user: %v %s", err, out) return } if _, err := user.LookupGroup(serviceUser); err == nil { if out, err := exec.Command("groupdel", serviceUser).CombinedOutput(); err != nil { t.Errorf("remove runner service group: %v %s", err, out) } } }) service, err = user.Lookup(serviceUser) if err != nil { t.Fatal(err) } } uid, err := strconv.Atoi(service.Uid) if err != nil || uid <= 0 { t.Fatal("runner service UID must be non-root", err) } gid, err := strconv.Atoi(service.Gid) if err != nil || gid < 0 { t.Fatal("invalid runner service GID", err) } return uid, gid }