All of lore.kernel.org
 help / color / mirror / Atom feed
* [PULL 0/9] Acceptance Tests and Python libs patches for 2021-02-15
@ 2021-02-16  4:56 Cleber Rosa
  2021-02-16  4:56 ` [PULL 1/9] Acceptance Tests: bump Avocado version requirement to 85.0 Cleber Rosa
                   ` (9 more replies)
  0 siblings, 10 replies; 11+ messages in thread
From: Cleber Rosa @ 2021-02-16  4:56 UTC (permalink / raw)
  To: qemu-devel, Peter Maydell
  Cc: Beraldo Leal, Philippe Mathieu-Daudé,
	Wainer dos Santos Moschetta, Willian Rampazzo, Cleber Rosa,
	John Snow, Eduardo Habkost

The following changes since commit 8ba4bca570ace1e60614a0808631a517cf5df67a:

  Merge remote-tracking branch 'remotes/kevin/tags/for-upstream' into staging=
 (2021-02-15 17:13:57 +0000)

are available in the Git repository at:

  https://gitlab.com/cleber.gnu/qemu.git/ tags/python-next-pull-request

for you to fetch changes up to c0c5a7f18e623b8f6eb7a9ccebdccdc56db2cec7:

  Acceptance Tests: set up existing ssh keys by default (2021-02-15 22:30:06 =
-0500)

----------------------------------------------------------------
Acceptance Tests and Python libs improvements

Along with the Acceptance Tests and Python libs improvements, a
improvement to the diff generation for Python code.

----------------------------------------------------------------

Cleber Rosa (7):
  Acceptance Tests: bump Avocado version requirement to 85.0
  Python: close the log file kept by QEMUMachine before reading it
  tests/acceptance/virtio-gpu.py: preserve virtio-user-gpu log
  Acceptance Tests: introduce LinuxTest base class
  Acceptance Tests: introduce method for requiring an accelerator
  Acceptance Tests: fix population of public key in cloudinit image
  Acceptance Tests: set up existing ssh keys by default

Eric Blake (1):
  maint: Tell git that *.py files should use python diff hunks

Max Reitz (1):
  virtiofs_submounts.py test: Note on vmlinuz param

 .gitattributes                            |   1 +
 python/qemu/machine.py                    |   4 +-
 tests/acceptance/avocado_qemu/__init__.py | 127 +++++++++++++++++++++
 tests/acceptance/boot_linux.py            | 128 +++-------------------
 tests/acceptance/virtio-gpu.py            |   5 +-
 tests/acceptance/virtiofs_submounts.py    |  23 ++--
 tests/requirements.txt                    |   2 +-
 7 files changed, 163 insertions(+), 127 deletions(-)

--=20
2.26.2




^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PULL 1/9] Acceptance Tests: bump Avocado version requirement to 85.0
  2021-02-16  4:56 [PULL 0/9] Acceptance Tests and Python libs patches for 2021-02-15 Cleber Rosa
@ 2021-02-16  4:56 ` Cleber Rosa
  2021-02-16  4:56 ` [PULL 2/9] virtiofs_submounts.py test: Note on vmlinuz param Cleber Rosa
                   ` (8 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Cleber Rosa @ 2021-02-16  4:56 UTC (permalink / raw)
  To: qemu-devel, Peter Maydell
  Cc: Beraldo Leal, Philippe Mathieu-Daudé,
	Wainer dos Santos Moschetta, Willian Rampazzo, Willian Rampazzo,
	Cleber Rosa, John Snow, Eduardo Habkost

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 <crosa@redhat.com>
Message-Id: <20210211232835.2608059-2-crosa@redhat.com>
Acked-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Reviewed-by: Wainer dos Santos Moschetta <wainersm@redhat.com>
Reviewed-by: Willian Rampazzo <willianr@redhat.com>
Signed-off-by: Cleber Rosa <crosa@redhat.com>
---
 tests/requirements.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tests/requirements.txt b/tests/requirements.txt
index 62e8ffd28c2..91f3a343b95 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
-- 
2.26.2



^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PULL 2/9] virtiofs_submounts.py test: Note on vmlinuz param
  2021-02-16  4:56 [PULL 0/9] Acceptance Tests and Python libs patches for 2021-02-15 Cleber Rosa
  2021-02-16  4:56 ` [PULL 1/9] Acceptance Tests: bump Avocado version requirement to 85.0 Cleber Rosa
