def run(test, params, env): """ Test virsh iface-bridge and iface-unbridge commands. (1) Bridge an existing network device(iface-bridge). (2) Unbridge a network device(iface-unbridge). """ iface_name = params.get("iface_name") bridge_name = params.get("bridge_name") ping_ip = params.get("ping_ip", "") ping_count = int(params.get("ping_count", "3")) ping_timeout = int(params.get("ping_timeout", "5")) bridge_option = params.get("bridge_option") unbridge_option = params.get("unbridge_option") bridge_delay = "yes" == params.get("bridge_delay", "no") delay_num = params.get("delay_num", "0") create_bridge = "yes" == params.get("create_bridge", "yes") bridge_status_error = "yes" == params.get("bridge_status_error", "no") unbridge_status_error = "yes" == params.get("unbridge_status_error", "no") iface_script = NETWORK_SCRIPT + iface_name iface_script_bk = os.path.join(test.tmpdir, "iface-%s.bk" % iface_name) check_iface = "yes" == params.get("check_iface", "yes") if check_iface: # Make sure the interface exists if not libvirt.check_iface(iface_name, "exists", "--all"): raise error.TestNAError("Interface '%s' not exists" % iface_name) net_iface = utils_net.Interface(name=iface_name) iface_is_up = net_iface.is_up() iface_ip = net_iface.get_ip() # Back up the interface script utils.run("cp %s %s" % (iface_script, iface_script_bk)) # Make sure the bridge name not exists net_bridge = utils_net.Bridge() if bridge_name in net_bridge.list_br(): raise error.TestNAError("Bridge '%s' already exists" % bridge_name) # Stop NetworkManager service try: NM = utils_path.find_command("NetworkManager") except utils_path.CmdNotFoundError: logging.debug("No NetworkManager service.") NM = None NM_is_running = False if NM is not None: NM_service = service.Factory.create_service("NetworkManager") NM_is_running = NM_service.status() if NM_is_running: NM_service.stop() def unbridge_check(): """ Check the result after do unbridge. """ list_option = "--all" if libvirt.check_iface(bridge_name, "exists", list_option): raise error.TestFail("%s is still present." % bridge_name) if "no-start" in unbridge_option: list_option = "--inactive" if not libvirt.check_iface(iface_name, "exists", list_option): raise error.TestFail("%s is not present." % iface_name) if bridge_delay: bridge_option += " --delay %s" % delay_num # Run test try: if create_bridge: # Create bridge result = virsh.iface_bridge(iface_name, bridge_name, bridge_option) libvirt.check_exit_status(result, bridge_status_error) if not bridge_status_error: # Get the new create bridge IP address try: br_ip = utils_net.get_ip_address_by_interface(bridge_name) except: br_ip = "" # check IP of new bridge if check_iface and br_ip and br_ip != iface_ip: raise error.Testfail("bridge IP(%s) isn't the same as iface IP(%s)." % (br_ip, iface_ip)) # check the status of STP feature if "no-start" not in bridge_option: if "no-stp" not in bridge_option: if "yes" != net_bridge.get_stp_status(bridge_name): raise error.Testfail("Fail to enable STP.") # Do ping test only bridge has IP address and ping_ip not empty if br_ip and ping_ip: if not libvirt.check_iface(bridge_name, "ping", ping_ip, count=ping_count, timeout=ping_timeout): raise error.TestFail("Fail to ping %s from %s." % (ping_ip, bridge_name)) else: # Skip ping test logging.debug("Skip ping test as %s has no IP address", bridge_name) list_option = "" if "no-start" in bridge_option: list_option = "--inactive" if libvirt.check_iface(bridge_name, "exists", list_option): # Unbridge result = virsh.iface_unbridge(bridge_name, unbridge_option) libvirt.check_exit_status(result, unbridge_status_error) if not unbridge_status_error: unbridge_check() else: raise error.TestFail("%s is not present." % bridge_name) else: # Unbridge without creating bridge, only for negative test now result = virsh.iface_unbridge(bridge_name, unbridge_option) libvirt.check_exit_status(result, unbridge_status_error) if not unbridge_status_error: unbridge_check() finally: if create_bridge and check_iface: if libvirt.check_iface(bridge_name, "exists", "--all"): virsh.iface_unbridge(bridge_name) if os.path.exists(iface_script_bk): utils.run("mv %s %s" % (iface_script_bk, iface_script)) if iface_is_up: # Need reload script utils.run("ifdown %s" % iface_name) utils.run("ifup %s" % iface_name) else: net_iface.down() # Clear the new create bridge if it exists try: utils_net.bring_down_ifname(bridge_name) utils.run("brctl delbr %s" % bridge_name) except utils_net.TAPBringDownError: pass if NM_is_running: NM_service.start()
def run(test, params, env): """ Test virsh interface related commands. (1) If using given exist interface for testing(eg. lo or ethX): 1.1 Dumpxml for the interface(with --inactive option) 1.2 Destroy the interface 1.3 Undefine the interface (2) Define an interface from XML file (3) List interfaces with '--inactive' optioin (4) Start the interface (5) List interfaces with no option (6) Dumpxml for the interface (7) Get interface MAC address by interface name (8) Get interface name by interface MAC address (9) Delete interface if not use the exist interface for testing 9.1 Destroy the interface 9.2 Undefine the interface Caveat, this test may affect the host network, so using the loopback(lo) device by default. You can specify the interface which you want, but be careful. """ iface_name = params.get("iface_name") iface_xml = params.get("iface_xml") iface_type = params.get("iface_type", "ethernet") iface_pro = params.get("iface_pro", "") iface_eth = params.get("iface_eth", "") iface_tag = params.get("iface_tag", "0") if iface_type == "vlan": iface_name = iface_eth + "." + iface_tag iface_eth_using = "yes" == params.get("iface_eth_using", "no") ping_ip = params.get("ping_ip", "localhost") use_exist_iface = "yes" == params.get("use_exist_iface", "no") status_error = "yes" == params.get("status_error", "no") net_restart = "yes" == params.get("iface_net_restart", "no") if ping_ip.count("ENTER"): raise error.TestNAError("Please input a valid ip address") if iface_name.count("ENTER"): raise error.TestNAError("Please input a existing bridge/ethernet name") vm_name = params.get("main_vm") vm = env.get_vm(vm_name) if vm: xml_bak = vm_xml.VMXML.new_from_inactive_dumpxml(vm_name) iface_script = NETWORK_SCRIPT + iface_name iface_script_bk = os.path.join(test.tmpdir, "iface-%s.bk" % iface_name) net_bridge = utils_net.Bridge() if use_exist_iface: if iface_type == "bridge": if iface_name not in net_bridge.list_br(): raise error.TestError("Bridge '%s' not exists" % iface_name) ifaces = net_bridge.get_structure()[iface_name] if len(ifaces) < 1: # In this situation, dhcp maybe cannot get ip address # Unless you use static, we'd better skip such case raise error.TestNAError("Bridge '%s' has no interface" " bridged, perhaps cannot get" " ipaddress" % iface_name) net_iface = utils_net.Interface(name=iface_name) iface_is_up = True list_option = "--all" if use_exist_iface: if not libvirt.check_iface(iface_name, "exists", "--all"): raise error.TestError("Interface '%s' not exists" % iface_name) iface_xml = os.path.join(test.tmpdir, "iface.xml.tmp") iface_is_up = net_iface.is_up() else: # Note, if not use the interface which already exists, iface_name must # be equal to the value specified in XML file if libvirt.check_iface(iface_name, "exists", "--all"): raise error.TestError("Interface '%s' already exists" % iface_name) if not iface_xml: raise error.TestError("XML file is needed.") iface_xml = os.path.join(test.tmpdir, iface_xml) create_xml_file(iface_xml, params) # Stop NetworkManager as which may conflict with virsh iface commands try: NM = utils_misc.find_command("NetworkManager") except ValueError: logging.debug("No NetworkManager service.") NM = None NM_is_running = False if NM is not None: NM_service = service.Factory.create_service("NetworkManager") NM_is_running = NM_service.status() if NM_is_running: NM_service.stop() # run test cases try: if use_exist_iface: # back up the interface script utils.run("cp %s %s" % (iface_script, iface_script_bk)) # step 1.1 # dumpxml for interface xml = virsh.iface_dumpxml(iface_name, "--inactive", to_file=iface_xml, debug=True) # Step 1.2 # Destroy interface if iface_is_up: result = virsh.iface_destroy(iface_name, debug=True) libvirt.check_exit_status(result, status_error) # Step 1.3 # Undefine interface result = virsh.iface_undefine(iface_name, debug=True) libvirt.check_exit_status(result, status_error) if not status_error: if libvirt.check_iface(iface_name, "exists", list_option): raise error.TestFail("%s is still present." % iface_name) # Step 2 # Define interface result = virsh.iface_define(iface_xml, debug=True) if iface_type == "bond" and not ping_ip: libvirt.check_exit_status(result, True) return else: libvirt.check_exit_status(result, status_error) if net_restart: network = service.Factory.create_service("network") network.restart() # After network restart, (ethernet)interface will be started if (not net_restart and iface_type in ("bridge", "ethernet")) or\ (not use_exist_iface and iface_type in ("vlan", "bond")): # Step 3 # List inactive interfaces list_option = "--inactive" if not status_error: if not libvirt.check_iface(iface_name, "exists", list_option): raise error.TestFail("Fail to find %s." % iface_name) # Step 4 # Start interface result = virsh.iface_start(iface_name, debug=True) if not net_restart and not use_exist_iface and\ (iface_type == "ethernet" and iface_pro in ["", "dhcp"] or iface_type == "bridge" and iface_pro == "dhcp"): libvirt.check_exit_status(result, True) else: libvirt.check_exit_status(result, status_error) if not status_error: iface_ip = net_iface.get_ip() ping_ip = ping_ip if not iface_ip else iface_ip if ping_ip: if not libvirt.check_iface(iface_name, "ping", ping_ip): raise error.TestFail("Ping %s fail." % ping_ip) # Step 5 # List active interfaces if use_exist_iface or\ (iface_pro != "dhcp" and iface_type == "bridge") or\ (iface_eth_using and iface_type == "vlan"): list_option = "" if not status_error: if not libvirt.check_iface(iface_name, "exists", list_option): raise error.TestFail("Fail to find %s in active " "interface list" % iface_name) if vm: iface_mac_list = vm_xml.VMXML.get_iface_dev(vm_name) # Before test, detach all interfaces in guest for mac in iface_mac_list: iface_info = vm_xml.VMXML.get_iface_by_mac(vm_name, mac) type = iface_info.get('type') virsh.detach_interface( vm_name, "--type %s --mac %s" " --config" % (type, mac)) virsh.attach_interface( vm_name, "--type %s --source %s" " --config" % (iface_type, iface_name)) vm.start() try: # Test if guest can be login vm.wait_for_login() except remote.LoginError: raise error.TestFail("Cannot login guest with %s" % iface_name) # Step 6 # Dumpxml for interface xml = virsh.iface_dumpxml(iface_name, "", to_file="", debug=True) logging.debug("Interface '%s' XML:\n%s", iface_name, xml) # Step 7 # Get interface MAC address by name result = virsh.iface_mac(iface_name, debug=True) libvirt.check_exit_status(result, status_error) if not status_error and result.stdout.strip(): if not libvirt.check_iface(iface_name, "mac", result.stdout.strip()): raise error.TestFail("Mac address check fail") # Step 8 # Get interface name by MAC address # Bridge's Mac equal to bridged interface's mac if iface_type not in ("bridge", "vlan") and result.stdout.strip(): iface_mac = net_iface.get_mac() result = virsh.iface_name(iface_mac, debug=True) libvirt.check_exit_status(result, status_error) # Step 9 if not use_exist_iface: # Step 9.1 # Destroy interface result = virsh.iface_destroy(iface_name, debug=True) if not net_restart and\ iface_type == "ethernet" and iface_pro in ["", "dhcp"] or\ iface_type == "bridge" and iface_pro == "dhcp": libvirt.check_exit_status(result, True) else: libvirt.check_exit_status(result, status_error) # Step 9.2 # Undefine interface result = virsh.iface_undefine(iface_name, debug=True) libvirt.check_exit_status(result, status_error) list_option = "--all" if not status_error: if libvirt.check_iface(iface_name, "exists", list_option): raise error.TestFail("%s is still present." % iface_name) finally: if os.path.exists(iface_xml): os.remove(iface_xml) if os.path.exists(iface_script): os.remove(iface_script) if use_exist_iface: if not os.path.exists(iface_script): utils.run("mv %s %s" % (iface_script_bk, iface_script)) if iface_is_up and\ not libvirt.check_iface(iface_name, "exists", ""): # Need reload script utils.run("ifup %s" % iface_name) elif not iface_is_up and libvirt.check_iface( iface_name, "exists", ""): net_iface.down() if vm: xml_bak.sync() else: if libvirt.check_iface(iface_name, "exists", "--all"): # Remove the interface try: utils_net.bring_down_ifname(iface_name) except utils_net.TAPBringDownError: pass if iface_type == "bridge": if iface_name in net_bridge.list_br(): try: net_bridge.del_bridge(iface_name) except IOError: pass if NM_is_running: NM_service.start()
def run(test, params, env): """ SR-IOV devices sanity test: 1) Bring up VFs by following instructions How To in Setup. 2) Configure all VFs in host. 3) Check whether all VFs get ip in host. 4) Unbind PFs/VFs from host kernel driver to sr-iov driver. 5) Bind PFs/VFs back to host kernel driver. 6) Repeat step 4, 5. 7) Try to boot up guest(s) with VF(s). :param test: QEMU test object :param params: Dictionary with the test parameters :param env: Dictionary with test environment. """ device_driver = params.get("device_driver", "pci-assign") repeat_time = int(params.get("bind_repeat_time", 1)) configure_on_host = int(params.get("configure_on_host", 0)) static_ip = int(params.get("static_ip", 1)) serial_login = params.get("serial_login", "no") pci_assignable = test_setup.PciAssignable( driver=params.get("driver"), driver_option=params.get("driver_option"), host_set_flag=params.get("host_set_flag", 1), kvm_params=params.get("kvm_default"), vf_filter_re=params.get("vf_filter_re"), pf_filter_re=params.get("pf_filter_re"), device_driver=device_driver, pa_type=params.get("pci_assignable"), static_ip=static_ip, net_mask=params.get("net_mask"), start_addr_PF=params.get("start_addr_PF")) devices = [] device_type = params.get("device_type", "vf") if device_type == "vf": device_num = pci_assignable.get_vfs_count() if device_num == 0: msg = " No VF device found even after running SR-IOV setup" test.cancel(msg) elif device_type == "pf": device_num = len(pci_assignable.get_pf_vf_info()) else: msg = "Unsupport device type '%s'." % device_type msg += " Please set device_type to 'vf' or 'pf'." test.error(msg) for i in range(device_num): device = {} device["type"] = device_type if device_type == "vf": device['mac'] = utils_net.generate_mac_address_simple() if params.get("device_name"): device["name"] = params.get("device_name") devices.append(device) pci_assignable.devices = devices vf_pci_id = [] pf_vf_dict = pci_assignable.get_pf_vf_info() for pf_dict in pf_vf_dict: vf_pci_id.extend(pf_dict["vf_ids"]) ethname_dict = [] ips = {} # Not all test environments would have a dhcp server to serve IP for # all mac addresses. So configure_on_host param has been # introduced to choose whether configure VFs on host or not if configure_on_host: msg = "Configure all VFs in host." error_context.context(msg, logging.info) for pci_id in vf_pci_id: ethname = utils_misc.get_interface_from_pci_id(pci_id) mac = utils_net.generate_mac_address_simple() ethname_dict.append(ethname) # TODO:cleanup of the network scripts try: utils_net.create_network_script(ethname, mac, "dhcp", "255.255.255.0", on_boot="yes") except Exception as info: test.error("Network script creation failed - %s" % info) msg = "Check whether VFs could get ip in host." error_context.context(msg, logging.info) for ethname in ethname_dict: utils_net.bring_down_ifname(ethname) _ip = check_network_interface_ip(ethname) if not _ip: msg = "Interface '%s' could not get IP." % ethname logging.error(msg) else: ips[ethname] = _ip logging.info("Interface '%s' get IP '%s'", ethname, _ip) for i in range(repeat_time): msg = "Bind/unbind device from host. Repeat %s/%s" % (i + 1, repeat_time) error_context.context(msg, logging.info) bind_device_num = random.randint(1, device_num) pci_assignable.request_devs(devices[:bind_device_num]) logging.info("Sleep 3s before releasing vf to host.") time.sleep(3) pci_assignable.release_devs() logging.info("Sleep 3s after releasing vf to host.") time.sleep(3) if device_type == "vf": post_device_num = pci_assignable.get_vfs_count() else: post_device_num = len(pci_assignable.get_pf_vf_info()) if post_device_num != device_num: msg = "lspci cannot report the correct PF/VF number." msg += " Correct number is '%s'" % device_num msg += " lspci report '%s'" % post_device_num test.fail(msg) dmesg = process.system_output("dmesg") file_name = "host_dmesg_after_unbind_device.txt" logging.info("Log dmesg after bind/unbing device to '%s'.", file_name) if configure_on_host: msg = "Check whether VFs still get ip in host." error_context.context(msg, logging.info) for ethname in ips: utils_net.bring_up_ifname(ethname, action="up") _ip = utils_net.get_ip_address_by_interface(ethname, ip_ver="ipv4") if not _ip: msg = "Interface '%s' could not get IP." % ethname msg += "Before bind/unbind it have IP '%s'." % ips[ethname] logging.error(msg) else: logging.info("Interface '%s' get IP '%s'", ethname, _ip) msg = "Try to boot up guest(s) with VF(s)." error_context.context(msg, logging.info) regain_ip_cmd = params.get("regain_ip_cmd", None) timeout = int(params.get("login_timeout", 30)) for vm_name in params["vms"].split(" "): params["start_vm"] = "yes" vm = env.get_vm(vm_name) # User can opt for dhcp IP or a static IP configuration for probed # interfaces inside guest. Added option for static IP configuration # below if static_ip: if 'IP_addr_VF' not in locals(): IP_addr_VF = netaddr.IPAddress(params.get("start_addr_VF")) net_mask = params.get("net_mask") if not IP_addr_VF: test.fail("No IP address found, please" "populate starting IP address in " "configuration file") session = vm.wait_for_serial_login( timeout=int(params.get("login_timeout", 720))) rc, output = session.cmd_status_output( "ip li| grep -i 'BROADCAST'|awk '{print $2}'| sed 's/://'") if not rc: iface_probed = output.splitlines() logging.info("probed VF Interface(s) in guest: %s", iface_probed) for iface in iface_probed: mac = utils_net.get_linux_mac(session, iface) utils_net.set_guest_ip_addr(session, mac, IP_addr_VF) rc, output = utils_test.ping(str(IP_addr_VF), 30, timeout=60) if rc != 0: test.fail("New nic failed ping test" "with output:\n %s" % output) IP_addr_VF = IP_addr_VF + 1 else: test.fail("Fail to locate probed interfaces" "for VFs, please check on respective" "drivers in guest image") else: # User has opted for DHCP IP inside guest vm.verify_alive() vm.wait_for_login(timeout=int(params.get("login_timeout", 360)))
def run(test, params, env): """ SR-IOV devices sanity test: 1) Bring up VFs by following instructions How To in Setup. 2) Configure all VFs in host. 3) Check whether all VFs get ip in host. 4) Unbind PFs/VFs from host kernel driver to sr-iov driver. 5) Bind PFs/VFs back to host kernel driver. 6) Repeat step 4, 5. 7) Try to boot up guest(s) with VF(s). :param test: QEMU test object :param params: Dictionary with the test parameters :param env: Dictionary with test environment. """ device_driver = params.get("device_driver", "pci-assign") repeat_time = int(params.get("bind_repeat_time", 1)) configure_on_host = int(params.get("configure_on_host", 0)) static_ip = int(params.get("static_ip", 1)) serial_login = params.get("serial_login", "no") pci_assignable = test_setup.PciAssignable( driver=params.get("driver"), driver_option=params.get("driver_option"), host_set_flag=params.get("host_set_flag", 1), kvm_params=params.get("kvm_default"), vf_filter_re=params.get("vf_filter_re"), pf_filter_re=params.get("pf_filter_re"), device_driver=device_driver, pa_type=params.get("pci_assignable"), static_ip=static_ip, net_mask=params.get("net_mask"), start_addr_PF=params.get("start_addr_PF")) devices = [] device_type = params.get("device_type", "vf") if device_type == "vf": device_num = pci_assignable.get_vfs_count() if device_num == 0: msg = " No VF device found even after running SR-IOV setup" test.cancel(msg) elif device_type == "pf": device_num = len(pci_assignable.get_pf_vf_info()) else: msg = "Unsupport device type '%s'." % device_type msg += " Please set device_type to 'vf' or 'pf'." test.error(msg) for i in range(device_num): device = {} device["type"] = device_type if device_type == "vf": device['mac'] = utils_net.generate_mac_address_simple() if params.get("device_name"): device["name"] = params.get("device_name") devices.append(device) pci_assignable.devices = devices vf_pci_id = [] pf_vf_dict = pci_assignable.get_pf_vf_info() for pf_dict in pf_vf_dict: vf_pci_id.extend(pf_dict["vf_ids"]) ethname_dict = [] ips = {} # Not all test environments would have a dhcp server to serve IP for # all mac addresses. So configure_on_host param has been # introduced to choose whether configure VFs on host or not if configure_on_host: msg = "Configure all VFs in host." error_context.context(msg, logging.info) for pci_id in vf_pci_id: ethname = utils_misc.get_interface_from_pci_id(pci_id) mac = utils_net.generate_mac_address_simple() ethname_dict.append(ethname) # TODO:cleanup of the network scripts try: utils_net.create_network_script(ethname, mac, "dhcp", "255.255.255.0", on_boot="yes") except Exception as info: test.error("Network script creation failed - %s" % info) msg = "Check whether VFs could get ip in host." error_context.context(msg, logging.info) for ethname in ethname_dict: utils_net.bring_down_ifname(ethname) _ip = check_network_interface_ip(ethname) if not _ip: msg = "Interface '%s' could not get IP." % ethname logging.error(msg) else: ips[ethname] = _ip logging.info("Interface '%s' get IP '%s'", ethname, _ip) for i in range(repeat_time): msg = "Bind/unbind device from host. Repeat %s/%s" % (i + 1, repeat_time) error_context.context(msg, logging.info) bind_device_num = random.randint(1, device_num) pci_assignable.request_devs(devices[:bind_device_num]) logging.info("Sleep 3s before releasing vf to host.") time.sleep(3) pci_assignable.release_devs() logging.info("Sleep 3s after releasing vf to host.") time.sleep(3) if device_type == "vf": post_device_num = pci_assignable.get_vfs_count() else: post_device_num = len(pci_assignable.get_pf_vf_info()) if post_device_num != device_num: msg = "lspci cannot report the correct PF/VF number." msg += " Correct number is '%s'" % device_num msg += " lspci report '%s'" % post_device_num test.fail(msg) dmesg = process.system_output("dmesg") file_name = "host_dmesg_after_unbind_device.txt" logging.info("Log dmesg after bind/unbing device to '%s'.", file_name) if configure_on_host: msg = "Check whether VFs still get ip in host." error_context.context(msg, logging.info) for ethname in ips: utils_net.bring_up_ifname(ethname, action="up") _ip = utils_net.get_ip_address_by_interface(ethname, ip_ver="ipv4") if not _ip: msg = "Interface '%s' could not get IP." % ethname msg += "Before bind/unbind it have IP '%s'." % ips[ethname] logging.error(msg) else: logging.info("Interface '%s' get IP '%s'", ethname, _ip) msg = "Try to boot up guest(s) with VF(s)." error_context.context(msg, logging.info) regain_ip_cmd = params.get("regain_ip_cmd", None) timeout = int(params.get("login_timeout", 30)) for vm_name in params["vms"].split(" "): params["start_vm"] = "yes" vm = env.get_vm(vm_name) # User can opt for dhcp IP or a static IP configuration for probed # interfaces inside guest. Added option for static IP configuration # below if static_ip: if 'IP_addr_VF' not in locals(): IP_addr_VF = netaddr.IPAddress(params.get("start_addr_VF")) net_mask = params.get("net_mask") if not IP_addr_VF: test.fail("No IP address found, please" "populate starting IP address in " "configuration file") session = vm.wait_for_serial_login( timeout=int(params.get("login_timeout", 720))) rc, output = session.cmd_status_output( "ip li| grep -i 'BROADCAST'|awk '{print $2}'| sed 's/://'") if not rc: iface_probed = output.splitlines() logging.info("probed VF Interface(s) in guest: %s", iface_probed) for iface in iface_probed: mac = utils_net.get_linux_mac(session, iface) utils_net.set_guest_ip_addr(session, mac, IP_addr_VF) rc, output = utils_test.ping( str(IP_addr_VF), 30, timeout=60) if rc != 0: test.fail("New nic failed ping test" "with output:\n %s" % output) IP_addr_VF = IP_addr_VF + 1 else: test.fail("Fail to locate probed interfaces" "for VFs, please check on respective" "drivers in guest image") else: # User has opted for DHCP IP inside guest vm.verify_alive() vm.wait_for_login(timeout=int(params.get("login_timeout", 360)))
def run(test, params, env): """ Test virsh interface related commands. (1) If using given exist interface for testing(eg. lo or ethX): 1.1 Dumpxml for the interface(with --inactive option) 1.2 Destroy the interface 1.3 Undefine the interface (2) Define an interface from XML file (3) List interfaces with '--inactive' optioin (4) Start the interface (5) List interfaces with no option (6) Dumpxml for the interface (7) Get interface MAC address by interface name (8) Get interface name by interface MAC address (9) Delete interface if not use the exist interface for testing 9.1 Destroy the interface 9.2 Undefine the interface Caveat, this test may affect the host network, so using the loopback(lo) device by default. You can specify the interface which you want, but be careful. """ iface_name = params.get("iface_name", "ENTER.BRIDGE.NAME") iface_xml = params.get("iface_xml") iface_type = params.get("iface_type", "ethernet") iface_pro = params.get("iface_pro", "") iface_eth = params.get("iface_eth", "") iface_tag = params.get("iface_tag", "0") if iface_type == "vlan": iface_name = iface_eth + "." + iface_tag iface_eth_using = "yes" == params.get("iface_eth_using", "no") ping_ip = params.get("ping_ip", "localhost") use_exist_iface = "yes" == params.get("use_exist_iface", "no") status_error = "yes" == params.get("status_error", "no") net_restart = "yes" == params.get("iface_net_restart", "no") list_dumpxml_acl = "yes" == params.get("list_dumpxml_acl", "no") if ping_ip.count("ENTER"): raise error.TestNAError("Please input a valid ip address") if iface_name.count("ENTER"): raise error.TestNAError("Please input a existing bridge/ethernet name") uri = params.get("virsh_uri") unprivileged_user = params.get('unprivileged_user', "EXAMPLE") if unprivileged_user: if unprivileged_user.count('EXAMPLE'): unprivileged_user = '******' if not libvirt_version.version_compare(1, 1, 1): if params.get('setup_libvirt_polkit') == 'yes': raise error.TestNAError("API acl test not supported in current" + " libvirt version.") virsh_dargs = {'debug': True} list_dumpxml_dargs = {'debug': True} if params.get('setup_libvirt_polkit') == 'yes': if not list_dumpxml_acl: virsh_dargs['uri'] = uri virsh_dargs['unprivileged_user'] = unprivileged_user else: list_dumpxml_dargs['uri'] = uri list_dumpxml_dargs['unprivileged_user'] = unprivileged_user list_dumpxml_dargs['ignore_status'] = False # acl api negative testing params write_save_status_error = "yes" == params.get("write_save_status_error", "no") start_status_error = "yes" == params.get("start_status_error", "no") stop_status_error = "yes" == params.get("stop_status_error", "no") delete_status_error = "yes" == params.get("delete_status_error", "no") vm_name = params.get("main_vm") vm = env.get_vm(vm_name) if vm: xml_bak = vm_xml.VMXML.new_from_inactive_dumpxml(vm_name) iface_script = NETWORK_SCRIPT + iface_name iface_script_bk = os.path.join(test.tmpdir, "iface-%s.bk" % iface_name) net_bridge = utils_net.Bridge() if use_exist_iface: if iface_type == "bridge": if iface_name not in net_bridge.list_br(): raise error.TestError("Bridge '%s' not exists" % iface_name) ifaces = net_bridge.get_structure()[iface_name] if len(ifaces) < 1: # In this situation, dhcp maybe cannot get ip address # Unless you use static, we'd better skip such case raise error.TestNAError("Bridge '%s' has no interface" " bridged, perhaps cannot get" " ipaddress" % iface_name) net_iface = utils_net.Interface(name=iface_name) iface_is_up = True list_option = "--all" if use_exist_iface: if not libvirt.check_iface(iface_name, "exists", "--all"): raise error.TestError("Interface '%s' not exists" % iface_name) iface_xml = os.path.join(test.tmpdir, "iface.xml.tmp") iface_is_up = net_iface.is_up() else: # Note, if not use the interface which already exists, iface_name must # be equal to the value specified in XML file if libvirt.check_iface(iface_name, "exists", "--all"): raise error.TestError("Interface '%s' already exists" % iface_name) if not iface_xml: raise error.TestError("XML file is needed.") iface_xml = os.path.join(test.tmpdir, iface_xml) create_xml_file(iface_xml, params) # Stop NetworkManager as which may conflict with virsh iface commands try: NM = utils_misc.find_command("NetworkManager") except ValueError: logging.debug("No NetworkManager service.") NM = None NM_is_running = False if NM is not None: NM_service = service.Factory.create_service("NetworkManager") NM_is_running = NM_service.status() if NM_is_running: NM_service.stop() # run test cases try: if use_exist_iface: # back up the interface script utils.run("cp %s %s" % (iface_script, iface_script_bk)) # step 1.1 # dumpxml for interface if list_dumpxml_acl: virsh.iface_list(**list_dumpxml_dargs) xml = virsh.iface_dumpxml(iface_name, "--inactive", to_file=iface_xml, **list_dumpxml_dargs) # Step 1.2 # Destroy interface if iface_is_up: result = virsh.iface_destroy(iface_name, **virsh_dargs) if (params.get('setup_libvirt_polkit') == 'yes' and stop_status_error): # acl_test negative test libvirt.check_exit_status(result, stop_status_error) virsh.iface_destroy(iface_name, debug=True) else: libvirt.check_exit_status(result, status_error) # Step 1.3 # Undefine interface result = virsh.iface_undefine(iface_name, **virsh_dargs) if (params.get('setup_libvirt_polkit') == 'yes' and delete_status_error): # acl_test negative test libvirt.check_exit_status(result, delete_status_error) virsh.iface_undefine(iface_name, debug=True) else: libvirt.check_exit_status(result, status_error) if not status_error: if libvirt.check_iface(iface_name, "exists", list_option): raise error.TestFail("%s is still present." % iface_name) # Step 2 # Define interface result = virsh.iface_define(iface_xml, **virsh_dargs) if (params.get('setup_libvirt_polkit') == 'yes' and write_save_status_error): # acl_test negative test libvirt.check_exit_status(result, write_save_status_error) virsh.iface_define(iface_xml, debug=True) elif iface_type == "bond" and not ping_ip: libvirt.check_exit_status(result, True) return else: libvirt.check_exit_status(result, status_error) if net_restart: network = service.Factory.create_service("network") network.restart() # After network restart, (ethernet)interface will be started if (not net_restart and iface_type in ("bridge", "ethernet")) or\ (not use_exist_iface and iface_type in ("vlan", "bond")): # Step 3 # List inactive interfaces list_option = "--inactive" if not status_error: if not libvirt.check_iface(iface_name, "exists", list_option): raise error.TestFail("Fail to find %s." % iface_name) # Step 4 # Start interface result = virsh.iface_start(iface_name, **virsh_dargs) if (params.get('setup_libvirt_polkit') == 'yes' and start_status_error): # acl_test negative test libvirt.check_exit_status(result, start_status_error) virsh.iface_start(iface_name, debug=True) elif (not net_restart and not use_exist_iface and (iface_type == "ethernet" and iface_pro in ["", "dhcp"] or iface_type == "bridge" and iface_pro == "dhcp")): libvirt.check_exit_status(result, True) else: libvirt.check_exit_status(result, status_error) if not status_error: iface_ip = net_iface.get_ip() ping_ip = ping_ip if not iface_ip else iface_ip if ping_ip: if not libvirt.check_iface(iface_name, "ping", ping_ip): raise error.TestFail("Ping %s fail." % ping_ip) # Step 5 # List active interfaces if use_exist_iface or\ (iface_pro != "dhcp" and iface_type == "bridge") or\ (iface_eth_using and iface_type == "vlan"): list_option = "" if not status_error: if not libvirt.check_iface(iface_name, "exists", list_option): raise error.TestFail("Fail to find %s in active " "interface list" % iface_name) if vm: iface_mac_list = vm_xml.VMXML.get_iface_dev(vm_name) # Before test, detach all interfaces in guest for mac in iface_mac_list: iface_info = vm_xml.VMXML.get_iface_by_mac(vm_name, mac) type = iface_info.get('type') virsh.detach_interface(vm_name, "--type %s --mac %s" " --config" % (type, mac)) virsh.attach_interface(vm_name, "--type %s --source %s" " --config" % (iface_type, iface_name)) vm.start() try: # Test if guest can be login vm.wait_for_login() except remote.LoginError: raise error.TestFail("Cannot login guest with %s" % iface_name) # Step 6 # Dumpxml for interface if list_dumpxml_acl: virsh.iface_list(**list_dumpxml_dargs) xml = virsh.iface_dumpxml(iface_name, "", to_file="", **list_dumpxml_dargs) logging.debug("Interface '%s' XML:\n%s", iface_name, xml) # Step 7 # Get interface MAC address by name result = virsh.iface_mac(iface_name, debug=True) libvirt.check_exit_status(result, status_error) if not status_error and result.stdout.strip(): if not libvirt.check_iface(iface_name, "mac", result.stdout.strip()): raise error.TestFail("Mac address check fail") # Step 8 # Get interface name by MAC address # Bridge's Mac equal to bridged interface's mac if iface_type not in ("bridge", "vlan") and result.stdout.strip(): iface_mac = net_iface.get_mac() result = virsh.iface_name(iface_mac, debug=True) libvirt.check_exit_status(result, status_error) # Step 9 if not use_exist_iface: # Step 9.1 # Destroy interface result = virsh.iface_destroy(iface_name, **virsh_dargs) if (params.get('setup_libvirt_polkit') == 'yes' and stop_status_error): # acl_test negative test libvirt.check_exit_status(result, stop_status_error) virsh.iface_destroy(iface_name, debug=True) elif (not net_restart and iface_type == "ethernet" and iface_pro in ["", "dhcp"] or iface_type == "bridge" and iface_pro == "dhcp"): libvirt.check_exit_status(result, True) else: libvirt.check_exit_status(result, status_error) # Step 9.2 # Undefine interface result = virsh.iface_undefine(iface_name, **virsh_dargs) if (params.get('setup_libvirt_polkit') == 'yes' and delete_status_error): # acl_test negative test libvirt.check_exit_status(result, delete_status_error) virsh.iface_undefine(iface_name, debug=True) else: libvirt.check_exit_status(result, status_error) list_option = "--all" if not status_error: if libvirt.check_iface(iface_name, "exists", list_option): raise error.TestFail("%s is still present." % iface_name) finally: if os.path.exists(iface_xml): os.remove(iface_xml) if os.path.exists(iface_script): os.remove(iface_script) if use_exist_iface: if not os.path.exists(iface_script): utils.run("mv %s %s" % (iface_script_bk, iface_script)) if iface_is_up and\ not libvirt.check_iface(iface_name, "exists", ""): # Need reload script utils.run("ifup %s" % iface_name) elif not iface_is_up and libvirt.check_iface(iface_name, "exists", ""): net_iface.down() if vm: xml_bak.sync() else: if libvirt.check_iface(iface_name, "exists", "--all"): # Remove the interface try: utils_net.bring_down_ifname(iface_name) except utils_net.TAPBringDownError: pass if iface_type == "bridge": if iface_name in net_bridge.list_br(): try: net_bridge.del_bridge(iface_name) except IOError: pass if NM_is_running: NM_service.start()
def run(test, params, env): """ Test virsh iface-bridge and iface-unbridge commands. (1) Bridge an existing network device(iface-bridge). (2) Unbridge a network device(iface-unbridge). """ bridge_name = params.get("bridge_name") ping_ip = params.get("ping_ip", "") ping_count = int(params.get("ping_count", "3")) ping_timeout = int(params.get("ping_timeout", "5")) bridge_option = params.get("bridge_option") unbridge_option = params.get("unbridge_option") bridge_delay = "yes" == params.get("bridge_delay", "no") delay_num = params.get("delay_num", "0") create_bridge = "yes" == params.get("create_bridge", "yes") bridge_status_error = "yes" == params.get("bridge_status_error", "no") unbridge_status_error = "yes" == params.get("unbridge_status_error", "no") iface_name = params.get("iface_name") if iface_name == "HOST_INTERFACE": # Get the first active nic to test iface_name = utils_net.get_net_if(state="UP")[0] iface_ip = utils_net.get_ip_address_by_interface(iface_name) iface_script = NETWORK_SCRIPT + iface_name iface_script_bk = os.path.join(data_dir.get_tmp_dir(), "iface-%s.bk" % iface_name) bridge_script = NETWORK_SCRIPT + bridge_name check_iface = "yes" == params.get("check_iface", "yes") if check_iface: # Make sure the interface exists if not libvirt.check_iface(iface_name, "exists", "--all"): test.cancel("Interface '%s' not exists" % iface_name) # Back up the interface script process.run("cp %s %s" % (iface_script, iface_script_bk), shell=True) # Make sure the bridge name not exists net_bridge = utils_net.Bridge() if bridge_name in net_bridge.list_br(): test.cancel("Bridge '%s' already exists" % bridge_name) # Stop NetworkManager service NM_service = None try: NM = utils_path.find_command("NetworkManager") except utils_path.CmdNotFoundError: logging.debug("No NetworkManager service.") NM = None if NM is not None: NM_service = service.Factory.create_service("NetworkManager") NM_is_running = NM_service.status() if NM_is_running: logging.debug("NM_is_running:%s", NM_is_running) logging.debug("Stop NetworkManager...") NM_service.stop() # Start network service NW_service = service.Factory.create_service("network") NW_status = NW_service.status() if NW_status is None: logging.debug("network service not found") if (not utils_package.package_install('network-scripts') or not utils_package.package_install('initscripts')): test.cancel("Failed to install network service") if NW_status is not True: logging.debug("network service is not running") logging.debug("Start network service...") NW_service.start() def unbridge_check(): """ Check the result after do unbridge. """ list_option = "--all" if libvirt.check_iface(bridge_name, "exists", list_option): test.fail("%s is still present." % bridge_name) if "no-start" in unbridge_option: list_option = "--inactive" if not libvirt.check_iface(iface_name, "exists", list_option): test.fail("%s is not present." % iface_name) if bridge_delay: bridge_option += " --delay %s" % delay_num # Run test try: if create_bridge: # Create bridge # Set timeout as the cmd run a long time result = virsh.iface_bridge(iface_name, bridge_name, bridge_option, timeout=240, debug=True) libvirt.check_exit_status(result, bridge_status_error) if not bridge_status_error: # Get the new create bridge IP address try: br_ip = utils_net.get_ip_address_by_interface(bridge_name) except Exception: br_ip = "" # check IP of new bridge if check_iface and br_ip and br_ip != iface_ip: test.fail("bridge IP(%s) isn't the same as iface IP(%s)." % (br_ip, iface_ip)) # check the status of STP feature if "no-start" not in bridge_option: if "no-stp" not in bridge_option: if "yes" != net_bridge.get_stp_status(bridge_name): test.fail("Fail to enable STP.") # Do ping test only bridge has IP address and ping_ip not empty if br_ip and ping_ip: if not libvirt.check_iface(bridge_name, "ping", ping_ip, count=ping_count, timeout=ping_timeout): test.fail("Fail to ping %s from %s." % (ping_ip, bridge_name)) else: # Skip ping test logging.debug("Skip ping test as %s has no IP address", bridge_name) list_option = "" if "no-start" in bridge_option: list_option = "--inactive" if libvirt.check_iface(bridge_name, "exists", list_option): # Unbridge result = virsh.iface_unbridge(bridge_name, unbridge_option, timeout=60) libvirt.check_exit_status(result, unbridge_status_error) if not unbridge_status_error: unbridge_check() else: test.fail("%s is not present." % bridge_name) else: # Unbridge without creating bridge, only for negative test now result = virsh.iface_unbridge(bridge_name, unbridge_option) libvirt.check_exit_status(result, unbridge_status_error) if not unbridge_status_error: unbridge_check() finally: if create_bridge and check_iface: if libvirt.check_iface(bridge_name, "exists", "--all"): virsh.iface_unbridge(bridge_name, timeout=60) if os.path.exists(iface_script_bk): process.run("mv %s %s" % (iface_script_bk, iface_script), shell=True) if os.path.exists(bridge_script): process.run("rm -rf %s" % bridge_script, shell=True) # Clear the new create bridge if it still exists try: utils_net.bring_down_ifname(bridge_name) process.run("ip link del dev %s" % bridge_name, shell=True) except utils_net.TAPBringDownError: pass # Reload network configuration NW_service.restart() # Recover NetworkManager if NM_is_running: NM_service.start()
def run(test, params, env): """ Test virsh iface-bridge and iface-unbridge commands. (1) Bridge an existing network device(iface-bridge). (2) Unbridge a network device(iface-unbridge). """ iface_name = params.get("iface_name") bridge_name = params.get("bridge_name") ping_ip = params.get("ping_ip", "") bridge_option = params.get("bridge_option") unbridge_option = params.get("unbridge_option") bridge_delay = "yes" == params.get("bridge_delay", "no") delay_num = params.get("delay_num", "0") create_bridge = "yes" == params.get("create_bridge", "yes") bridge_status_error = "yes" == params.get("bridge_status_error", "no") unbridge_status_error = "yes" == params.get("unbridge_status_error", "no") iface_script = NETWORK_SCRIPT + iface_name iface_script_bk = os.path.join(test.tmpdir, "iface-%s.bk" % iface_name) if not libvirt.check_iface(iface_name, "exists", "--all"): raise error.TestNAError("Interface '%s' not exists" % iface_name) net_iface = utils_net.Interface(name=iface_name) iface_is_up = net_iface.is_up() # Make sure the interface exists if not libvirt.check_iface(iface_name, "exists", "--all"): raise error.TestNAError("Interface '%s' not exists" % iface_name) # Make sure the bridge name not exists net_bridge = utils_net.Bridge() if bridge_name in net_bridge.list_br(): raise error.TestNAError("Bridge '%s' already exists" % bridge_name) # Stop NetworkManager service try: NM = utils_misc.find_command("NetworkManager") except ValueError: logging.debug("No NetworkManager service.") NM = None NM_is_running = False if NM is not None: NM_service = service.Factory.create_service("NetworkManager") NM_is_running = NM_service.status() if NM_is_running: NM_service.stop() # Back up the interface script utils.run("cp %s %s" % (iface_script, iface_script_bk)) def unbridge_check(): """ Check the result after do unbridge. """ list_option = "--all" if libvirt.check_iface(bridge_name, "exists", list_option): raise error.TestFail("%s is still present." % bridge_name) if "no-start" in unbridge_option: list_option = "--inactive" if not libvirt.check_iface(iface_name, "exists", list_option): raise error.TestFail("%s is not present." % iface_name) if bridge_delay: bridge_option += " --delay %s" % delay_num # Run test try: if create_bridge: # Create bridge result = virsh.iface_bridge(iface_name, bridge_name, bridge_option) libvirt.check_exit_status(result, bridge_status_error) if not bridge_status_error: # Get the new create bridge IP address try: br_ip = utils_net.get_ip_address_by_interface(bridge_name) except: br_ip = "" # Do ping test only bridge has IP address and ping_ip not empty if br_ip and ping_ip: if not libvirt.check_iface(bridge_name, "ping", ping_ip): raise error.TestFail("Fail to ping %s from %s." % (ping_ip, bridge_name)) else: # Skip ping test logging.debug("Skip ping test as %s has no IP address", bridge_name) list_option = "" if "no-start" in bridge_option: list_option = "--inactive" if libvirt.check_iface(bridge_name, "exists", list_option): # Unbridge result = virsh.iface_unbridge(bridge_name, unbridge_option) libvirt.check_exit_status(result, unbridge_status_error) if not unbridge_status_error: unbridge_check() else: raise error.TestFail("%s is not present." % bridge_name) else: # Unbridge without creating bridge, only for negative test now result = virsh.iface_unbridge(bridge_name, unbridge_option) libvirt.check_exit_status(result, unbridge_status_error) if not unbridge_status_error: unbridge_check() finally: if create_bridge: if libvirt.check_iface(bridge_name, "exists", "--all"): virsh.iface_unbridge(bridge_name) if not os.path.exists(iface_script): utils.run("mv %s %s" % (iface_script_bk, iface_script)) if iface_is_up: # Need reload script utils.run("ifup %s" % iface_name) else: net_iface.down() # Clear the new create bridge if it exists try: utils_net.bring_down_ifname(bridge_name) utils.run("brctl delbr %s" % bridge_name) except utils_net.TAPBringDownError: pass if NM_is_running: NM_service.start()
def run(test, params, env): """ Test virsh interface related commands. (1) If using given exist interface for testing(eg. lo or ethX): 1.1 Dumpxml for the interface(with --inactive option) 1.2 Destroy the interface 1.3 Undefine the interface (2) Define an interface from XML file (3) List interfaces with '--inactive' optioin (4) Start the interface (5) List interfaces with no option (6) Dumpxml for the interface (7) Get interface MAC address by interface name (8) Get interface name by interface MAC address (9) Delete interface if not use the exist interface for testing 9.1 Destroy the interface 9.2 Undefine the interface Caveat, this test may affect the host network, so using the loopback(lo) device by default. You can specify the interface which you want, but be careful. """ iface_name = params.get("iface_name") iface_xml = params.get("iface_xml") ping_ip = params.get("ping_ip", "localhost") use_exist_iface = "yes" == params.get("use_exist_iface", "no") status_error = "yes" == params.get("status_error", "no") iface_script = NETWORK_SCRIPT + iface_name iface_script_bk = os.path.join(test.tmpdir, "iface-%s.bk" % iface_name) net_iface = utils_net.Interface(name=iface_name) iface_is_up = True list_option = "--all" if use_exist_iface: if not libvirt.check_iface(iface_name, "exists", "--all"): raise error.TestError("Interface '%s' not exists" % iface_name) iface_xml = os.path.join(test.tmpdir, "iface.xml.tmp") iface_is_up = net_iface.is_up() else: # Note, if not use the interface which already exists, iface_name must # be equal to the value specified in XML file if libvirt.check_iface(iface_name, "exists", "--all"): raise error.TestError("Interface '%s' already exists" % iface_name) if not iface_xml: raise error.TestError("XML file is needed.") # Stop NetworkManager as which may conflict with virsh iface commands try: NM = utils_misc.find_command("NetworkManager") except ValueError: logging.debug("No NetworkManager service.") NM = None NM_is_running = False if NM is not None: NM_service = service.Factory.create_service("NetworkManager") NM_is_running = NM_service.status() if NM_is_running: NM_service.stop() # run test cases try: if use_exist_iface: # back up the interface script utils.run("cp %s %s" % (iface_script, iface_script_bk)) # step 1.1 # dumpxml for interface xml = virsh.iface_dumpxml(iface_name, "--inactive", to_file=iface_xml, debug=True) # Step 1.2 # Destroy interface if iface_is_up: result = virsh.iface_destroy(iface_name, debug=True) libvirt.check_exit_status(result, status_error) # Step 1.3 # Undefine interface result = virsh.iface_undefine(iface_name, debug=True) libvirt.check_exit_status(result, status_error) if not status_error: if libvirt.check_iface(iface_name, "exists", list_option): raise error.TestFail("%s is still present." % iface_name) # Step 2 # Define interface result = virsh.iface_define(iface_xml, debug=True) libvirt.check_exit_status(result, status_error) # Step 3 # List inactive interfaces list_option = "--inactive" if not status_error: if not libvirt.check_iface(iface_name, "exists", list_option): raise error.TestFail("Fail to find %s." % iface_name) # Step 4 # Start interface result = virsh.iface_start(iface_name, debug=True) libvirt.check_exit_status(result, status_error) if not status_error: if not libvirt.check_iface(iface_name, "ping", ping_ip): raise error.TestFail("Ping %s fail." % ping_ip) # Step 5 # List active interfaces list_option = "" if not status_error: if not libvirt.check_iface(iface_name, "exists", list_option): raise error.TestFail("Fail to find %s in active interface list." % iface_name) # Step 6 # Dumpxml for interface xml = virsh.iface_dumpxml(iface_name, "", to_file="", debug=True) logging.debug("Interface '%s' XML:\n%s", iface_name, xml) # Step 7 # Get interface MAC address by name result = virsh.iface_mac(iface_name, debug=True) libvirt.check_exit_status(result, status_error) if not status_error: if not libvirt.check_iface(iface_name, "mac", result.stdout.strip()): raise error.TestFail("Mac address check fail") # Step 8 # Get interface name by MAC address iface_mac = net_iface.get_mac() result = virsh.iface_name(iface_mac, debug=True) libvirt.check_exit_status(result, status_error) # Step 9 if not use_exist_iface: # Step 9.1 # Destroy interface result = virsh.iface_destroy(iface_name, debug=True) libvirt.check_exit_status(result, status_error) # Step 9.2 # Undefine interface result = virsh.iface_undefine(iface_name, debug=True) libvirt.check_exit_status(result, status_error) list_option = "--all" if not status_error: if libvirt.check_iface(iface_name, "exists", list_option): raise error.TestFail("%s is still present." % iface_name) finally: if use_exist_iface: if os.path.exists(iface_xml): os.remove(iface_xml) if not os.path.exists(iface_script): utils.run("mv %s %s" % (iface_script_bk, iface_script)) if iface_is_up: # Need reload script utils.run("ifup %s" % iface_name) else: net_iface.down() else: if libvirt.check_iface(iface_name, "exists", "--all"): # Remove the interface if os.path.exists(iface_script): os.remove(iface_script) utils_net.bring_down_ifname(iface_name) if NM_is_running: NM_service.start()
def run(test, params, env): """ Test virsh interface related commands. (1) If using given exist interface for testing(eg. lo or ethX): 1.1 Dumpxml for the interface(with --inactive option) 1.2 Destroy the interface 1.3 Undefine the interface (2) Define an interface from XML file (3) List interfaces with '--inactive' option (4) Start the interface (5) List interfaces with no option (6) Dumpxml for the interface (7) Get interface MAC address by interface name (8) Get interface name by interface MAC address (9) Delete interface if not use the exist interface for testing 9.1 Destroy the interface 9.2 Undefine the interface Caveat, this test may affect the host network, so using the loopback(lo) device by default. You can specify the interface which you want, but be careful. """ iface_name = params.get("iface_name", "ENTER.BRIDGE.NAME") iface_xml = params.get("iface_xml") iface_type = params.get("iface_type", "ethernet") iface_pro = params.get("iface_pro", "") iface_eth = params.get("iface_eth", "") iface_tag = params.get("iface_tag", "0") if iface_type == "vlan": iface_name = iface_eth + "." + iface_tag iface_eth_using = "yes" == params.get("iface_eth_using", "no") ping_ip = params.get("ping_ip", "localhost") use_exist_iface = "yes" == params.get("use_exist_iface", "no") status_error = "yes" == params.get("status_error", "no") net_restart = "yes" == params.get("iface_net_restart", "no") list_dumpxml_acl = "yes" == params.get("list_dumpxml_acl", "no") if ping_ip.count("ENTER"): test.cancel("Please input a valid ip address") if iface_name.count("ENTER"): test.cancel("Please input a existing bridge/ethernet name") uri = params.get("virsh_uri") unprivileged_user = params.get('unprivileged_user', "EXAMPLE") if unprivileged_user: if unprivileged_user.count('EXAMPLE'): unprivileged_user = '******' if not libvirt_version.version_compare(1, 1, 1): if params.get('setup_libvirt_polkit') == 'yes': test.cancel("API acl test not supported in current" " libvirt version.") virsh_dargs = {'debug': True} list_dumpxml_dargs = {'debug': True} if params.get('setup_libvirt_polkit') == 'yes': if not list_dumpxml_acl: virsh_dargs['uri'] = uri virsh_dargs['unprivileged_user'] = unprivileged_user else: list_dumpxml_dargs['uri'] = uri list_dumpxml_dargs['unprivileged_user'] = unprivileged_user list_dumpxml_dargs['ignore_status'] = False # acl api negative testing params write_save_status_error = "yes" == params.get("write_save_status_error", "no") start_status_error = "yes" == params.get("start_status_error", "no") stop_status_error = "yes" == params.get("stop_status_error", "no") delete_status_error = "yes" == params.get("delete_status_error", "no") vm_name = params.get("main_vm") vm = env.get_vm(vm_name) if vm: xml_bak = vm_xml.VMXML.new_from_inactive_dumpxml(vm_name) iface_script = NETWORK_SCRIPT + iface_name iface_script_bk = os.path.join(data_dir.get_tmp_dir(), "iface-%s.bk" % iface_name) net_bridge = utils_net.Bridge() if use_exist_iface: if iface_type == "bridge": if iface_name not in net_bridge.list_br(): test.error("Bridge '%s' not exists" % iface_name) ifaces = net_bridge.get_structure()[iface_name] if len(ifaces) < 1: # In this situation, dhcp maybe cannot get ip address # Unless you use static, we'd better skip such case test.cancel("Bridge '%s' has no interface" " bridged, perhaps cannot get" " ipaddress" % iface_name) net_iface = utils_net.Interface(name=iface_name) iface_is_up = True list_option = "--all" if use_exist_iface: if not libvirt.check_iface(iface_name, "exists", "--all"): test.error("Interface '%s' not exists" % iface_name) iface_xml = os.path.join(data_dir.get_tmp_dir(), "iface.xml.tmp") iface_is_up = net_iface.is_up() else: # Note, if not use the interface which already exists, iface_name must # be equal to the value specified in XML file if libvirt.check_iface(iface_name, "exists", "--all"): test.error("Interface '%s' already exists" % iface_name) if not iface_xml: test.error("XML file is needed.") iface_xml = os.path.join(data_dir.get_tmp_dir(), iface_xml) create_xml_file(iface_xml, params) # Stop NetworkManager as which may conflict with virsh iface commands try: NM = utils_path.find_command("NetworkManager") except utils_path.CmdNotFoundError: logging.debug("No NetworkManager service.") NM = None NM_is_running = False if NM is not None: NM_service = service.Factory.create_service("NetworkManager") NM_is_running = NM_service.status() if NM_is_running: NM_service.stop() # run test cases try: if use_exist_iface: # back up the interface script process.run("cp %s %s" % (iface_script, iface_script_bk), shell=True) # step 1.1 # dumpxml for interface if list_dumpxml_acl: virsh.iface_list(**list_dumpxml_dargs) xml = virsh.iface_dumpxml(iface_name, "--inactive", to_file=iface_xml, **list_dumpxml_dargs) # Step 1.2 # Destroy interface if iface_is_up: result = virsh.iface_destroy(iface_name, **virsh_dargs) if (params.get('setup_libvirt_polkit') == 'yes' and stop_status_error): # acl_test negative test libvirt.check_exit_status(result, stop_status_error) virsh.iface_destroy(iface_name, debug=True) else: libvirt.check_exit_status(result, status_error) # Step 1.3 # Undefine interface result = virsh.iface_undefine(iface_name, **virsh_dargs) if (params.get('setup_libvirt_polkit') == 'yes' and delete_status_error): # acl_test negative test libvirt.check_exit_status(result, delete_status_error) virsh.iface_undefine(iface_name, debug=True) else: libvirt.check_exit_status(result, status_error) if not status_error: if libvirt.check_iface(iface_name, "exists", list_option): test.fail("%s is still present." % iface_name) # Step 2 # Define interface result = virsh.iface_define(iface_xml, **virsh_dargs) if (params.get('setup_libvirt_polkit') == 'yes' and write_save_status_error): # acl_test negative test libvirt.check_exit_status(result, write_save_status_error) virsh.iface_define(iface_xml, debug=True) elif iface_type == "bond" and not ping_ip: libvirt.check_exit_status(result, True) return else: libvirt.check_exit_status(result, status_error) if net_restart: network = service.Factory.create_service("network") network.restart() # After network restart, (ethernet)interface will be started if (not net_restart and iface_type in ("bridge", "ethernet")) or\ (not use_exist_iface and iface_type in ("vlan", "bond")): # Step 3 # List inactive interfaces list_option = "--inactive" if not status_error: if not libvirt.check_iface(iface_name, "exists", list_option): test.fail("Fail to find %s." % iface_name) # Step 4 # Start interface result = virsh.iface_start(iface_name, **virsh_dargs) if (params.get('setup_libvirt_polkit') == 'yes' and start_status_error): # acl_test negative test libvirt.check_exit_status(result, start_status_error) virsh.iface_start(iface_name, debug=True) elif (not net_restart and not use_exist_iface and (iface_type == "ethernet" and iface_pro in ["", "dhcp"] or iface_type == "bridge" and iface_pro == "dhcp")): libvirt.check_exit_status(result, True) else: libvirt.check_exit_status(result, status_error) if not status_error: iface_ip = net_iface.get_ip() ping_ip = ping_ip if not iface_ip else iface_ip if ping_ip: if not libvirt.check_iface(iface_name, "ping", ping_ip): test.fail("Ping %s fail." % ping_ip) # Step 5 # List active interfaces if use_exist_iface or\ (iface_pro != "dhcp" and iface_type == "bridge") or\ (iface_eth_using and iface_type == "vlan"): list_option = "" if not status_error: if not libvirt.check_iface(iface_name, "exists", list_option): test.fail("Fail to find %s in active " "interface list" % iface_name) if vm: if vm.is_alive(): vm.destroy() iface_index = 0 iface_mac_list = vm_xml.VMXML.get_iface_dev(vm_name) # Before test, detach all interfaces in guest for mac in iface_mac_list: iface_info = vm_xml.VMXML.get_iface_by_mac(vm_name, mac) type = iface_info.get('type') virsh.detach_interface( vm_name, "--type %s --mac %s" " --config" % (type, mac)) # After detach interface, vm.virtnet also need update, the # easy way is free these mac addresses before start VM vm.free_mac_address(iface_index) iface_index += 1 virsh.attach_interface( vm_name, "--type %s --source %s" " --config" % (iface_type, iface_name)) vm.start() try: # Test if guest can be login vm.wait_for_login() except remote.LoginError: test.fail("Cannot login guest with %s" % iface_name) # Step 6 # Dumpxml for interface if list_dumpxml_acl: virsh.iface_list(**list_dumpxml_dargs) xml = virsh.iface_dumpxml(iface_name, "", to_file="", **list_dumpxml_dargs) logging.debug("Interface '%s' XML:\n%s", iface_name, xml) # Step 7 # Get interface MAC address by name result = virsh.iface_mac(iface_name, debug=True) libvirt.check_exit_status(result, status_error) if not status_error and result.stdout.strip(): if not libvirt.check_iface(iface_name, "mac", result.stdout.strip()): test.fail("Mac address check fail") # Step 8 # Get interface name by MAC address # Bridge's Mac equal to bridged interface's mac if iface_type not in ("bridge", "vlan") and result.stdout.strip(): iface_mac = net_iface.get_mac() result = virsh.iface_name(iface_mac, debug=True) libvirt.check_exit_status(result, status_error) # Step 9 if not use_exist_iface: # Step 9.0 # check if interface's state is active before destroy if libvirt.check_iface(iface_name, "state", "--all"): # Step 9.1 # Destroy interface result = virsh.iface_destroy(iface_name, **virsh_dargs) if (params.get('setup_libvirt_polkit') == 'yes' and stop_status_error): # acl_test negative test libvirt.check_exit_status(result, stop_status_error) virsh.iface_destroy(iface_name, debug=True) elif (not net_restart and iface_type == "ethernet" and iface_pro in ["", "dhcp"] or iface_type == "bridge" and iface_pro == "dhcp"): libvirt.check_exit_status(result, True) else: libvirt.check_exit_status(result, status_error) # Step 9.2 # Undefine interface result = virsh.iface_undefine(iface_name, **virsh_dargs) if (params.get('setup_libvirt_polkit') == 'yes' and delete_status_error): # acl_test negative test libvirt.check_exit_status(result, delete_status_error) virsh.iface_undefine(iface_name, debug=True) else: libvirt.check_exit_status(result, status_error) list_option = "--all" if not status_error: if libvirt.check_iface(iface_name, "exists", list_option): test.fail("%s is still present." % iface_name) finally: if os.path.exists(iface_xml): os.remove(iface_xml) if os.path.exists(iface_script): os.remove(iface_script) if use_exist_iface: if not os.path.exists(iface_script): process.run("mv %s %s" % (iface_script_bk, iface_script), shell=True) if iface_is_up and\ not libvirt.check_iface(iface_name, "exists", ""): # Need reload script process.run("ifup %s" % iface_name, shell=True) elif not iface_is_up and libvirt.check_iface( iface_name, "exists", ""): net_iface.down() if vm: xml_bak.sync() else: if libvirt.check_iface(iface_name, "exists", "--all"): # Remove the interface try: utils_net.bring_down_ifname(iface_name) except utils_net.TAPBringDownError: pass if iface_type == "bridge": if iface_name in net_bridge.list_br(): try: net_bridge.del_bridge(iface_name) except IOError: pass if NM_is_running: NM_service.start()
def run(test, params, env): """ Test virsh interface related commands. (1) If using given exist interface for testing(eg. lo or ethX): 1.1 Dumpxml for the interface(with --inactive option) 1.2 Destroy the interface 1.3 Undefine the interface (2) Define an interface from XML file (3) List interfaces with '--inactive' optioin (4) Start the interface (5) List interfaces with no option (6) Dumpxml for the interface (7) Get interface MAC address by interface name (8) Get interface name by interface MAC address (9) Delete interface if not use the exist interface for testing 9.1 Destroy the interface 9.2 Undefine the interface Caveat, this test may affect the host network, so using the loopback(lo) device by default. You can specify the interface which you want, but be careful. """ iface_name = params.get("iface_name") iface_xml = params.get("iface_xml") ping_ip = params.get("ping_ip", "localhost") use_exist_iface = "yes" == params.get("use_exist_iface", "no") status_error = "yes" == params.get("status_error", "no") iface_script = NETWORK_SCRIPT + iface_name iface_script_bk = os.path.join(test.tmpdir, "iface-%s.bk" % iface_name) net_iface = utils_net.Interface(name=iface_name) iface_is_up = True list_option = "--all" if use_exist_iface: if not libvirt.check_iface(iface_name, "exists", "--all"): raise error.TestError("Interface '%s' not exists" % iface_name) iface_xml = os.path.join(test.tmpdir, "iface.xml.tmp") iface_is_up = net_iface.is_up() else: # Note, if not use the interface which already exists, iface_name must # be equal to the value specified in XML file if libvirt.check_iface(iface_name, "exists", "--all"): raise error.TestError("Interface '%s' already exists" % iface_name) if not iface_xml: raise error.TestError("XML file is needed.") # Stop NetworkManager as which may conflict with virsh iface commands try: NM = utils_misc.find_command("NetworkManager") except ValueError: logging.debug("No NetworkManager service.") NM = None NM_is_running = False if NM is not None: NM_service = service.Factory.create_service("NetworkManager") NM_is_running = NM_service.status() if NM_is_running: NM_service.stop() # run test cases try: if use_exist_iface: # back up the interface script utils.run("cp %s %s" % (iface_script, iface_script_bk)) # step 1.1 # dumpxml for interface xml = virsh.iface_dumpxml(iface_name, "--inactive", to_file=iface_xml, debug=True) # Step 1.2 # Destroy interface if iface_is_up: result = virsh.iface_destroy(iface_name, debug=True) libvirt.check_exit_status(result, status_error) # Step 1.3 # Undefine interface result = virsh.iface_undefine(iface_name, debug=True) libvirt.check_exit_status(result, status_error) if not status_error: if libvirt.check_iface(iface_name, "exists", list_option): raise error.TestFail("%s is still present." % iface_name) # Step 2 # Define interface result = virsh.iface_define(iface_xml, debug=True) libvirt.check_exit_status(result, status_error) # Step 3 # List inactive interfaces list_option = "--inactive" if not status_error: if not libvirt.check_iface(iface_name, "exists", list_option): raise error.TestFail("Fail to find %s." % iface_name) # Step 4 # Start interface result = virsh.iface_start(iface_name, debug=True) libvirt.check_exit_status(result, status_error) if not status_error: if not libvirt.check_iface(iface_name, "ping", ping_ip): raise error.TestFail("Ping %s fail." % ping_ip) # Step 5 # List active interfaces list_option = "" if not status_error: if not libvirt.check_iface(iface_name, "exists", list_option): raise error.TestFail( "Fail to find %s in active interface list." % iface_name) # Step 6 # Dumpxml for interface xml = virsh.iface_dumpxml(iface_name, "", to_file="", debug=True) logging.debug("Interface '%s' XML:\n%s", iface_name, xml) # Step 7 # Get interface MAC address by name result = virsh.iface_mac(iface_name, debug=True) libvirt.check_exit_status(result, status_error) if not status_error: if not libvirt.check_iface(iface_name, "mac", result.stdout.strip()): raise error.TestFail("Mac address check fail") # Step 8 # Get interface name by MAC address iface_mac = net_iface.get_mac() result = virsh.iface_name(iface_mac, debug=True) libvirt.check_exit_status(result, status_error) # Step 9 if not use_exist_iface: # Step 9.1 # Destroy interface result = virsh.iface_destroy(iface_name, debug=True) libvirt.check_exit_status(result, status_error) # Step 9.2 # Undefine interface result = virsh.iface_undefine(iface_name, debug=True) libvirt.check_exit_status(result, status_error) list_option = "--all" if not status_error: if libvirt.check_iface(iface_name, "exists", list_option): raise error.TestFail("%s is still present." % iface_name) finally: if use_exist_iface: if os.path.exists(iface_xml): os.remove(iface_xml) if not os.path.exists(iface_script): utils.run("mv %s %s" % (iface_script_bk, iface_script)) if iface_is_up: # Need reload script utils.run("ifup %s" % iface_name) else: net_iface.down() else: if libvirt.check_iface(iface_name, "exists", "--all"): # Remove the interface if os.path.exists(iface_script): os.remove(iface_script) utils_net.bring_down_ifname(iface_name) if NM_is_running: NM_service.start()
def run(test, params, env): """ Test virsh iface-bridge and iface-unbridge commands. (1) Bridge an existing network device(iface-bridge). (2) Unbridge a network device(iface-unbridge). """ iface_name = params.get("iface_name") bridge_name = params.get("bridge_name") ping_ip = params.get("ping_ip", "") ping_count = int(params.get("ping_count", "3")) ping_timeout = int(params.get("ping_timeout", "5")) bridge_option = params.get("bridge_option") unbridge_option = params.get("unbridge_option") bridge_delay = "yes" == params.get("bridge_delay", "no") delay_num = params.get("delay_num", "0") create_bridge = "yes" == params.get("create_bridge", "yes") bridge_status_error = "yes" == params.get("bridge_status_error", "no") unbridge_status_error = "yes" == params.get("unbridge_status_error", "no") iface_script = NETWORK_SCRIPT + iface_name iface_script_bk = os.path.join(data_dir.get_tmp_dir(), "iface-%s.bk" % iface_name) check_iface = "yes" == params.get("check_iface", "yes") if check_iface: # Make sure the interface exists if not libvirt.check_iface(iface_name, "exists", "--all"): test.cancel("Interface '%s' not exists" % iface_name) net_iface = utils_net.Interface(name=iface_name) iface_is_up = net_iface.is_up() iface_ip = net_iface.get_ip() # Back up the interface script process.run("cp %s %s" % (iface_script, iface_script_bk), shell=True) # Make sure the bridge name not exists net_bridge = utils_net.Bridge() if bridge_name in net_bridge.list_br(): test.cancel("Bridge '%s' already exists" % bridge_name) # Stop NetworkManager service try: NM = utils_path.find_command("NetworkManager") except utils_path.CmdNotFoundError: logging.debug("No NetworkManager service.") NM = None NM_is_running = False if NM is not None: NM_service = service.Factory.create_service("NetworkManager") NM_is_running = NM_service.status() if NM_is_running: NM_service.stop() def unbridge_check(): """ Check the result after do unbridge. """ list_option = "--all" if libvirt.check_iface(bridge_name, "exists", list_option): test.fail("%s is still present." % bridge_name) if "no-start" in unbridge_option: list_option = "--inactive" if not libvirt.check_iface(iface_name, "exists", list_option): test.fail("%s is not present." % iface_name) if bridge_delay: bridge_option += " --delay %s" % delay_num # Run test try: if create_bridge: # Create bridge result = virsh.iface_bridge(iface_name, bridge_name, bridge_option) libvirt.check_exit_status(result, bridge_status_error) if not bridge_status_error: # Get the new create bridge IP address try: br_ip = utils_net.get_ip_address_by_interface(bridge_name) except Exception: br_ip = "" # check IP of new bridge if check_iface and br_ip and br_ip != iface_ip: test.fail("bridge IP(%s) isn't the same as iface IP(%s)." % (br_ip, iface_ip)) # check the status of STP feature if "no-start" not in bridge_option: if "no-stp" not in bridge_option: if "yes" != net_bridge.get_stp_status(bridge_name): test.fail("Fail to enable STP.") # Do ping test only bridge has IP address and ping_ip not empty if br_ip and ping_ip: if not libvirt.check_iface(bridge_name, "ping", ping_ip, count=ping_count, timeout=ping_timeout): test.fail("Fail to ping %s from %s." % (ping_ip, bridge_name)) else: # Skip ping test logging.debug("Skip ping test as %s has no IP address", bridge_name) list_option = "" if "no-start" in bridge_option: list_option = "--inactive" if libvirt.check_iface(bridge_name, "exists", list_option): # Unbridge result = virsh.iface_unbridge(bridge_name, unbridge_option) libvirt.check_exit_status(result, unbridge_status_error) if not unbridge_status_error: unbridge_check() else: test.fail("%s is not present." % bridge_name) else: # Unbridge without creating bridge, only for negative test now result = virsh.iface_unbridge(bridge_name, unbridge_option) libvirt.check_exit_status(result, unbridge_status_error) if not unbridge_status_error: unbridge_check() finally: if create_bridge and check_iface: if libvirt.check_iface(bridge_name, "exists", "--all"): virsh.iface_unbridge(bridge_name) if os.path.exists(iface_script_bk): process.run("mv %s %s" % (iface_script_bk, iface_script), shell=True) if iface_is_up: # Need reload script process.run("ifdown %s" % iface_name, shell=True) process.run("ifup %s" % iface_name, shell=True) else: net_iface.down() # Clear the new create bridge if it exists try: utils_net.bring_down_ifname(bridge_name) process.run("brctl delbr %s" % bridge_name, shell=True) except utils_net.TAPBringDownError: pass if NM_is_running: NM_service.start()