def log_folder_check(): log("Create log folder Now") log_folder = "/root/RHEL_NIC_QUAL_LOGS" if not os.path.exists(log_folder): os.mkdir(log_folder) time_stamp = time.strftime("%Y-%m-%d-%H-%M-%S") nic_log_folder = log_folder + "/" + time_stamp if os.path.exists(nic_log_folder): os.rmdir(nic_log_folder) os.mkdir(nic_log_folder) else: os.mkdir(nic_log_folder) local.path(nic_log_folder + "/throughput_log_folder.txt").write(nic_log_folder) os.environ["NIC_LOG_FOLDER"] = nic_log_folder log(f"log folder is {nic_log_folder}") return 0
def guest_start_kernel_bridge(): # brctl addbr br0 # brctl addif br0 eth1 # brctl addif br0 eth2 cmd = f""" ip link add br0 type bridge ip addr add 192.168.1.2/24 dev eth1 ip link set dev eth1 up ip link set eth1 master br0 ip addr add 192.168.1.3/24 dev eth2 ip link set dev eth2 up ip link set eth2 master br0 ip addr add 1.1.1.5/16 dev br0 ip link set dev br0 up # arp -s 1.1.1.10 3c:fd:fe:ad:bc:e8 # arp -s 1.1.2.10 3c:fd:fe:ad:bc:e9 sysctl -w net.ipv4.ip_forward=1 yum install -y tuna tuned-adm profile network-latency sysctl -w net.ipv4.conf.all.rp_filter=0 # sysctl -w net.ipv4.conf.eth0.rp_filter=0 """ pts = bash("virsh ttyconsole gg").value() ret = my_tool.run_cmd_get_output(pts, cmd) log(ret) pass
def nic_card_check(): log("Now Checking for NIC cards") nic1 = get_env("NIC1") nic2 = get_env("NIC2") if local.path("/sys/class/net/" + nic1).exists == False or local.path("/sys/class/net/" + nic2).exists == False: log("NIC $NIC1 or NIC $NIC2 cannot be seen by kernel") return 1 return 0
def bonding_test_trex(t_time,pkt_size,dst_mac_one,dst_mac_two): trex_server_ip = get_env("TRAFFICGEN_TREX_HOST_IP_ADDR") trex_url = get_env("TREX_URL") trex_dir = os.path.basename(trex_url).replace(".tar.gz","") trex_name = os.path.basename(trex_url) #init trex package and lua traffic generator # [ -e trafficgen ] || git clone https://github.com/atheurer/trafficgen.git # [ -e trafficgen ] || git clone https://github.com/wanghekai/trafficgen.git with pushd("/opt"): cmd = fr""" [ -e trafficgen ] || git clone https://github.com/atheurer/trafficgen.git mkdir -p trex pushd trex &>/dev/null [ -f {trex_name} ] || wget -nv -N {trex_url};tar xf {trex_name};ln -sf {trex_dir} current; ls -l; popd &>/dev/null chmod 777 /opt/trex -R """ log_and_run(cmd) pass with pushd(case_path): ret = bash(f"ping {trex_server_ip} -c 3") if ret.code != 0: log("Trex server {} not up please check ".format(trex_server_ip)) pass # cmd = f""" # ./binary-search.py \ # --trex-host={trex_server_ip} \ # --traffic-generator=trex-txrx \ # --frame-size={pkt_size} \ # --dst-macs={dst_mac_one},{dst_mac_two} \ # --traffic-direction=bidirectional \ # --search-granularity=5 \ # --search-runtime={t_time} \ # --validation-runtime=10 \ # --max-loss-pct=0.0 \ # --rate-unit=% \ # --rate=100 # """ # --search-granularity=1 \ with pushd("/opt/trafficgen"): cmd = f""" python ./binary-search.py \ --trex-host={trex_server_ip} \ --traffic-generator=trex-txrx \ --frame-size={pkt_size} \ --traffic-direction=bidirectional \ --search-runtime={t_time} \ --search-granularity=0.5 \ --validation-runtime=10 \ --negative-packet-loss=fail \ --max-loss-pct=0.0 \ --rate-unit=% \ --rate=100 """ log(cmd) py3_run(cmd) return 0
def check_guest_testpmd_result(): cmd = f""" show port info all show port stats all """ pts = bash("virsh ttyconsole gg").value() ret = my_tool.run_cmd_get_output(pts, cmd,"testpmd>") log(ret) return 0
def run_tests(test_list): print(os.environ) SKIP_SRIOV = int(os.environ.get("SKIP_SRIOV")) SKIP_1Q = int(os.environ.get("SKIP_1Q")) SKIP_2Q = int(os.environ.get("SKIP_2Q")) SKIP_JUMBO = int(os.environ.get("SKIP_JUMBO")) SKIP_KERNEL = int(os.environ.get("SKIP_KERNEL")) if test_list == "pvp_cont": ovs_dpdk_pvp_test_wrap(1,1500,1500,30) if test_list == "ALL" or test_list == "SRIOV": if SKIP_SRIOV == 1: data = """ ************************************************ SKIP Running 64/1500 Bytes SR-IOV Throughput TEST ************************************************ """ log(data) else: sriov_pci_passthrough_test_wrap(1,64,30) sriov_pci_passthrough_test_wrap(1,1500,30) pass if test_list == "ALL" or test_list == "1Q": if SKIP_1Q == 1: log("SKIP running 1500 Byte PVP verify check For 1Q 2PMD Test") else: ovs_dpdk_pvp_test_wrap(1,64,64,30) ovs_dpdk_pvp_test_wrap(1,1500,1500,30) pass if test_list == "ALL" or test_list == "2Q": if SKIP_2Q == 1: log("SKIP running 1500 Byte PVP verify check For 2Q 4PMD Test") else: ovs_dpdk_pvp_test_wrap(2,64,64,30) ovs_dpdk_pvp_test_wrap(2,1500,1500,30) pass if test_list == "ALL" or test_list == "Jumbo": if SKIP_JUMBO == 1: log("SKIP running 2000/9000 Bytes 2PMD PVP OVS/DPDK Throughput TEST") else: ovs_dpdk_pvp_test_wrap(1,2000,2000,30) ovs_dpdk_pvp_test_wrap(2,9000,9000,30) pass if test_list == "ALL" or test_list == "Kernel": if SKIP_KERNEL == 1: log("skip running 64/1500 Bytes PVP OVS Kernel Throughput TEST") else: ovs_kernel_datapath_test_wrap(1,64,30) ovs_kernel_datapath_test_wrap(2,1500,30) pass return 0
def check_guest_kernel_bridge_result(): cmd = f""" ip -d link show br0 ifconfig br0 ifconfig eth1 ifconfig eth2 """ pts = bash("virsh ttyconsole gg").value() ret = my_tool.run_cmd_get_output(pts, cmd) log(ret) pass
def network_connection_check(): log("*** Checking connection to people.redhat.com ***") ret = bash("ping -c 10 people.redhat.com") log(ret) if ret.code == 0: log("*** Connection to server succesful ***") return 0 else: log("People.redhat.com connection fail !!!!") log("Cannot connect to people.redhat.com, please verify internet connection !!!") return 1 return 0
def configure_guest(): cmd = """ stty rows 24 cols 120 nmcli dev set eth1 managed no nmcli dev set eth2 managed no systemctl stop firewalld iptables -t filter -P INPUT ACCEPT iptables -t filter -P FORWARD ACCEPT iptables -t filter -P OUTPUT ACCEPT iptables -t mangle -P PREROUTING ACCEPT iptables -t mangle -P INPUT ACCEPT iptables -t mangle -P FORWARD ACCEPT iptables -t mangle -P OUTPUT ACCEPT iptables -t mangle -P POSTROUTING ACCEPT iptables -t nat -P PREROUTING ACCEPT iptables -t nat -P INPUT ACCEPT iptables -t nat -P OUTPUT ACCEPT iptables -t nat -P POSTROUTING ACCEPT iptables -t filter -F iptables -t filter -X iptables -t mangle -F iptables -t mangle -X iptables -t nat -F iptables -t nat -X ip6tables -t filter -P INPUT ACCEPT ip6tables -t filter -P FORWARD ACCEPT ip6tables -t filter -P OUTPUT ACCEPT ip6tables -t mangle -P PREROUTING ACCEPT ip6tables -t mangle -P INPUT ACCEPT ip6tables -t mangle -P FORWARD ACCEPT ip6tables -t mangle -P OUTPUT ACCEPT ip6tables -t mangle -P POSTROUTING ACCEPT ip6tables -t nat -P PREROUTING ACCEPT ip6tables -t nat -P INPUT ACCEPT ip6tables -t nat -P OUTPUT ACCEPT ip6tables -t nat -P POSTROUTING ACCEPT ip6tables -t filter -F ip6tables -t filter -X ip6tables -t mangle -F ip6tables -t mangle -X ip6tables -t nat -F ip6tables -t nat -X ip -d addr show """ pts = bash("virsh ttyconsole gg").value() ret = my_tool.run_cmd_get_output(pts, cmd) log(ret) return 0
def sriov_pci_passthrough_test(q_num,pkt_size,cont_time): clear_env() numa_node = bash("cat /sys/class/net/{}/device/numa_node".format(get_env("NIC1_VF"))).value() vcpu_list = [ get_env("VCPU1"),get_env("VCPU2"),get_env("VCPU3")] if q_num != 1: vcpu_list = [ get_env("VCPU1"),get_env("VCPU2"),get_env("VCPU3"),get_env("VCPU4"),get_env("VCPU5")] new_xml = "g1.xml" vcpupin_in_xml(numa_node,"guest.xml",new_xml,vcpu_list) #clear the old hostdev config and update xml file xml_tool.remove_item_from_xml(new_xml,"./devices/interface[@type='hostdev']") # Here because of the limit of p35 archtechture , I can not add two vf into vm at the same time # So , make a workaround , add vf with virsh attach-device two times one_queue_image_name = os.path.basename(get_env("ONE_QUEUE_IMAGE")) two_queue_image_name = os.path.basename(get_env("TWO_QUEUE_IMAGE")) if q_num == 1: xml_tool.update_image_source(new_xml,image_dir + "/" + one_queue_image_name) else: xml_tool.update_image_source(new_xml,image_dir + "/" + two_queue_image_name) start_guest(new_xml) #Here attach vf to vm attach_sriov_vf_to_vm(new_xml,"gg") configure_guest log("guest start testpmd test Now") if q_num == 1: guest_cpu_list="0,1,2" else: guest_cpu_list="0,1,2,3,4" guest_start_testpmd(q_num,guest_cpu_list,get_env("SRIOV_RXD_SIZE"),get_env("SRIOV_TXD_SIZE"),pkt_size,"mac") log("sriov pci passthrough PVP performance test Begin Now") bonding_test_trex(cont_time,pkt_size,"52:54:00:11:8f:ea","52:54:00:11:8f:eb") check_guest_testpmd_result() return 0
def ovs_running_check(): log("*** Checking for running instance of Openvswitch ***") if bash("pgrep ovs-vswitchd || pgrep ovsdb-server").value(): log("It appears Openvswitch may be running, please stop all services and processes") else: log("ovs-vswitchd and ovsdb-server check OK") return 0
def ovs_kernel_datapath_test(q_num,pkt_size,cont_time): clear_env() nic1_name = get_env("NIC1") nic2_name = get_env("NIC2") numa_node = bash(f"cat /sys/class/net/{nic1_name}/device/numa_node").value() if q_num == 1: vcpu_list = [ get_env("VCPU1"),get_env("VCPU2"),get_env("VCPU3")] ovs_bridge_with_kernel(nic1_name,nic2_name) else: vcpu_list = [ get_env("VCPU1"),get_env("VCPU2"),get_env("VCPU3"),get_env("VCPU4"),get_env("VCPU5")] ovs_bridge_with_kernel(nic1_name,nic2_name) pass new_xml = "g1.xml" vcpupin_in_xml(numa_node,"guest.xml",new_xml,vcpu_list) update_xml_vnet_port(new_xml) one_queue_image_name = os.path.basename(get_env("ONE_QUEUE_IMAGE")) two_queue_image_name = os.path.basename(get_env("TWO_QUEUE_IMAGE")) if q_num == 1: xml_tool.update_image_source(new_xml,image_dir + "/" + one_queue_image_name) else: xml_tool.update_image_source(new_xml,image_dir + "/" + two_queue_image_name) start_guest(new_xml) configure_guest() guest_start_kernel_bridge() log("ovs kernel datapath PVP performance test Begin Now") trex_port_1 = get_env("TRAFFICGEN_TREX_PORT1") trex_port_2 = get_env("TRAFFICGEN_TREX_PORT2") bonding_test_trex(cont_time,pkt_size,trex_port_1,trex_port_2) check_guest_kernel_bridge_result() return 0
def hugepage_checks(): log("*** Checking Hugepage Config ***") ret = bash("""cat /proc/meminfo | awk /Hugepagesize/ | awk /1048576/""").value() if ret: log("Hugepage Check OK") else: log("Hugepage Check Failed" "Please enable 1G Hugepages") return 1 return 0
def config_file_checks(): log("*** Checking Config File ***") with pushd(case_path): str_all_name = """ NIC1 NIC2 PMD_CPU_1 PMD_CPU_2 PMD_CPU_3 PMD_CPU_4 VCPU1 VCPU2 VCPU3 VCPU4 VCPU5 TXD_SIZE RXD_SIZE SRIOV_TXD_SIZE SRIOV_RXD_SIZE TRAFFICGEN_TREX_HOST_IP_ADDR TRAFFICGEN_TREX_PORT1 TRAFFICGEN_TREX_PORT2 NIC1_VF NIC2_VF ONE_QUEUE_IMAGE TWO_QUEUE_IMAGE DPDK_VER DPDK_URL DPDK_TOOL_URL TREX_URL """.split() for name in str_all_name: if False == check_env_var(name): log(f"Please set the config Var {name} in Perf-Verify.conf file") return 1 return 0
def os_check(): log("Begin OS Check Now") import getpass if get_env("ID") != 'rhel': log("system distro not correct") return 1 if getpass.getuser() != "root": log("User check ,must be logged in as root") return 1 check_install("lrzip") return 0
def enable_dpdk(nic1_mac, nic2_mac): nic1_name = get_nic_name_from_mac(nic1_mac) nic2_name = get_nic_name_from_mac(nic2_mac) nic1_businfo = my_tool.get_bus_from_name(nic1_name) nic2_businfo = my_tool.get_bus_from_name(nic2_name) cmd = """ modprobe -r vfio-pci modprobe -r vfio modprobe vfio-pci modprobe vfio """ log_and_run(cmd,"0,1") import ethtool driver_name = ethtool.get_module(nic1_name) if driver_name == "mlx5_core": log("This Driver is Mallenox , So just return 0") return 0 if os.path.exists("/usr/share/dpdk/usertools/dpdk-devbind.py"): log("using dpdk-devbind.py set the vfio-pci driver to nic") cmd = f""" /usr/share/dpdk/usertools/dpdk-devbind.py -b vfio-pci {nic1_businfo} /usr/share/dpdk/usertools/dpdk-devbind.py -b vfio-pci {nic2_businfo} /usr/share/dpdk/usertools/dpdk-devbind.py --status """ log_and_run(cmd) else: log("using driverctl set the vfio-pci driver to nic") cmd = f""" driverctl -v set-override {nic1_businfo} vfio-pci sleep 3 driverctl -v set-override {nic2_businfo} vfio-pci sleep 3 driverctl -v list-devices | grep vfio-pci """ log_and_run(cmd) return 0
def rpm_check(): log("*** Checking for installed RPMS ***") if bash("rpm -qa | grep ^openvswitch").value() == "": log("Openvswitch rpm" "Please install Openvswitch rpm") return 1 else: log("Openvswitch rpm check OK") if bash("rpm -qa | grep dpdk-tools").value() == "": log("Please install dpdk tools rpm ") return 1 else: log("dpdk tools check OK ") if bash("rpm -qa | grep dpdk-[0-9]").value() == "": log("Please install dpdk package rpm ") return 1 else: log("dpdk package check OK") log("Please make sure qemu-kvm qemu-kvm-tools version >= 2.12 !!!!") log("Please make sure qemu-kvm qemu-kvm-tools version >= 2.12 !!!!") log("Please make sure qemu-kvm qemu-kvm-tools version >= 2.12 !!!!") if system_version_id < 80: if bash("rpm -qa | grep qemu-kvm-tools").value() == "": log("Please install qemu-kvm-tools rpm ") return 1 else: log("qemu-kvm-tools check OK") else: if bash("rpm -qa | grep kernel-tools").value() == "": log("Please install kernel-tools rpm ") return 1 else: log("kernel-tools check OK") if bash("rpm -qa | grep qemu-img").value() == "": log("Please install qemu-img rpm ") return 1 else: log("qemu-img package check OK") if bash("rpm -qa | grep qemu-kvm").value() == "": log("Please install qemu-kmv rpm ") return 1 else: log("qemu-kvm package check OK") return 0
def guest_start_testpmd(queue_num, guest_cpu_list, rxd_size, txd_size,max_pkt_len,fwd_mode): dpdk_ver = get_env("DPDK_VER") cmd = fr""" stty rows 24 cols 120 /root/one_gig_hugepages.sh 1 rpm -ivh /root//{dpdk_ver}/dpdk*.rpm echo "options vfio enable_unsafe_noiommu_mode=1" > /etc/modprobe.d/vfio.conf modprobe -r vfio_iommu_type1 modprobe -r vfio-pci modprobe -r vfio modprobe vfio modprobe vfio-pci ip link set eth1 down ip link set eth2 down ip -d link show driver=$(lspci -s 0000:03:00.0 -v | grep Kernel | grep modules | awk '{{print $NF}}') echo "Diver is"$driver grep "mlx" <<< $driver || driverctl -v set-override 0000:03:00.0 vfio-pci grep "mlx" <<< $driver || driverctl -v set-override 0000:04:00.0 vfio-pci grep "mlx" <<< $driver && driverctl -v unset-override 0000:03:00.0 grep "mlx" <<< $driver && driverctl -v unset-override 0000:04:00.0 dpdk-devbind --status """ pts = bash("virsh ttyconsole gg").value() ret = my_tool.run_cmd_get_output(pts, cmd) # log(ret) print("**********************************") print(ret) print("**********************************") num_core = 2 if queue_num == 1: num_core = 2 else: num_core = 4 hw_vlan_flag = "" legacy_mem = "" dpdk_version = int(get_env("DPDK_VER").split('-')[0]) if dpdk_version >= 1811: legacy_mem = " --legacy-mem " hw_vlan_flag = "" else: legacy_mem = "" hw_vlan_flag = "--disable-hw-vlan" extra_parameter = "" if fwd_mode == "mac": port0_peer_mac = get_env("TRAFFICGEN_TREX_PORT1") port1_peer_mac = get_env("TRAFFICGEN_TREX_PORT2") extra_parameter = f""" --eth-peer=0,{port0_peer_mac} --eth-peer=1,{port1_peer_mac} """ cmd_test = f"""testpmd -l {guest_cpu_list} \ --socket-mem 1024 \ {legacy_mem} \ -n 4 \ -- \ --forward-mode={fwd_mode} \ --port-topology=paired \ {hw_vlan_flag} \ --disable-rss \ -i \ --rxq={queue_num} \ --txq={queue_num} \ --rxd={rxd_size} \ --txd={txd_size} \ --nb-cores={num_core} \ --max-pkt-len={max_pkt_len} \ {extra_parameter} \ --auto-start """ log(cmd_test) ret = my_tool.run_cmd_get_output(pts,cmd_test,"testpmd>") # log(ret) print("***********************************") print(ret) print("***********************************") return 0
def exit_with_error(str): print(f"Exit with {str}") log(f"""Exit with {str}""") send_command("sriov-github-throughput-quit-string") pass
def conf_checks(): proc_cmdline_info = local.path("/proc/cmdline").read() log(proc_cmdline_info) if not "intel_iommu=on" in proc_cmdline_info: log("Iommu Enablement" "Please enable IOMMU mode in your grub config") return 1 else: log("Check intel_iommu=on SUCCESS") if bash("tuned-adm active | grep cpu-partitioning").value() == '': log("Tuned-adm cpu-partitioning profile must be active") return 1 else: log("tuned-adm active OK") if bash(""" cat /proc/cmdline | grep "nohz_full=[0-9]" """).value() == '': log("Tuned Config Must set cores to isolate in tuned-adm profile") return 1 else: log("nohz_full flag check is OK") return 0
def ovs_dpdk_pvp_test(q_num,mtu_val,pkt_size,cont_time): clear_env() nic1_name = get_env("NIC1") nic2_name = get_env("NIC2") nic1_mac = my_tool.get_mac_from_name(nic1_name) nic2_mac = my_tool.get_mac_from_name(nic2_name) nic1_businfo = my_tool.get_bus_from_name(nic1_name) nic2_businfo = my_tool.get_bus_from_name(nic2_name) nic_driver = my_tool.get_nic_driver_from_name(nic1_name) numa_node = bash(f"cat /sys/class/net/{nic1_name}/device/numa_node").value() log("enable dpdk now") enable_dpdk(nic1_mac,nic2_mac) log("config openvswitch with dpdk ") pmd_cpu_2_list = [get_env("PMD_CPU_1"),get_env("PMD_CPU_2")] pmd_cpu_4_list = [get_env("PMD_CPU_1"),get_env("PMD_CPU_2"),get_env("PMD_CPU_3"),get_env("PMD_CPU_4")] if q_num == 1: cpu_mask = my_tool.get_pmd_masks(" ".join(pmd_cpu_2_list)) vcpu_list = [get_env("VCPU1"),get_env("VCPU2"),get_env("VCPU3")] if "mlx" in nic_driver: ovs_bridge_with_dpdk_with_mac(nic1_mac,nic2_mac,mtu_val,cpu_mask) else: ovs_bridge_with_dpdk_with_pci_bus(nic1_businfo,nic2_businfo,mtu_val,cpu_mask) else: cpu_mask = my_tool.get_pmd_masks(" ".join(pmd_cpu_4_list)) vcpu_list = [get_env("VCPU1"),get_env("VCPU2"),get_env("VCPU3"),get_env("VCPU4"),get_env("VCPU5")] if "mlx" in nic_driver: ovs_bridge_with_dpdk_with_mac(nic1_mac,nic2_mac,mtu_val,cpu_mask) else: ovs_bridge_with_dpdk_with_pci_bus(nic1_businfo,nic2_businfo,mtu_val,cpu_mask) log("update guest xml config file") new_xml = "g1.xml" vcpupin_in_xml(numa_node,"guest.xml",new_xml,vcpu_list) update_xml_vhostuser(new_xml,q_num) one_queue_image_name = os.path.basename(get_env("ONE_QUEUE_IMAGE")) two_queue_image_name = os.path.basename(get_env("TWO_QUEUE_IMAGE")) if q_num == 1: xml_tool.update_image_source(new_xml,image_dir + "/" + one_queue_image_name) else: xml_tool.update_image_source(new_xml,image_dir + "/" + two_queue_image_name) log("start and config guest Now") start_guest(new_xml) configure_guest() log("show vm xml") cmd = f""" virsh dumpxml gg """ log_and_run(cmd) log("guest start testpmd test Now") if q_num == 1: guest_cpu_list="0,1,2" else: guest_cpu_list="0,1,2,3,4" guest_start_testpmd(q_num,guest_cpu_list,get_env("RXD_SIZE"),get_env("TXD_SIZE"),mtu_val,"io") log("ovs dpdk PVP performance test Begin Now") trex_port_1 = get_env("TRAFFICGEN_TREX_PORT1") trex_port_2 = get_env("TRAFFICGEN_TREX_PORT2") bonding_test_trex(cont_time,pkt_size,trex_port_1,trex_port_2) check_guest_testpmd_result() return 0
def download_VNF_image(): cmd = f""" chmod 777 {image_dir} """ log_and_run(cmd) with pushd(case_path): one_queue_image = get_env("ONE_QUEUE_IMAGE") two_queue_image = get_env("TWO_QUEUE_IMAGE") one_queue_image_name = os.path.basename(one_queue_image) two_queue_image_name = os.path.basename(two_queue_image) one_queue_image_backup_name = "backup_" + one_queue_image_name two_queue_image_backup_name = "backup_" + two_queue_image_name #for one queue image backup if not os.path.exists(f"{image_dir}/{one_queue_image_backup_name}"): log_info = """ *********************************************************************** Downloading and decompressing VNF image. This may take a while! *********************************************************************** """ log(log_info) cmd = f""" wget {one_queue_image} -O {image_dir}/{one_queue_image_backup_name} > /dev/null 2>&1 """ log_and_run(cmd) #for two queue image backup if not os.path.exists(f"{image_dir}/{two_queue_image_backup_name}"): log_info = """ *********************************************************************** Downloading and decompressing VNF image. This may take a while! *********************************************************************** """ log(log_info) cmd = f""" wget {two_queue_image} -O {image_dir}/{two_queue_image_backup_name}> /dev/null 2>&1 """ log_and_run(cmd) #config a new image from backup image if os.path.exists(f"{image_dir}/{one_queue_image_name}"): with pushd(f"{image_dir}"): cmd = f""" rm -f {one_queue_image_name} cp {one_queue_image_backup_name} {one_queue_image_name} """ log_and_run(cmd) else: with pushd(f"{image_dir}"): cmd = f""" cp {one_queue_image_backup_name} {one_queue_image_name} """ log_and_run(cmd) #config a new two queue image from backup image if os.path.exists(f"{image_dir}/{two_queue_image_name}"): with pushd(f"{image_dir}"): cmd = f""" rm -f {two_queue_image_name} cp {two_queue_image_backup_name} {two_queue_image_name} """ log_and_run(cmd) else: with pushd(f"{image_dir}"): cmd = f""" cp {two_queue_image_backup_name} {two_queue_image_name} """ log_and_run(cmd) udev_file = "60-persistent-net.rules" data = """ ACTION=="add", SUBSYSTEM=="net", KERNELS=="0000:03:00.0", NAME:="eth1" ACTION=="add", SUBSYSTEM=="net", KERNELS=="0000:04:00.0", NAME:="eth2" """ log("add net rules to guest image") log(data) local.path(udev_file).write(data) cmd = f""" virt-copy-in -a {image_dir}/{one_queue_image_name} {udev_file} /etc/udev/rules.d/ virt-copy-in -a {image_dir}/{two_queue_image_name} {udev_file} /etc/udev/rules.d/ """ log_and_run(cmd) dpdk_url = get_env("DPDK_URL") dpdk_tool_url = get_env("DPDK_TOOL_URL") dpdk_ver = get_env("DPDK_VER") cmd = f""" rm -rf /root/{dpdk_ver} mkdir -p /root/{dpdk_ver} wget -P /root/{dpdk_ver}/ {dpdk_url} > /dev/null 2>&1 wget -P /root/{dpdk_ver}/ {dpdk_tool_url} > /dev/null 2>&1 virt-copy-in -a {image_dir}/{one_queue_image_name} /root/{dpdk_ver} /root/ virt-copy-in -a {image_dir}/{two_queue_image_name} /root/{dpdk_ver} /root/ sleep 5 """ log_and_run(cmd) return 0
def attach_sriov_vf_to_vm(xml_file,vm,vlan_id=0): vf1_bus_info = my_tool.get_bus_from_name(get_env("NIC1_VF")) vf2_bus_info = my_tool.get_bus_from_name(get_env("NIC2_VF")) vf1_bus_info = vf1_bus_info.replace(":",'_') vf1_bus_info = vf1_bus_info.replace(".",'_') vf2_bus_info = vf2_bus_info.replace(":",'_') vf2_bus_info = vf2_bus_info.replace(".",'_') log(vf1_bus_info) log(vf2_bus_info) vf1_domain = vf1_bus_info.split('_')[0] vf1_bus = vf1_bus_info.split('_')[1] vf1_slot = vf1_bus_info.split('_')[2] vf1_func = vf1_bus_info.split('_')[3] vf2_domain = vf2_bus_info.split('_')[0] vf2_bus = vf2_bus_info.split('_')[1] vf2_slot = vf2_bus_info.split('_')[2] vf2_func = vf2_bus_info.split('_')[3] vlan_item = """ <interface type='hostdev' managed='yes'> <mac address='{}'/> <vlan > <tag id='{}'/> </vlan> <driver name='vfio'/> <source > <address type='pci' domain='0x{}' bus='0x{}' slot='0x{}' function='0x{}'/> </source > <address type='pci' domain='{}' bus='{}' slot='{}' function='{}'/> </interface > """ item = """ <interface type='hostdev' managed='yes'> <mac address='{}'/> <driver name='vfio'/> <source > <address type='pci' domain='0x{}' bus='0x{}' slot='0x{}' function='0x{}'/> </source > <address type='pci' domain='{}' bus='{}' slot='{}' function='{}'/> </interface > """ vf1_xml_path = os.getcwd() + "/vf1.xml" vf2_xml_path = os.getcwd() + "/vf2.xml" if os.path.exists(vf1_xml_path): os.remove(vf1_xml_path) if os.path.exists(vf2_xml_path): os.remove(vf2_xml_path) local.path(vf1_xml_path).touch() local.path(vf2_xml_path).touch() vf1_f_obj = local.path(vf1_xml_path) vf2_f_obj = local.path(vf2_xml_path) import xml.etree.ElementTree as xml if vlan_id != 0: vf1_format_list = ['52:54:00:11:8f:ea', vlan_id ,vf1_domain ,vf1_bus, vf1_slot, vf1_func, '0x0000', '0x03', '0x0', '0x0'] vf1_vlan_item = vlan_item.format(*vf1_format_list) vf1_vlan_obj = xml.fromstring(vf1_vlan_item) vf1_f_obj.write(xml.tostring(vf1_vlan_obj)) vf2_format_list = ['52:54:00:11:8f:eb', vlan_id, vf2_domain, vf2_bus, vf2_slot, vf2_func, '0x0000', '0x04', '0x0', '0x0'] vf2_vlan_item = vlan_item.format(*vf2_format_list) vf2_vlan_obj = xml.fromstring(vf2_vlan_item) vf2_f_obj.write(xml.tostring(vf2_vlan_obj)) else: vf1_format_list = ['52:54:00:11:8f:ea' ,vf1_domain, vf1_bus, vf1_slot, vf1_func, '0x0000', '0x03', '0x0', '0x0'] vf1_novlan_item = item.format(*vf1_format_list) vf1_novlan_obj = xml.fromstring(vf1_novlan_item) vf1_f_obj.write(xml.tostring(vf1_novlan_obj)) vf2_format_list = ['52:54:00:11:8f:eb' ,vf2_domain ,vf2_bus, vf2_slot ,vf2_func, '0x0000', '0x04', '0x0', '0x0'] vf2_novlan_item = item.format(*vf2_format_list) vf2_novlan_obj = xml.fromstring(vf2_novlan_item) vf2_f_obj.write(xml.tostring(vf2_novlan_obj)) cmd = f""" sleep 10 echo "#################################################" cat {vf1_xml_path} echo "#################################################" cat {vf2_xml_path} echo "#################################################" virsh attach-device {vm} {vf1_xml_path} sleep 5 virsh dumpxml {vm} sleep 10 virsh attach-device {vm} {vf2_xml_path} sleep 5 virsh dumpxml {vm} """ log_and_run(cmd) return 0
def update_xml_sriov_vf_port(xml_file,vlan_id=0): vf1_bus_info = my_tool.get_bus_from_name(get_env("NIC1_VF")) vf2_bus_info = my_tool.get_bus_from_name(get_env("NIC2_VF")) vf1_bus_info = vf1_bus_info.replace(":",'_') vf1_bus_info = vf1_bus_info.replace(".",'_') vf2_bus_info = vf2_bus_info.replace(":",'_') vf2_bus_info = vf2_bus_info.replace(".",'_') log(vf1_bus_info) log(vf2_bus_info) vf1_domain = vf1_bus_info.split('_')[0] vf1_bus = vf1_bus_info.split('_')[1] vf1_slot = vf1_bus_info.split('_')[2] vf1_func = vf1_bus_info.split('_')[3] vf2_domain = vf2_bus_info.split('_')[0] vf2_bus = vf2_bus_info.split('_')[1] vf2_slot = vf2_bus_info.split('_')[2] vf2_func = vf2_bus_info.split('_')[3] vlan_item = """ <interface type='hostdev' managed='yes'> <mac address='{}'/> <vlan > <tag id='{}'/> </vlan> <driver name='vfio'/> <source > <address type='pci' domain='0x{}' bus='0x{}' slot='0x{}' function='0x{}'/> </source > <address type='pci' domain='{}' bus='{}' slot='{}' function='{}'/> </interface > """ item = """ <interface type='hostdev' managed='yes'> <mac address='{}'/> <driver name='vfio'/> <source > <address type='pci' domain='0x{}' bus='0x{}' slot='0x{}' function='0x{}'/> </source > <address type='pci' domain='{}' bus='{}' slot='{}' function='{}'/> </interface > """ xml_tool.remove_item_from_xml(xml_file,"./devices/interface[@type='hostdev']") if vlan_id != 0: vf1_format_list = ['52:54:00:11:8f:ea', vlan_id ,vf1_domain ,vf1_bus, vf1_slot, vf1_func, '0x0000', '0x03', '0x0', '0x0'] vf1_vlan_item = vlan_item.format(*vf1_format_list) xml_tool.add_item_from_xml(xml_file,"./devices",vf1_vlan_item) vf2_format_list = ['52:54:00:11:8f:eb', vlan_id, vf2_domain, vf2_bus, vf2_slot, vf2_func, '0x0000', '0x04', '0x0', '0x0'] vf2_vlan_item = vlan_item.format(*vf2_format_list) xml_tool.add_item_from_xml(xml_file,"./devices" ,vf2_vlan_item) else: vf1_format_list = ['52:54:00:11:8f:ea' ,vf1_domain, vf1_bus, vf1_slot, vf1_func, '0x0000', '0x03', '0x0', '0x0'] vf1_novlan_item = item.format(*vf1_format_list) xml_tool.add_item_from_xml(xml_file,"./devices",vf1_novlan_item) vf2_format_list = ['52:54:00:11:8f:eb' ,vf2_domain ,vf2_bus, vf2_slot ,vf2_func, '0x0000', '0x04', '0x0', '0x0'] vf2_novlan_item = item.format(*vf2_format_list) xml_tool.add_item_from_xml(xml_file,"./devices", vf2_novlan_item) return 0