CSIT-312 VPP vhost-user - VPP vhost-user driver, virtio in VM
[csit.git] / resources / libraries / robot / performance.robot
index bb9e8ab..4e12ded 100644 (file)
@@ -14,7 +14,9 @@
 *** Settings ***
 | Library | resources.libraries.python.topology.Topology
 | Library | resources.libraries.python.NodePath
+| Library | resources.libraries.python.DpdkUtil
 | Library | resources.libraries.python.InterfaceUtil
+| Library | resources.libraries.python.VhostUser
 | Library | resources.libraries.python.TrafficGenerator
 | Library | resources.libraries.python.TrafficGenerator.TGDropRateSearchImpl
 | Resource | resources/libraries/robot/default.robot
@@ -24,6 +26,7 @@
 | Resource | resources/libraries/robot/l2_xconnect.robot
 | Resource | resources/libraries/robot/ipv4.robot
 | Resource | resources/libraries/robot/ipv6.robot
+| Resource | resources/libraries/robot/qemu.robot
 | Documentation | Performance suite keywords
 
 *** Keywords ***
@@ -75,6 +78,8 @@
 | | ... |                             for 40GE with 9004B L2 Frame.
 | | ... | - 40Ge_linerate_pps_9008B - Maximum number of packet per second
 | | ... |                             for 40GE with 9008B L2 Frame.
+| | ... | - 40Ge_linerate_pps_IMIX_v4_1 - Maximum number of packet per second
+| | ... |                                 for 40GE with IMIX_v4_1 profile.
 | | ...
 | | Set Suite Variable | ${10Ge_linerate_pps_64B} | 14880952
 | | Set Suite Variable | ${10Ge_linerate_pps_68B} | 14204545
 | | Set Suite Variable | ${40Ge_linerate_pps_9000B} | 554323
 | | Set Suite Variable | ${40Ge_linerate_pps_9004B} | 554078
 | | Set Suite Variable | ${40Ge_linerate_pps_9008B} | 553832
+| | Set Suite Variable | ${40Ge_linerate_pps_IMIX_v4_1} | 13374944
+
+| Calculate pps
+| | [Documentation]
+| | ... | Calculate pps for given rate and L2 frame size,
+| | ... | additional 20B are added to L2 frame size as padding.
+| | ...
+| | ... | *Arguments*
+| | ... | - bps - Rate in bps. Type: integer
+| | ... | - framesize - L2 frame size in Bytes. Type: integer
+| | ...
+| | ... | *Return*
+| | ... | - Calculated pps. Type: integer
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| Calculate pps \| 10000000000 | 64
+| | [Arguments] | ${bps} | ${framesize}
+| | ${ret}= | Evaluate | (${bps}/((${framesize}+20)*8)).__trunc__()
+| | Return From Keyword | ${ret}
 
 | Get Frame Size
 | | [Documentation]
 | | ... | _NOTE:_ This KW sets following suite variables:
 | | ... | - glob_loss_acceptance - Loss acceptance treshold
 | | ... | - glob_loss_acceptance_type - Loss acceptance treshold type
+| | ... | - glob_vm_image - Guest VM disk image
 | | ...
 | | Set Suite Variable | ${glob_loss_acceptance} | 0.5
 | | Set Suite Variable | ${glob_loss_acceptance_type} | percentage
+| | Set Suite Variable | ${glob_vm_image} | /var/lib/vm/csit-nested-1.3.img
 
 | 2-node circular Topology Variables Setup
 | | [Documentation]
 | | Vpp Route Add | ${dut2} | 2001:2::0 | ${host_prefix} | 2001:5::2
 | | ...           | interface=${dut2_if1} | count=${count}
 
+| IPv6 iAcl whitelist initialized in a 3-node circular topology
+| | [Documentation]
+| | ... | Creates classify L3 table on DUTs. IPv6 iAcl security whitelist
+| | ... | ingress /64 filter entries applied on links TG - DUT1 and DUT2 - TG.
+| | ...
+| | ${table_idx} | ${skip_n} | ${match_n}= | And Vpp Creates Classify Table L3
+| | ... | ${dut1} | ip6 | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut1} | permit | ${table_idx} | ${skip_n} | ${match_n}
+| | ... | ip6 | dst | 2001:2::2
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut1} | ${dut1_if1} | ip6 | ${table_idx}
+| | ${table_idx} | ${skip_n} | ${match_n}= | And Vpp Creates Classify Table L3
+| | ... | ${dut2} | ip6 | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut2} | permit | ${table_idx} | ${skip_n} | ${match_n}
+| | ... | ip6 | dst | 2001:1::2
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut2} | ${dut2_if2} | ip6 | ${table_idx}
+
 | L2 xconnect initialized in a 3-node circular topology
 | | [Documentation]
 | | ... | Setup L2 xconnect topology by cross connecting two interfaces on
 | | Vpp l2bd forwarding setup | ${dut2} | ${dut2_if1} | ${dut2_if2}
 | | All Vpp Interfaces Ready Wait | ${nodes}
 
