|
| 1 | +import ast |
| 2 | + |
| 3 | +from avocado.utils import process |
| 4 | + |
| 5 | +from virttest import remote |
| 6 | +from virttest import utils_disk |
| 7 | +from virttest import utils_test |
| 8 | +from virttest import utils_iptables |
| 9 | + |
| 10 | +from virttest.utils_libvirt import libvirt_disk |
| 11 | +from virttest.utils_test import libvirt |
| 12 | + |
| 13 | +from provider.migration import base_steps |
| 14 | +from provider.virtual_disk import disk_base |
| 15 | + |
| 16 | + |
| 17 | +def setup_block_remote(params, test): |
| 18 | + """ |
| 19 | + Setup iSCSI target on remote host. |
| 20 | +
|
| 21 | + :param params: test parameters |
| 22 | + :param test: test object |
| 23 | + """ |
| 24 | + test.log.info("Setting up iSCSI target on remote host.") |
| 25 | + client_ip = params.get("client_ip") |
| 26 | + vg_name = params.get("vg_name", "vg0") |
| 27 | + lv_name = params.get("lv_name", "lv0") |
| 28 | + lv_size = params.get("lv_size", "200M") |
| 29 | + target_emulate_image = params.get("target_emulate_image", "emulated-iscsi2") |
| 30 | + block_dev = utils_test.RemoteDiskManager(params) |
| 31 | + iscsi_target, _ = libvirt.setup_or_cleanup_iscsi(is_setup=True, |
| 32 | + is_login=False, |
| 33 | + emulated_image=target_emulate_image, |
| 34 | + portal_ip=client_ip) |
| 35 | + |
| 36 | + remote_device = block_dev.iscsi_login_setup(client_ip, iscsi_target) |
| 37 | + clear_dm_dev = ( |
| 38 | + f"dmsetup ls --noheadings | awk '/^{vg_name}-/ {{print $1}}' " |
| 39 | + f"| xargs -r dmsetup remove --force; rm -rf /dev/{vg_name}" |
| 40 | + ) |
| 41 | + remote.run_remote_cmd(clear_dm_dev, params, ignore_status=True) |
| 42 | + block_dev.create_vg(vg_name, remote_device) |
| 43 | + block_dev.create_image("lvm", |
| 44 | + size=lv_size, |
| 45 | + vgname=vg_name, |
| 46 | + lvname=lv_name, |
| 47 | + sparse=False, |
| 48 | + timeout=60) |
| 49 | + |
| 50 | + |
| 51 | +def run(test, params, env): |
| 52 | + """ |
| 53 | + Test migration with different disk types (iSCSI LV and NBD). |
| 54 | + """ |
| 55 | + def setup_test(): |
| 56 | + """ |
| 57 | + Setup steps for migration with different disk types. |
| 58 | + """ |
| 59 | + test.log.info("Setting up %s disk test environment for guest.", disk_type) |
| 60 | + migration_obj.setup_connection() |
| 61 | + disk_obj.new_image_path = disk_obj.add_vm_disk(disk_type, disk_dict) |
| 62 | + if not vm.is_alive(): |
| 63 | + vm.start() |
| 64 | + |
| 65 | + vm_session = vm.wait_for_login() |
| 66 | + source_disk_name, _ = libvirt_disk.get_non_root_disk_name(vm_session) |
| 67 | + utils_disk.dd_data_to_vm_disk(vm_session, source_disk_name) |
| 68 | + vm_session.close() |
| 69 | + |
| 70 | + if disk_type == "block": |
| 71 | + setup_block_remote(params, test) |
| 72 | + |
| 73 | + if disk_type == "nbd": |
| 74 | + firewall_cmd.add_port(nbd_server_port, "tcp", permanent=True) |
| 75 | + |
| 76 | + def cleanup_test(): |
| 77 | + """ |
| 78 | + Cleanup steps for migration with different disk types. |
| 79 | + """ |
| 80 | + test.log.info("Cleanup steps for migration with different disk types.") |
| 81 | + migration_obj.cleanup_connection() |
| 82 | + disk_obj.cleanup_disk_preparation(disk_type) |
| 83 | + if disk_type == "block": |
| 84 | + remote.run_remote_cmd("iscsiadm -m session -u", params, ignore_status=True) |
| 85 | + libvirt.setup_or_cleanup_iscsi(is_setup=False, |
| 86 | + emulated_image=target_emulate_image, |
| 87 | + portal_ip=client_ip) |
| 88 | + if disk_type == "nbd": |
| 89 | + firewall_cmd.remove_port(nbd_server_port, "tcp", permanent=True) |
| 90 | + |
| 91 | + vm_name = params.get("migrate_main_vm") |
| 92 | + vm = env.get_vm(vm_name) |
| 93 | + disk_type = params.get("disk_type") |
| 94 | + client_ip = params.get("client_ip") |
| 95 | + target_emulate_image = params.get("target_emulate_image", "emulated-iscsi2") |
| 96 | + disk_dict = ast.literal_eval(params.get("disk_dict", "{}")) |
| 97 | + nbd_server_port = params.get("nbd_server_port", "10809") |
| 98 | + |
| 99 | + base_steps.sync_cpu_for_mig(params) |
| 100 | + migration_obj = base_steps.MigrationBase(test, vm, params) |
| 101 | + disk_obj = disk_base.DiskBase(test, vm, params) |
| 102 | + firewall_cmd = utils_iptables.Firewall_cmd() |
| 103 | + |
| 104 | + try: |
| 105 | + setup_test() |
| 106 | + migration_obj.run_migration() |
| 107 | + migration_obj.verify_default() |
| 108 | + finally: |
| 109 | + cleanup_test() |
0 commit comments