@ 2021-02-16  4:56 ` Cleber Rosa
  2021-02-16  4:56 ` [PULL 3/9] Python: close the log file kept by QEMUMachine before reading it Cleber Rosa
                   ` (7 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Cleber Rosa @ 2021-02-16  4:56 UTC (permalink / raw)
  To: qemu-devel, Peter Maydell
  Cc: Willian Rampazzo, Beraldo Leal, Philippe Mathieu-Daudé,
	Wainer dos Santos Moschetta, Max Reitz, Alex Bennée,
	Willian Rampazzo, Cleber Rosa, John Snow, Eduardo Habkost

From: Max Reitz <mreitz@redhat.com>

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 <alex.bennee@linaro.org>
Signed-off-by: Max Reitz <mreitz@redhat.com>
Message-Id: <20210212151649.252440-1-mreitz@redhat.com>
Reviewed-by: Cleber Rosa <crosa@redhat.com>
Reviewed-by: Willian Rampazzo <willianr@redhat.com>
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
Signed-off-by: Cleber Rosa <crosa@redhat.com>
---
 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 949ca87a837..9a69b6b17bc 100644
--- a/tests/acceptance/virtiofs_submounts.py
+++ b/tests/acceptance/virtiofs_submounts.py
@@ -228,6 +228,18 @@ def live_cleanup(self):
     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)')
-- 
2.26.2



^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PULL 3/9] Python: close the log file kept by QEMUMachine before reading it
  2021-02-16  4:56 [PULL 0/9] Acceptance Tests and Python libs patches for 2021-02-15 Cleber Rosa
  2021-02-16  4:56 ` [PULL 1/9] Acceptance Tests: bump Avocado version requirement to 85.0 Cleber Rosa
  2021-02-16  4:56 ` [PULL 2/9] virtiofs_submounts.py test: Note on vmlinuz param Cleber Rosa
@ 2021-02-16  4:56 ` Cleber Rosa
  2021-02-16  4:57 ` [PULL 4/9] tests/acceptance/virtio-gpu.py: preserve virtio-user-gpu log Cleber Rosa
                   ` (6 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Cleber Rosa @ 2021-02-16  4:56 UTC (permalink / raw)
  To: qemu-devel, Peter Maydell
  Cc: Beraldo Leal, Philippe Mathieu-Daudé,
	Wainer dos Santos Moschetta, Willian Rampazzo, Cleber Rosa,
	John Snow, Eduardo Habkost

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 <crosa@redhat.com>
Message-Id: <20210211220146.2525771-2-crosa@redhat.com>
Reviewed-by: John Snow <jsnow@redhat.com>
Signed-off-by: Cleber Rosa <crosa@redhat.com>
---
 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 7a40f4604be..6e44bda337e 100644
--- a/python/qemu/machine.py
+++ b/python/qemu/machine.py
@@ -337,12 +337,12 @@ def _post_shutdown(self) -> None:
             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:
-- 
2.26.2



^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PULL 4/9] tests/acceptance/virtio-gpu.py: preserve virtio-user-gpu log
  2021-02-16  4:56 [PULL 0/9] Acceptance Tests and Python libs patches for 2021-02-15 Cleber Rosa
                   ` (2 preceding siblings ...)
  2021-02-16  4:56 ` [PULL 3/9] Python: close the log file kept by QEMUMachine before reading it Cleber Rosa
