def setup(self, test, params, env): self.br0_name = "br0-%s" % (utils_misc.generate_random_string(3)) while self.br0_name in utils_net.get_net_if(): self.br0_name = "br0-%s" % (utils_misc.generate_random_string(3)) self.br0_ip = params.get("bridge_ip", "192.168.250.1") self.ovs = None error.context("Try to log into guest.") self.vms = [env.get_vm(vm) for vm in params.get("vms").split()] for vm in self.vms: vm.verify_alive() error.context("Start OpenVSwitch.") self.ovs = versionable_class.factory(openvswitch.OpenVSwitchSystem)() self.ovs.init_system() self.ovs.check() error.context("Add new bridge %s." % (self.br0_name)) self.ovs.add_br(self.br0_name) utils_net.set_net_if_ip(self.br0_name, self.br0_ip) utils_net.bring_up_ifname(self.br0_name) self.dns_pidf = (utils_net.check_add_dnsmasq_to_br(self.br0_name, test.tmpdir)) error.context("Add new ports from vms %s to bridge %s." % (self.vms, self.br0_name)) for vm in self.vms: utils_net.change_iface_bridge(vm.virtnet[1], self.br0_name, self.ovs) logging.debug(self.ovs.status()) self.host = ovs_utils.Machine(src=test.srcdir) self.mvms = [ovs_utils.Machine(vm) for vm in self.vms] self.machines = [self.host] + self.mvms #ForAllP(self.mvms).cmd("dhclinet") time.sleep(5) utils_misc.ForAllP(self.machines).fill_addrs()
def setup(self, test, params, env): self.br0_name = "br0-%s" % (utils_misc.generate_random_string(3)) while self.br0_name in utils_net.get_net_if(): self.br0_name = "br0-%s" % (utils_misc.generate_random_string(3)) self.br0_ip = params.get("bridge_ip", "192.168.250.1") self.ovs = None error.context("Try to log into guest.") self.vms = [env.get_vm(vm) for vm in params.get("vms").split()] for vm in self.vms: vm.verify_alive() error.context("Start OpenVSwitch.") self.ovs = versionable_class.factory(openvswitch.OpenVSwitchSystem)() self.ovs.init_system() self.ovs.check() error.context("Add new bridge %s." % (self.br0_name)) self.ovs.add_br(self.br0_name) utils_net.set_net_if_ip(self.br0_name, self.br0_ip) utils_net.bring_up_ifname(self.br0_name) self.dns_pidf = (utils_net.check_add_dnsmasq_to_br(self.br0_name, test.tmpdir)) error.context("Add new ports from vms %s to bridge %s." % (self.vms, self.br0_name)) for vm in self.vms: utils_net.change_iface_bridge(vm.virtnet[1], self.br0_name, self.ovs) logging.debug(self.ovs.status()) self.host = ovs_utils.Machine(src=test.srcdir) self.mvms = [ovs_utils.Machine(vm) for vm in self.vms] self.machines = [self.host] + self.mvms # ForAllP(self.mvms).cmd("dhclinet") time.sleep(5) utils_misc.ForAllP(self.machines).fill_addrs()
tap_list_re = r"tap,vlan=(\d+)," tap_replace_re = r"(tap,vlan=%s,fd=)\d+" tap_list = re.findall(tap_list_re, cmd_line) if not tap_list: print "Could not find tap device." sys.exit(1) tapfd_list = [] for tap in tap_list: try: ifname = "tap-%s" % tap tapfd = utils_net.open_tap("/dev/net/tun", ifname) utils_net.add_to_bridge(ifname, brname) utils_net.bring_up_ifname(ifname) pattern = tap_replace_re % tap cmd_line = re.sub(pattern, "\g<1>%s " % tapfd, cmd_line) tapfd_list.append(tapfd) except Exception, e: destroy_tap(tapfd_list) print "Error: %s" % e sys.exit(2) try: # Run qemu command. logging.info("TAP fd open to %s: %s", brname, tapfd_list) os.system(cmd_line) finally: destroy_tap(tapfd_list)
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)))