From 9e5fa3a47c8016e04eb0f2d0cc405a4367e45cb2 Mon Sep 17 00:00:00 2001 From: Cleber Rosa Date: Thu, 11 Feb 2021 18:28:35 -0500 Subject: [PATCH 1/9] Acceptance Tests: bump Avocado version requirement to 85.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This version (and 84.0) contain improvements that address specific QEMU use cases, including: * Being able to download and use Fedora 31 images and thus re-activate the "boot_linux.py" tests * Being able to register local assets via "avocado assets register" and use them in tests Signed-off-by: Cleber Rosa Message-Id: <20210211232835.2608059-2-crosa@redhat.com> Acked-by: Philippe Mathieu-Daudé Reviewed-by: Wainer dos Santos Moschetta Reviewed-by: Willian Rampazzo Signed-off-by: Cleber Rosa --- tests/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/requirements.txt b/tests/requirements.txt index 62e8ffd28c..91f3a343b9 100644 --- a/tests/requirements.txt +++ b/tests/requirements.txt @@ -1,5 +1,5 @@ # Add Python module requirements, one per line, to be installed # in the tests/venv Python virtual environment. For more info, # refer to: https://pip.pypa.io/en/stable/user_guide/#id1 -avocado-framework==83.0 +avocado-framework==85.0 pycdlib==1.11.0 From 3e5c180be0ccf6ced16b76ed552182f364e5da6c Mon Sep 17 00:00:00 2001 From: Max Reitz Date: Fri, 12 Feb 2021 16:16:49 +0100 Subject: [PATCH 2/9] virtiofs_submounts.py test: Note on vmlinuz param MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From the cancel message, it is not entirely clear why this parameter is mandatory now, or that it will be optional in the future. Add such a more detailed explanation as a comment in the test source file. Suggested-by: Alex Bennée Signed-off-by: Max Reitz Message-Id: <20210212151649.252440-1-mreitz@redhat.com> Reviewed-by: Cleber Rosa Reviewed-by: Willian Rampazzo Reviewed-by: Alex Bennée Signed-off-by: Cleber Rosa --- tests/acceptance/virtiofs_submounts.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tests/acceptance/virtiofs_submounts.py b/tests/acceptance/virtiofs_submounts.py index 949ca87a83..9a69b6b17b 100644 --- a/tests/acceptance/virtiofs_submounts.py +++ b/tests/acceptance/virtiofs_submounts.py @@ -228,6 +228,18 @@ class VirtiofsSubmountsTest(BootLinux): def setUp(self): vmlinuz = self.params.get('vmlinuz') if vmlinuz is None: + """ + The Linux kernel supports FUSE auto-submounts only as of 5.10. + boot_linux.py currently provides Fedora 31, whose kernel is too + old, so this test cannot pass with the on-image kernel (you are + welcome to try, hence the option to force such a test with + -p vmlinuz=''). Therefore, for now the user must provide a + sufficiently new custom kernel, or effectively explicitly + request failure with -p vmlinuz=''. + Once an image with a sufficiently new kernel is available + (probably Fedora 34), we can make -p vmlinuz='' the default, so + that this parameter no longer needs to be specified. + """ self.cancel('vmlinuz parameter not set; you must point it to a ' 'Linux kernel binary to test (to run this test with ' \ 'the on-image kernel, set it to an empty string)') From 3c1e16c60c72e8f11a15d63e9d4a2fd33be6b106 Mon Sep 17 00:00:00 2001 From: Cleber Rosa Date: Thu, 11 Feb 2021 17:01:41 -0500 Subject: [PATCH 3/9] Python: close the log file kept by QEMUMachine before reading it Closing a file that is open for writing, and then reading from it sounds like a better idea than the opposite, given that the content will be flushed. Reference: https://docs.python.org/3/library/io.html#io.IOBase.close Signed-off-by: Cleber Rosa Message-Id: <20210211220146.2525771-2-crosa@redhat.com> Reviewed-by: John Snow Signed-off-by: Cleber Rosa --- python/qemu/machine.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/qemu/machine.py b/python/qemu/machine.py index 7a40f4604b..6e44bda337 100644 --- a/python/qemu/machine.py +++ b/python/qemu/machine.py @@ -337,12 +337,12 @@ class QEMUMachine: self._qmp.close() self._qmp_connection = None - self._load_io_log() - if self._qemu_log_file is not None: self._qemu_log_file.close() self._qemu_log_file = None + self._load_io_log() + self._qemu_log_path = None if self._temp_dir is not None: From cdcc50bf6e05749478d93b42dd4b13114f416b5a Mon Sep 17 00:00:00 2001 From: Cleber Rosa Date: Thu, 11 Feb 2021 17:01:46 -0500 Subject: [PATCH 4/9] tests/acceptance/virtio-gpu.py: preserve virtio-user-gpu log MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Preserve log at location already prepared for keeping the test's log files. While at it, log info about its location (in the main test log file), instead of printing it out. Reference: https://avocado-framework.readthedocs.io/en/85.0/api/test/avocado.html#avocado.Test.logdir Signed-off-by: Cleber Rosa Reviewed-by: Wainer dos Santos Moschetta Reviewed-by: Philippe Mathieu-Daudé [philmd: use full sentence] Message-Id: <20210211220146.2525771-7-crosa@redhat.com> Signed-off-by: Cleber Rosa --- tests/acceptance/virtio-gpu.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/acceptance/virtio-gpu.py b/tests/acceptance/virtio-gpu.py index 211f02932f..ab1a4c1a71 100644 --- a/tests/acceptance/virtio-gpu.py +++ b/tests/acceptance/virtio-gpu.py @@ -119,10 +119,11 @@ class VirtioGPUx86(Test): os.set_inheritable(vug_sock.fileno(), True) self._vug_log_path = os.path.join( - self.vm._test_dir, "vhost-user-gpu.log" + self.logdir, "vhost-user-gpu.log" ) self._vug_log_file = open(self._vug_log_path, "wb") - print(self._vug_log_path) + self.log.info('Complete vhost-user-gpu.log file can be ' + 'found at %s', self._vug_log_path) vugp = subprocess.Popen( [vug, "--virgl", "--fd=%d" % vug_sock.fileno()], From 991e80911ed131f1785bd6015647180fed4dd95f Mon Sep 17 00:00:00 2001 From: Eric Blake Date: Mon, 15 Feb 2021 16:25:24 -0600 Subject: [PATCH 5/9] maint: Tell git that *.py files should use python diff hunks Git's default hunk pattern recognizer favors the C language, but it also includes several built-in diff styles that give saner results in other languages. In particular, telling git to treat all .py files as python changes the beginning of diff hunks as follows: | --- a/python/qemu/machine.py | +++ b/python/qemu/machine.py | -@@ -337,12 +337,12 @@ class QEMUMachine: | +@@ -337,12 +337,12 @@ def _post_shutdown(self) -> None: | self._qmp.close() which makes it much easier to tell what function a patch is touching, rather than a non-descript listing of what class contains the changes. Sadly, our python files that don't use .py suffix (such as numerous iotests) do not benefit from this glob. Reported-by: John Snow Signed-off-by: Eric Blake Message-Id: <20210215222524.1820223-1-eblake@redhat.com> Reviewed-by: John Snow Reviewed-by: Cleber Rosa Signed-off-by: Cleber Rosa --- .gitattributes | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitattributes b/.gitattributes index 3d2fe2ecda..07f430e944 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,2 +1,3 @@ *.c.inc diff=c *.h.inc diff=c +*.py diff=python From 6dd7457916e17f7674e96d02b66a376b0f923fcc Mon Sep 17 00:00:00 2001 From: Cleber Rosa Date: Wed, 3 Feb 2021 12:23:49 -0500 Subject: [PATCH 6/9] Acceptance Tests: introduce LinuxTest base class This is basically the infrastructure around "boot_linux.py" tests, but now made into a base class for general use. Signed-off-by: Cleber Rosa Message-Id: <20210203172357.1422425-15-crosa@redhat.com> Reviewed-by: Wainer dos Santos Moschetta Reviewed-by: Willian Rampazzo Signed-off-by: Cleber Rosa --- tests/acceptance/avocado_qemu/__init__.py | 87 +++++++++++++++++++++ tests/acceptance/boot_linux.py | 94 ++--------------------- tests/acceptance/virtiofs_submounts.py | 6 +- 3 files changed, 94 insertions(+), 93 deletions(-) diff --git a/tests/acceptance/avocado_qemu/__init__.py b/tests/acceptance/avocado_qemu/__init__.py index bf54e419da..b06692a59d 100644 --- a/tests/acceptance/avocado_qemu/__init__.py +++ b/tests/acceptance/avocado_qemu/__init__.py @@ -16,6 +16,13 @@ import tempfile import avocado +from avocado.utils import cloudinit +from avocado.utils import datadrainer +from avocado.utils import network +from avocado.utils import vmimage +from avocado.utils.path import find_command + + #: The QEMU build root directory. It may also be the source directory #: if building from the source dir, but it's safer to use BUILD_DIR for #: that purpose. Be aware that if this code is moved outside of a source @@ -206,3 +213,83 @@ class Test(avocado.Test): expire=expire, find_only=find_only, cancel_on_missing=cancel_on_missing) + + +class LinuxTest(Test): + """Facilitates having a cloud-image Linux based available. + + For tests that indend to interact with guests, this is a better choice + to start with than the more vanilla `Test` class. + """ + + timeout = 900 + chksum = None + + def setUp(self, ssh_pubkey=None): + super(LinuxTest, self).setUp() + self.vm.add_args('-smp', '2') + self.vm.add_args('-m', '1024') + self.set_up_boot() + self.set_up_cloudinit(ssh_pubkey) + + def download_boot(self): + self.log.debug('Looking for and selecting a qemu-img binary to be ' + 'used to create the bootable snapshot image') + # If qemu-img has been built, use it, otherwise the system wide one + # will be used. If none is available, the test will cancel. + qemu_img = os.path.join(BUILD_DIR, 'qemu-img') + if not os.path.exists(qemu_img): + qemu_img = find_command('qemu-img', False) + if qemu_img is False: + self.cancel('Could not find "qemu-img", which is required to ' + 'create the bootable image') + vmimage.QEMU_IMG = qemu_img + + self.log.info('Downloading/preparing boot image') + # Fedora 31 only provides ppc64le images + image_arch = self.arch + if image_arch == 'ppc64': + image_arch = 'ppc64le' + try: + boot = vmimage.get( + 'fedora', arch=image_arch, version='31', + checksum=self.chksum, + algorithm='sha256', + cache_dir=self.cache_dirs[0], + snapshot_dir=self.workdir) + except: + self.cancel('Failed to download/prepare boot image') + return boot.path + + def prepare_cloudinit(self, ssh_pubkey=None): + self.log.info('Preparing cloudinit image') + try: + cloudinit_iso = os.path.join(self.workdir, 'cloudinit.iso') + self.phone_home_port = network.find_free_port() + cloudinit.iso(cloudinit_iso, self.name, + username='root', + password='password', + # QEMU's hard coded usermode router address + phone_home_host='10.0.2.2', + phone_home_port=self.phone_home_port, + authorized_key=ssh_pubkey) + except Exception: + self.cancel('Failed to prepare the cloudinit image') + return cloudinit_iso + + def set_up_boot(self): + path = self.download_boot() + self.vm.add_args('-drive', 'file=%s' % path) + + def set_up_cloudinit(self, ssh_pubkey=None): + cloudinit_iso = self.prepare_cloudinit(ssh_pubkey) + self.vm.add_args('-drive', 'file=%s,format=raw' % cloudinit_iso) + + def launch_and_wait(self): + self.vm.set_console() + self.vm.launch() + console_drainer = datadrainer.LineLogger(self.vm.console_socket.fileno(), + logger=self.log.getChild('console')) + console_drainer.start() + self.log.info('VM launched, waiting for boot confirmation from guest') + cloudinit.wait_for_phone_home(('0.0.0.0', self.phone_home_port), self.name) diff --git a/tests/acceptance/boot_linux.py b/tests/acceptance/boot_linux.py index bcd923bb4a..14e89d020d 100644 --- a/tests/acceptance/boot_linux.py +++ b/tests/acceptance/boot_linux.py @@ -10,16 +10,11 @@ import os -from avocado_qemu import Test, BUILD_DIR +from avocado_qemu import LinuxTest, BUILD_DIR from qemu.accel import kvm_available from qemu.accel import tcg_available -from avocado.utils import cloudinit -from avocado.utils import network -from avocado.utils import vmimage -from avocado.utils import datadrainer -from avocado.utils.path import find_command from avocado import skipIf ACCEL_NOT_AVAILABLE_FMT = "%s accelerator does not seem to be available" @@ -27,86 +22,7 @@ KVM_NOT_AVAILABLE = ACCEL_NOT_AVAILABLE_FMT % "KVM" TCG_NOT_AVAILABLE = ACCEL_NOT_AVAILABLE_FMT % "TCG" -class BootLinuxBase(Test): - def download_boot(self): - self.log.debug('Looking for and selecting a qemu-img binary to be ' - 'used to create the bootable snapshot image') - # If qemu-img has been built, use it, otherwise the system wide one - # will be used. If none is available, the test will cancel. - qemu_img = os.path.join(BUILD_DIR, 'qemu-img') - if not os.path.exists(qemu_img): - qemu_img = find_command('qemu-img', False) - if qemu_img is False: - self.cancel('Could not find "qemu-img", which is required to ' - 'create the bootable image') - vmimage.QEMU_IMG = qemu_img - - self.log.info('Downloading/preparing boot image') - # Fedora 31 only provides ppc64le images - image_arch = self.arch - if image_arch == 'ppc64': - image_arch = 'ppc64le' - try: - boot = vmimage.get( - 'fedora', arch=image_arch, version='31', - checksum=self.chksum, - algorithm='sha256', - cache_dir=self.cache_dirs[0], - snapshot_dir=self.workdir) - except: - self.cancel('Failed to download/prepare boot image') - return boot.path - - def prepare_cloudinit(self, ssh_pubkey=None): - self.log.info('Preparing cloudinit image') - try: - cloudinit_iso = os.path.join(self.workdir, 'cloudinit.iso') - self.phone_home_port = network.find_free_port() - cloudinit.iso(cloudinit_iso, self.name, - username='root', - password='password', - # QEMU's hard coded usermode router address - phone_home_host='10.0.2.2', - phone_home_port=self.phone_home_port, - authorized_key=ssh_pubkey) - except Exception: - self.cancel('Failed to prepare the cloudinit image') - return cloudinit_iso - -class BootLinux(BootLinuxBase): - """ - Boots a Linux system, checking for a successful initialization - """ - - timeout = 900 - chksum = None - - def setUp(self, ssh_pubkey=None): - super(BootLinux, self).setUp() - self.vm.add_args('-smp', '2') - self.vm.add_args('-m', '1024') - self.set_up_boot() - self.set_up_cloudinit(ssh_pubkey) - - def set_up_boot(self): - path = self.download_boot() - self.vm.add_args('-drive', 'file=%s' % path) - - def set_up_cloudinit(self, ssh_pubkey=None): - cloudinit_iso = self.prepare_cloudinit(ssh_pubkey) - self.vm.add_args('-drive', 'file=%s,format=raw' % cloudinit_iso) - - def launch_and_wait(self): - self.vm.set_console() - self.vm.launch() - console_drainer = datadrainer.LineLogger(self.vm.console_socket.fileno(), - logger=self.log.getChild('console')) - console_drainer.start() - self.log.info('VM launched, waiting for boot confirmation from guest') - cloudinit.wait_for_phone_home(('0.0.0.0', self.phone_home_port), self.name) - - -class BootLinuxX8664(BootLinux): +class BootLinuxX8664(LinuxTest): """ :avocado: tags=arch:x86_64 """ @@ -154,7 +70,7 @@ class BootLinuxX8664(BootLinux): self.launch_and_wait() -class BootLinuxAarch64(BootLinux): +class BootLinuxAarch64(LinuxTest): """ :avocado: tags=arch:aarch64 :avocado: tags=machine:virt @@ -212,7 +128,7 @@ class BootLinuxAarch64(BootLinux): self.launch_and_wait() -class BootLinuxPPC64(BootLinux): +class BootLinuxPPC64(LinuxTest): """ :avocado: tags=arch:ppc64 """ @@ -230,7 +146,7 @@ class BootLinuxPPC64(BootLinux): self.launch_and_wait() -class BootLinuxS390X(BootLinux): +class BootLinuxS390X(LinuxTest): """ :avocado: tags=arch:s390x """ diff --git a/tests/acceptance/virtiofs_submounts.py b/tests/acceptance/virtiofs_submounts.py index 9a69b6b17b..fc2b4fd666 100644 --- a/tests/acceptance/virtiofs_submounts.py +++ b/tests/acceptance/virtiofs_submounts.py @@ -5,14 +5,12 @@ import subprocess import time from avocado import skipUnless -from avocado_qemu import Test, BUILD_DIR +from avocado_qemu import LinuxTest, BUILD_DIR from avocado_qemu import wait_for_console_pattern from avocado.utils import ssh from qemu.accel import kvm_available -from boot_linux import BootLinux - def run_cmd(args): subp = subprocess.Popen(args, @@ -71,7 +69,7 @@ def has_cmds(*cmds): return (True, '') -class VirtiofsSubmountsTest(BootLinux): +class VirtiofsSubmountsTest(LinuxTest): """ :avocado: tags=arch:x86_64 """ From efe30d5011b7a667e3edac22ffd5318bc55c14b2 Mon Sep 17 00:00:00 2001 From: Cleber Rosa Date: Wed, 3 Feb 2021 12:23:51 -0500 Subject: [PATCH 7/9] Acceptance Tests: introduce method for requiring an accelerator Some tests explicitly require a QEMU accelerator to be available. Given that this depends on some runtime aspects not known before the test is started, such as the currently set QEMU binary, it's left to be checked also at runtime. Signed-off-by: Cleber Rosa Message-Id: <20210203172357.1422425-17-crosa@redhat.com> Reviewed-by: Beraldo Leal Reviewed-by: Willian Rampazzo Signed-off-by: Cleber Rosa --- tests/acceptance/avocado_qemu/__init__.py | 24 ++++++++++++++++ tests/acceptance/boot_linux.py | 34 ++++++----------------- tests/acceptance/virtiofs_submounts.py | 5 +--- 3 files changed, 34 insertions(+), 29 deletions(-) diff --git a/tests/acceptance/avocado_qemu/__init__.py b/tests/acceptance/avocado_qemu/__init__.py index b06692a59d..687c5dc0cf 100644 --- a/tests/acceptance/avocado_qemu/__init__.py +++ b/tests/acceptance/avocado_qemu/__init__.py @@ -39,6 +39,8 @@ else: sys.path.append(os.path.join(SOURCE_DIR, 'python')) +from qemu.accel import kvm_available +from qemu.accel import tcg_available from qemu.machine import QEMUMachine def is_readable_executable_file(path): @@ -162,6 +164,28 @@ class Test(avocado.Test): return vals.pop() return None + def require_accelerator(self, accelerator): + """ + Requires an accelerator to be available for the test to continue + + It takes into account the currently set qemu binary. + + If the check fails, the test is canceled. If the check itself + for the given accelerator is not available, the test is also + canceled. + + :param accelerator: name of the accelerator, such as "kvm" or "tcg" + :type accelerator: str + """ + checker = {'tcg': tcg_available, + 'kvm': kvm_available}.get(accelerator) + if checker is None: + self.cancel("Don't know how to check for the presence " + "of accelerator %s" % accelerator) + if not checker(qemu_bin=self.qemu_bin): + self.cancel("%s accelerator does not seem to be " + "available" % accelerator) + def setUp(self): self._vms = {} diff --git a/tests/acceptance/boot_linux.py b/tests/acceptance/boot_linux.py index 14e89d020d..0d178038a0 100644 --- a/tests/acceptance/boot_linux.py +++ b/tests/acceptance/boot_linux.py @@ -12,15 +12,8 @@ import os from avocado_qemu import LinuxTest, BUILD_DIR -from qemu.accel import kvm_available -from qemu.accel import tcg_available - from avocado import skipIf -ACCEL_NOT_AVAILABLE_FMT = "%s accelerator does not seem to be available" -KVM_NOT_AVAILABLE = ACCEL_NOT_AVAILABLE_FMT % "KVM" -TCG_NOT_AVAILABLE = ACCEL_NOT_AVAILABLE_FMT % "TCG" - class BootLinuxX8664(LinuxTest): """ @@ -34,8 +27,7 @@ class BootLinuxX8664(LinuxTest): :avocado: tags=machine:pc :avocado: tags=accel:tcg """ - if not tcg_available(self.qemu_bin): - self.cancel(TCG_NOT_AVAILABLE) + self.require_accelerator("tcg") self.vm.add_args("-accel", "tcg") self.launch_and_wait() @@ -44,8 +36,7 @@ class BootLinuxX8664(LinuxTest): :avocado: tags=machine:pc :avocado: tags=accel:kvm """ - if not kvm_available(self.arch, self.qemu_bin): - self.cancel(KVM_NOT_AVAILABLE) + self.require_accelerator("kvm") self.vm.add_args("-accel", "kvm") self.launch_and_wait() @@ -54,8 +45,7 @@ class BootLinuxX8664(LinuxTest): :avocado: tags=machine:q35 :avocado: tags=accel:tcg """ - if not tcg_available(self.qemu_bin): - self.cancel(TCG_NOT_AVAILABLE) + self.require_accelerator("tcg") self.vm.add_args("-accel", "tcg") self.launch_and_wait() @@ -64,8 +54,7 @@ class BootLinuxX8664(LinuxTest): :avocado: tags=machine:q35 :avocado: tags=accel:kvm """ - if not kvm_available(self.arch, self.qemu_bin): - self.cancel(KVM_NOT_AVAILABLE) + self.require_accelerator("kvm") self.vm.add_args("-accel", "kvm") self.launch_and_wait() @@ -91,8 +80,7 @@ class BootLinuxAarch64(LinuxTest): :avocado: tags=accel:tcg :avocado: tags=cpu:max """ - if not tcg_available(self.qemu_bin): - self.cancel(TCG_NOT_AVAILABLE) + self.require_accelerator("tcg") self.vm.add_args("-accel", "tcg") self.vm.add_args("-cpu", "max") self.vm.add_args("-machine", "virt,gic-version=2") @@ -105,8 +93,7 @@ class BootLinuxAarch64(LinuxTest): :avocado: tags=cpu:host :avocado: tags=device:gicv2 """ - if not kvm_available(self.arch, self.qemu_bin): - self.cancel(KVM_NOT_AVAILABLE) + self.require_accelerator("kvm") self.vm.add_args("-accel", "kvm") self.vm.add_args("-cpu", "host") self.vm.add_args("-machine", "virt,gic-version=2") @@ -119,8 +106,7 @@ class BootLinuxAarch64(LinuxTest): :avocado: tags=cpu:host :avocado: tags=device:gicv3 """ - if not kvm_available(self.arch, self.qemu_bin): - self.cancel(KVM_NOT_AVAILABLE) + self.require_accelerator("kvm") self.vm.add_args("-accel", "kvm") self.vm.add_args("-cpu", "host") self.vm.add_args("-machine", "virt,gic-version=3") @@ -140,8 +126,7 @@ class BootLinuxPPC64(LinuxTest): :avocado: tags=machine:pseries :avocado: tags=accel:tcg """ - if not tcg_available(self.qemu_bin): - self.cancel(TCG_NOT_AVAILABLE) + self.require_accelerator("tcg") self.vm.add_args("-accel", "tcg") self.launch_and_wait() @@ -159,7 +144,6 @@ class BootLinuxS390X(LinuxTest): :avocado: tags=machine:s390-ccw-virtio :avocado: tags=accel:tcg """ - if not tcg_available(self.qemu_bin): - self.cancel(TCG_NOT_AVAILABLE) + self.require_accelerator("tcg") self.vm.add_args("-accel", "tcg") self.launch_and_wait() diff --git a/tests/acceptance/virtiofs_submounts.py b/tests/acceptance/virtiofs_submounts.py index fc2b4fd666..46fa65392a 100644 --- a/tests/acceptance/virtiofs_submounts.py +++ b/tests/acceptance/virtiofs_submounts.py @@ -9,8 +9,6 @@ from avocado_qemu import LinuxTest, BUILD_DIR from avocado_qemu import wait_for_console_pattern from avocado.utils import ssh -from qemu.accel import kvm_available - def run_cmd(args): subp = subprocess.Popen(args, @@ -260,8 +258,7 @@ class VirtiofsSubmountsTest(LinuxTest): self.vm.add_args('-netdev', 'user,id=vnet,hostfwd=:127.0.0.1:0-:22', '-device', 'virtio-net,netdev=vnet') - if not kvm_available(self.arch, self.qemu_bin): - self.cancel(KVM_NOT_AVAILABLE) + self.require_accelerator("kvm") self.vm.add_args('-accel', 'kvm') def tearDown(self): From e8197c6e0c56aff83d96df221bb56a57d0bc0e96 Mon Sep 17 00:00:00 2001 From: Cleber Rosa Date: Wed, 3 Feb 2021 12:23:52 -0500 Subject: [PATCH 8/9] Acceptance Tests: fix population of public key in cloudinit image MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently the path of the ssh public key is being set, but its content is obviously what's needed. Signed-off-by: Cleber Rosa Message-Id: <20210203172357.1422425-18-crosa@redhat.com> Reviewed-by: Marc-André Lureau Reviewed-by: Wainer dos Santos Moschetta Reviewed-by: Willian Rampazzo Signed-off-by: Cleber Rosa --- tests/acceptance/avocado_qemu/__init__.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/acceptance/avocado_qemu/__init__.py b/tests/acceptance/avocado_qemu/__init__.py index 687c5dc0cf..51e9055c98 100644 --- a/tests/acceptance/avocado_qemu/__init__.py +++ b/tests/acceptance/avocado_qemu/__init__.py @@ -290,13 +290,15 @@ class LinuxTest(Test): try: cloudinit_iso = os.path.join(self.workdir, 'cloudinit.iso') self.phone_home_port = network.find_free_port() + with open(ssh_pubkey) as pubkey: + pubkey_content = pubkey.read() cloudinit.iso(cloudinit_iso, self.name, username='root', password='password', # QEMU's hard coded usermode router address phone_home_host='10.0.2.2', phone_home_port=self.phone_home_port, - authorized_key=ssh_pubkey) + authorized_key=pubkey_content) except Exception: self.cancel('Failed to prepare the cloudinit image') return cloudinit_iso From c0c5a7f18e623b8f6eb7a9ccebdccdc56db2cec7 Mon Sep 17 00:00:00 2001 From: Cleber Rosa Date: Wed, 3 Feb 2021 12:23:53 -0500 Subject: [PATCH 9/9] Acceptance Tests: set up existing ssh keys by default MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It's questionable whether it's necessary to create one brand new pair for each test. It's not questionable that it takes less time and resources to just use the keys available at "tests/keys" that exist for that exact reason. If a location for the public key is not given explicitly, the LinuxTest will now set up the existing pair of keys as the default. This removes the need for a lot of boilerplate code. To avoid the ssh client from erroring on permission issues, a directory with restrictive permissions is created for the private key. This should still be a lot cheaper than creating a new key. Signed-off-by: Cleber Rosa Message-Id: <20210203172357.1422425-19-crosa@redhat.com> Reviewed-by: Willian Rampazzo Reviewed-by: Marc-André Lureau [marcandre: fix typos in commit message] Signed-off-by: Cleber Rosa --- tests/acceptance/avocado_qemu/__init__.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tests/acceptance/avocado_qemu/__init__.py b/tests/acceptance/avocado_qemu/__init__.py index 51e9055c98..df167b142c 100644 --- a/tests/acceptance/avocado_qemu/__init__.py +++ b/tests/acceptance/avocado_qemu/__init__.py @@ -10,6 +10,7 @@ import logging import os +import shutil import sys import uuid import tempfile @@ -254,8 +255,21 @@ class LinuxTest(Test): self.vm.add_args('-smp', '2') self.vm.add_args('-m', '1024') self.set_up_boot() + if ssh_pubkey is None: + ssh_pubkey, self.ssh_key = self.set_up_existing_ssh_keys() self.set_up_cloudinit(ssh_pubkey) + def set_up_existing_ssh_keys(self): + ssh_public_key = os.path.join(SOURCE_DIR, 'tests', 'keys', 'id_rsa.pub') + source_private_key = os.path.join(SOURCE_DIR, 'tests', 'keys', 'id_rsa') + ssh_dir = os.path.join(self.workdir, '.ssh') + os.mkdir(ssh_dir, mode=0o700) + ssh_private_key = os.path.join(ssh_dir, + os.path.basename(source_private_key)) + shutil.copyfile(source_private_key, ssh_private_key) + os.chmod(ssh_private_key, 0o600) + return (ssh_public_key, ssh_private_key) + def download_boot(self): self.log.debug('Looking for and selecting a qemu-img binary to be ' 'used to create the bootable snapshot image')