@ 2021-02-16  4:57 ` Cleber Rosa
  2021-02-16  4:57 ` [PULL 5/9] maint: Tell git that *.py files should use python diff hunks Cleber Rosa
                   ` (5 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Cleber Rosa @ 2021-02-16  4:57 UTC (permalink / raw)
  To: qemu-devel, Peter Maydell
  Cc: Beraldo Leal, Philippe Mathieu-Daudé,
	Wainer dos Santos Moschetta, Willian Rampazzo, Cleber Rosa,
	John Snow, Eduardo Habkost

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 <crosa@redhat.com>
Reviewed-by: Wainer dos Santos Moschetta <wainersm@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
[philmd: use full sentence]
Message-Id: <20210211220146.2525771-7-crosa@redhat.com>

Signed-off-by: Cleber Rosa <crosa@redhat.com>
---
 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 211f02932f2..ab1a4c1a718 100644
--- a/tests/acceptance/virtio-gpu.py
+++ b/tests/acceptance/virtio-gpu.py
@@ -119,10 +119,11 @@ def test_vhost_user_vga_virgl(self):
         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()],
-- 
2.26.2



^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PULL 5/9] maint: Tell git that *.py files should use python diff hunks
  2021-02-16  4:56 [PULL 0/9] Acceptance Tests and Python libs patches for 2021-02-15 Cleber Rosa
                   ` (3 preceding siblings ...)
  2021-02-16  4:57 ` [PULL 4/9] tests/acceptance/virtio-gpu.py: preserve virtio-user-gpu log Cleber Rosa
@ 2021-02-16  4:57 ` Cleber Rosa
  2021-02-16  4:57 ` [PULL 6/9] Acceptance Tests: introduce LinuxTest base class Cleber Rosa
                   ` (4 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Cleber Rosa @ 2021-02-16  4:57 UTC (permalink / raw)
  To: qemu-devel, Peter Maydell
  Cc: Beraldo Leal, Philippe Mathieu-Daudé,
	Wainer dos Santos Moschetta, Willian Rampazzo, Cleber Rosa,
	John Snow, Eduardo Habkost

From: Eric Blake <eblake@redhat.com>

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 <jsnow@redhat.com>
Signed-off-by: Eric Blake <eblake@redhat.com>
Message-Id: <20210215222524.1820223-1-eblake@redhat.com>
Reviewed-by: John Snow <jsnow@redhat.com>
Reviewed-by: Cleber Rosa <crosa@redhat.com>
Signed-off-by: Cleber Rosa <crosa@redhat.com>
---
 .gitattributes | 1 +
 1 file changed, 1 insertion(+)

diff --git a/.gitattributes b/.gitattributes
index 3d2fe2ecda8..07f430e9441 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1,2 +1,3 @@
 *.c.inc         diff=c
 *.h.inc         diff=c
+*.py            diff=python
-- 
2.26.2



^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PULL 6/9] Acceptance Tests: introduce LinuxTest base class
  2021-02-16  4:56 [PULL 0/9] Acceptance Tests and Python libs patches for 2021-02-15 Cleber Rosa
                   ` (4 preceding siblings ...)
  2021-02-16  4:57 ` [PULL 5/9] maint: Tell git that *.py files should use python diff hunks Cleber Rosa
@ 2021-02-16  4:57 ` Cleber Rosa
  2021-02-16  4:57 ` [PULL 7/9] Acceptance Tests: introduce method for requiring an accelerator Cleber Rosa
                   ` (3 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Cleber Rosa @ 2021-02-16  4:57 UTC (permalink / raw)
  To: qemu-devel, Peter Maydell
  Cc: Beraldo Leal, Philippe Mathieu-Daudé,
	Wainer dos Santos Moschetta, Willian Rampazzo, Willian Rampazzo,
	Cleber Rosa, John Snow, Eduardo Habkost

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 <crosa@redhat.com>
Message-Id: <20210203172357.1422425-15-crosa@redhat.com>
Reviewed-by: Wainer dos Santos Moschetta <wainersm@redhat.com>
Reviewed-by: Willian Rampazzo <willianr@redhat.com>
Signed-off-by: Cleber Rosa <crosa@redhat.com>
---
 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 bf54e419da2..b06692a59df 100644
--- a/tests/acceptance/avocado_qemu/__init__.py
+++ b/tests/acceptance/avocado_qemu/__init__.py
@@ -16,6 +16,13 @@
 
 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 @@ def fetch_asset(self, name,
                         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 bcd923bb4a0..14e89d020d1 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 @@
 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 @@ def test_pc_q35_kvm(self):
         self.launch_and_wait()
 
 
-class BootLinuxAarch64(BootLinux):
+class BootLinuxAarch64(LinuxTest):
     """
     :avocado: tags=arch:aarch64
     :avocado: tags=machine:virt
@@ -212,7 +128,7 @@ def test_virt_kvm_gicv3(self):
         self.launch_and_wait()
 
 
-class BootLinuxPPC64(BootLinux):
+class BootLinuxPPC64(LinuxTest):
     """
     :avocado: tags=arch:ppc64
     """
@@ -230,7 +146,7 @@ def test_pseries_tcg(self):
         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 9a69b6b17bc..fc2b4fd6669 100644
--- a/tests/acceptance/virtiofs_submounts.py
+++ b/tests/acceptance/virtiofs_submounts.py
@@ -5,14 +5,12 @@
 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 test_something_that_needs_cmd1_and_cmd2(self):
     return (True, '')
 
 
-class VirtiofsSubmountsTest(BootLinux):
+class VirtiofsSubmountsTest(LinuxTest):
     """
     :avocado: tags=arch:x86_64
     """
-- 
2.26.2



^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PULL 7/9] Acceptance Tests: introduce method for requiring an accelerator
  2021-02-16  4:56 [PULL 0/9] Acceptance Tests and Python libs patches for 2021-02-15 Cleber Rosa
                   ` (5 preceding siblings ...)
  2021-02-16  4:57 ` [PULL 6/9] Acceptance Tests: introduce LinuxTest base class Cleber Rosa
@ 2021-02-16  4:57 ` Cleber Rosa
  2021-02-16  4:57 ` [PULL 8/9] Acceptance Tests: fix population of public key in cloudinit image Cleber Rosa
                   ` (2 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Cleber Rosa @ 2021-02-16  4:57 UTC (permalink / raw)
  To: qemu-devel, Peter Maydell
  Cc: Beraldo Leal, Philippe Mathieu-Daudé,
	Wainer dos Santos Moschetta, Willian Rampazzo, Willian Rampazzo,
	Cleber Rosa, John Snow, Eduardo Habkost

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 <crosa@redhat.com>
Message-Id: <20210203172357.1422425-17-crosa@redhat.com>
Reviewed-by: Beraldo Leal <bleal@redhat.com>
Reviewed-by: Willian Rampazzo <willianr@redhat.com>
Signed-off-by: Cleber Rosa <crosa@redhat.com>
---
 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 b06692a59df..687c5dc0cf6 100644
--- a/tests/acceptance/avocado_qemu/__init__.py
+++ b/tests/acceptance/avocado_qemu/__init__.py
@@ -39,6 +39,8 @@
 
 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 @@ def _get_unique_tag_val(self, tag_name):
             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 14e89d020d1..0d178038a09 100644
--- a/tests/acceptance/boot_linux.py
+++ b/tests/acceptance/boot_linux.py
@@ -12,15 +12,8 @@
 
 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 @@ def test_pc_i440fx_tcg(self):
         :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 @@ def test_pc_i440fx_kvm(self):
         :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 @@ def test_pc_q35_tcg(self):
         :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 @@ def test_pc_q35_kvm(self):
         :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 @@ def test_virt_tcg(self):
         :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 @@ def test_virt_kvm_gicv2(self):
         :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 @@ def test_virt_kvm_gicv3(self):
         :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 @@ def test_pseries_tcg(self):
         :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 @@ def test_s390_ccw_virtio_tcg(self):
         :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 fc2b4fd6669..46fa65392a1 100644
--- a/tests/acceptance/virtiofs_submounts.py
+++ b/tests/acceptance/virtiofs_submounts.py
@@ -9,8 +9,6 @@
 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 @@ def setUp(self):
         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):
