| 
									
										
										
										
											2019-02-12 17:38:55 -02:00
										 |  |  | # 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. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-03 13:16:31 +02:00
										 |  |  | import tempfile | 
					
						
							| 
									
										
										
										
											2023-04-26 15:00:09 -03:00
										 |  |  | import os | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-27 18:14:33 +02:00
										 |  |  | from avocado_qemu import QemuSystemTest | 
					
						
							| 
									
										
										
										
											2020-02-03 13:16:31 +02:00
										 |  |  | from avocado import skipUnless | 
					
						
							| 
									
										
										
										
											2019-02-12 17:38:55 -02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-29 14:19:39 +02:00
										 |  |  | from avocado.utils.network import ports | 
					
						
							| 
									
										
										
										
											2019-02-12 17:38:55 -02:00
										 |  |  | from avocado.utils import wait | 
					
						
							| 
									
										
										
										
											2020-02-03 13:16:31 +02:00
										 |  |  | from avocado.utils.path import find_command | 
					
						
							| 
									
										
										
										
											2019-02-12 17:38:55 -02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-26 15:00:09 -03:00
										 |  |  | class MigrationTest(QemuSystemTest): | 
					
						
							| 
									
										
										
										
											2020-02-04 17:33:04 +01:00
										 |  |  |     """
 | 
					
						
							|  |  |  |     :avocado: tags=migration | 
					
						
							|  |  |  |     """
 | 
					
						
							| 
									
										
										
										
											2019-02-12 17:38:55 -02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     timeout = 10 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @staticmethod | 
					
						
							|  |  |  |     def migration_finished(vm): | 
					
						
							|  |  |  |         return vm.command('query-migrate')['status'] in ('completed', 'failed') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-03 13:16:30 +02:00
										 |  |  |     def assert_migration(self, src_vm, dst_vm): | 
					
						
							|  |  |  |         wait.wait_for(self.migration_finished, | 
					
						
							|  |  |  |                       timeout=self.timeout, | 
					
						
							|  |  |  |                       step=0.1, | 
					
						
							|  |  |  |                       args=(src_vm,)) | 
					
						
							| 
									
										
										
										
											2020-05-28 12:24:04 +01:00
										 |  |  |         wait.wait_for(self.migration_finished, | 
					
						
							|  |  |  |                       timeout=self.timeout, | 
					
						
							|  |  |  |                       step=0.1, | 
					
						
							|  |  |  |                       args=(dst_vm,)) | 
					
						
							| 
									
										
										
										
											2020-02-03 13:16:30 +02:00
										 |  |  |         self.assertEqual(src_vm.command('query-migrate')['status'], 'completed') | 
					
						
							|  |  |  |         self.assertEqual(dst_vm.command('query-migrate')['status'], 'completed') | 
					
						
							|  |  |  |         self.assertEqual(dst_vm.command('query-status')['status'], 'running') | 
					
						
							|  |  |  |         self.assertEqual(src_vm.command('query-status')['status'],'postmigrate') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-03 13:16:30 +02:00
										 |  |  |     def do_migrate(self, dest_uri, src_uri=None): | 
					
						
							|  |  |  |         dest_vm = self.get_vm('-incoming', dest_uri) | 
					
						
							| 
									
										
										
										
											2020-01-29 22:23:43 +01:00
										 |  |  |         dest_vm.add_args('-nodefaults') | 
					
						
							| 
									
										
										
										
											2020-02-03 13:16:30 +02:00
										 |  |  |         dest_vm.launch() | 
					
						
							|  |  |  |         if src_uri is None: | 
					
						
							|  |  |  |             src_uri = dest_uri | 
					
						
							| 
									
										
										
										
											2020-01-29 22:23:43 +01:00
										 |  |  |         source_vm = self.get_vm() | 
					
						
							|  |  |  |         source_vm.add_args('-nodefaults') | 
					
						
							| 
									
										
										
										
											2020-02-03 13:16:30 +02:00
										 |  |  |         source_vm.launch() | 
					
						
							|  |  |  |         source_vm.qmp('migrate', uri=src_uri) | 
					
						
							|  |  |  |         self.assert_migration(source_vm, dest_vm) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-12 17:38:55 -02:00
										 |  |  |     def _get_free_port(self): | 
					
						
							| 
									
										
										
										
											2022-08-29 14:19:39 +02:00
										 |  |  |         port = ports.find_free_port() | 
					
						
							| 
									
										
										
										
											2019-02-12 17:38:55 -02:00
										 |  |  |         if port is None: | 
					
						
							|  |  |  |             self.cancel('Failed to find a free port') | 
					
						
							|  |  |  |         return port | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-26 15:00:09 -03:00
										 |  |  |     def migration_with_tcp_localhost(self): | 
					
						
							| 
									
										
										
										
											2019-02-12 17:38:55 -02:00
										 |  |  |         dest_uri = 'tcp:localhost:%u' % self._get_free_port() | 
					
						
							| 
									
										
										
										
											2020-02-03 13:16:30 +02:00
										 |  |  |         self.do_migrate(dest_uri) | 
					
						
							| 
									
										
										
										
											2020-02-03 13:16:31 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-26 15:00:09 -03:00
										 |  |  |     def migration_with_unix(self): | 
					
						
							| 
									
										
										
										
											2020-02-03 13:16:31 +02:00
										 |  |  |         with tempfile.TemporaryDirectory(prefix='socket_') as socket_path: | 
					
						
							|  |  |  |             dest_uri = 'unix:%s/qemu-test.sock' % socket_path | 
					
						
							|  |  |  |             self.do_migrate(dest_uri) | 
					
						
							| 
									
										
										
										
											2020-02-03 13:16:31 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     @skipUnless(find_command('nc', default=False), "'nc' command not found") | 
					
						
							| 
									
										
										
										
											2023-04-26 15:00:09 -03:00
										 |  |  |     def migration_with_exec(self): | 
					
						
							| 
									
										
										
										
											2020-03-25 13:31:37 +02:00
										 |  |  |         """The test works for both netcat-traditional and netcat-openbsd packages.""" | 
					
						
							| 
									
										
										
										
											2020-02-03 13:16:31 +02:00
										 |  |  |         free_port = self._get_free_port() | 
					
						
							|  |  |  |         dest_uri = 'exec:nc -l localhost %u' % free_port | 
					
						
							| 
									
										
										
										
											2020-03-25 13:31:37 +02:00
										 |  |  |         src_uri = 'exec:nc localhost %u' % free_port | 
					
						
							|  |  |  |         self.do_migrate(dest_uri, src_uri) | 
					
						
							| 
									
										
										
										
											2023-04-26 15:00:09 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @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 | 
					
						
							|  |  |  |     :avocado: tags=cpu:power9_v2.0 | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     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() |