From 25e5d62b3fc8adcc6438a9a9eefef55c104bb5ae Mon Sep 17 00:00:00 2001 From: Sebastian Mitterle Date: Tue, 9 Dec 2025 10:46:52 -0500 Subject: [PATCH 1/2] virtual_network/migrate_with_bridge: enable remote host iface config We previously enabled configuration for host face selection for bridge setup to account for environments where it's not the default interface (the first one). However, the test case also requires this for the remote host as it's a migration test case. Add this option and the same setting logic as for 'host_iface'. For this, the setting logic has to be brought further up in the execution where the variable is defined. Signed-off-by: Sebastian Mitterle --- .../migrate_with_bridge_type_interface.cfg | 1 + .../migrate_with_bridge_type_interface.py | 90 ++++++++++++------- 2 files changed, 57 insertions(+), 34 deletions(-) diff --git a/libvirt/tests/cfg/virtual_network/migrate/migrate_with_bridge_type_interface.cfg b/libvirt/tests/cfg/virtual_network/migrate/migrate_with_bridge_type_interface.cfg index 7158cdfc5f..400e344483 100644 --- a/libvirt/tests/cfg/virtual_network/migrate/migrate_with_bridge_type_interface.cfg +++ b/libvirt/tests/cfg/virtual_network/migrate/migrate_with_bridge_type_interface.cfg @@ -27,6 +27,7 @@ expected_xpath = [{'element_attrs': ["//interface/driver[@queues='${iface_queues}']"]}] check_network_accessibility_after_mig = "yes" host_iface = + remote_host_iface = variants: - linux_bridge: bridge_type = "linux" diff --git a/libvirt/tests/src/virtual_network/migrate/migrate_with_bridge_type_interface.py b/libvirt/tests/src/virtual_network/migrate/migrate_with_bridge_type_interface.py index 086d992462..ecc3867ec6 100644 --- a/libvirt/tests/src/virtual_network/migrate/migrate_with_bridge_type_interface.py +++ b/libvirt/tests/src/virtual_network/migrate/migrate_with_bridge_type_interface.py @@ -47,7 +47,8 @@ def check_multiqueue_in_guest(vm_session): test.log.info("Checking multiqueue configuration in guest") guest_iface_info = vm_session.cmd_output("ip --color=never l").strip() iface_matches = re.findall( - r"^\d+: (\S+?)[@:].*state UP.*$", guest_iface_info, re.MULTILINE) + r"^\d+: (\S+?)[@:].*state UP.*$", guest_iface_info, re.MULTILINE + ) if not iface_matches: test.fail("Failed to get network interface name in guest") iface_name = iface_matches[0] @@ -68,18 +69,19 @@ def setup_vm_interface(): Setup VM interface according to configuration """ vm_xml = VMXML.new_from_inactive_dumpxml(vm_name) - vm_xml.remove_all_device_by_type('interface') + vm_xml.remove_all_device_by_type("interface") vm_xml.sync() if interface_timing == "hotplug": if not vm.is_alive(): vm.start() - iface = libvirt_vmxml.create_vm_device_by_type('interface', iface_dict) - virsh.attach_device(vm_name, iface.xml, flagstr="--config", - debug=True, ignore_status=False) + iface = libvirt_vmxml.create_vm_device_by_type("interface", iface_dict) + virsh.attach_device( + vm_name, iface.xml, flagstr="--config", debug=True, ignore_status=False + ) else: libvirt_vmxml.modify_vm_device( - VMXML.new_from_inactive_dumpxml(vm_name), 'interface', - iface_dict) + VMXML.new_from_inactive_dumpxml(vm_name), "interface", iface_dict + ) vm.start() vm.wait_for_serial_login().close() test.log.debug("Guest xml:\n%s", VMXML.new_from_dumpxml(vm_name)) @@ -103,19 +105,19 @@ def setup_test(): if bridge_type == "linux": utils_net.create_linux_bridge_tmux(bridge_name, iface_name=host_iface) - - remote_host_iface = utils_net.get_default_gateway( - iface_name=True, session=remote_session, force_dhcp=False, json=True) - params.update({"remote_host_iface": remote_host_iface}) utils_net.create_linux_bridge_tmux( - bridge_name, iface_name=remote_host_iface, session=remote_session) + bridge_name, iface_name=remote_host_iface, session=remote_session + ) elif bridge_type == "ovs": - utils_net.create_ovs_bridge(ovs_bridge_name, ip_options='-color=never') - - utils_net.create_ovs_bridge(ovs_bridge_name, session=remote_session, - ip_options='-color=never') - libvirt_network.create_or_del_network(network_dict, remote_args=remote_virsh_dargs) + utils_net.create_ovs_bridge(ovs_bridge_name, ip_options="-color=never") + + utils_net.create_ovs_bridge( + ovs_bridge_name, session=remote_session, ip_options="-color=never" + ) + libvirt_network.create_or_del_network( + network_dict, remote_args=remote_virsh_dargs + ) libvirt_network.create_or_del_network(network_dict) if vm.is_alive(): @@ -143,7 +145,7 @@ def run_test(): vm_session_after_mig.cmd("dhclient -r; dhclient", timeout=120) test.log.info("TEST_STEP: Testing guest ping to outside") - ips = {'outside_ip': outside_ip} + ips = {"outside_ip": outside_ip} network_base.ping_check(params, ips, vm_session_after_mig) test.log.info("TEST_STEP: Checking multiqueue") @@ -151,7 +153,8 @@ def run_test(): virsh_obj = virsh.VirshPersistent(uri=dest_uri) libvirt_vmxml.check_guest_xml_by_xpaths( VMXML.new_from_dumpxml(vm_name, virsh_instance=virsh_obj), - expected_xpath) + expected_xpath, + ) if migrate_vm_back: test.log.info("TEST_STEP: Migrating VM back to source host") @@ -165,14 +168,20 @@ def teardown_test(): if bridge_type == "linux": utils_net.delete_linux_bridge_tmux(bridge_name, iface_name=host_iface) utils_net.delete_linux_bridge_tmux( - bridge_name, iface_name=params.get("remote_host_iface"), - session=remote_session) + bridge_name, + iface_name=params.get("remote_host_iface"), + session=remote_session, + ) elif bridge_type == "ovs": - utils_net.delete_ovs_bridge(ovs_bridge_name, ip_options='-color=never') - utils_net.delete_ovs_bridge(ovs_bridge_name, session=remote_session, ip_options='-color=never') - - libvirt_network.create_or_del_network(network_dict, is_del=True, remote_args=remote_virsh_dargs) + utils_net.delete_ovs_bridge(ovs_bridge_name, ip_options="-color=never") + utils_net.delete_ovs_bridge( + ovs_bridge_name, session=remote_session, ip_options="-color=never" + ) + + libvirt_network.create_or_del_network( + network_dict, is_del=True, remote_args=remote_virsh_dargs + ) libvirt_network.create_or_del_network(network_dict, is_del=True) migration_obj.cleanup_connection() @@ -190,25 +199,38 @@ def teardown_test(): migrate_vm_back = params.get_boolean("migrate_vm_back") cancel_migration = params.get_boolean("cancel_migration") - remote_virsh_dargs = {'remote_ip': server_ip, 'remote_user': server_user, - 'remote_pwd': server_pwd, 'unprivileged_user': params.get("unprivileged_user"), - 'ssh_remote_auth': params.get("ssh_remote_auth")} + remote_virsh_dargs = { + "remote_ip": server_ip, + "remote_user": server_user, + "remote_pwd": server_pwd, + "unprivileged_user": params.get("unprivileged_user"), + "ssh_remote_auth": params.get("ssh_remote_auth"), + } src_uri = params.get("virsh_migrate_connect_uri") dest_uri = params.get("virsh_migrate_desturi") expected_xpath = eval(params.get("expected_xpath")) iface_dict = eval(params.get("iface_dict", "{}")) - host_iface = params.get('host_iface') - host_iface = host_iface if host_iface else utils_net.get_default_gateway( - iface_name=True, force_dhcp=False, json=True) + host_iface = params.get("host_iface") + host_iface = ( + host_iface + if host_iface + else utils_net.get_default_gateway(iface_name=True, force_dhcp=False, json=True) + ) vm_name = guest_os.get_vm(params) vm = env.get_vm(vm_name) new_xml = vm_xml.VMXML.new_from_inactive_dumpxml(vm_name) - remote_session = aexpect.remote.remote_login("ssh", server_ip, "22", - server_user, server_pwd, - r'[$#%]') + remote_session = aexpect.remote.remote_login( + "ssh", server_ip, "22", server_user, server_pwd, r"[$#%]" + ) + remote_host_iface = params.get("remote_host_iface") + if not remote_host_iface: + remote_host_iface = utils_net.get_default_gateway( + iface_name=True, session=remote_session, force_dhcp=False, json=True + ) + params.update({"remote_host_iface": remote_host_iface}) migration_obj = base_steps.MigrationBase(test, vm, params) try: From 63ba58275ac4dc1ddfc5912c5cc37a4675fa247c Mon Sep 17 00:00:00 2001 From: Sebastian Mitterle Date: Tue, 9 Dec 2025 11:52:24 -0500 Subject: [PATCH 2/2] virtual_network/migrate_with_bridge/ovs: enable host ifname config The ovs bridge must be created with a specific host interface that provides DHCP which in our case isn't the default. If the value is not configured the behavior is unchanged. Signed-off-by: Sebastian Mitterle --- .../migrate_with_bridge_type_interface.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/libvirt/tests/src/virtual_network/migrate/migrate_with_bridge_type_interface.py b/libvirt/tests/src/virtual_network/migrate/migrate_with_bridge_type_interface.py index ecc3867ec6..04419d5b40 100644 --- a/libvirt/tests/src/virtual_network/migrate/migrate_with_bridge_type_interface.py +++ b/libvirt/tests/src/virtual_network/migrate/migrate_with_bridge_type_interface.py @@ -110,10 +110,15 @@ def setup_test(): ) elif bridge_type == "ovs": - utils_net.create_ovs_bridge(ovs_bridge_name, ip_options="-color=never") + utils_net.create_ovs_bridge( + ovs_bridge_name, ip_options="-color=never", iface_name=host_iface + ) utils_net.create_ovs_bridge( - ovs_bridge_name, session=remote_session, ip_options="-color=never" + ovs_bridge_name, + session=remote_session, + ip_options="-color=never", + iface_name=remote_host_iface, ) libvirt_network.create_or_del_network( network_dict, remote_args=remote_virsh_dargs @@ -174,9 +179,14 @@ def teardown_test(): ) elif bridge_type == "ovs": - utils_net.delete_ovs_bridge(ovs_bridge_name, ip_options="-color=never") utils_net.delete_ovs_bridge( - ovs_bridge_name, session=remote_session, ip_options="-color=never" + ovs_bridge_name, ip_options="-color=never", iface_name=host_iface + ) + utils_net.delete_ovs_bridge( + ovs_bridge_name, + session=remote_session, + ip_options="-color=never", + iface_name=remote_host_iface, ) libvirt_network.create_or_del_network(