-- 
2.26.2



^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PULL 8/9] Acceptance Tests: fix population of public key in cloudinit image
  2021-02-16  4:56 [PULL 0/9] Acceptance Tests and Python libs patches for 2021-02-15 Cleber Rosa
                   ` (6 preceding siblings ...)
  2021-02-16  4:57 ` [PULL 7/9] Acceptance Tests: introduce method for requiring an accelerator Cleber Rosa
@ 2021-02-16  4:57 ` Cleber Rosa
  2021-02-16  4:57 ` [PULL 9/9] Acceptance Tests: set up existing ssh keys by default Cleber Rosa
  2021-02-16 16:46 ` [PULL 0/9] Acceptance Tests and Python libs patches for 2021-02-15 Peter Maydell
  9 siblings, 0 replies; 11+ messages in thread
From: Cleber Rosa @ 2021-02-16  4:57 UTC (permalink / raw)
  To: qemu-devel, Peter Maydell
  Cc: Beraldo Leal, Philippe Mathieu-Daudé,
	Wainer dos Santos Moschetta, Willian Rampazzo, Willian Rampazzo,
	Cleber Rosa, Marc-André Lureau, John Snow, Eduardo Habkost

Currently the path of the ssh public key is being set, but its
content is obviously what's needed.

Signed-off-by: Cleber Rosa <crosa@redhat.com>
Message-Id: <20210203172357.1422425-18-crosa@redhat.com>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Wainer dos Santos Moschetta <wainersm@redhat.com>
Reviewed-by: Willian Rampazzo <willianr@redhat.com>
Signed-off-by: Cleber Rosa <crosa@redhat.com>
---
 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 687c5dc0cf6..51e9055c986 100644
--- a/tests/acceptance/avocado_qemu/__init__.py
+++ b/tests/acceptance/avocado_qemu/__init__.py
@@ -290,13 +290,15 @@ def prepare_cloudinit(self, ssh_pubkey=None):
         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
-- 
2.26.2



^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PULL 9/9] Acceptance Tests: set up existing ssh keys by default
  2021-02-16  4:56 [PULL 0/9] Acceptance Tests and Python libs patches for 2021-02-15 Cleber Rosa
                   ` (7 preceding siblings ...)
  2021-02-16  4:57 ` [PULL 8/9] Acceptance Tests: fix population of public key in cloudinit image Cleber Rosa
@ 2021-02-16  4:57 ` Cleber Rosa
  2021-02-16 16:46 ` [PULL 0/9] Acceptance Tests and Python libs patches for 2021-02-15 Peter Maydell
  9 siblings, 0 replies; 11+ messages in thread
From: Cleber Rosa @ 2021-02-16  4:57 UTC (permalink / raw)
  To: qemu-devel, Peter Maydell
  Cc: Beraldo Leal, Philippe Mathieu-Daudé,
	Wainer dos Santos Moschetta, Willian Rampazzo, Willian Rampazzo,
	Cleber Rosa, Marc-André Lureau, John Snow, Eduardo Habkost

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 <crosa@redhat.com>
Message-Id: <20210203172357.1422425-19-crosa@redhat.com>
Reviewed-by: Willian Rampazzo <willianr@redhat.com>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
[marcandre: fix typos in commit message]
Signed-off-by: Cleber Rosa <crosa@redhat.com>
---
 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 51e9055c986..df167b142cc 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 @@ def setUp(self, ssh_pubkey=None):
         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')
-- 
2.26.2



^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PULL 0/9] Acceptance Tests and Python libs patches for 2021-02-15
  2021-02-16  4:56 [PULL 0/9] Acceptance Tests and Python libs patches for 2021-02-15 Cleber Rosa
                   ` (8 preceding siblings ...)
  2021-02-16  4:57 ` [PULL 9/9] Acceptance Tests: set up existing ssh keys by default Cleber Rosa
@ 2021-02-16 16:46 ` Peter Maydell
  9 siblings, 0 replies; 11+ messages in thread
