From 6ae99e9839413a3e4262fa7ca873ffa7af190c34 Mon Sep 17 00:00:00 2001 From: Joshua Watt Date: Mon, 5 Jun 2023 17:03:35 -0500 Subject: [PATCH] qemudriver: Handle Virtio GL change in 6.1.0 Starting with version 6.1.0, the QEMU command line argument to enable virtio with VirGL support was changed from "-vga virtio" to "-device virtio-vgal-gl". To correctly handle this, scrape the QEMU version number from the command output and use it to pass the correct arguments. Signed-off-by: Joshua Watt [bst: cherry-picked from commit df4f6a91] Signed-off-by: Bastian Krause --- labgrid/driver/qemudriver.py | 22 ++++++++++++++++++++-- tests/test_qemudriver.py | 12 +++++++++--- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/labgrid/driver/qemudriver.py b/labgrid/driver/qemudriver.py index 6e0b40678..1027ce2c7 100644 --- a/labgrid/driver/qemudriver.py +++ b/labgrid/driver/qemudriver.py @@ -6,6 +6,7 @@ import shutil import socket import subprocess +import re import tempfile import time @@ -108,6 +109,17 @@ def _atexit(self): self._child.kill() self._child.communicate(timeout=1) + def get_qemu_version(self, qemu_bin): + p = subprocess.run([qemu_bin, "-version"], stdout=subprocess.PIPE, encoding="utf-8") + if p.returncode != 0: + raise ExecutionError(f"Unable to get QEMU version. QEMU exited with: {p.returncode}") + + m = re.search(r'(?P\d+)\.(?P\d+)\.(?P\d+)', p.stdout.splitlines()[0]) + if m is None: + raise ExecutionError(f"Unable to find QEMU version in: {p.stdout.splitlines()[0]}") + + return (int(m.group('major')), int(m.group('minor')), int(m.group('micro'))) + def on_activate(self): self._tempdir = tempfile.mkdtemp(prefix="labgrid-qemu-tmp-") sockpath = f"{self._tempdir}/serialrw" @@ -121,6 +133,8 @@ def on_activate(self): "QEMU Binary Path not configured in tools configuration key") self._cmd = [qemu_bin] + self._qemu_version = self.get_qemu_version(qemu_bin) + boot_args = [] if self.kernel is not None: @@ -190,8 +204,12 @@ def on_activate(self): self._cmd.append("-display") self._cmd.append("none") elif self.display == "egl-headless": - self._cmd.append("-vga") - self._cmd.append("virtio") + if self._qemu_version >= (6, 1, 0): + self._cmd.append("-device") + self._cmd.append("virtio-vga-gl") + else: + self._cmd.append("-vga") + self._cmd.append("virtio") self._cmd.append("-display") self._cmd.append("egl-headless") else: diff --git a/tests/test_qemudriver.py b/tests/test_qemudriver.py index d94032ca9..bfbe08edb 100644 --- a/tests/test_qemudriver.py +++ b/tests/test_qemudriver.py @@ -60,14 +60,20 @@ def qemu_mock(mocker): socket_mock = mocker.patch('socket.socket') socket_mock.return_value.accept.return_value = mocker.MagicMock(), '' +@pytest.fixture +def qemu_version_mock(mocker): + run_mock = mocker.patch('subprocess.run') + run_mock.return_value.returncode = 0 + run_mock.return_value.stdout = "QEMU emulator version 4.2.1" + def test_qemu_instance(qemu_target, qemu_driver): assert (isinstance(qemu_driver, QEMUDriver)) -def test_qemu_activate_deactivate(qemu_target, qemu_driver): +def test_qemu_activate_deactivate(qemu_target, qemu_driver, qemu_version_mock): qemu_target.activate(qemu_driver) qemu_target.deactivate(qemu_driver) -def test_qemu_on_off(qemu_target, qemu_driver, qemu_mock): +def test_qemu_on_off(qemu_target, qemu_driver, qemu_mock, qemu_version_mock): qemu_target.activate(qemu_driver) qemu_driver.on() @@ -75,7 +81,7 @@ def test_qemu_on_off(qemu_target, qemu_driver, qemu_mock): qemu_target.deactivate(qemu_driver) -def test_qemu_read_write(qemu_target, qemu_driver, qemu_mock): +def test_qemu_read_write(qemu_target, qemu_driver, qemu_mock, qemu_version_mock): qemu_target.activate(qemu_driver) qemu_driver.on()