All of lore.kernel.org
 help / color / mirror / Atom feed
From: Cleber Rosa <crosa@redhat.com>
To: qemu-devel@nongnu.org
Cc: "Fam Zheng" <fam@euphon.net>,
	"Aleksandar Rikalo" <aleksandar.rikalo@syrmia.com>,
	"Beraldo Leal" <bleal@redhat.com>,
	"Wainer dos Santos Moschetta" <wainersm@redhat.com>,
	"Alex Bennée" <alex.bennee@linaro.org>,
	"Philippe Mathieu-Daudé" <f4bug@amsat.org>,
	"Max Reitz" <mreitz@redhat.com>, "John Snow" <jsnow@redhat.com>,
	"Eric Auger" <eauger@redhat.com>,
	"Willian Rampazzo" <wrampazz@redhat.com>,
	"Cleber Rosa" <crosa@redhat.com>,
	"Thomas Huth" <thuth@redhat.com>,
	"Marc-André Lureau" <marcandre.lureau@redhat.com>,
	"Philippe Mathieu-Daudé" <philmd@redhat.com>,
	"Aurelien Jarno" <aurelien@aurel32.net>,
	"Eduardo Habkost" <ehabkost@redhat.com>
Subject: [PATCH 14/22] Acceptance Tests: introduce LinuxTest base class
Date: Wed,  3 Feb 2021 12:23:49 -0500	[thread overview]
Message-ID: <20210203172357.1422425-15-crosa@redhat.com> (raw)
In-Reply-To: <20210203172357.1422425-1-crosa@redhat.com>

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>
---
 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 1e745f15a2..25ea54b6ff 100644
--- a/tests/acceptance/virtiofs_submounts.py
+++ b/tests/acceptance/virtiofs_submounts.py
@@ -5,15 +5,13 @@ 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 qemu.utils import get_info_usernet_hostfwd_port
 
