From cc33fd5f5bf52cc704f9c8e27f51d8fad80bf3e7 Mon Sep 17 00:00:00 2001 From: Luke Hackwell Date: Mon, 2 Dec 2024 16:25:27 +0000 Subject: [PATCH] feat: support parallel execution in QEMU toolchains --- bazel/labgrid/strategy/qemu.py | 29 ++++++++++++++++++- .../toolchain/config/qemu/amd64/config.yaml | 3 +- .../toolchain/config/qemu/arm64/config.yaml | 3 +- 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/bazel/labgrid/strategy/qemu.py b/bazel/labgrid/strategy/qemu.py index 04d4166c..2e7de496 100644 --- a/bazel/labgrid/strategy/qemu.py +++ b/bazel/labgrid/strategy/qemu.py @@ -4,9 +4,11 @@ import attr from labgrid.driver.qemudriver import QEMUDriver from labgrid.driver.shelldriver import ShellDriver +from labgrid.driver.sshdriver import SSHDriver from labgrid.factory import target_factory from labgrid.step import step from labgrid.strategy import Strategy, StrategyError +from labgrid.util import get_free_port class Status(enum.Enum): @@ -18,10 +20,33 @@ class Status(enum.Enum): @target_factory.reg_driver @attr.s(eq=False) class QEMUStrategy(Strategy): - bindings = {"qemu": QEMUDriver, "shell": ShellDriver} + bindings = {"qemu": QEMUDriver, "shell": ShellDriver, "ssh": SSHDriver} status = attr.ib(default=Status.unknown) + def __attrs_post_init__(self): + super().__attrs_post_init__() + self._local_port = None + + @step() + def _update_network_service(self): + if self._local_port is not None: + self.qemu.remove_port_forward( + "tcp", + "", + self._local_port, + ) + + self._local_port = get_free_port() + self.ssh.networkservice.port = self._local_port + self.qemu.add_port_forward( + "tcp", + "", + self._local_port, + "", + 22, + ) + @step() def transition(self, status, *, step): if not isinstance(status, Status): @@ -46,6 +71,8 @@ class QEMUStrategy(Strategy): self.qemu.on() # Wait until booted self.target.activate(self.shell) + # Dynamically allocate SSH port + self._update_network_service() else: raise StrategyError(f"no transition found from {self.status} to {status}") self.status = status diff --git a/labgrid/toolchain/config/qemu/amd64/config.yaml b/labgrid/toolchain/config/qemu/amd64/config.yaml index a8377ee4..86d10b0a 100644 --- a/labgrid/toolchain/config/qemu/amd64/config.yaml +++ b/labgrid/toolchain/config/qemu/amd64/config.yaml @@ -3,7 +3,6 @@ targets: resources: NetworkService: address: "localhost" - port: 2222 username: "labgrid-user" password: "labgrid" drivers: @@ -12,7 +11,7 @@ targets: machine: "pc" cpu: "max" memory: "2G" - nic: "user,model=e1000,hostfwd=tcp::2222-:22" + nic: "user,model=e1000" extra_args: !template "-snapshot -drive file=$LG_QEMU_QCOW2_IMAGE,format=qcow2 -cdrom $LG_QEMU_VIRT_IMAGE" ShellDriver: prompt: " login: " diff --git a/labgrid/toolchain/config/qemu/arm64/config.yaml b/labgrid/toolchain/config/qemu/arm64/config.yaml index 0c4098c0..db848af1 100644 --- a/labgrid/toolchain/config/qemu/arm64/config.yaml +++ b/labgrid/toolchain/config/qemu/arm64/config.yaml @@ -3,7 +3,6 @@ targets: resources: NetworkService: address: "localhost" - port: 2223 username: "labgrid-user" password: "labgrid" drivers: @@ -13,7 +12,7 @@ targets: cpu: "max,pauth-impdef=on" memory: "2G" bios: "efi" - nic: "user,model=virtio-net-pci,hostfwd=tcp::2223-:22" + nic: "user,model=virtio-net-pci" extra_args: !template "-snapshot -smp 4 -drive file=$LG_QEMU_QCOW2_IMAGE,format=qcow2 -cdrom $LG_QEMU_VIRT_IMAGE" ShellDriver: prompt: " login: " -- GitLab