diff --git a/qemu/tests/cfg/expose_host_mtu.cfg b/qemu/tests/cfg/expose_host_mtu.cfg new file mode 100644 index 0000000000000000000000000000000000000000..c332f4af15247a955862b68c99899fe033e91920 --- /dev/null +++ b/qemu/tests/cfg/expose_host_mtu.cfg @@ -0,0 +1,17 @@ +- expose_host_mtu: install setup image_copy unattended_install.cdrom + no RHEL.6 RHEL.5 RHEL.4 RHEL.3 + no Windows + requires_root = yes + type = expose_host_mtu + kill_vm = yes + only virtio_net + start_vm = no + mtu_value = 4000 + nic_extra_params = ",host_mtu=${mtu_value}" + nm_stop_cmd = systemctl stop NetworkManager + check_guest_mtu_cmd = "ifconfig %s" + set_guest_mtu_cmd = "ifconfig %s mtu ${mtu_value}" + bridge_get_if_cmd = "bridge link show | awk '{print $2}'" + Windows: + # TBD, will support later + check_guest_mtu_cmd = "netsh interface ipv4 show subinterface "%s"" diff --git a/qemu/tests/expose_host_mtu.py b/qemu/tests/expose_host_mtu.py new file mode 100644 index 0000000000000000000000000000000000000000..fde0473a55807ffcacfd05dcc3a5d29a1b1b02d3 --- /dev/null +++ b/qemu/tests/expose_host_mtu.py @@ -0,0 +1,118 @@ +import logging +import re + +from avocado.utils import process +from virttest import error_context +from virttest import utils_net +from virttest import utils_test +from virttest import env_process + + +@error_context.context_aware +def run(test, params, env): + """ + Expose host MTU to guest test + + 1) Boot up guest with param 'host_mtu=4000' in nic part + 2) Disable NetworkManager in guest + 3) set mtu of guest tap (eg: tap0) and physical nic (eg: eno1) to + 4000 in host + 4) check the mtu in guest + 5) ping from guest to external host with packet size 3972 + + :param test: kvm test object + :param params: Dictionary with the test parameters + :param env: Dictionary with test environment + """ + + def get_ovs_ports(ovs): + """ + Get ovs ports + + :param ovs: ovs bridge name + """ + + cmd = "ovs-vsctl list-ports %s" % ovs + return process.system_output(cmd, shell=True).decode() + + def is_ovs_backend(netdst): + """ + Check whether the host is OVS backend + + :param netdst: netdst get from command line + """ + + return netdst in process.system_output("ovs-vsctl list-br", + ignore_status=True, + shell=True).decode() + + def cleanup_ovs_ports(netdst, ports): + """ + Clean up created ovs ports in this case + + :param netdst: netdst get from command line + :param ports: existing ports need to be remain before this test + """ + + if is_ovs_backend(netdst) is True: + ports = set(get_ovs_ports(netdst).splitlines()) - \ + set(ports.splitlines()) + for p in ports: + process.system("ovs-vsctl del-port %s %s" % (netdst, p)) + + netdst = params.get("netdst", "switch") + if netdst in utils_net.Bridge().list_br(): + cmd = params["bridge_get_if_cmd"] + host_hw_interface = process.system_output( + cmd, shell=True).decode().strip(':') + elif is_ovs_backend(netdst) is True: + host_hw_interface = get_ovs_ports(netdst) + tmp_ports = re.findall(r"t[0-9]-[a-zA-Z0-9]{6}", host_hw_interface) + if tmp_ports: + for p in tmp_ports: + process.system_output("ovs-vsctl del-port %s %s" % + (netdst, p)) + host_hw_interface = get_ovs_ports(netdst) + else: + test.cancel("The host is using Macvtap backend, which is not" + " supported by now!") + + params["start_vm"] = "yes" + env_process.preprocess_vm(test, params, env, params["main_vm"]) + + vm = env.get_vm(params["main_vm"]) + vm.verify_alive() + + device_mac = vm.virtnet[0].mac + vm_iface = vm.get_ifname() + # TODO, will support windows later + process.system_output(params["nm_stop_cmd"]) + process.system_output(params["set_guest_mtu_cmd"] % host_hw_interface) + process.system_output(params["set_guest_mtu_cmd"] % vm_iface) + + os_type = params.get("os_type", "linux") + login_timeout = float(params.get("login_timeout", 360)) + session = vm.wait_for_login(timeout=login_timeout) + + host_ip = utils_net.get_ip_address_by_interface(params["netdst"]) + if os_type == "linux": # TODO, will support windows later + session.cmd_output_safe(params["nm_stop_cmd"]) + guest_ifname = utils_net.get_linux_ifname(session, + vm.get_mac_address()) + output = session.cmd_output_safe( + params["check_guest_mtu_cmd"] % guest_ifname) + error_context.context(output, logging.info) + match_string = "mtu %s" % params["mtu_value"] + if match_string in output: + logging.info("Host mtu %s exposed to guest as expected!" % + params["mtu_value"]) + logging.info("Ping from guest to host with packet size 3972") + status, output = utils_test.ping(host_ip, 10, packetsize=3972, + timeout=30, session=session) + ratio = utils_test.get_loss_ratio(output) + if ratio != 0: + test.fail("Loss ratio is %s", ratio) + else: + test.fail("host mtu %s not exposed to guest" % params["mtu_value"]) + cleanup_ovs_ports(netdst, host_hw_interface) + session.close()