m/t/launch: prevent a TPM socket race with QEMU
This deflakes e2e tests by making sure that TPM emulator's socket
becomes available before QEMU is launched in LaunchNode.
Change-Id: I2ca937ca0cd4712552805dc16fcbf7949f672ff3
Reviewed-on: https://review.monogon.dev/c/monogon/+/701
Tested-by: Jenkins CI
Reviewed-by: Sergiusz Bazanski <serge@monogon.tech>
diff --git a/metropolis/test/launch/cluster/cluster.go b/metropolis/test/launch/cluster/cluster.go
index e40f7b8..5c4753d 100644
--- a/metropolis/test/launch/cluster/cluster.go
+++ b/metropolis/test/launch/cluster/cluster.go
@@ -290,6 +290,22 @@
return fmt.Errorf("failed to start TPM emulator: %w", err)
}
+ // Wait for the socket to be created by the TPM emulator before launching
+ // QEMU.
+ for {
+ _, err := os.Stat(tpmSocketPath)
+ if err == nil {
+ break
+ }
+ if err != nil && !os.IsNotExist(err) {
+ return fmt.Errorf("while stat-ing TPM socket path: %w", err)
+ }
+ if err := tpmCtx.Err(); err != nil {
+ return fmt.Errorf("while waiting for the TPM socket: %w", err)
+ }
+ time.Sleep(time.Millisecond * 100)
+ }
+
// Start the main qemu binary
systemCmd := exec.CommandContext(options.Runtime.ctxT, "qemu-system-x86_64", qemuArgs...)
if options.ConnectToSocket != nil {