-| 2-node Performance Suite Setup
-| | [Documentation]
-| | ... | Suite preparation phase that setup default startup configuration of
-| | ... | VPP on all DUTs. Updates interfaces on all nodes and setup global
-| | ... | variables used in test cases. Initializes traffic generator.
-| | ...
-| | ... | *Arguments:*
-| | ... | - topology_type - Topology type. Type: string
-| | ...
-| | ... | *Example:*
-| | ...
-| | ... | \| 2-node Performance Suite Setup \| L2 \|
-| | [Arguments] | ${topology_type}
-| | Setup default startup configuration of VPP on all DUTs
-| | Show vpp version on all DUTs
-| | Setup performance rate Variables
-| | Setup performance global Variables
-| | 2-node circular Topology Variables Setup
-| | Initialize traffic generator | ${tg} | ${tg_if1} | ${tg_if2}
-| | ...                          | ${dut1} | ${dut1_if1}
-| | ...                          | ${dut1} | ${dut1_if2}
-| | ...                          | ${topology_type}
-
-| 3-node Performance Suite Setup
-| | [Documentation]
-| | ... | Suite preparation phase that setup default startup configuration of
-| | ... | VPP on all DUTs. Updates interfaces on all nodes and setup global
-| | ... | variables used in test cases. Initializes traffic generator.
-| | ...
-| | ... | *Arguments:*
-| | ... | - topology_type - Topology type. Type: string
-| | ...
-| | ... | *Example:*
-| | ...
-| | ... | \| 3-node Performance Suite Setup \| L2 \|
-| | [Arguments] | ${topology_type}
-| | Setup default startup configuration of VPP on all DUTs
-| | Show vpp version on all DUTs
-| | Setup performance rate Variables
-| | Setup performance global Variables
-| | 3-node circular Topology Variables Setup
-| | Initialize traffic generator | ${tg} | ${tg_if1} | ${tg_if2}
-| | ...                          | ${dut1} | ${dut1_if1}
-| | ...                          | ${dut2} | ${dut2_if2}
-| | ...                          | ${topology_type}
-
 2-node Performance Suite Setup with DUT's NIC model
 | | [Documentation]
 | | ... | Suite preparation phase that setup default startup configuration of
 | | ${dut2_if2_pci}= | Get Interface PCI Addr | ${dut2} | ${dut2_if2}
 | | Add PCI device | ${dut1} | ${dut1_if1_pci} | ${dut1_if2_pci}
 | | Add PCI device | ${dut2} | ${dut2_if1_pci} | ${dut2_if2_pci}
