Exemple #1
0
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
Exemple #2
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
Exemple #3
0
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
Exemple #4
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
Exemple #5
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
Exemple #6
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
Exemple #7
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
Exemple #8
0
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
Exemple #9
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
Exemple #10
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
Exemple #11
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
Exemple #12
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
Exemple #13
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
Exemple #14
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
Exemple #15
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
Exemple #16
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
Exemple #17
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
Exemple #18
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
Exemple #19
0
def exit_with_error(str):
    print(f"Exit with {str}")
    log(f"""Exit with {str}""")
    send_command("sriov-github-throughput-quit-string")
    pass
Exemple #20
0
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
Exemple #21
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
Exemple #22
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
Exemple #23
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
Exemple #24
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