-from boot_linux import BootLinux
-
 
 def run_cmd(args):
     subp = subprocess.Popen(args,
@@ -72,7 +70,7 @@ def has_cmds(*cmds):
     return (True, '')
 
 
-class VirtiofsSubmountsTest(BootLinux):
+class VirtiofsSubmountsTest(LinuxTest):
     """
     :avocado: tags=arch:x86_64
     :avocado: tags=accel:kvm
-- 
2.25.4



  parent reply	other threads:[~2021-02-03 17:56 UTC|newest]

Thread overview: 86+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-02-03 17:23 [PATCH 00/22] Acceptance Test: introduce base class for Linux based tests Cleber Rosa
2021-02-03 17:23 ` [PATCH 01/22] tests/acceptance/boot_linux.py: fix typo on cloudinit error message Cleber Rosa
2021-02-03 17:41   ` Philippe Mathieu-Daudé
2021-02-04 10:34   ` Alex Bennée
2021-02-04 10:44   ` Beraldo Leal
2021-02-03 17:23 ` [PATCH 02/22] tests/acceptance/boot_linux.py: rename misleading cloudinit method Cleber Rosa
2021-02-04  6:50   ` Thomas Huth
2021-02-04 10:47   ` Alex Bennée
2021-02-04 10:48   ` Beraldo Leal
2021-02-03 17:23 ` [PATCH 03/22] Acceptance Tests: remove unnecessary tag from documentation example Cleber Rosa
2021-02-03 17:41   ` Philippe Mathieu-Daudé
2021-02-04 10:47   ` Alex Bennée
2021-02-03 17:23 ` [PATCH 04/22] tests/acceptance/virtiofs_submounts.py: use workdir property Cleber Rosa
2021-02-04 10:48   ` Alex Bennée
2021-02-04 10:50   ` Beraldo Leal
2021-02-03 17:23 ` [PATCH 05/22] tests/acceptance/virtiofs_submounts.py: do not ask for ssh key password Cleber Rosa
2021-02-04 10:49   ` Alex Bennée
2021-02-04 11:05   ` Beraldo Leal
2021-02-03 17:23 ` [PATCH 06/22] tests/acceptance/virtiofs_submounts.py: use a virtio-net device instead Cleber Rosa
2021-02-04 13:22   ` Alex Bennée
2021-02-03 17:23 ` [PATCH 07/22] tests/acceptance/virtiofs_submounts.py: evaluate string not length Cleber Rosa
2021-02-04 11:07   ` Beraldo Leal
2021-02-04 13:23   ` Alex Bennée
2021-02-09 10:25     ` Max Reitz
2021-02-09 11:24       ` Alex Bennée
2021-02-09 12:03         ` Max Reitz
2021-02-09 12:52           ` Alex Bennée
2021-02-09 13:35             ` Max Reitz
2021-02-09 16:15               ` Alex Bennée
2021-02-09 17:15             ` Philippe Mathieu-Daudé
2021-02-15 17:56               ` Cleber Rosa
2021-02-03 17:23 ` [PATCH 08/22] tests/acceptance/virtiofs_submounts.py: standardize port as integer Cleber Rosa
2021-02-04 11:14   ` Beraldo Leal
2021-02-03 17:23 ` [PATCH 09/22] tests/acceptance/virtiofs_submounts.py: required space between IP and port Cleber Rosa
2021-02-08 11:21   ` Philippe Mathieu-Daudé
2021-02-03 17:23 ` [PATCH 10/22] Python: add utility function for retrieving port redirection Cleber Rosa
2021-02-05  0:25   ` John Snow
2021-03-23 21:53     ` Cleber Rosa
2021-02-09 14:50   ` Wainer dos Santos Moschetta
2021-02-15 18:27     ` Cleber Rosa
2021-02-15 19:43       ` John Snow
2021-02-15 20:31       ` Wainer dos Santos Moschetta
2021-02-03 17:23 ` [PATCH 11/22] tests/acceptance/linux_ssh_mips_malta.py: standardize port as integer Cleber Rosa
2021-02-08 11:24   ` Philippe Mathieu-Daudé
2021-02-15 18:58   ` Willian Rampazzo
2021-02-03 17:23 ` [PATCH 12/22] Acceptance tests: clarify ssh connection failure reason Cleber Rosa
2021-02-03 17:42   ` Philippe Mathieu-Daudé
2021-02-03 17:23 ` [PATCH 13/22] tests/acceptance/virtiofs_submounts.py: add missing accel tag Cleber Rosa
2021-02-08 11:28   ` Philippe Mathieu-Daudé
2021-02-15 17:37     ` Cleber Rosa
2021-02-09 14:54   ` Wainer dos Santos Moschetta
2021-02-15 20:05   ` Willian Rampazzo
2021-02-03 17:23 ` Cleber Rosa [this message]
2021-02-09 19:27   ` [PATCH 14/22] Acceptance Tests: introduce LinuxTest base class Wainer dos Santos Moschetta
2021-02-15 19:06   ` Willian Rampazzo
2021-02-16  3:21     ` Cleber Rosa
2021-02-03 17:23 ` [PATCH 15/22] Acceptance Tests: move useful ssh methods to " Cleber Rosa
2021-02-09 19:56   ` Wainer dos Santos Moschetta
2021-02-15 19:15   ` Willian Rampazzo
2021-02-03 17:23 ` [PATCH 16/22] Acceptance Tests: introduce method for requiring an accelerator Cleber Rosa
2021-02-04 11:25   ` Beraldo Leal
2021-02-15 19:20   ` Willian Rampazzo
2021-02-03 17:23 ` [PATCH 17/22] Acceptance Tests: fix population of public key in cloudinit image Cleber Rosa
2021-02-11 10:08   ` Marc-André Lureau
2021-02-15 14:48   ` Wainer dos Santos Moschetta
2021-02-15 19:23   ` Willian Rampazzo
2021-02-03 17:23 ` [PATCH 18/22] Acceptance Tests: set up existing ssh keys by default Cleber Rosa
2021-02-11 10:15   ` Marc-André Lureau
2021-02-16  3:28     ` Cleber Rosa
2021-02-15 19:25   ` Willian Rampazzo
2021-02-03 17:23 ` [PATCH 19/22] Acceptance Tests: add port redirection for ssh " Cleber Rosa
2021-02-03 17:46   ` Philippe Mathieu-Daudé
2021-02-03 17:51     ` Philippe Mathieu-Daudé
2021-03-23 17:56       ` Cleber Rosa
2021-02-03 17:23 ` [PATCH 20/22] Acceptance Tests: add basic documentation on LinuxTest base class Cleber Rosa
2021-02-11 10:24   ` Marc-André Lureau
2021-02-12 20:30   ` Willian Rampazzo
2021-02-03 17:23 ` [PATCH 21/22] Acceptance Tests: introduce CPU hotplug test Cleber Rosa
2021-02-11 10:25   ` Marc-André Lureau
2021-02-15 19:57   ` Willian Rampazzo
2021-02-03 17:23 ` [PATCH 22/22] [NOTFORMERGE] Bump Avocado version to latest master Cleber Rosa
2021-02-11 10:45   ` Marc-André Lureau
2021-02-08 11:35 ` [PATCH 00/22] Acceptance Test: introduce base class for Linux based tests Philippe Mathieu-Daudé
2021-02-15 15:49   ` Wainer dos Santos Moschetta
2021-02-15 17:03     ` Philippe Mathieu-Daudé
2021-02-16  3:35       ` Cleber Rosa

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210203172357.1422425-15-crosa@redhat.com \
    --to=crosa@redhat.com \
    --cc=aleksandar.rikalo@syrmia.com \
    --cc=alex.bennee@linaro.org \
    --cc=aurelien@aurel32.net \
    --cc=bleal@redhat.com \
    --cc=eauger@redhat.com \
    --cc=ehabkost@redhat.com \
    --cc=f4bug@amsat.org \
    --cc=fam@euphon.net \
    --cc=jsnow@redhat.com \
    --cc=marcandre.lureau@redhat.com \
    --cc=mreitz@redhat.com \
    --cc=philmd@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=thuth@redhat.com \
    --cc=wainersm@redhat.com \
    --cc=wrampazz@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.