+
+| Guest VM with dpdk-testpmd connected via vhost-user is setup
+| | [Documentation]
+| | ... | Start QEMU guest with two vhost-user interfaces and interconnecting
+| | ... | DPDK testpmd. Qemu Guest is using 3 cores pinned to physical cores 5,
+| | ... | 6, 7 and 2048M. Testpmd is using 3 cores (1 main core and 2 cores
+| | ... | dedicated to io) socket-mem=1024, mem-channel=4, txq/rxq=2048,
+| | ... | burst=64, disable-hw-vlan, total-num-mbufs, driver
+| | ... | usr/lib/librte_pmd_virtio.so.
+| | ...
+| | ... | *Arguments:*
+| | ... | - dut_node - DUT node to start guest VM on. Type: dictionary
+| | ... | - sock1 - Socket path for first Vhost-User interface. Type: string
+| | ... | - sock2 - Socket path for second Vhost-User interface. Type: string
+| | ... | - vm_name - QemuUtil instance name. Type: string
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| Guest VM with dpdk-testpmd connected via vhost-user is setup \
+| | ... | \| ${nodes['DUT1']} \| /tmp/sock1 \| /tmp/sock2 \| DUT1_VM \|
+| | [Arguments] | ${dut_node} | ${sock1} | ${sock2} | ${vm_name}
+| | Import Library | resources.libraries.python.QemuUtils
+| | ...            | WITH NAME | ${vm_name}
+| | Run keyword | ${vm_name}.Qemu Add Vhost User If | ${sock1}
+| | Run keyword | ${vm_name}.Qemu Add Vhost User If | ${sock2}
+| | Run keyword | ${vm_name}.Qemu Set Node | ${dut_node}
+| | Run keyword | ${vm_name}.Qemu Set Smp | 3 | 3 | 1 | 1
+| | Run keyword | ${vm_name}.Qemu Set Mem Size | 2048
+| | Run keyword | ${vm_name}.Qemu Set Huge Allocate
+| | Run keyword | ${vm_name}.Qemu Set Disk Image | ${glob_vm_image}
+| | ${vm}= | Run keyword | ${vm_name}.Qemu Start
+| | Run keyword | ${vm_name}.Qemu Set Affinity | 5 | 6 | 7
+| | Dpdk Testpmd Start | ${vm} | eal_coremask=0x7
+| | ...                | eal_mem_channels=4
+| | ...                | eal_socket_mem=1024
+| | ...                | pmd_fwd_mode=io
+| | ...                | pmd_disable_hw_vlan=${True}
+| | Return From Keyword | ${vm}
+
+| Guest VM with Linux Bridge connected via vhost-user is setup
+| | [Documentation]
+| | ... | Start QEMU guest with two vhost-user interfaces and interconnecting
+| | ... | linux bridge. Qemu Guest is using 3 cores pinned to physical cores 5,
+| | ... | 6, 7 and 2048M.
+| | ...
+| | ... | *Arguments:*
+| | ... | - dut_node - DUT node to start guest VM on. Type: dictionary
+| | ... | - sock1 - Socket path for first Vhost-User interface. Type: string
+| | ... | - sock2 - Socket path for second Vhost-User interface. Type: string
+| | ... | - vm_name - QemuUtil instance name. Type: string
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| Guest VM with Linux Bridge connected via vhost-user is setup \
+| | ... | \| ${nodes['DUT1']} \| /tmp/sock1 \| /tmp/sock2 \| DUT1_VM \|
+| | [Arguments] | ${dut_node} | ${sock1} | ${sock2} | ${vm_name}
+| | Import Library | resources.libraries.python.QemuUtils
+| | ...            | WITH NAME | ${vm_name}
+| | Run keyword | ${vm_name}.Qemu Add Vhost User If | ${sock1}
+| | Run keyword | ${vm_name}.Qemu Add Vhost User If | ${sock2}
+| | Run keyword | ${vm_name}.Qemu Set Node | ${dut_node}
+| | Run keyword | ${vm_name}.Qemu Set Smp | 3 | 3 | 1 | 1
+| | Run keyword | ${vm_name}.Qemu Set Mem Size | 2048
+| | Run keyword | ${vm_name}.Qemu Set Huge Allocate
+| | Run keyword | ${vm_name}.Qemu Set Disk Image | ${glob_vm_image}
+| | ${vm}= | Run keyword | ${vm_name}.Qemu Start
+| | Run keyword | ${vm_name}.Qemu Set Affinity | 5 | 6 | 7
+| | ${br}= | Set Variable | br0
+| | ${vhost1}= | Get Vhost User If Name By Sock | ${vm} | ${sock1}
+| | ${vhost2}= | Get Vhost User If Name By Sock | ${vm} | ${sock2}
+| | Linux Add Bridge | ${vm} | ${br} | ${vhost1} | ${vhost2}
+| | Set Interface State | ${vm} | ${vhost1} | up | if_type=name
+| | Set Interface State | ${vm} | ${vhost2} | up | if_type=name
+| | Set Interface State | ${vm} | ${br} | up | if_type=name
+| | Return From Keyword | ${vm}
+
+| Guest VM with dpdk-testpmd Teardown
+| | [Documentation]
+| | ... | Stop all qemu processes with dpdk-testpmd running on ${dut_node}.
+| | ... | Argument is dictionary of all qemu nodes running with its names.
+| | ... | Dpdk-testpmd is stopped gracefully with printing stats.
+| | ... |
+| | ... | *Arguments:*
+| | ... | - dut_node - Node where to clean qemu. Type: dictionary
+| | ... | - dut_vm_refs - VM references on node. Type: dictionary
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| Guest VM with dpdk-testpmd Teardown \| ${node['DUT1']} \
+| | ... | \| ${dut_vm_refs} \|
+| | ...
+| | [Arguments] | ${dut_node} | ${dut_vm_refs}
+| | :FOR | ${vm_name} | IN | @{dut_vm_refs}
+| | | ${vm}= | Get From Dictionary | ${dut_vm_refs} | ${vm_name}
+| | | Dpdk Testpmd Stop | ${vm}
+| | | Run Keyword | ${vm_name}.Qemu Set Node | ${dut_node}
+| | | Run Keyword | ${vm_name}.Qemu Kill
+| | | Run Keyword | ${vm_name}.Qemu Clear Socks
+
+| Guest VM Teardown
+| | [Documentation]
+| | ... | Stop all qemu processes running on ${dut_node}.
+| | ... | Argument is dictionary of all qemu nodes running with its names.
+| | ... |
+| | ... | *Arguments:*
+| | ... | - dut_node - Node where to clean qemu. Type: dictionary
+| | ... | - dut_vm_refs - VM references on node. Type: dictionary
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| Guest VM Teardown \| ${node['DUT1']} \
+| | ... | \| ${dut_vm_refs} \|
+| | ...
+| | [Arguments] | ${dut_node} | ${dut_vm_refs}
+| | :FOR | ${vm_name} | IN | @{dut_vm_refs}
+| | | ${vm}= | Get From Dictionary | ${dut_vm_refs} | ${vm_name}
+| | | Run Keyword | ${vm_name}.Qemu Set Node | ${dut_node}
+| | | Run Keyword | ${vm_name}.Qemu Kill
+| | | Run Keyword | ${vm_name}.Qemu Clear Socks
+