[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 5/5] tests/functional: Convert the migration avocado test
From: |
Thomas Huth |
Subject: |
[PATCH 5/5] tests/functional: Convert the migration avocado test |
Date: |
Wed, 4 Dec 2024 08:19:11 +0100 |
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 default machine that
ships with a working firmware.
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
tests/avocado/migration.py | 135 -----------------------------
tests/functional/meson.build | 19 ++++
tests/functional/test_migration.py | 83 ++++++++++++++++++
3 files changed, 102 insertions(+), 135 deletions(-)
delete mode 100644 tests/avocado/migration.py
create mode 100755 tests/functional/test_migration.py
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 3d29b8245a..0558d0aa4e 100644
--- a/tests/functional/meson.build
+++ b/tests/functional/meson.build
@@ -61,6 +61,10 @@ tests_aarch64_system_thorough = [
'multiprocess',
]
+tests_alpha_system_quick = [
+ 'migration',
+]
+
tests_alpha_system_thorough = [
'alpha_clipper',
]
@@ -148,6 +152,10 @@ tests_ppc_system_thorough = [
'ppc_virtex_ml507',
]
+tests_ppc64_system_quick = [
+ 'migration',
+]
+
tests_ppc64_system_thorough = [
'ppc64_e500',
'ppc64_hv',
@@ -157,6 +165,7 @@ tests_ppc64_system_thorough = [
]
tests_riscv32_system_quick = [
+ 'migration',
'riscv_opensbi',
]
@@ -165,6 +174,7 @@ tests_riscv32_system_thorough = [
]
tests_riscv64_system_quick = [
+ 'migration',
'riscv_opensbi',
]
@@ -191,10 +201,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',
@@ -203,6 +221,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..9c78444f80
--- /dev/null
+++ b/tests/functional/test_migration.py
@@ -0,0 +1,83 @@
+#!/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 os
+import tempfile
+import time
+
+from qemu_test import QemuSystemTest, has_cmd
+from qemu_test.ports import Ports
+from unittest import skipUnless
+
+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 do_migrate(self, dest_uri, src_uri=None):
+ 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)
+
+ @skipUnless(*has_cmd('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.47.0