aboutsummaryrefslogtreecommitdiffstats
path: root/vm
diff options
context:
space:
mode:
Diffstat (limited to 'vm')
-rw-r--r--vm/starnix/starnix.go101
1 files changed, 74 insertions, 27 deletions
diff --git a/vm/starnix/starnix.go b/vm/starnix/starnix.go
index c1921aff5..98d44d3ff 100644
--- a/vm/starnix/starnix.go
+++ b/vm/starnix/starnix.go
@@ -12,6 +12,7 @@ import (
"os"
"os/exec"
"path/filepath"
+ "slices"
"strconv"
"strings"
"time"
@@ -133,30 +134,24 @@ func (pool *Pool) Create(workdir string, index int) (vmimpl.Instance, error) {
inst.fuchsiaDir,
err)
}
- pubkey, err := inst.runFfx(30*time.Second, "config", "get", "ssh.pub")
+ pubkey, err := inst.getFfxConfigValue("ssh.pub")
if err != nil {
return nil, err
}
- inst.sshPubKey = string(bytes.Trim(pubkey, "\"\n"))
- privkey, err := inst.runFfx(30*time.Second, "config", "get", "ssh.priv")
- if err != nil {
- return nil, err
- }
- inst.sshPrivKey = string(bytes.Trim(privkey, "\"\n"))
+ inst.sshPubKey = pubkey
- // Copy auto-detected product bundle path from in-tree ffx to isolated ffx.
- cmd := osutil.Command(inst.ffxBinary,
- "-c", "log.enabled=false,ffx.analytics.disabled=true,daemon.autostart=false",
- "config", "get", "product.path")
- cmd.Env = append(cmd.Environ(), "FUCHSIA_ANALYTICS_DISABLED=1")
- cmd.Dir = inst.fuchsiaDir
- output, err := osutil.Run(30*time.Second, cmd)
+ privkey, err := inst.getFfxConfigValue("ssh.priv")
if err != nil {
return nil, err
}
- pbPath := string(bytes.Trim(output, "\"\n"))
+ inst.sshPrivKey = privkey
- if _, err := inst.runFfx(30*time.Second, "config", "set", "product.path", pbPath); err != nil {
+ // Copy auto-detected paths from in-tree ffx to isolated ffx.
+ err = inst.copyFfxConfigValuesToIsolate(
+ "product.path",
+ "sdk.overrides.aemu_internal",
+ "sdk.overrides.uefi_internal_x64")
+ if err != nil {
return nil, err
}
@@ -186,7 +181,7 @@ func (inst *instance) boot() error {
}
inst.merger = vmimpl.NewOutputMerger(tee)
- inst.runFfx(5*time.Minute, "emu", "stop", inst.name)
+ inst.runFfx(5*time.Minute, true, "emu", "stop", inst.name)
if err := inst.startFuchsiaVM(); err != nil {
return fmt.Errorf("instance %s: could not start Fuchsia VM: %w", inst.name, err)
@@ -207,7 +202,7 @@ func (inst *instance) boot() error {
}
func (inst *instance) Close() error {
- inst.runFfx(5*time.Minute, "emu", "stop", inst.name)
+ inst.runFfx(5*time.Minute, true, "emu", "stop", inst.name)
if inst.fuchsiaLogs != nil {
inst.fuchsiaLogs.Process.Kill()
inst.fuchsiaLogs.Wait()
@@ -229,8 +224,10 @@ func (inst *instance) Close() error {
}
func (inst *instance) startFuchsiaVM() error {
- inst.runFfx(30*time.Second, "config", "get", "product.path")
- if _, err := inst.runFfx(5*time.Minute, "emu", "start", "--headless",
+ if _, err := inst.runFfx(
+ 5*time.Minute,
+ true,
+ "emu", "start", "--headless",
"--name", inst.name, "--net", "user"); err != nil {
return err
}
@@ -241,7 +238,10 @@ func (inst *instance) startFuchsiaLogs() error {
// `ffx log` outputs some buffered logs by default, and logs from early boot
// trigger a false positive from the unexpected reboot check. To avoid this,
// only request logs from now on.
- cmd := inst.ffxCommand("--target", inst.name, "log", "--since", "now",
+ cmd := inst.ffxCommand(
+ true,
+ "--target", inst.name,
+ "log", "--since", "now",
"--show-metadata", "--show-full-moniker", "--no-color",
"--exclude-tags", "netlink")
cmd.Stdout = inst.wpipe
@@ -259,6 +259,7 @@ func (inst *instance) startFuchsiaLogs() error {
func (inst *instance) startSshdAndConnect() error {
if _, err := inst.runFfx(
5*time.Minute,
+ true,
"--target",
inst.name,
"component",
@@ -273,6 +274,7 @@ func (inst *instance) startSshdAndConnect() error {
}
if _, err := inst.runFfx(
5*time.Minute,
+ true,
"--target",
inst.name,
"component",
@@ -287,6 +289,7 @@ func (inst *instance) startSshdAndConnect() error {
}
if _, err := inst.runFfx(
5*time.Minute,
+ true,
"--target",
inst.name,
"component",
@@ -308,6 +311,7 @@ func (inst *instance) connect() error {
}
address, err := inst.runFfx(
30*time.Second,
+ true,
"--target",
inst.name,
"target",
@@ -324,7 +328,8 @@ func (inst *instance) connect() error {
"-o", "UserKnownHostsFile=/dev/null",
"-i", inst.sshPrivKey,
"-NT",
- "-L", fmt.Sprintf("localhost:%d:localhost:7000", inst.port), fmt.Sprintf("ssh://%s", bytes.Trim(address, "\n")),
+ "-L", fmt.Sprintf("localhost:%d:localhost:7000", inst.port),
+ fmt.Sprintf("ssh://%s", bytes.Trim(address, "\n")),
)
cmd.Stderr = os.Stderr
if err = cmd.Start(); err != nil {
@@ -340,18 +345,30 @@ func (inst *instance) connect() error {
return nil
}
-func (inst *instance) ffxCommand(args ...string) *exec.Cmd {
+func (inst *instance) ffxCommand(isolated bool, args ...string) *exec.Cmd {
+ config := []string{"-c", "log.enabled=false,ffx.analytics.disabled=true"}
+ if !isolated {
+ config = append(config, "-c", "daemon.autostart=false")
+ }
+ args = slices.Concat(config, args)
cmd := osutil.Command(inst.ffxBinary, args...)
cmd.Dir = inst.fuchsiaDir
- cmd.Env = append(cmd.Environ(), "FFX_ISOLATE_DIR="+inst.ffxDir, "FUCHSIA_ANALYTICS_DISABLED=1")
+ cmd.Env = append(cmd.Environ(), "FUCHSIA_ANALYTICS_DISABLED=1")
+ if isolated {
+ cmd.Env = append(cmd.Env, "FFX_ISOLATE_DIR="+inst.ffxDir)
+ }
return cmd
}
-func (inst *instance) runFfx(timeout time.Duration, args ...string) ([]byte, error) {
+func (inst *instance) runFfx(timeout time.Duration, isolated bool, args ...string) ([]byte, error) {
if inst.debug {
- log.Logf(1, "instance %s: running ffx: %q", inst.name, args)
+ isolation := "without"
+ if isolated {
+ isolation = "with"
+ }
+ log.Logf(1, "instance %s: running ffx %s isolation: %q", inst.name, isolation, args)
}
- cmd := inst.ffxCommand(args...)
+ cmd := inst.ffxCommand(isolated, args...)
cmd.Stderr = os.Stderr
output, err := osutil.Run(timeout, cmd)
if inst.debug {
@@ -360,6 +377,36 @@ func (inst *instance) runFfx(timeout time.Duration, args ...string) ([]byte, err
return output, err
}
+// Gets a value from ffx's default configuration.
+func (inst *instance) getFfxConfigValue(key string) (string, error) {
+ rawValue, err := inst.runFfx(
+ 30*time.Second,
+ false,
+ "config", "get", key)
+ if err != nil {
+ return "", err
+ }
+ return string(bytes.Trim(rawValue, "\"\n")), nil
+}
+
+// Copies values from ffx's default configuration into the ffx isolate's configuration.
+func (inst *instance) copyFfxConfigValuesToIsolate(keys ...string) error {
+ for _, key := range keys {
+ value, err := inst.getFfxConfigValue(key)
+ if err != nil {
+ return err
+ }
+ _, err = inst.runFfx(
+ 30*time.Second,
+ true,
+ "config", "set", key, value)
+ if err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
// Runs a command inside the fuchsia directory.
func (inst *instance) runCommand(cmd string, args ...string) error {
if inst.debug {