From: Peter Maydell @ 2021-02-16 16:46 UTC (permalink / raw)
  To: Cleber Rosa
  Cc: Beraldo Leal, Philippe Mathieu-Daudé,
	QEMU Developers, Wainer dos Santos Moschetta, Willian Rampazzo,
	John Snow, Eduardo Habkost

On Tue, 16 Feb 2021 at 04:57, Cleber Rosa <crosa@redhat.com> wrote:
>
> The following changes since commit 8ba4bca570ace1e60614a0808631a517cf5df67a:
>
>   Merge remote-tracking branch 'remotes/kevin/tags/for-upstream' into staging=
>  (2021-02-15 17:13:57 +0000)
>
> are available in the Git repository at:
>
>   https://gitlab.com/cleber.gnu/qemu.git/ tags/python-next-pull-request
>
> for you to fetch changes up to c0c5a7f18e623b8f6eb7a9ccebdccdc56db2cec7:
>
>   Acceptance Tests: set up existing ssh keys by default (2021-02-15 22:30:06 =
> -0500)
>
> ----------------------------------------------------------------
> Acceptance Tests and Python libs improvements
>
> Along with the Acceptance Tests and Python libs improvements, a
> improvement to the diff generation for Python code.
>


Applied, thanks.

Please update the changelog at https://wiki.qemu.org/ChangeLog/6.0
for any user-visible changes.

-- PMM


^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2021-02-16 17:11 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-02-16  4:56 [PULL 0/9] Acceptance Tests and Python libs patches for 2021-02-15 Cleber Rosa
2021-02-16  4:56 ` [PULL 1/9] Acceptance Tests: bump Avocado version requirement to 85.0 Cleber Rosa
2021-02-16  4:56 ` [PULL 2/9] virtiofs_submounts.py test: Note on vmlinuz param Cleber Rosa
2021-02-16  4:56 ` [PULL 3/9] Python: close the log file kept by QEMUMachine before reading it Cleber Rosa
2021-02-16  4:57 ` [PULL 4/9] tests/acceptance/virtio-gpu.py: preserve virtio-user-gpu log Cleber Rosa
2021-02-16  4:57 ` [PULL 5/9] maint: Tell git that *.py files should use python diff hunks Cleber Rosa
2021-02-16  4:57 ` [PULL 6/9] Acceptance Tests: introduce LinuxTest base class Cleber Rosa
2021-02-16  4:57 ` [PULL 7/9] Acceptance Tests: introduce method for requiring an accelerator Cleber Rosa
2021-02-16  4:57 ` [PULL 8/9] Acceptance Tests: fix population of public key in cloudinit image Cleber Rosa
2021-02-16  4:57 ` [PULL 9/9] Acceptance Tests: set up existing ssh keys by default Cleber Rosa
2021-02-16 16:46 ` [PULL 0/9] Acceptance Tests and Python libs patches for 2021-02-15 Peter Maydell

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.