def check_iface(iface_name, checkpoint, extra=""): """ Check interface with specified checkpoint. :param iface_name: Interface name :param checkpoint: Check if interface exists, MAC address, IP address or ping out. Support values: [exists, mac, ip, ping] :param extra: Extra string for checking :return: Boolean value, true for pass, false for fail """ support_check = ["exists", "mac", "ip", "ping"] iface = utils_net.Interface(name=iface_name) check_pass = False try: if checkpoint == "exists": # extra is iface-list option list_find, ifcfg_find = (False, False) # Check virsh list output result = virsh.iface_list(extra, ignore_status=True) check_exit_status(result, False) output = re.findall(r"(\S+)\ +(\S+)\ +(\S+|\s+)[\ +\n]", str(result.stdout)) if filter(lambda x: x[0] == iface_name, output[1:]): list_find = True logging.debug("Find '%s' in virsh iface-list output: %s", iface_name, list_find) # Check network script iface_script = "/etc/sysconfig/network-scripts/ifcfg-" + iface_name ifcfg_find = os.path.exists(iface_script) logging.debug("Find '%s': %s", iface_script, ifcfg_find) check_pass = list_find and ifcfg_find elif checkpoint == "mac": # extra is the MAC address to compare iface_mac = iface.get_mac().lower() check_pass = iface_mac == extra logging.debug("MAC address of %s: %s", iface_name, iface_mac) elif checkpoint == "ip": # extra is the IP address to compare iface_ip = iface.get_ip() check_pass = iface_ip == extra logging.debug("IP address of %s: %s", iface_name, iface_ip) elif checkpoint == "ping": # extra is the ping destination ping_s, _ = ping( dest=extra, count=3, interface=iface_name, timeout=5, ) check_pass = ping_s == 0 else: logging.debug("Support check points are: %s", support_check) logging.error("Unsupport check point: %s", checkpoint) except Exception, detail: raise error.TestFail("Interface check failed: %s" % detail)
def check_iface(iface_name, checkpoint, extra=""): """ Check interface with specified checkpoint. :param iface_name: Interface name :param checkpoint: Check if interface exists, MAC address, IP address or ping out. Support values: [exists, mac, ip, ping] :param extra: Extra string for checking :return: Boolean value, true for pass, false for fail """ support_check = ["exists", "mac", "ip", "ping"] iface = utils_net.Interface(name=iface_name) check_pass = False try: if checkpoint == "exists": # extra is iface-list option list_find, ifcfg_find = (False, False) # Check virsh list output result = virsh.iface_list(extra, ignore_status=True) check_exit_status(result, False) output = re.findall(r"(\S+)\ +(\S+)\ +(\S+|\s+)[\ +\n]", str(result.stdout)) if filter(lambda x: x[0] == iface_name, output[1:]): list_find = True logging.debug("Find '%s' in virsh iface-list output: %s", iface_name, list_find) # Check network script iface_script = "/etc/sysconfig/network-scripts/ifcfg-" + iface_name ifcfg_find = os.path.exists(iface_script) logging.debug("Find '%s': %s", iface_script, ifcfg_find) check_pass = list_find and ifcfg_find elif checkpoint == "mac": # extra is the MAC address to compare iface_mac = iface.get_mac().lower() check_pass = iface_mac == extra logging.debug("MAC address of %s: %s", iface_name, iface_mac) elif checkpoint == "ip": # extra is the IP address to compare iface_ip = iface.get_ip() check_pass = iface_ip == extra logging.debug("IP address of %s: %s", iface_name, iface_ip) elif checkpoint == "ping": # extra is the ping destination ping_s, _ = ping(dest=extra, count=3, interface=iface_name, timeout=5,) check_pass = ping_s == 0 else: logging.debug("Support check points are: %s", support_check) logging.error("Unsupport check point: %s", checkpoint) except Exception, detail: raise error.TestFail("Interface check failed: %s" % detail)
def interface_validate(file=None, **virsh_dargs): """ Test for schema interface """ cmd_result = virsh.iface_list(**virsh_dargs) libvirt.check_exit_status(cmd_result) try: iface_name = re.findall(r"(\S+)\ +(\S+)\ +(\S+)[\ +\n]", str(cmd_result.stdout))[1][0] except IndexError: raise error.TestError("Fail to get iface name") if iface_name is None: raise error.TestNAError("None iface is specified.") try: virsh.iface_dumpxml(iface_name, to_file=file, **virsh_dargs) except error.CmdError, e: raise error.TestError(str(e))
def interface_validate(test, file=None, **virsh_dargs): """ Test for schema interface """ cmd_result = virsh.iface_list(**virsh_dargs) libvirt.check_exit_status(cmd_result) try: iface_name = re.findall(r"(\S+)\ +(\S+)\ +(\S+)", str(cmd_result.stdout.strip()))[1][0] except IndexError: test.error("Fail to get iface name") if iface_name is None: test.cancel("None iface is specified.") try: virsh.iface_dumpxml(iface_name, to_file=file, **virsh_dargs) except process.CmdError as e: test.error(str(e))
def run(test, params, env): """ Test virsh interface related commands. As the netcf is deprecated on rhel 9, most of the iface* command will not be supported. Even on rhel 8, most of the commands are not recommended. Only iface-mac, iface-name, iface-list, iface-dumpxml are still supported. And the backend change to be udev. (1) Using exist interface for testing(eg. lo or ethX) 1.1 List interfaces with '--inactive' optioin 1.2 List interfaces with '--all' optioin 1.3 List interfaces with no option (2) Dumpxml for the interface 2.1 Dumpxml for the interface(with --inactive option) 2.2 Dumpxml for the interface (3) Get interface MAC address by interface name (4) Get interface name by interface MAC address """ vm_name = params.get("main_vm") vm = env.get_vm(vm_name) opt = params.get('opt', '') test_list = "yes" == params.get("test_list", "no") test_info = "yes" == params.get("test_info", "no") test_mac = "yes" == params.get("test_mac", "no") test_name = "yes" == params.get("test_name", "no") def check_host_version(): get_hostos_version = astring.to_text( process.run("cat /etc/redhat-release", shell=True).stdout) if re.search(r'(\d+(\.\d+)?)', get_hostos_version) is not None: hostos_version = float( re.search(r'(\d+(\.\d+)?)', get_hostos_version).group(0)) if hostos_version < float(9.0): test.cancel( "Skip the virsh iface-* command test, only test it on RHEL 9 or above" ) else: test.cancel("Skip the test as failed to get the os version") def check_status(iface_name, status): """ Test the status in the iface-list output for interface param iface_name: the interface to be checked status: the expected status of the interface, active or inactive return: True or False """ o = process.run("cat /sys/class/net/%s/carrier" % iface_name, shell=True).stdout_text if o.strip() == '0' and status == 'active': return False elif o.strip() == '1' and status == 'inactive': return False return True def test_dumpxml_info(iface_name): """ Check the information from iface-dumpxml for interface iface_name, including mac, mtu, link state Param iface_name: the interface name Return: True or False """ # get the info from iface-dumpxml virsh cmd logging.debug("Check the dumpxml info for interface %s", iface_name) output = virsh.iface_dumpxml(iface_name) logging.debug("the dumpxml of interface %s is %s", iface, output) mtu = re.search(r"size='(.*)'", output, re.M | re.I).group(1) link_state = re.search(r"state='(.*)'", output, re.M | re.I).group(1) mac = re.search(r"address='(.*)'", output, re.M | re.I).group(1) # check the info in the output, includes interface type, mtu, link state, mac # compared with system device info mac_file = process.run("cat /sys/class/net/%s/address" % iface_name, shell=True).stdout_text.strip() carrier = process.run("cat /sys/class/net/%s/carrier" % iface_name, shell=True).stdout_text.strip() mtu_file = process.run("cat /sys/class/net/%s/mtu" % iface_name, shell=True).stdout_text.strip() if mac != mac_file: logging.debug("Interface %s mac check fail", iface_name) return False if (link_state == "up" and carrier != "1") or (link_state == "down" and carrier != "0"): logging.debug("Interface %s carrier check fail", iface_name) return False if mtu != mtu_file: logging.debug("Interface %s mtu check fail", iface_name) return False return True check_host_version() # run test cases if vm.is_alive(): vm.destroy() try: output_all = virsh.iface_list("--all").stdout_text logging.debug("the outputs of the iface_list is %s", output_all) # Get the list for all the interface, active interface, inactive interface based on the iface-list --all output interface = [] inactive_interface = [] active_interface = [] for line in output_all.splitlines(): logging.debug("the line is %s", line) iface_ = [x for x in line.split() if x] if "active" in iface_: active_interface.append(iface_[0]) interface.append(iface_[0]) elif "inactive" in iface_: inactive_interface.append(iface_[0]) interface.append(iface_[0]) logging.debug("all interface get from the virsh iface-list is %s", interface) logging.debug("inactive interface get from the virsh iface-list is %s", inactive_interface) logging.debug("active interface is %s", active_interface) # check all the interface has been listed compared with system udev info if test_list: all_iface = process.run("ls /sys/class/net", shell=True).stdout_text.split('\n')[:-1] logging.debug("all interfaces get from the /sys/class/net is %s", all_iface) # do not include the tap device tuntap = process.run("ip tuntap", shell=True).stdout_text for x in all_iface: if x in tuntap: all_iface.remove(x) logging.debug("after delete the tuntap device: %s", all_iface) interface_ = set(interface) all_iface_ = set(all_iface) if interface_ != all_iface_: test.fail( "Interface existence check for 'iface-list --all' fail compared with system device info!" ) # check the active and inactive attribute from the iface-list is correct for item in active_interface: if not check_status(item, 'active'): test.fail( "The interface %s should be inactive in virsh iface-list, but it is not." % item) for item in inactive_interface: if not check_status(item, 'inactive'): test.fail( "The interface %s should be active in virsh iface-list, but it is not." % item) # check the filter of the flag is effective, as above check compares all interfaces with /sys/class/net, # now comparing with the the "iface-list --all" outputs is enough output = virsh.iface_list(opt).stdout_text cmd_iface = [] for line in output.splitlines(): iface_ = [x for x in line.split() if x] if "active" in iface_ or "inactive" in iface_: cmd_iface.append(iface_[0]) if opt == '--inactive' and set(cmd_iface) != set( inactive_interface): test.fail( "iface-list --inactive should list all inactive interface, but it is not" ) elif opt == '' and set(cmd_iface) != set(active_interface): test.fail( "iface-list should list all active interface by default, but it is not" ) elif test_info: for iface in interface: if not iface.startswith("virbr"): s = test_dumpxml_info(iface) if not s: test.fail("Checking info in dumpxml fail for %s" % iface) else: out = process.run('ip addr show %s' % iface, shell=True).stdout_text.strip() mac = re.search(r"ether (.*) brd", out, re.M | re.I).group(1) if test_mac: # test iface-mac command mac_cmd = virsh.iface_mac(iface).stdout_text.strip() if mac_cmd not in process.run("ip l show %s" % iface).stdout_text: test.fail( "the mac address get from virsh iface-mac for %s does not match" % iface) if test_name: # test iface-name command name_cmd = virsh.iface_name(mac).stdout_text.strip() if iface != name_cmd: test.fail( "The name get from virsh iface-name for %s is not expexted" % mac) finally: logging.info( "Test case finished, and no need to restore any environment")
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"): 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", "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()