treewide: rename osbase/test/launch to osbase/test/qemu
Change-Id: Ia0775c462c8c909dc2080f01ff1f609b6d099179
Reviewed-on: https://review.monogon.dev/c/monogon/+/4046
Tested-by: Jenkins CI
Reviewed-by: Jan Schär <jan@monogon.tech>
diff --git a/metropolis/test/launch/BUILD.bazel b/metropolis/test/launch/BUILD.bazel
index fa66e5a..166ba3a 100644
--- a/metropolis/test/launch/BUILD.bazel
+++ b/metropolis/test/launch/BUILD.bazel
@@ -6,6 +6,7 @@
"cluster.go",
"insecure_key.go",
"launch.go",
+ "log.go",
"metroctl.go",
"prefixed_stdio.go",
"swtpm.go",
@@ -50,7 +51,7 @@
"//metropolis/proto/common",
"//metropolis/test/localregistry",
"//osbase/logbuffer",
- "//osbase/test/launch",
+ "//osbase/test/qemu",
"@com_github_cenkalti_backoff_v4//:backoff",
"@com_github_kballard_go_shellquote//:go-shellquote",
"@io_bazel_rules_go//go/runfiles",
diff --git a/metropolis/test/launch/cli/launch/BUILD.bazel b/metropolis/test/launch/cli/launch/BUILD.bazel
index 72825d9..4824ef6 100644
--- a/metropolis/test/launch/cli/launch/BUILD.bazel
+++ b/metropolis/test/launch/cli/launch/BUILD.bazel
@@ -8,7 +8,7 @@
deps = [
"//metropolis/proto/api",
"//metropolis/test/launch",
- "//osbase/test/launch",
+ "//osbase/test/qemu",
],
)
diff --git a/metropolis/test/launch/cli/launch/main.go b/metropolis/test/launch/cli/launch/main.go
index b4acd68..cade651 100644
--- a/metropolis/test/launch/cli/launch/main.go
+++ b/metropolis/test/launch/cli/launch/main.go
@@ -13,7 +13,7 @@
apb "source.monogon.dev/metropolis/proto/api"
mlaunch "source.monogon.dev/metropolis/test/launch"
- "source.monogon.dev/osbase/test/launch"
+ "source.monogon.dev/osbase/test/qemu"
)
func main() {
@@ -44,7 +44,7 @@
}
err = mlaunch.LaunchNode(ctx, ld, sd, tpmf, &mlaunch.NodeOptions{
Name: "test-node",
- Ports: launch.IdentityPortMap(ports),
+ Ports: qemu.IdentityPortMap(ports),
SerialPort: os.Stdout,
RunVNC: true,
NodeParameters: &apb.NodeParameters{
diff --git a/metropolis/test/launch/cluster.go b/metropolis/test/launch/cluster.go
index a0075ed..7acb738 100644
--- a/metropolis/test/launch/cluster.go
+++ b/metropolis/test/launch/cluster.go
@@ -52,7 +52,7 @@
"source.monogon.dev/metropolis/node/core/rpc"
"source.monogon.dev/metropolis/node/core/rpc/resolver"
"source.monogon.dev/metropolis/test/localregistry"
- "source.monogon.dev/osbase/test/launch"
+ "source.monogon.dev/osbase/test/qemu"
)
const (
@@ -83,7 +83,7 @@
// Ports contains the port mapping where to expose the internal ports of the VM to
// the host. See IdentityPortMap() and ConflictFreePortMap(). Ignored when
// ConnectToSocket is set.
- Ports launch.PortMap
+ Ports qemu.PortMap
// If set to true, reboots are honored. Otherwise, all reboots exit the Launch()
// command. Metropolis nodes generally restart on almost all errors, so unless you
@@ -169,7 +169,7 @@
diskBytes = max(diskBytes, uint64(st.Size()))
di := filepath.Join(stdp, "image.qcow2")
- launch.Log("Cluster: generating node QCOW2 snapshot image: %s -> %s", xNodeImagePath, di)
+ logf("Cluster: generating node QCOW2 snapshot image: %s -> %s", xNodeImagePath, di)
df, err := os.Create(di)
if err != nil {
@@ -204,7 +204,7 @@
if c.authClient == nil {
authCreds := rpc.NewAuthenticatedCredentials(c.Owner, rpc.WantInsecure())
r := resolver.New(c.ctxT, resolver.WithLogger(logging.NewFunctionBackend(func(severity logging.Severity, msg string) {
- launch.Log("Cluster: client resolver: %s: %s", severity, msg)
+ logf("Cluster: client resolver: %s: %s", severity, msg)
})))
for _, n := range c.Nodes {
r.AddEndpoint(resolver.NodeAtAddressWithDefaultPort(n.ManagementAddress))
@@ -267,16 +267,16 @@
r.ctxT, r.CtxC = context.WithCancel(ctx)
var qemuNetType string
- var qemuNetConfig launch.QemuValue
+ var qemuNetConfig qemu.QemuValue
if options.ConnectToSocket != nil {
qemuNetType = "socket"
- qemuNetConfig = launch.QemuValue{
+ qemuNetConfig = qemu.QemuValue{
"id": {"net0"},
"fd": {"3"},
}
} else {
qemuNetType = "user"
- qemuNetConfig = launch.QemuValue{
+ qemuNetConfig = qemu.QemuValue{
"id": {"net0"},
"net": {"10.42.0.0/24"},
"dhcpstart": {"10.42.0.10"},
@@ -340,7 +340,7 @@
}
if options.PcapDump {
- qemuNetDump := launch.QemuValue{
+ qemuNetDump := qemu.QemuValue{
"id": {"net0"},
"netdev": {"net0"},
"file": {filepath.Join(r.ld, "net0.pcap")},
@@ -403,20 +403,20 @@
systemCmd.Stderr = &stdErrBuf
systemCmd.Stdout = options.SerialPort
- launch.PrettyPrintQemuArgs(options.Name, systemCmd.Args)
+ qemu.PrettyPrintQemuArgs(options.Name, systemCmd.Args)
go func() {
- launch.Log("Node: Starting...")
+ logf("Node: Starting...")
err = systemCmd.Run()
- launch.Log("Node: Returned: %v", err)
+ logf("Node: Returned: %v", err)
// Stop TPM emulator and wait for it to exit to properly reap the child process
tpmCancel()
- launch.Log("Node: Waiting for TPM emulator to exit")
+ logf("Node: Waiting for TPM emulator to exit")
// Wait returns a SIGKILL error because we just cancelled its context.
// We still need to call it to avoid creating zombies.
errTpm := tpmEmuCmd.Wait()
- launch.Log("Node: TPM emulator done: %v", errTpm)
+ logf("Node: TPM emulator done: %v", errTpm)
var exerr *exec.ExitError
if err != nil && errors.As(err, &exerr) {
@@ -428,8 +428,8 @@
return
}
exerr.Stderr = stdErrBuf.Bytes()
- newErr := launch.QEMUError(*exerr)
- launch.Log("Node: %q", stdErrBuf.String())
+ newErr := qemu.QEMUError(*exerr)
+ logf("Node: %q", stdErrBuf.String())
doneC <- &newErr
return
}
@@ -600,7 +600,7 @@
Owner tls.Certificate
// Ports is the PortMap used to access the first nodes' services (defined in
// ClusterPorts) and the SOCKS proxy (at SOCKSPort).
- Ports launch.PortMap
+ Ports qemu.PortMap
// Nodes is a map from Node ID to its runtime information.
Nodes map[string]*NodeInCluster
@@ -682,14 +682,14 @@
// Retrieve owner certificate - this can take a while because the node is still
// coming up, so do it in a backoff loop.
- launch.Log("Cluster: retrieving owner certificate (this can take a few seconds while the first node boots)...")
+ logf("Cluster: retrieving owner certificate (this can take a few seconds while the first node boots)...")
aaa := apb.NewAAAClient(initClient)
var cert *tls.Certificate
err = backoff.Retry(func() error {
cert, err = rpc.RetrieveOwnerCertificate(ctx, aaa, InsecurePrivateKey)
if st, ok := status.FromError(err); ok {
if st.Code() == codes.Unavailable {
- launch.Log("Cluster: cluster UNAVAILABLE: %v", st.Message())
+ logf("Cluster: cluster UNAVAILABLE: %v", st.Message())
return err
}
}
@@ -698,7 +698,7 @@
if err != nil {
return nil, nil, fmt.Errorf("couldn't retrieve owner certificate: %w", err)
}
- launch.Log("Cluster: retrieved owner certificate.")
+ logf("Cluster: retrieved owner certificate.")
// Now connect authenticated and get the node ID.
creds := rpc.NewAuthenticatedCredentials(*cert, rpc.WantInsecure())
@@ -806,7 +806,7 @@
// Prepare links between nodes and nanoswitch.
var switchPorts []*os.File
for i := range opts.NumNodes {
- switchPort, vmPort, err := launch.NewSocketPair()
+ switchPort, vmPort, err := qemu.NewSocketPair()
if err != nil {
return nil, fmt.Errorf("failed to get socketpair: %w", err)
}
@@ -832,14 +832,14 @@
if err != nil {
return nil, fmt.Errorf("could not open log file for node %d: %w", i, err)
}
- launch.Log("Node %d logs at %s", i, path)
+ logf("Node %d logs at %s", i, path)
nodeOpts[i].SerialPort = port
}
}
// Start the first node.
ctxT, ctxC := context.WithCancel(ctx)
- launch.Log("Cluster: Starting node %d...", 0)
+ logf("Cluster: Starting node %d...", 0)
if err := LaunchNode(ctxT, ld, sd, tpmf, &nodeOpts[0], done[0]); err != nil {
ctxC()
return nil, fmt.Errorf("failed to launch first node: %w", err)
@@ -850,7 +850,7 @@
Port: 5000,
}
- var guestSvcMap launch.GuestServiceMap
+ var guestSvcMap qemu.GuestServiceMap
if opts.LocalRegistry != nil {
l, err := net.ListenTCP("tcp", &net.TCPAddr{IP: net.IPv4(127, 0, 0, 1)})
if err != nil {
@@ -865,13 +865,13 @@
<-ctxT.Done()
s.Close()
}()
- guestSvcMap = launch.GuestServiceMap{
+ guestSvcMap = qemu.GuestServiceMap{
&localRegistryAddr: *l.Addr().(*net.TCPAddr),
}
}
// Launch nanoswitch.
- portMap, err := launch.ConflictFreePortMap(ClusterPorts)
+ portMap, err := qemu.ConflictFreePortMap(ClusterPorts)
if err != nil {
ctxC()
return nil, fmt.Errorf("failed to allocate ephemeral ports: %w", err)
@@ -884,13 +884,14 @@
loggerPath := path.Join(ld, "nanoswitch.txt")
serialPort, err = NewSerialFileLogger(loggerPath)
if err != nil {
- launch.Fatal("Could not open log file for nanoswitch: %v", err)
+ logf("Could not open log file for nanoswitch: %v", err)
+ os.Exit(1)
}
- launch.Log("Nanoswitch logs at %s", loggerPath)
+ logf("Nanoswitch logs at %s", loggerPath)
} else {
serialPort = newPrefixedStdio(99)
}
- if err := launch.RunMicroVM(ctxT, &launch.MicroVMOptions{
+ if err := qemu.RunMicroVM(ctxT, &qemu.MicroVMOptions{
Name: "nanoswitch",
KernelPath: xKernelPath,
InitramfsPath: xInitramfsPath,
@@ -901,7 +902,8 @@
PcapDump: path.Join(ld, "nanoswitch.pcap"),
}); err != nil {
if !errors.Is(err, ctxT.Err()) {
- launch.Fatal("Failed to launch nanoswitch: %v", err)
+ logf("Failed to launch nanoswitch: %v", err)
+ os.Exit(1)
}
}
}()
@@ -931,7 +933,7 @@
return nil, fmt.Errorf("could not write owner certificate: %w", err)
}
- launch.Log("Cluster: Node %d is %s", 0, firstNode.ID)
+ logf("Cluster: Node %d is %s", 0, firstNode.ID)
// Set up a partially initialized cluster instance, to be filled in the
// later steps.
@@ -970,14 +972,14 @@
mgmt := apb.NewManagementClient(curC)
// Retrieve register ticket to register further nodes.
- launch.Log("Cluster: retrieving register ticket...")
+ logf("Cluster: retrieving register ticket...")
resT, err := mgmt.GetRegisterTicket(ctx, &apb.GetRegisterTicketRequest{})
if err != nil {
ctxC()
return nil, fmt.Errorf("GetRegisterTicket: %w", err)
}
ticket := resT.Ticket
- launch.Log("Cluster: retrieved register ticket (%d bytes).", len(ticket))
+ logf("Cluster: retrieved register ticket (%d bytes).", len(ticket))
// Retrieve cluster info (for directory and ca public key) to register further
// nodes.
@@ -1013,7 +1015,7 @@
// Now run the rest of the nodes.
for i := 1; i < opts.NumNodes; i++ {
- launch.Log("Cluster: Starting node %d...", i)
+ logf("Cluster: Starting node %d...", i)
err := LaunchNode(ctxT, ld, sd, tpmf, &nodeOpts[i], done[i])
if err != nil {
return nil, fmt.Errorf("failed to launch node %d: %w", i, err)
@@ -1024,7 +1026,7 @@
// nodeOpts, etc.) to Metropolis Node ID.
seenNodes := make(map[string]bool)
nodeNumberToID := make(map[int]string)
- launch.Log("Cluster: waiting for nodes to appear as NEW...")
+ logf("Cluster: waiting for nodes to appear as NEW...")
for i := 1; i < opts.NumNodes; i++ {
for {
nodes, err := getNodes(ctx, mgmt)
@@ -1049,7 +1051,7 @@
if err != nil {
return nil, fmt.Errorf("node %s has undecodable number label: %w", n.Id, err)
}
- launch.Log("Cluster: Node %d is %s", num, n.Id)
+ logf("Cluster: Node %d is %s", num, n.Id)
nodeNumberToID[num] = n.Id
}
@@ -1059,7 +1061,7 @@
time.Sleep(1 * time.Second)
}
}
- launch.Log("Found all expected nodes")
+ logf("Found all expected nodes")
// Build the rest of NodeIDs from map.
for i := 1; i < opts.NumNodes; i++ {
@@ -1082,7 +1084,7 @@
}
if node.State == cpb.NodeState_NODE_STATE_UP && node.Status != nil && node.Status.ExternalAddress != "" {
- launch.Log("Cluster: node %s is up", node.Id)
+ logf("Cluster: node %s is up", node.Id)
upNodes[node.Id] = true
cluster.Nodes[node.Id].ManagementAddress = node.Status.ExternalAddress
}
@@ -1091,7 +1093,7 @@
}
if !approvedNodes[node.Id] {
- launch.Log("Cluster: approving node %s", node.Id)
+ logf("Cluster: approving node %s", node.Id)
_, err := mgmt.ApproveNode(ctx, &apb.ApproveNodeRequest{
Pubkey: node.Pubkey,
})
@@ -1103,7 +1105,7 @@
}
}
- launch.Log("Cluster: want %d up nodes, have %d", opts.NumNodes, len(upNodes)+1)
+ logf("Cluster: want %d up nodes, have %d", opts.NumNodes, len(upNodes)+1)
if len(upNodes) == opts.NumNodes-1 {
break
}
@@ -1111,11 +1113,11 @@
}
}
- launch.Log("Cluster: all nodes up:")
+ logf("Cluster: all nodes up:")
for i, nodeID := range cluster.NodeIDs {
- launch.Log("Cluster: %d. %s at %s", i, nodeID, cluster.Nodes[nodeID].ManagementAddress)
+ logf("Cluster: %d. %s at %s", i, nodeID, cluster.Nodes[nodeID].ManagementAddress)
}
- launch.Log("Cluster: starting tests...")
+ logf("Cluster: starting tests...")
return cluster, nil
}
@@ -1142,14 +1144,14 @@
// Cancel the node's context. This will shut down QEMU.
c.nodeOpts[idx].Runtime.CtxC()
- launch.Log("Cluster: waiting for node %d (%s) to stop.", idx, id)
+ logf("Cluster: waiting for node %d (%s) to stop.", idx, id)
err = <-c.nodesDone[idx]
if err != nil {
return fmt.Errorf("while restarting node: %w", err)
}
// Start QEMU again.
- launch.Log("Cluster: restarting node %d (%s).", idx, id)
+ logf("Cluster: restarting node %d (%s).", idx, id)
if err := LaunchNode(c.ctxT, c.launchDir, c.socketDir, c.tpmFactory, &c.nodeOpts[idx], c.nodesDone[idx]); err != nil {
return fmt.Errorf("failed to launch node %d: %w", idx, err)
}
@@ -1160,10 +1162,10 @@
for {
cs, err := getNode(ctx, mgmt, id)
if err != nil {
- launch.Log("Cluster: node get error: %v", err)
+ logf("Cluster: node get error: %v", err)
return err
}
- launch.Log("Cluster: node health: %+v", cs.Health)
+ logf("Cluster: node health: %+v", cs.Health)
lhb := time.Now().Add(-cs.TimeSinceHeartbeat.AsDuration())
if lhb.After(start) && cs.Health == apb.Node_HEALTH_HEALTHY {
@@ -1171,7 +1173,7 @@
}
time.Sleep(time.Second)
}
- launch.Log("Cluster: node %d (%s) has rejoined the cluster.", idx, id)
+ logf("Cluster: node %d (%s) has rejoined the cluster.", idx, id)
return nil
}
@@ -1191,12 +1193,12 @@
// Cancel the node's context. This will shut down QEMU.
c.nodeOpts[idx].Runtime.CtxC()
- launch.Log("Cluster: waiting for node %d (%s) to stop.", idx, id)
+ logf("Cluster: waiting for node %d (%s) to stop.", idx, id)
err := <-c.nodesDone[idx]
if err != nil {
return fmt.Errorf("while shutting down node: %w", err)
}
- launch.Log("Cluster: node %d (%s) stopped.", idx, id)
+ logf("Cluster: node %d (%s) stopped.", idx, id)
return nil
}
@@ -1215,11 +1217,11 @@
}
// Start QEMU again.
- launch.Log("Cluster: starting node %d (%s).", idx, id)
+ logf("Cluster: starting node %d (%s).", idx, id)
if err := LaunchNode(c.ctxT, c.launchDir, c.socketDir, c.tpmFactory, &c.nodeOpts[idx], c.nodesDone[idx]); err != nil {
return fmt.Errorf("failed to launch node %d: %w", idx, err)
}
- launch.Log("Cluster: node %d (%s) started.", idx, id)
+ logf("Cluster: node %d (%s) started.", idx, id)
return nil
}
@@ -1227,25 +1229,25 @@
// nodes to stop. It returns an error if stopping the nodes failed, or one of
// the nodes failed to fully start in the first place.
func (c *Cluster) Close() error {
- launch.Log("Cluster: stopping...")
+ logf("Cluster: stopping...")
if c.authClient != nil {
c.authClient.Close()
}
c.ctxC()
var errs []error
- launch.Log("Cluster: waiting for nodes to exit...")
+ logf("Cluster: waiting for nodes to exit...")
for _, c := range c.nodesDone {
err := <-c
if err != nil {
errs = append(errs, err)
}
}
- launch.Log("Cluster: removing nodes' state files (%s) and sockets (%s).", c.launchDir, c.socketDir)
+ logf("Cluster: removing nodes' state files (%s) and sockets (%s).", c.launchDir, c.socketDir)
os.RemoveAll(c.launchDir)
os.RemoveAll(c.socketDir)
os.RemoveAll(c.metroctlDir)
- launch.Log("Cluster: done")
+ logf("Cluster: done")
return multierr.Combine(errs...)
}
@@ -1382,7 +1384,7 @@
if err != nil {
return fmt.Errorf("ApproveNode: %w", err)
}
- launch.Log("Cluster: %s: approved, waiting for UP", id)
+ logf("Cluster: %s: approved, waiting for UP", id)
for {
nodes, err := mgmt.GetNodes(ctx, &apb.GetNodesRequest{})
if err != nil {
@@ -1413,7 +1415,7 @@
}
time.Sleep(time.Second)
}
- launch.Log("Cluster: %s: UP", id)
+ logf("Cluster: %s: UP", id)
return nil
}
@@ -1425,7 +1427,7 @@
}
mgmt := apb.NewManagementClient(curC)
- launch.Log("Cluster: %s: adding KubernetesWorker", id)
+ logf("Cluster: %s: adding KubernetesWorker", id)
_, err = mgmt.UpdateNodeRoles(ctx, &apb.UpdateNodeRolesRequest{
Node: &apb.UpdateNodeRolesRequest_Id{
Id: id,
@@ -1443,7 +1445,7 @@
}
mgmt := apb.NewManagementClient(curC)
- launch.Log("Cluster: %s: adding KubernetesController", id)
+ logf("Cluster: %s: adding KubernetesController", id)
_, err = mgmt.UpdateNodeRoles(ctx, &apb.UpdateNodeRolesRequest{
Node: &apb.UpdateNodeRolesRequest_Id{
Id: id,
@@ -1462,7 +1464,7 @@
mgmt := apb.NewManagementClient(curC)
cur := ipb.NewCuratorClient(curC)
- launch.Log("Cluster: %s: adding ConsensusMember", id)
+ logf("Cluster: %s: adding ConsensusMember", id)
bo := backoff.NewExponentialBackOff()
bo.MaxElapsedTime = 10 * time.Second
@@ -1474,7 +1476,7 @@
ConsensusMember: ptr.To(true),
})
if err != nil {
- launch.Log("Cluster: %s: UpdateNodeRoles failed: %v", id, err)
+ logf("Cluster: %s: UpdateNodeRoles failed: %v", id, err)
}
return err
}, backoff.WithContext(bo, ctx))
@@ -1482,7 +1484,7 @@
return err
}
- launch.Log("Cluster: %s: waiting for learner/full members...", id)
+ logf("Cluster: %s: waiting for learner/full members...", id)
learner := false
for {
@@ -1498,10 +1500,10 @@
case ipb.GetConsensusStatusResponse_EtcdMember_STATUS_LEARNER:
if !learner {
learner = true
- launch.Log("Cluster: %s: became a learner, waiting for full member...", id)
+ logf("Cluster: %s: became a learner, waiting for full member...", id)
}
case ipb.GetConsensusStatusResponse_EtcdMember_STATUS_FULL:
- launch.Log("Cluster: %s: became a full member", id)
+ logf("Cluster: %s: became a full member", id)
return nil
}
}
diff --git a/osbase/test/launch/log.go b/metropolis/test/launch/log.go
similarity index 70%
rename from osbase/test/launch/log.go
rename to metropolis/test/launch/log.go
index 4cddd61..f251d5b 100644
--- a/osbase/test/launch/log.go
+++ b/metropolis/test/launch/log.go
@@ -5,13 +5,12 @@
import (
"fmt"
- "os"
"strings"
)
-// Log is compatible with the output of ConciseString as used in the Metropolis
+// logf is compatible with the output of ConciseString as used in the Metropolis
// console log, making the output more readable in unified test logs.
-func Log(f string, args ...any) {
+func logf(f string, args ...any) {
formatted := fmt.Sprintf(f, args...)
for i, line := range strings.Split(formatted, "\n") {
if len(line) == 0 {
@@ -24,8 +23,3 @@
}
}
}
-
-func Fatal(f string, args ...any) {
- Log(f, args...)
- os.Exit(1)
-}
diff --git a/metropolis/test/launch/swtpm.go b/metropolis/test/launch/swtpm.go
index 3c48227..4e83637 100644
--- a/metropolis/test/launch/swtpm.go
+++ b/metropolis/test/launch/swtpm.go
@@ -12,8 +12,6 @@
"path/filepath"
"sort"
"strings"
-
- "source.monogon.dev/osbase/test/launch"
)
// A TPMFactory manufactures virtual TPMs using swtpm.
@@ -103,13 +101,13 @@
// to a directory that will be created if it doens't exist yet, and can be passed
// to swtpm to actually emulate the created TPM.
func (f *TPMFactory) Manufacture(ctx context.Context, path string, platform *TPMPlatform) error {
- launch.Log("Starting to manufacture TPM for %s... (%+v)", path, platform)
+ logf("Starting to manufacture TPM for %s... (%+v)", path, platform)
// Path to state file. Used to make sure Manufacture runs only once.
permall := filepath.Join(path, "tpm2-00.permall")
if _, err := os.Stat(permall); err == nil {
- launch.Log("Skipping manufacturing TPM for %s, already exists", path)
+ logf("Skipping manufacturing TPM for %s, already exists", path)
return nil
}
// Prepare swtpm-localca.options.
@@ -159,6 +157,6 @@
return fmt.Errorf("%s did not get created during TPM manufacture", permall)
}
- launch.Log("Successfully manufactured TPM for %s", path)
+ logf("Successfully manufactured TPM for %s", path)
return nil
}
diff --git a/metropolis/test/nanoswitch/BUILD.bazel b/metropolis/test/nanoswitch/BUILD.bazel
index c82f409..40f7f01 100644
--- a/metropolis/test/nanoswitch/BUILD.bazel
+++ b/metropolis/test/nanoswitch/BUILD.bazel
@@ -16,7 +16,7 @@
"//osbase/logtree",
"//osbase/socksproxy",
"//osbase/supervisor",
- "//osbase/test/launch",
+ "//osbase/test/qemu",
"@com_github_google_nftables//:nftables",
"@com_github_google_nftables//expr",
"@com_github_insomniacslk_dhcp//dhcpv4",
diff --git a/metropolis/test/nanoswitch/nanoswitch.go b/metropolis/test/nanoswitch/nanoswitch.go
index 9ca2ff8..39e5026 100644
--- a/metropolis/test/nanoswitch/nanoswitch.go
+++ b/metropolis/test/nanoswitch/nanoswitch.go
@@ -34,7 +34,7 @@
dhcpcb "source.monogon.dev/metropolis/node/core/network/dhcp4c/callback"
"source.monogon.dev/osbase/logtree"
"source.monogon.dev/osbase/supervisor"
- "source.monogon.dev/osbase/test/launch"
+ "source.monogon.dev/osbase/test/qemu"
)
var switchIP = net.IP{10, 1, 0, 1}
@@ -235,7 +235,7 @@
if attrs.Flags&net.FlagUp != net.FlagUp {
netlink.LinkSetUp(link) // Attempt to take up all ethernet links
}
- if bytes.Equal(attrs.HardwareAddr, launch.HostInterfaceMAC) {
+ if bytes.Equal(attrs.HardwareAddr, qemu.HostInterfaceMAC) {
externalLink = link
} else {
vmLinks = append(vmLinks, link)
diff --git a/osbase/test/ktest/BUILD.bazel b/osbase/test/ktest/BUILD.bazel
index 0a43ab4..e247ca1 100644
--- a/osbase/test/ktest/BUILD.bazel
+++ b/osbase/test/ktest/BUILD.bazel
@@ -7,7 +7,7 @@
srcs = ["main.go"],
importpath = "source.monogon.dev/osbase/test/ktest",
visibility = ["//visibility:private"],
- deps = ["//osbase/test/launch"],
+ deps = ["//osbase/test/qemu"],
)
go_binary(
diff --git a/osbase/test/ktest/main.go b/osbase/test/ktest/main.go
index 9f17f68..5ed387c 100644
--- a/osbase/test/ktest/main.go
+++ b/osbase/test/ktest/main.go
@@ -13,7 +13,7 @@
"os"
"time"
- "source.monogon.dev/osbase/test/launch"
+ "source.monogon.dev/osbase/test/qemu"
)
var (
@@ -25,7 +25,7 @@
func main() {
flag.Parse()
- hostFeedbackConn, vmFeedbackConn, err := launch.NewSocketPair()
+ hostFeedbackConn, vmFeedbackConn, err := qemu.NewSocketPair()
if err != nil {
log.Fatalf("Failed to create socket pair: %v", err)
}
@@ -42,7 +42,7 @@
exitCodeChan <- returnCode[0]
}()
- if err := launch.RunMicroVM(context.Background(), &launch.MicroVMOptions{
+ if err := qemu.RunMicroVM(context.Background(), &qemu.MicroVMOptions{
Name: "ktest",
KernelPath: *kernelPath,
InitramfsPath: *initrdPath,
diff --git a/osbase/test/launch/BUILD.bazel b/osbase/test/qemu/BUILD.bazel
similarity index 64%
rename from osbase/test/launch/BUILD.bazel
rename to osbase/test/qemu/BUILD.bazel
index 3df6b40..f45804f 100644
--- a/osbase/test/launch/BUILD.bazel
+++ b/osbase/test/qemu/BUILD.bazel
@@ -1,12 +1,9 @@
load("@io_bazel_rules_go//go:def.bzl", "go_library")
go_library(
- name = "launch",
- srcs = [
- "launch.go",
- "log.go",
- ],
- importpath = "source.monogon.dev/osbase/test/launch",
+ name = "qemu",
+ srcs = ["launch.go"],
+ importpath = "source.monogon.dev/osbase/test/qemu",
visibility = [
"//metropolis:__subpackages__",
"//osbase:__subpackages__",
diff --git a/osbase/test/launch/launch.go b/osbase/test/qemu/launch.go
similarity index 98%
rename from osbase/test/launch/launch.go
rename to osbase/test/qemu/launch.go
index d38df79..52a1492 100644
--- a/osbase/test/launch/launch.go
+++ b/osbase/test/qemu/launch.go
@@ -1,8 +1,8 @@
// Copyright The Monogon Project Authors.
// SPDX-License-Identifier: Apache-2.0
-// launch implements test harnesses for running qemu VMs from tests.
-package launch
+// Package qemu implements test harnesses for running qemu VMs from tests.
+package qemu
import (
"bytes"
@@ -53,7 +53,7 @@
argsFmt += " "
}
}
- Log("Running %s:\n %s\n", name, argsFmt)
+ fmt.Fprintf(os.Stderr, "Running %s:\n %s\n", name, argsFmt)
}
// PortMap represents where VM ports are mapped to on the host. It maps from the VM