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 {