From: Thomas Huth <thuth@redhat.com>
To: qemu-devel@nongnu.org
Cc: Stefan Hajnoczi <stefanha@redhat.com>, Fabiano Rosas <farosas@suse.de>
Subject: [PULL 03/20] tests/functional: Convert the migration avocado test
Date: Thu, 30 Jan 2025 14:15:17 +0100 [thread overview]
Message-ID: <20250130131535.91297-4-thuth@redhat.com> (raw)
In-Reply-To: <20250130131535.91297-1-thuth@redhat.com>
Now that we've got a find_free_port() function in the functional
test framework, we can convert the migration test, too.
While the original avocado test was only meant to run on aarch64,
ppc64 and x86, we can turn this into a more generic test by now
and run it on all architectures that have a machine which ships
with a working firmware. To avoid overlapping with the migration
qtest, we now also test migration on machines that are not covered
by the migration qtest yet.
Acked-by: Fabiano Rosas <farosas@suse.de>
Message-ID: <20250103074308.463860-1-thuth@redhat.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
MAINTAINERS | 1 +
tests/avocado/migration.py | 135 -----------------------------
tests/functional/meson.build | 32 +++++++
tests/functional/test_migration.py | 100 +++++++++++++++++++++
4 files changed, 133 insertions(+), 135 deletions(-)
delete mode 100644 tests/avocado/migration.py
create mode 100755 tests/functional/test_migration.py
diff --git a/MAINTAINERS b/MAINTAINERS
index bb96a00db0..7b4d84bf5f 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -3461,6 +3461,7 @@ F: include/migration/
F: include/qemu/userfaultfd.h
F: migration/
F: scripts/vmstate-static-checker.py
+F: tests/functional/test_migration.py
F: tests/vmstate-static-checker-data/
F: tests/qtest/migration/
F: tests/qtest/migration-*
diff --git a/tests/avocado/migration.py b/tests/avocado/migration.py
deleted file mode 100644
index be6234b3c2..0000000000
--- a/tests/avocado/migration.py
+++ /dev/null
@@ -1,135 +0,0 @@
-# Migration test
-#
-# Copyright (c) 2019 Red Hat, Inc.
-#
-# Authors:
-# Cleber Rosa <crosa@redhat.com>
-# Caio Carrara <ccarrara@redhat.com>
-#
-# This work is licensed under the terms of the GNU GPL, version 2 or
-# later. See the COPYING file in the top-level directory.
-
-
-import tempfile
-import os
-
-from avocado_qemu import QemuSystemTest
-from avocado import skipUnless
-
-from avocado.utils.network import ports
-from avocado.utils import wait
-from avocado.utils.path import find_command
-
-
-class MigrationTest(QemuSystemTest):
- """
- :avocado: tags=migration
- """
-
- timeout = 10
-
- @staticmethod
- def migration_finished(vm):
- return vm.cmd('query-migrate')['status'] in ('completed', 'failed')
-
- def assert_migration(self, src_vm, dst_vm):
- wait.wait_for(self.migration_finished,
- timeout=self.timeout,
- step=0.1,
- args=(src_vm,))
- wait.wait_for(self.migration_finished,
- timeout=self.timeout,
- step=0.1,
- args=(dst_vm,))
- self.assertEqual(src_vm.cmd('query-migrate')['status'], 'completed')
- self.assertEqual(dst_vm.cmd('query-migrate')['status'], 'completed')
- self.assertEqual(dst_vm.cmd('query-status')['status'], 'running')
- self.assertEqual(src_vm.cmd('query-status')['status'],'postmigrate')
-
- def do_migrate(self, dest_uri, src_uri=None):
- dest_vm = self.get_vm('-incoming', dest_uri)
- dest_vm.add_args('-nodefaults')
- dest_vm.launch()
- if src_uri is None:
- src_uri = dest_uri
- source_vm = self.get_vm()
- source_vm.add_args('-nodefaults')
- source_vm.launch()
- source_vm.qmp('migrate', uri=src_uri)
- self.assert_migration(source_vm, dest_vm)
-
- def _get_free_port(self):
- port = ports.find_free_port()
- if port is None:
- self.cancel('Failed to find a free port')
- return port
-
- def migration_with_tcp_localhost(self):
- dest_uri = 'tcp:localhost:%u' % self._get_free_port()
- self.do_migrate(dest_uri)
-
- def migration_with_unix(self):
- with tempfile.TemporaryDirectory(prefix='socket_') as socket_path:
- dest_uri = 'unix:%s/qemu-test.sock' % socket_path
- self.do_migrate(dest_uri)
-
- @skipUnless(find_command('nc', default=False), "'nc' command not found")
- def migration_with_exec(self):
- """The test works for both netcat-traditional and netcat-openbsd packages."""
- free_port = self._get_free_port()
- dest_uri = 'exec:nc -l localhost %u' % free_port
- src_uri = 'exec:nc localhost %u' % free_port
- self.do_migrate(dest_uri, src_uri)
-
-
-@skipUnless('aarch64' in os.uname()[4], "host != target")
-class Aarch64(MigrationTest):
- """
- :avocado: tags=arch:aarch64
- :avocado: tags=machine:virt
- :avocado: tags=cpu:max
- """
-
- def test_migration_with_tcp_localhost(self):
- self.migration_with_tcp_localhost()
-
- def test_migration_with_unix(self):
- self.migration_with_unix()
-
- def test_migration_with_exec(self):
- self.migration_with_exec()
-
-
-@skipUnless('x86_64' in os.uname()[4], "host != target")
-class X86_64(MigrationTest):
- """
- :avocado: tags=arch:x86_64
- :avocado: tags=machine:pc
- :avocado: tags=cpu:qemu64
- """
-
- def test_migration_with_tcp_localhost(self):
- self.migration_with_tcp_localhost()
-
- def test_migration_with_unix(self):
- self.migration_with_unix()
-
- def test_migration_with_exec(self):
- self.migration_with_exec()
-
-
-@skipUnless('ppc64le' in os.uname()[4], "host != target")
-class PPC64(MigrationTest):
- """
- :avocado: tags=arch:ppc64
- :avocado: tags=machine:pseries
- """
-
- def test_migration_with_tcp_localhost(self):
- self.migration_with_tcp_localhost()
-
- def test_migration_with_unix(self):
- self.migration_with_unix()
-
- def test_migration_with_exec(self):
- self.migration_with_exec()
diff --git a/tests/functional/meson.build b/tests/functional/meson.build
index b62f714220..3e11b725cb 100644
--- a/tests/functional/meson.build
+++ b/tests/functional/meson.build
@@ -59,6 +59,10 @@ tests_generic_linuxuser = [
tests_generic_bsduser = [
]
+tests_aarch64_system_quick = [
+ 'migration',
+]
+
tests_aarch64_system_thorough = [
'aarch64_aspeed',
'aarch64_raspi3',
@@ -74,10 +78,18 @@ tests_aarch64_system_thorough = [
'multiprocess',
]
+tests_alpha_system_quick = [
+ 'migration',
+]
+
tests_alpha_system_thorough = [
'alpha_clipper',
]
+tests_arm_system_quick = [
+ 'migration',
+]
+
tests_arm_system_thorough = [
'arm_aspeed_ast1030',
'arm_aspeed_palmetto',
@@ -114,6 +126,10 @@ tests_hppa_system_quick = [
'hppa_seabios',
]
+tests_i386_system_quick = [
+ 'migration',
+]
+
tests_i386_system_thorough = [
'i386_tuxrun',
]
@@ -163,6 +179,7 @@ tests_or1k_system_thorough = [
]
tests_ppc_system_quick = [
+ 'migration',
'ppc_74xx',
]
@@ -177,6 +194,10 @@ tests_ppc_system_thorough = [
'ppc_virtex_ml507',
]
+tests_ppc64_system_quick = [
+ 'migration',
+]
+
tests_ppc64_system_thorough = [
'ppc64_e500',
'ppc64_hv',
@@ -186,6 +207,7 @@ tests_ppc64_system_thorough = [
]
tests_riscv32_system_quick = [
+ 'migration',
'riscv_opensbi',
]
@@ -194,6 +216,7 @@ tests_riscv32_system_thorough = [
]
tests_riscv64_system_quick = [
+ 'migration',
'riscv_opensbi',
]
@@ -220,10 +243,18 @@ tests_sh4eb_system_thorough = [
'sh4eb_r2d',
]
+tests_sparc_system_quick = [
+ 'migration',
+]
+
tests_sparc_system_thorough = [
'sparc_sun4m',
]
+tests_sparc64_system_quick = [
+ 'migration',
+]
+
tests_sparc64_system_thorough = [
'sparc64_sun4u',
'sparc64_tuxrun',
@@ -232,6 +263,7 @@ tests_sparc64_system_thorough = [
tests_x86_64_system_quick = [
'cpu_queries',
'mem_addr_space',
+ 'migration',
'pc_cpu_hotplug_props',
'virtio_version',
'x86_cpu_model_versions',
diff --git a/tests/functional/test_migration.py b/tests/functional/test_migration.py
new file mode 100755
index 0000000000..44804113cf
--- /dev/null
+++ b/tests/functional/test_migration.py
@@ -0,0 +1,100 @@
+#!/usr/bin/env python3
+#
+# Migration test
+#
+# Copyright (c) 2019 Red Hat, Inc.
+#
+# Authors:
+# Cleber Rosa <crosa@redhat.com>
+# Caio Carrara <ccarrara@redhat.com>
+#
+# This work is licensed under the terms of the GNU GPL, version 2 or
+# later. See the COPYING file in the top-level directory.
+
+
+import tempfile
+import os
+import time
+
+from qemu_test import QemuSystemTest, skipIfMissingCommands
+from qemu_test.ports import Ports
+
+class MigrationTest(QemuSystemTest):
+
+ timeout = 10
+
+ @staticmethod
+ def migration_finished(vm):
+ return vm.cmd('query-migrate')['status'] in ('completed', 'failed')
+
+ def assert_migration(self, src_vm, dst_vm):
+
+ end = time.monotonic() + self.timeout
+ while time.monotonic() < end and not self.migration_finished(src_vm):
+ time.sleep(0.1)
+
+ end = time.monotonic() + self.timeout
+ while time.monotonic() < end and not self.migration_finished(dst_vm):
+ time.sleep(0.1)
+
+ self.assertEqual(src_vm.cmd('query-migrate')['status'], 'completed')
+ self.assertEqual(dst_vm.cmd('query-migrate')['status'], 'completed')
+ self.assertEqual(dst_vm.cmd('query-status')['status'], 'running')
+ self.assertEqual(src_vm.cmd('query-status')['status'],'postmigrate')
+
+ def select_machine(self):
+ target_machine = {
+ 'aarch64': 'quanta-gsj',
+ 'alpha': 'clipper',
+ 'arm': 'npcm750-evb',
+ 'i386': 'isapc',
+ 'ppc': 'sam460ex',
+ 'ppc64': 'mac99',
+ 'riscv32': 'spike',
+ 'riscv64': 'virt',
+ 'sparc': 'SS-4',
+ 'sparc64': 'sun4u',
+ 'x86_64': 'microvm',
+ }
+ self.set_machine(target_machine[self.arch])
+
+ def do_migrate(self, dest_uri, src_uri=None):
+ self.select_machine()
+ dest_vm = self.get_vm('-incoming', dest_uri, name="dest-qemu")
+ dest_vm.add_args('-nodefaults')
+ dest_vm.launch()
+ if src_uri is None:
+ src_uri = dest_uri
+ source_vm = self.get_vm(name="source-qemu")
+ source_vm.add_args('-nodefaults')
+ source_vm.launch()
+ source_vm.qmp('migrate', uri=src_uri)
+ self.assert_migration(source_vm, dest_vm)
+
+ def _get_free_port(self, ports):
+ port = ports.find_free_port()
+ if port is None:
+ self.skipTest('Failed to find a free port')
+ return port
+
+ def test_migration_with_tcp_localhost(self):
+ with Ports() as ports:
+ dest_uri = 'tcp:localhost:%u' % self._get_free_port(ports)
+ self.do_migrate(dest_uri)
+
+ def test_migration_with_unix(self):
+ with tempfile.TemporaryDirectory(prefix='socket_') as socket_path:
+ dest_uri = 'unix:%s/qemu-test.sock' % socket_path
+ self.do_migrate(dest_uri)
+
+ @skipIfMissingCommands('nc')
+ def test_migration_with_exec(self):
+ """The test works for both netcat-traditional and netcat-openbsd packages."""
+ with Ports() as ports:
+ free_port = self._get_free_port(ports)
+ dest_uri = 'exec:nc -l localhost %u' % free_port
+ src_uri = 'exec:nc localhost %u' % free_port
+ self.do_migrate(dest_uri, src_uri)
+
+if __name__ == '__main__':
+ QemuSystemTest.main()
--
2.48.1
next prev parent reply other threads:[~2025-01-30 13:17 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-01-30 13:15 [PULL 00/20] Functional tests, s390x improvements and slirp fixes Thomas Huth
2025-01-30 13:15 ` [PULL 01/20] tests/functional/qemu_test/decorators: Fix bad check for imports Thomas Huth
2025-01-30 13:15 ` [PULL 02/20] tests/functional: Fix broken decorators with lamda functions Thomas Huth
2025-01-30 13:15 ` Thomas Huth [this message]
2025-01-30 13:15 ` [PULL 04/20] tests/functional: Fix the aarch64_tcg_plugins test Thomas Huth
2025-01-30 13:15 ` [PULL 05/20] tests/functional: Add a ppc64 mac99 test Thomas Huth
2025-01-30 13:15 ` [PULL 06/20] tests/functional/test_mips_malta: Fix comment about endianness of the test Thomas Huth
2025-01-30 13:15 ` [PULL 07/20] target/s390x: Fix PPNO execution with icount Thomas Huth
2025-01-30 13:15 ` [PULL 08/20] target/s390x: Fix MVC not always invalidating translation blocks Thomas Huth
2025-01-30 13:15 ` [PULL 09/20] tests/tcg/s390x: Test modifying code using the MVC instruction Thomas Huth
2025-01-30 13:15 ` [PULL 10/20] hw/s390x/s390-virtio-ccw: Fix a record/replay deadlock Thomas Huth
2025-01-30 13:15 ` [PULL 11/20] virtio-balloon-pci: Allow setting nvectors, so we can use MSI-X Thomas Huth
2025-01-30 13:15 ` [PULL 12/20] virtio-mem-pci: " Thomas Huth
2025-01-30 13:15 ` [PULL 13/20] s390x/s390-virtio-ccw: Support plugging PCI-based virtio memory devices Thomas Huth
2025-01-30 13:15 ` [PULL 14/20] tests/functional: Extend PPC 40p test with Linux boot Thomas Huth
2025-01-30 13:15 ` [PULL 15/20] tests/functional: Add a decorator for skipping long running tests Thomas Huth
2025-01-30 13:15 ` [PULL 16/20] tests/functional: Add the ReplayKernelBase class Thomas Huth
2025-01-30 13:15 ` [PULL 17/20] tests/functional/test_mipsel_malta: Convert the mipsel replay tests Thomas Huth
2025-01-30 13:15 ` [PULL 18/20] tests/functional/test_mips64el_malta: Convert the mips64el " Thomas Huth
2025-01-30 13:15 ` [PULL 19/20] tests/functional/test_mips_malta: Convert the mips big endian " Thomas Huth
2025-01-30 13:15 ` [PULL 20/20] net/slirp: libslirp 4.9.0 compatibility Thomas Huth
2025-02-01 3:03 ` [PULL 00/20] Functional tests, s390x improvements and slirp fixes Stefan Hajnoczi
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=20250130131535.91297-4-thuth@redhat.com \
--to=thuth@redhat.com \
--cc=farosas@suse.de \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@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.