diff options
author | Florian Klink <flokli@flokli.de> | 2023-09-25T10·59+0300 |
---|---|---|
committer | clbot <clbot@tvl.fyi> | 2023-09-25T12·46+0000 |
commit | 1b3d6975ed8c2a19f1e7f4f39a564cdfa387f0b6 (patch) | |
tree | 0405d22f3792a62d79e94668b0d14c1431bd2b75 /tvix/tests/tvix-init.go | |
parent | 242949ecfbb913d0e1ac50153918f39c6107f21a (diff) |
chore(tvix/tests): rename to //tvix/boot r/6652
This is mostly boot tooling, the integration test is just one instance making use of it. Expose initrd, kernel and runVM as a separate target to CI, and move the tests to a subdirectory. Change-Id: I1d22cd68bf5af095bc11dd9d7117b62956c7f7f2 Reviewed-on: https://cl.tvl.fyi/c/depot/+/9465 Reviewed-by: raitobezarius <tvl@lahfa.xyz> Autosubmit: flokli <flokli@flokli.de> Tested-by: BuildkiteCI
Diffstat (limited to 'tvix/tests/tvix-init.go')
-rw-r--r-- | tvix/tests/tvix-init.go | 138 |
1 files changed, 0 insertions, 138 deletions
diff --git a/tvix/tests/tvix-init.go b/tvix/tests/tvix-init.go deleted file mode 100644 index 97a24bab3547..000000000000 --- a/tvix/tests/tvix-init.go +++ /dev/null @@ -1,138 +0,0 @@ -package main - -import ( - "fmt" - "log" - "os" - "os/exec" - "strings" - "syscall" -) - -// run the given command, connecting std{in,err,out} with the OS one. -func run(args ...string) error { - cmd := exec.Command(args[0], args[1:]...) - cmd.Stdin = os.Stdin - cmd.Stderr = os.Stderr - cmd.Stdout = os.Stdout - - return cmd.Run() -} - -// parse the cmdline, return a map[string]string. -func parseCmdline(cmdline string) map[string]string { - line := strings.TrimSuffix(cmdline, "\n") - fields := strings.Fields(line) - out := make(map[string]string, 0) - - for _, arg := range fields { - kv := strings.SplitN(arg, "=", 2) - switch len(kv) { - case 1: - out[kv[0]] = "" - case 2: - out[kv[0]] = kv[1] - } - } - - return out -} - -// mounts the nix store from the virtiofs tag to the given destination, -// creating the destination if it doesn't exist already. -func mountTvixStore(dest string) error { - if err := os.MkdirAll(dest, os.ModePerm); err != nil { - return fmt.Errorf("unable to mkdir dest: %w", err) - } - if err := run("mount", "-t", "virtiofs", "tvix", dest, "-o", "ro"); err != nil { - return fmt.Errorf("unable to run mount: %w", err) - } - - return nil -} - -func main() { - fmt.Print(` - ______ _ ____ _ __ - /_ __/ __(_) __ / _/___ (_) /_ - / / | | / / / |/_/ / // __ \/ / __/ - / / | |/ / /> < _/ // / / / / /_ -/_/ |___/_/_/|_| /___/_/ /_/_/\__/ - -`) - - // Set PATH to "/bbin", so we can find the u-root tools - os.Setenv("PATH", "/bbin") - - if err := run("mount", "-t", "proc", "none", "/proc"); err != nil { - log.Printf("Failed to mount /proc: %v\n", err) - } - if err := run("mount", "-t", "sysfs", "none", "/sys"); err != nil { - log.Printf("Failed to mount /sys: %v\n", err) - } - if err := run("mount", "-t", "devtmpfs", "devtmpfs", "/dev"); err != nil { - log.Printf("Failed to mount /dev: %v\n", err) - } - - cmdline, err := os.ReadFile("/proc/cmdline") - if err != nil { - log.Printf("Failed to read cmdline: %s\n", err) - } - cmdlineFields := parseCmdline(string(cmdline)) - - if _, ok := cmdlineFields["tvix.find"]; ok { - // If tvix.find is set, invoke find /nix/store - if err := mountTvixStore("/nix/store"); err != nil { - log.Printf("Failed to mount tvix store: %v\n", err) - } - - if err := run("find", "/nix/store"); err != nil { - log.Printf("Failed to run find command: %s\n", err) - } - } else if _, ok := cmdlineFields["tvix.shell"]; ok { - // If tvix.shell is set, mount the nix store to /nix/store directly, - // then invoke the elvish shell - if err := mountTvixStore("/nix/store"); err != nil { - log.Printf("Failed to mount tvix store: %v\n", err) - } - - if err := run("elvish"); err != nil { - log.Printf("Failed to run shell: %s\n", err) - } - } else if v, ok := cmdlineFields["tvix.run"]; ok { - // If tvix.run is set, mount the nix store to /nix/store directly, - // then invoke the command. - if err := mountTvixStore("/nix/store"); err != nil { - log.Printf("Failed to mount tvix store: %v\n", err) - } - - if err := run(v); err != nil { - log.Printf("Failed to run command: %s\n", err) - } - } else if v, ok := cmdlineFields["init"]; ok { - // If init is set, invoke the binary specified (with switch_root), - // and prepare /fs beforehand as well. - os.Mkdir("/fs", os.ModePerm) - if err := run("mount", "-t", "tmpfs", "none", "/fs"); err != nil { - log.Fatalf("Failed to mount /fs tmpfs: %s\n", err) - } - - // Mount /fs/nix/store - if err := mountTvixStore("/fs/nix/store"); err != nil { - log.Fatalf("Failed to mount tvix store: %v\n", err) - } - - // Invoke switch_root, which will take care of moving /proc, /sys and /dev. - if err := syscall.Exec("/bbin/switch_root", []string{"switch_root", "/fs", v}, []string{}); err != nil { - log.Printf("Failed to switch root: %s\n", err) - } - } else { - log.Printf("No command detected, not knowing what to do!") - } - - // This is only reached in the non switch_root case. - log.Printf("Nothing left to be done, powering off.") - if err := run("poweroff"); err != nil { - log.Printf("Failed to run poweroff command: %v\n", err) - } -} |