From 7fc1c2842d2b6040fa3e19609653b712131fa0fa Mon Sep 17 00:00:00 2001 From: lcheng Date: Wed, 9 Oct 2024 09:16:00 +0800 Subject: [PATCH] migration: Add case about destroy vm XXX-298199 - [VM migration][async ops] destroy vm during PerformPhase of migration Signed-off-by: lcheng --- .../destroy_vm_during_performphase.cfg | 65 +++++++++++++++++++ .../destroy_vm_during_performphase.py | 53 +++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 libvirt/tests/cfg/migration/async_ops/destroy_vm_during_performphase.cfg create mode 100644 libvirt/tests/src/migration/async_ops/destroy_vm_during_performphase.py diff --git a/libvirt/tests/cfg/migration/async_ops/destroy_vm_during_performphase.cfg b/libvirt/tests/cfg/migration/async_ops/destroy_vm_during_performphase.cfg new file mode 100644 index 0000000000..a31660f2cf --- /dev/null +++ b/libvirt/tests/cfg/migration/async_ops/destroy_vm_during_performphase.cfg @@ -0,0 +1,65 @@ +- migration.async_ops.destroy_vm_during_performphase: + type = destroy_vm_during_performphase + migration_setup = 'yes' + storage_type = 'nfs' + setup_local_nfs = 'yes' + disk_type = "file" + disk_source_protocol = "netfs" + mnt_path_name = ${nfs_mount_dir} + # Console output can only be monitored via virsh console output + only_pty = True + take_regular_screendumps = no + # Extra options to pass after + virsh_migrate_extra = '' + # SSH connection time out + ssh_timeout = 60 + # Local URI + virsh_migrate_connect_uri = 'qemu:///system' + virsh_migrate_dest_state = "running" + virsh_migrate_src_state = "shut off" + image_convert = 'no' + server_ip = "${migrate_dest_host}" + server_user = "root" + server_pwd = "${migrate_dest_pwd}" + check_network_accessibility_after_mig = "yes" + migrate_desturi_port = "16509" + migrate_desturi_type = "tcp" + virsh_migrate_desturi = "qemu+tcp://${migrate_dest_host}/system" + status_error = "yes" + migrate_again = "yes" + migrate_again_status_error = "no" + variants: + - p2p: + virsh_migrate_options = '--live --p2p --verbose' + - non_p2p: + virsh_migrate_options = '--live --verbose' + variants: + - with_precopy: + variants: + - destroy_dst_vm_before_vm_paused: + virsh_migrate_extra = "--bandwidth 1" + expected_event_src = ["migration-iteration"] + expected_event_target = ["lifecycle.*Stopped Destroyed"] + expected_dest_state = "nonexist" + expected_src_state = "running" + action_during_mig = [{"func": "virsh.destroy", "after_event": "iteration: '1'", "func_param": {"name": "${main_vm}", "uri": "${virsh_migrate_desturi}"}, "need_sleep_time": "1"}] + err_msg = "domain is not running|Unable to read from socket: Connection reset by peer|domain.* is not processing incoming migration" + virsh_migrate_extra_mig_again = " " + - destroy_dst_vm_after_vm_paused: + migrate_speed = "10" + action_during_mig = [{"func": "virsh.destroy", "after_event": "Suspended Migrated", "func_param": {"name": "${main_vm}", "uri": "${virsh_migrate_desturi}"}}] + virsh_migrate_extra = "--timeout 2 --timeout-suspend" + expected_event_src = ["lifecycle.*Suspended Migrated", "lifecycle.*Resumed Migrated"] + expected_event_target = ["lifecycle.*Stopped Destroyed"] + expected_dest_state = "nonexist" + expected_src_state = "running" + err_msg = "domain is no longer running|Unable to read from socket: Connection reset by peer|domain.* is not processing incoming migration" + - destroy_src_vm: + migrate_speed = "10" + virsh_migrate_extra = "--timeout 2 --timeout-suspend" + expected_event_src = ["lifecycle.*Stopped Destroyed"] + expected_event_target = ["lifecycle.*Started Migrated", "lifecycle.*Stopped Failed"] + expected_dest_state = "nonexist" + expected_src_state = "shut off" + action_during_mig = [{"func": "virsh.destroy", "after_event": "iteration: '1'", "func_param": {"name": "${main_vm}"}}] + err_msg = "domain is not running" diff --git a/libvirt/tests/src/migration/async_ops/destroy_vm_during_performphase.py b/libvirt/tests/src/migration/async_ops/destroy_vm_during_performphase.py new file mode 100644 index 0000000000..76659b751f --- /dev/null +++ b/libvirt/tests/src/migration/async_ops/destroy_vm_during_performphase.py @@ -0,0 +1,53 @@ +from virttest import virsh + +from virttest.utils_test import libvirt + +from provider.migration import base_steps +from provider.migration import migration_base + + +def run(test, params, env): + """ + This case is to verify that if destroying vm during PerformPhase of precopy + migration, migration will fail. + + :param test: test object + :param params: Dictionary with the test parameters + :param env: Dictionary with test environment. + """ + def verify_test(): + """ + Verify steps + """ + expected_dest_state = params.get("expected_dest_state") + expected_src_state = params.get("expected_src_state") + dest_uri = params.get("virsh_migrate_desturi") + + test.log.info("Verify steps.") + if not libvirt.check_vm_state(vm.name, expected_src_state, uri=migration_obj.src_uri): + test.faile("Check vm state on source host fail.") + dest_vm_list = virsh.dom_list(options="--all --persistent", debug=True, uri=dest_uri) + if expected_dest_state == "nonexist": + if vm_name in dest_vm_list.stdout.strip(): + test.fail("%s should not exist." % vm_name) + + vm_name = params.get("migrate_main_vm") + migrate_again = "yes" == params.get("migrate_again", "no") + + virsh_session = None + remote_virsh_session = None + + vm = env.get_vm(vm_name) + migration_obj = base_steps.MigrationBase(test, vm, params) + + try: + migration_obj.setup_connection() + virsh_session, remote_virsh_session = migration_base.monitor_event(params) + migration_obj.run_migration() + verify_test() + if migrate_again: + migration_obj.run_migration_again() + migration_obj.verify_default() + migration_base.check_event_output(params, test, virsh_session, remote_virsh_session) + finally: + migration_obj.cleanup_connection()