diff options
Diffstat (limited to 'resources/libraries/robot')
36 files changed, 1314 insertions, 1856 deletions
diff --git a/resources/libraries/robot/crypto/ipsec.robot b/resources/libraries/robot/crypto/ipsec.robot index a37c18db77..33702a43ae 100644 --- a/resources/libraries/robot/crypto/ipsec.robot +++ b/resources/libraries/robot/crypto/ipsec.robot @@ -17,28 +17,28 @@ | Library | resources.libraries.python.IPsecUtil | Library | resources.libraries.python.IPUtil | Library | resources.libraries.python.IPv6Util -| ... +| | Documentation | IPsec keywords. *** Keywords *** | Generate keys for IPSec | | [Documentation] | Generate keys for IPsec. -| | ... +| | | | ... | *Arguments:* | | ... | - crypto_alg - Encryption algorithm. Type: enum | | ... | - integ_alg - Integrity algorithm. Type: enum -| | ... +| | | | ... | _NOTE:_ This KW sets following test case variable: | | ... | - encr_key - Encryption key. Type: string | | ... | - auth_key - Integrity key. Type: string -| | ... +| | | | ... | *Example:* | | ... | \| ${encr_alg}= \| Crypto Alg AES CBC 128 \| | | ... | \| ${auth_alg}= \| Integ Alg SHA1 96 \| | | ... | \| Generate keys for IPSec \| ${encr_alg} \| ${auth_alg} \| -| | ... +| | | | [Arguments] | ${crypto_alg} | ${integ_alg} -| | ... +| | | | ${encr_key_len}= | Get Crypto Alg Key Len | ${crypto_alg} | | ${encr_key}= | Generate Random String | ${encr_key_len} | | ${auth_key_len}= | Get Integ Alg Key Len | ${integ_alg} @@ -48,26 +48,26 @@ | Configure path for IPSec test | | [Documentation] | Setup path for IPsec testing TG<-->DUT1. -| | ... +| | | | ... | *Example:* | | ... | \| Configure path for IPSec test \| -| | ... +| | | | Set Interface State | ${dut1} | ${dut1_if1} | up | | Set Interface State | ${dut1} | ${dut1_if2} | up | | Vpp Node Interfaces Ready Wait | ${dut1} | Configure topology for IPv4 IPsec testing | | [Documentation] | Setup topology for IPv4 IPsec testing. -| | ... +| | | | ... | _NOTE:_ This KW sets following test case variable: | | ... | - dut_tun_ip - DUT tunnel IP address. Type: string | | ... | - dut_src_ip - DUT source IP address. Type: string | | ... | - tg_tun_ip - TG tunnel IP address. Type: string | | ... | - tg_src_ip - TG source IP address. Type: string -| | ... +| | | | ... | *Example:* | | ... | \| Configure topology for IPv4 IPsec testing \| -| | ... +| | | | Configure path for IPSec test | | VPP Interface Set IP Address | | ... | ${dut1} | ${dut1_if1} | ${dut_if1_ip4} | ${ip4_plen} @@ -87,16 +87,16 @@ | Configure topology for IPv6 IPsec testing | | [Documentation] | Setup topology fo IPv6 IPsec testing. -| | ... +| | | | ... | _NOTE:_ This KW sets following test case variable: | | ... | - dut_tun_ip - DUT tunnel IP address. Type: string | | ... | - dut_src_ip - DUT source IP address. Type: string | | ... | - tg_tun_ip - TG tunnel IP address. Type: string | | ... | - tg_src_ip - TG source IP address. Type: string -| | ... +| | | | ... | *Example:* | | ... | \| Configure topology for IPv6 IPsec testing \| -| | ... +| | | | Configure path for IPSec test | | VPP Interface Set IP Address | | ... | ${dut1} | ${dut1_if1} | ${dut_if1_ip6} | ${ip6_plen} @@ -117,7 +117,7 @@ | Configure manual keyed connection for IPSec | | [Documentation] | Setup IPsec manual keyed connection on VPP node. -| | ... +| | | | ... | *Arguments:* | | ... | - node - VPP node to setup IPsec on. Type: dictionary | | ... | - interface - Interface to enable IPsec on. Type: string @@ -131,11 +131,11 @@ | | ... | - r_ip - Remote IP address. Type: string | | ... | - l_tunnel - Local tunnel IP address (optional). Type: string | | ... | - r_tunnel - Remote tunnel IP address (optional). Type: string -| | ... +| | | | ... | _NOTE:_ This KW sets following test case variables: | | ... | - l_sa_id | | ... | - r_sa_id -| | ... +| | | | ... | *Example:* | | ... | \| ${encr_alg}= \| Crypto Alg AES CBC 128 \| | | ... | \| ${auth_alg}= \| Integ Alg SHA1 96 \| @@ -143,12 +143,12 @@ | | ... | \| GigabitEthernet0/8/0 \| ${encr_alg} \| sixteenbytes_key \ | | ... | \| ${auth_alg} \| twentybytessecretkey \| ${1000} \| ${1001} \ | | ... | \| 192.168.4.4 \| 192.168.3.3 \| 192.168.100.3 \| 192.168.100.2 \| -| | ... +| | | | [Arguments] | ${node} | ${interface} | ${crypto_alg} | ${crypto_key} | | ... | ${integ_alg} | ${integ_key} | ${l_spi} | ${r_spi} | ${l_ip} | | ... | ${r_ip} | ${l_tunnel}=${None} | ${r_tunnel}=${None} | | ... | ${is_ipv6}=${FALSE} -| | ... +| | | | Set Test Variable | ${l_sa_id} | ${10} | | Set Test Variable | ${r_sa_id} | ${20} | | ${spd_id}= | Set Variable | ${1} @@ -185,7 +185,7 @@ | | ... | DUT1-DUT2 links. Set routing for encrypted traffic on both DUT nodes | | ... | with prefix /8 and next hop of neighbour DUT or TG interface IPv4 | | ... | address. -| | ... +| | | | Set interfaces in path up | | VPP Interface Set IP Address | ${dut1} | ${dut1_if1} | | ... | ${dut1_if1_ip4} | 24 diff --git a/resources/libraries/robot/dpdk/default.robot b/resources/libraries/robot/dpdk/default.robot index 4b8ec0b08b..00c0691864 100644 --- a/resources/libraries/robot/dpdk/default.robot +++ b/resources/libraries/robot/dpdk/default.robot @@ -22,23 +22,23 @@ | Start L2FWD on all DUTs | | [Documentation] | Start the l2fwd with M worker threads and rxqueues N and | | ... | jumbo support frames on/off on all DUTs. -| | ... +| | | | ... | *Arguments:* | | ... | - phy_cores - Number of physical cores to use. Type: integer | | ... | - rx_queues - Number of RX queues. Type: integer | | ... | - jumbo_frames - Jumbo frames on/off: boolean -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Start L2FWD on all DUTs \| ${1} \| ${1} \| ${False} \| -| | ... +| | | | [Arguments] | ${phy_cores} | ${rx_queues}=${None} | ${jumbo_frames}=${False} -| | ... +| | | | ${cpu_count_int} | Convert to Integer | ${phy_cores} | | ${thr_count_int} | Convert to Integer | ${phy_cores} | | ${dp_cores}= | Evaluate | ${cpu_count_int}+1 | | ${duts}= | Get Matches | ${nodes} | DUT* -| | :FOR | ${dut} | IN | @{duts} +| | FOR | ${dut} | IN | @{duts} | | | ${numa}= | Get interfaces numa node | ${nodes['${dut}']} | | | ... | ${${dut}_if1} | ${${dut}_if2} | | | ${smt_used}= | Is SMT enabled | ${nodes['${dut}']['cpuinfo']} @@ -58,27 +58,28 @@ | | | Run keyword if | ${thr_count_int} > 1 | | | ... | Set Tags | MTHREAD | ELSE | Set Tags | STHREAD | | | Set Tags | ${thr_count_int}T${cpu_count_int}C +| | END | Start L3FWD on all DUTs | | [Documentation] | Start the l3fwd with M worker threads and rxqueues N and | | ... | jumbo support frames on/off on all DUTs. -| | ... +| | | | ... | *Arguments:* | | ... | - phy_cores - Number of physical cores to use. Type: integer | | ... | - rx_queues - Number of RX queues. Type: integer | | ... | - jumbo_frames - Jumbo frames on/off: boolean -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Start L3FWD on all DUTs \| ${1} \| ${1} \| ${False} \| -| | ... +| | | | [Arguments] | ${phy_cores} | ${rx_queues}=${None} | ${jumbo_frames}=${False} -| | ... +| | | | ${cpu_count_int} | Convert to Integer | ${phy_cores} | | ${thr_count_int} | Convert to Integer | ${phy_cores} | | ${dp_cores}= | Evaluate | ${cpu_count_int}+1 | | ${duts}= | Get Matches | ${nodes} | DUT* -| | :FOR | ${dut} | IN | @{duts} +| | FOR | ${dut} | IN | @{duts} | | | ${numa}= | Get interfaces numa node | ${nodes['${dut}']} | | | ... | ${${dut}_if1} | ${${dut}_if2} | | | ${smt_used}= | Is SMT enabled | ${nodes['${dut}']['cpuinfo']} @@ -99,3 +100,4 @@ | | | Run keyword if | ${thr_count_int} > 1 | | | ... | Set Tags | MTHREAD | ELSE | Set Tags | STHREAD | | | Set Tags | ${thr_count_int}T${cpu_count_int}C +| | END diff --git a/resources/libraries/robot/features/acl.robot b/resources/libraries/robot/features/acl.robot index a70a34c2db..fa94507994 100644 --- a/resources/libraries/robot/features/acl.robot +++ b/resources/libraries/robot/features/acl.robot @@ -19,17 +19,17 @@ | | [Documentation] | | ... | Configure MACIP ACL with required number of not-hitting permit ACEs | | ... | plus two hitting ACEs for both traffic directions. -| | ... +| | | | ... | *Arguments:* | | ... | - dut_node - DUT node. Type: dictionary | | ... | - dut_if1 - DUT node interface1 name (Optional). Type: string | | ... | - dut_if2 - DUT node interface2 name (Optional). Type: string -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Configure MACIP ACLs \| ${nodes['DUT1']} \| GigabitEthernet0/7/0 \ | | ... | \| GigabitEthernet0/8/0 \| -| | ... +| | | | ... | _NOTE:_ This KW uses following test case variables: | | ... | - src_ip_start - Source IP address start. Type: string | | ... | - ip_step - IP address step. Type: string @@ -52,23 +52,23 @@ | | ... | Type: string | | ... | - tg_mac_mask - MAC address mask for traffic streams. | | ... | 00:00:00:00:00:00 is a wildcard mask. Type: string -| | ... +| | | | [Arguments] | ${dut} | ${dut_if1}=${NONE} | ${dut_if2}=${NONE} -| | ... +| | | | ${src_ip_int} = | IP To Int | ${src_ip_start} | | ${src_ip_int} = | Evaluate | ${src_ip_int} - ${ip_step} -| | ... +| | | | ${ip_limit} = | Set Variable | 255.255.255.255 | | ${ip_limit_int} = | IP To Int | ${ip_limit} -| | ... +| | | | ${src_mac_int} = | Mac To Int | ${src_mac_start} | | ${src_mac_int} = | Evaluate | ${src_mac_int} - ${src_mac_step} -| | ... +| | | | ${mac_limit} = | Set Variable | ff:ff:ff:ff:ff:ff | | ${mac_limit_int} = | Mac To Int | ${mac_limit} -| | ... +| | | | ${acl}= | Set Variable | ipv4 permit -| | :FOR | ${nr} | IN RANGE | 0 | ${no_hit_aces_number} +| | FOR | ${nr} | IN RANGE | 0 | ${no_hit_aces_number} | | | ${src_ip_int} = | Evaluate | ${src_ip_int} + ${ip_step} | | | ${src_mac_int} = | Evaluate | ${src_mac_int} + ${src_mac_step} | | | ${ipv4_limit_reached}= | Set Variable If @@ -90,6 +90,7 @@ | | | ${acl}= | Catenate | ${acl} | ip ${src_ip}/32 | | | ... | mac ${src_mac} | mask ${src_mac_mask}, | | | Exit For Loop If | '${ipv4_limit_reached}' == '${TRUE}' or '${mac_limit_reached}' == '${TRUE}' +| | END | | ${acl0}= | Catenate | ${acl} | | ... | ipv4 ${acl_action} ip ${tg_stream1_subnet} mac ${tg_stream1_mac} | | ... | mask ${tg_mac_mask} @@ -109,17 +110,17 @@ | | [Documentation] | | ... | Configure ACL with required number of not-hitting permit ACEs plus two | | ... | hitting ACEs for both traffic directions. -| | ... +| | | | ... | *Arguments:* | | ... | - dut_node - DUT node. Type: dictionary | | ... | - dut_if1 - DUT node interface1 name (Optional). Type: string | | ... | - dut_if2 - DUT node interface2 name (Optional). Type: string -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Configure IPv4 ACLs \| ${nodes['DUT1']} \| GigabitEthernet0/7/0 \ | | ... | \| GigabitEthernet0/8/0 \| -| | ... +| | | | ... | _NOTE:_ This KW uses following test case variables: | | ... | - src_ip_start - Source IP address start. Type: string | | ... | - dst_ip_start - Destination IP address start. Type: string @@ -137,7 +138,7 @@ | | ... | Type: string | | ... | - trex_stream2_subnet - IP subnet used by T-Rex in direction 1->0. | | ... | Type: string -| | ... +| | | | [Arguments] | ${dut} | ${dut_if1}=${NONE} | ${dut_if2}=${NONE} | | ${src_ip_int} = | Evaluate | | ... | int(ipaddress.ip_address(unicode($src_ip_start))) - $ip_step @@ -152,7 +153,7 @@ | | ${dport}= | Evaluate | $dport_start - $port_step | | ${port_limit}= | Set Variable | ${65535} | | ${acl}= | Set Variable | ipv4 permit -| | :FOR | ${nr} | IN RANGE | 0 | ${no_hit_aces_number} +| | FOR | ${nr} | IN RANGE | 0 | ${no_hit_aces_number} | | | ${src_ip_int} = | Evaluate | $src_ip_int + $ip_step | | | ${dst_ip_int} = | Evaluate | $dst_ip_int + $ip_step | | | ${sport}= | Evaluate | $sport + $port_step @@ -184,6 +185,7 @@ | | | ... | sport ${sport} | dport ${dport}, | | | Exit For Loop If | | | ... | $ipv4_limit_reached is True or $udp_limit_reached is True +| | END | | ${acl}= | Catenate | ${acl} | | ... | ipv4 ${acl_action} src ${trex_stream1_subnet}, | | ... | ipv4 ${acl_action} src ${trex_stream2_subnet} @@ -203,28 +205,29 @@ | Configure ACLs on a single interface | | [Documentation] | | ... | Configure ACL -| | ... +| | | | ... | *Arguments:* | | ... | - dut - DUT node. Type: string | | ... | - dut_if - DUT node interface name. Type: string | | ... | - acl_apply_type - To what path apply the ACL - input or output. | | ... | - acl_action - Action for the rule - deny, permit, permit+reflect. | | ... | - subnets - Subnets to apply the specific ACL. Type: list -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Configure ACLs on a single interface \| ${nodes['DUT1']} | | ... | \| ... \| GigabitEthernet0/7/0 \| input \| permit | 0.0.0.0/0 -| | ... +| | | | [Arguments] | ${dut} | ${dut_if} | ${acl_apply_type} | ${acl_action} | | ... | @{subnets} | | Set Test variable | ${acl} | ${EMPTY} -| | :FOR | ${subnet} | IN | @{subnets} +| | FOR | ${subnet} | IN | @{subnets} | | | ${acl} = | Run Keyword If | '${acl}' == '${EMPTY}' | | | ... | Set Variable | ipv4 ${acl_action} src ${subnet} | | | ... | ELSE | | | ... | Catenate | SEPARATOR=", " | ${acl} | | | ... | ipv4 ${acl_action} src ${subnet} +| | END | | Add Replace Acl Multi Entries | ${dut} | rules=${acl} | | @{acl_list} = | Create List | ${0} | | Set Acl List For Interface | ${dut} | ${dut_if} | ${acl_apply_type} @@ -239,17 +242,17 @@ | | ... | on DUT1-DUT2 link and set routing on both DUT nodes with prefix /24 | | ... | and next hop of neighbour DUT interface IPv4 address. | | ... | Apply required ACL rules to DUT1 interfaces. -| | ... +| | | | ... | *Arguments:* | | ... | - ip_nr - Number of IPs to be used. Type: integer -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Initialize IPv4 routing fwith IPv4 ACLs on DUT1 \ | | ... | in 3-node circular topology \| -| | ... +| | | | [Arguments] | ${ip_nr}=${1} -| | ... +| | | | ${dut2_status} | ${value}= | Run Keyword And Ignore Error | | ... | Variable Should Exist | ${dut2} | | ${dut}= | Run Keyword If | '${dut2_status}' == 'PASS' @@ -258,21 +261,22 @@ | | ${dut_if2}= | Run Keyword If | '${dut2_status}' == 'PASS' | | ... | Set Variable | ${dut2_if2} | | ... | ELSE | Set Variable | ${dut1_if2} -| | ... +| | | | Set interfaces in path up -| | ... -| | :FOR | ${number} | IN RANGE | 2 | ${ip_nr}+2 +| | +| | FOR | ${number} | IN RANGE | 2 | ${ip_nr}+2 | | | VPP Add IP Neighbor | | | ... | ${dut1} | ${dut1_if1} | 10.10.10.${number} | ${tg_if1_mac} | | | VPP Add IP Neighbor | | | ... | ${dut} | ${dut_if2} | 20.20.20.${number} | ${tg_if2_mac} +| | END | | Run Keyword If | '${dut2_status}' == 'PASS' | | ... | VPP Add IP Neighbor | | ... | ${dut1} | ${dut1_if2} | 1.1.1.2 | ${dut2_if1_mac} | | Run Keyword If | '${dut2_status}' == 'PASS' | | ... | VPP Add IP Neighbor | | ... | ${dut2} | ${dut2_if1} | 1.1.1.1 | ${dut1_if2_mac} -| | ... +| | | | VPP Interface Set IP Address | | ... | ${dut1} | ${dut1_if1} | 10.10.10.1 | 24 | | VPP Interface Set IP Address @@ -283,12 +287,12 @@ | | Run Keyword If | '${dut2_status}' == 'PASS' | | ... | VPP Interface Set IP Address | | ... | ${dut2} | ${dut2_if1} | 1.1.1.2 | 30 -| | ... +| | | | Run Keyword If | '${dut2_status}' == 'PASS' | | ... | Vpp Route Add | ${dut1} | 20.20.20.0 | 24 | gateway=1.1.1.2 | | ... | interface=${dut1_if2} | | Run Keyword If | '${dut2_status}' == 'PASS' | | ... | Vpp Route Add | ${dut2} | 10.10.10.0 | 24 | gateway=1.1.1.1 | | ... | interface=${dut2_if1} -| | ... +| | | | Configure IPv4 ACLs | ${dut1} | ${dut1_if1} | ${dut1_if2} diff --git a/resources/libraries/robot/features/gbp.robot b/resources/libraries/robot/features/gbp.robot index 8495475639..57ddf6dd1a 100644 --- a/resources/libraries/robot/features/gbp.robot +++ b/resources/libraries/robot/features/gbp.robot @@ -13,26 +13,26 @@ *** Settings *** | Library | resources.libraries.python.GBP -| ... +| | Documentation | GBP keywords. *** Keywords *** | Initialize GBP routing domains on node | | [Documentation] | | ... | Initialize GBP routing domains on node. -| | ... +| | | | ... | *Arguments:* | | ... | - dut - DUT node. Type: string | | ... | - count - Number of baseline interface variables. Type: integer -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Initialize GBP routing domains on node \| DUT1 \| 1 \| -| | ... +| | | | [Arguments] | ${dut} | ${count}=${1} -| | ... +| | | | ${dut_str}= | Convert To Lowercase | ${dut} -| | :FOR | ${id} | IN RANGE | 1 | ${count} + 1 +| | FOR | ${id} | IN RANGE | 1 | ${count} + 1 | | | ${hexa_id}= | Convert To Hex | ${id} | length=2 | lowercase=yes | | | ${dut_lo}= | VPP Create Loopback | ${nodes['${dut}']} | | | ... | mac=ba:dc:00:ff:ee:${hexa_id} @@ -80,20 +80,22 @@ | | | ... | ${nodes['${dut}']} | ${200} | ${300} | acl_index=${0} | | | GBP Contract Add Del | | | ... | ${nodes['${dut}']} | ${300} | ${200} | acl_index=${0} +| | END | Initialize GBP routing domains | | [Documentation] | | ... | Initialize GBP routing domains on all DUTs. -| | ... +| | | | ... | *Arguments:* | | ... | - count - Number of GBP routing domains. Type: integer -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Initialize GBP routing domains \| 1 \| -| | ... +| | | | [Arguments] | ${count}=${1} -| | ... -| | :FOR | ${dut} | IN | @{duts} +| | +| | FOR | ${dut} | IN | @{duts} | | | Initialize GBP routing domains on node | ${dut} | count=${count} +| | END | | Set interfaces in path up diff --git a/resources/libraries/robot/features/policer.robot b/resources/libraries/robot/features/policer.robot index 962f4cf2be..bbabdd7632 100644 --- a/resources/libraries/robot/features/policer.robot +++ b/resources/libraries/robot/features/policer.robot @@ -14,7 +14,7 @@ *** Settings *** | Library | resources.libraries.python.Classify | Library | resources.libraries.python.Policer -| ... +| | Documentation | Policer keywords *** Keywords *** @@ -23,7 +23,7 @@ | | ... | Setup of 2r3c color-aware or color-blind policer with dst IPv4 match | | ... | on all DUT nodes in 2-node / 3-node circular topology. Policer is | | ... | applied on links TG - DUTx. -| | ... +| | | | ${policer_index}= | Policer Set Configuration | ${dut1} | policer1 | ${cir} | | ... | ${eir} | ${cb} | ${eb} | pps | Closest | 2R3C_RFC_2698 | Transmit | | ... | Mark_and_Transmit | Transmit | ${t} | exceed_dscp=${dscp} @@ -35,7 +35,7 @@ | | ... | hit_next_index=${policer_index} | opaque_index=${pre_color} | | Policer Classify Set Interface | ${dut1} | ${dut1_if1} | | ... | ip4_table_index=${table_idx} -| | ... +| | | | ${dut2_status} | ${value}= | Run Keyword And Ignore Error | | ... | Variable Should Exist | ${dut2} | | ${dut}= | Run Keyword If | '${dut2_status}' == 'PASS' @@ -44,7 +44,7 @@ | | ${dut_if2}= | Run Keyword If | '${dut2_status}' == 'PASS' | | ... | Set Variable | ${dut2_if2} | | ... | ELSE | Set Variable | ${dut1_if2} -| | ... +| | | | ${policer_index}= | Run Keyword If | '${dut2_status}' == 'PASS' | | ... | Policer Set Configuration | ${dut} | policer2 | ${cir} | | ... | ${eir} | ${cb} | ${eb} | pps | Closest | 2R3C_RFC_2698 | Transmit @@ -65,7 +65,7 @@ | | ... | Setup of 2r3c color-aware or color-blind policer with dst IPv6 match | | ... | on all DUT nodes in 2-node / 3-node circular topology. Policer is | | ... | applied on links TG - DUTx. -| | ... +| | | | ${policer_index}= | Policer Set Configuration | ${dut1} | policer1 | ${cir} | | ... | ${eir} | ${cb} | ${eb} | pps | Closest | 2R3C_RFC_2698 | Transmit | | ... | Mark_and_Transmit | Transmit | ${t} | exceed_dscp=${dscp} @@ -77,7 +77,7 @@ | | ... | hit_next_index=${policer_index} | opaque_index=${pre_color} | | Policer Classify Set Interface | ${dut1} | ${dut1_if1} | | ... | ip6_table_index=${table_idx} -| | ... +| | | | ${dut2_status} | ${value}= | Run Keyword And Ignore Error | | ... | Variable Should Exist | ${dut2} | | ${dut}= | Run Keyword If | '${dut2_status}' == 'PASS' @@ -86,7 +86,7 @@ | | ${dut_if2}= | Run Keyword If | '${dut2_status}' == 'PASS' | | ... | Set Variable | ${dut2_if2} | | ... | ELSE | Set Variable | ${dut1_if2} -| | ... +| | | | ${policer_index}= | Run Keyword If | '${dut2_status}' == 'PASS' | | ... | Policer Set Configuration | ${dut} | policer2 | ${cir} | | ... | ${eir} | ${cb} | ${eb} | pps | Closest | 2R3C_RFC_2698 | Transmit @@ -105,16 +105,17 @@ | Show Classify Tables Verbose on all DUTs | | [Documentation] | Show classify tables verbose on all DUT nodes in topology. -| | ... +| | | | ... | *Arguments:* | | ... | - nodes - Topology. Type: dictionary -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Show Classify Tables Verbose on all DUTs \| ${nodes} \| -| | ... +| | | | [Arguments] | ${nodes} -| | ... +| | | | ${duts}= | Get Matches | ${nodes} | DUT* -| | :FOR | ${dut} | IN | @{duts} +| | FOR | ${dut} | IN | @{duts} | | | Show Classify Tables Verbose | ${nodes['${dut}']} +| | END diff --git a/resources/libraries/robot/ip/ip4.robot b/resources/libraries/robot/ip/ip4.robot index 84f422e8bc..961c0b3c43 100644 --- a/resources/libraries/robot/ip/ip4.robot +++ b/resources/libraries/robot/ip/ip4.robot @@ -14,7 +14,7 @@ *** Settings *** | Library | resources.libraries.python.InterfaceUtil | Library | resources.libraries.python.IPUtil -| ... +| | Documentation | IPv4 keywords *** Keywords *** @@ -26,25 +26,25 @@ | | ... | links. In case of 3-node topology setup IPv4 adresses with /30 prefix | | ... | on DUT1-DUT2 link and set routing on both DUT nodes with prefix /24 | | ... | and next hop of neighbour DUT interface IPv4 address. -| | ... +| | | | ... | *Arguments:* | | ... | - remote_host1_ip - IP address of remote host1 (Optional). | | ... | Type: string | | ... | - remote_host2_ip - IP address of remote host2 (Optional). | | ... | Type: string -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Initialize IPv4 forwarding in circular topology \ | | ... | \| 192.168.0.1 \| 192.168.0.2 \| -| | ... +| | | | [Arguments] | ${remote_host1_ip}=${NONE} | ${remote_host2_ip}=${NONE} -| | ... +| | | | ${dut2_status} | ${value}= | Run Keyword And Ignore Error | | ... | Variable Should Exist | ${dut2} -| | ... +| | | | Set interfaces in path up -| | ... +| | | | VPP Add IP Neighbor | ${dut1} | ${dut1_if1} | 10.10.10.2 | ${tg_if1_mac} | | Run Keyword If | '${dut2_status}' == 'PASS' | | ... | VPP Add IP Neighbor @@ -59,7 +59,7 @@ | | ... | Set Variable | ${dut2_if2} | | ... | ELSE | Set Variable | ${dut1_if2} | | VPP Add IP Neighbor | ${dut} | ${dut_if2} | 20.20.20.2 | ${tg_if2_mac} -| | ... +| | | | VPP Interface Set IP Address | ${dut1} | ${dut1_if1} | | ... | 10.10.10.1 | 24 | | Run Keyword If | '${dut2_status}' == 'PASS' @@ -70,14 +70,14 @@ | | ... | 1.1.1.2 | 30 | | VPP Interface Set IP Address | ${dut} | ${dut_if2} | | ... | 20.20.20.1 | 24 -| | ... +| | | | Run Keyword If | '${dut2_status}' == 'PASS' | | ... | Vpp Route Add | ${dut1} | 20.20.20.0 | 24 | gateway=1.1.1.2 | | ... | interface=${dut1_if2} | | Run Keyword If | '${dut2_status}' == 'PASS' | | ... | Vpp Route Add | ${dut2} | 10.10.10.0 | 24 | gateway=1.1.1.1 | | ... | interface=${dut2_if1} -| | ... +| | | | Run Keyword Unless | '${remote_host1_ip}' == '${NONE}' | | ... | Vpp Route Add | ${dut1} | ${remote_host1_ip} | 32 | | ... | gateway=10.10.10.2 | interface=${dut1_if1} @@ -97,25 +97,25 @@ | | [Documentation] | | ... | Custom setup of IPv4 topology with scalability of ip routes on all | | ... | DUT nodes in 2-node / 3-node circular topology -| | ... +| | | | ... | *Arguments:* | | ... | - count - IP route count. Type: integer -| | ... +| | | | ... | *Return:* | | ... | - No value returned -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Initialize IPv4 forwarding with scaling in 3-node circular \ | | ... | topology \| 100000 \| -| | ... +| | | | [Arguments] | ${count} -| | ... +| | | | ${dut2_status} | ${value}= | Run Keyword And Ignore Error | | ... | Variable Should Exist | ${dut2} -| | ... +| | | | Set interfaces in path up -| | ... +| | | | VPP Add IP Neighbor | ${dut1} | ${dut1_if1} | 1.1.1.1 | ${tg_if1_mac} | | Run Keyword If | '${dut2_status}' == 'PASS' | | ... | VPP Add IP Neighbor @@ -154,18 +154,19 @@ | | ... | Create pairs of Memif interfaces on all defined VPP nodes. Put each | | ... | Memif interface to separate IPv4 VRF with one physical or | | ... | virtual interface to create a chain accross DUT node. -| | ... +| | | | ... | *Arguments:* | | ... | - count - Number of memif pairs (containers). Type: integer -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Initialize IPv4 routing with memif pairs \| ${1} \| -| | ... +| | | | [Arguments] | ${count}=${1} -| | ... -| | :FOR | ${dut} | IN | @{duts} +| | +| | FOR | ${dut} | IN | @{duts} | | | Initialize IPv4 routing with memif pairs on DUT node | ${dut} | ${count} +| | END | | Set interfaces in path up | | Show Memif on all DUTs | ${nodes} | | VPP round robin RX placement on all DUTs | ${nodes} | prefix=memif @@ -175,28 +176,28 @@ | | ... | Create pairs of Memif interfaces on DUT node. Put each Memif interface | | ... | to separate IPv4 VRF with one physical or virtual interface | | ... | to create a chain accross DUT node. -| | ... +| | | | ... | *Arguments:* | | ... | - dut - DUT node. Type: dictionary | | ... | - count - Number of memif pairs (containers). Type: integer -| | ... +| | | | ... | *Note:* | | ... | Socket paths for Memif are defined in following format: | | ... | - /tmp/memif-\${dut}_CNF\${number}-\${sid} -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Initialize IPv4 routing with memif pairs on DUT node \ | | ... | \| ${dut} \| ${1} \| -| | ... +| | | | [Arguments] | ${dut} | ${count} -| | ... +| | | | ${dut_index}= | Get Index From List | ${duts} | ${dut} | | ${last_dut_index}= | Evaluate | ${duts_count} - ${1} -| | ... +| | | | ${tg_if1_net}= | Set Variable | 10.10.10.0 | | ${tg_if2_net}= | Set Variable | 20.20.20.0 -| | ... +| | | | ${fib_table_1}= | Set Variable | ${10} | | Run Keyword If | ${fib_table_1} > ${0} | | ... | Add Fib Table | ${nodes['${dut}']} | ${fib_table_1} @@ -220,7 +221,7 @@ | | ... | ${${prev_node}_${prev_if}} | | VPP Add IP Neighbor | | ... | ${nodes['${dut}']} | ${${dut}_if1} | ${ip_net_if1}.1 | ${prev_if_mac} -| | ... +| | | | ${fib_table_2}= | Evaluate | ${fib_table_1} + ${count} | | Add Fib Table | ${nodes['${dut}']} | ${fib_table_2} | | ${ip_base_if2}= | Evaluate | ${ip_base_if1} + ${1} @@ -243,10 +244,10 @@ | | ... | ${${next_node}_${next_if}} | | VPP Add IP Neighbor | | ... | ${nodes['${dut}']} | ${${dut}_if2} | ${ip_net_if2}.2 | ${next_if_mac} -| | ... +| | | | ${fib_table_1}= | Evaluate | ${fib_table_1} - ${1} | | ${ip_base_start}= | Set Variable | ${31} -| | :FOR | ${number} | IN RANGE | 1 | ${count+${1}} +| | FOR | ${number} | IN RANGE | 1 | ${count+${1}} | | | ${sock1}= | Set Variable | memif-${dut}_CNF | | | ${sock2}= | Set Variable | memif-${dut}_CNF | | | Set up memif interfaces on DUT node | ${nodes['${dut}']} @@ -291,6 +292,7 @@ | | | ... | ${memif1} | ${ip_net_memif2}.1 | ${memif_if2_mac} | | | VPP Add IP Neighbor | ${nodes['${dut}']} | | | ... | ${memif2} | ${ip_net_memif1}.1 | ${memif_if1_mac} +| | END | Initialize IPv4 forwarding with vhost in 2-node circular topology | | [Documentation] @@ -302,24 +304,24 @@ | | ... | DUT-TG links. Set routing on DUT nodes in all FIB tables with prefix | | ... | /8 and next hop of neighbour IPv4 address. Setup ARP on all VPP | | ... | interfaces. -| | ... +| | | | ... | *Arguments:* | | ... | - nf_nodes - Number of guest VMs. Type: integer | | ... | - testpmd_mac - Switch for testpmd_mac test configuration. | | ... | Type: boolean -| | ... +| | | | ... | *Note:* | | ... | Socket paths for VM are defined in following format: | | ... | - /var/run/vpp/sock-${VM_ID}-1 | | ... | - /var/run/vpp/sock-${VM_ID}-2 -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| IPv4 forwarding with Vhost-User initialized in a 2-node circular\ | | ... | topology \| 1 \| -| | ... +| | | | [Arguments] | ${nf_nodes}=${1} | ${testpmd_mac}=${FALSE} -| | ... +| | | | Set interfaces in path up | | ${fib_table_1}= | Set Variable | ${101} | | ${fib_table_2}= | Evaluate | ${fib_table_1}+${nf_nodes} @@ -337,7 +339,7 @@ | | ... | interface=${dut1_if1} | vrf=${fib_table_1} | | Vpp Route Add | ${dut1} | 20.0.0.0 | 8 | gateway=200.0.0.2 | | ... | interface=${dut1_if2} | vrf=${fib_table_2} -| | :FOR | ${number} | IN RANGE | 1 | ${nf_nodes}+1 +| | FOR | ${number} | IN RANGE | 1 | ${nf_nodes}+1 | | | ${fib_table_1}= | Evaluate | ${100}+${number} | | | ${fib_table_2}= | Evaluate | ${fib_table_1}+${1} | | | Configure vhost interfaces | ${dut1} @@ -373,6 +375,7 @@ | | | Run Keyword If | ${testpmd_mac} | | | ... | Vpp Route Add | ${dut1} | 10.0.0.0 | 8 | gateway=1.1.1.2 | | | ... | interface=${dut1-vhost-${number}-if2} | vrf=${fib_table_2} +| | END | Initialize IPv4 forwarding with vhost in 3-node circular topology | | [Documentation] @@ -384,22 +387,22 @@ | | ... | DUT-TG links and /30 prefix on DUT1-DUT2 link. Set routing on all DUT | | ... | nodes in all FIB tables with prefix /8 and next hop of neighbour IPv4 | | ... | address. Setup ARP on all VPP interfaces. -| | ... +| | | | ... | *Arguments:* | | ... | - nf_nodes - Number of guest VMs. Type: integer -| | ... +| | | | ... | *Note:* | | ... | Socket paths for VM are defined in following format: | | ... | - /var/run/vpp/sock-\${VM_ID}-1 | | ... | - /var/run/vpp/sock-\${VM_ID}-2 -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| IPv4 forwarding with Vhost-User initialized in a 3-node circular\ | | ... | topology \| 1 \| -| | ... +| | | | [Arguments] | ${nf_nodes}=${1} | ${testpmd_mac}=${FALSE} -| | ... +| | | | Set interfaces in path up | | ${fib_table_1}= | Set Variable | ${101} | | ${fib_table_2}= | Evaluate | ${fib_table_1}+${nf_nodes} @@ -429,7 +432,7 @@ | | ... | interface=${dut2_if1} | vrf=${fib_table_1} | | Vpp Route Add | ${dut2} | 20.0.0.0 | 8 | gateway=200.0.0.2 | | ... | interface=${dut2_if2} | vrf=${fib_table_2} -| | :FOR | ${number} | IN RANGE | 1 | ${nf_nodes}+1 +| | FOR | ${number} | IN RANGE | 1 | ${nf_nodes}+1 | | | ${fib_table_1}= | Evaluate | ${100}+${number} | | | ${fib_table_2}= | Evaluate | ${fib_table_1}+${1} | | | Configure vhost interfaces | ${dut1} @@ -498,6 +501,7 @@ | | | Run Keyword If | ${testpmd_mac} | | | ... | Vpp Route Add | ${dut2} | 10.0.0.0 | 8 | gateway=1.1.1.2 | | | ... | interface=${dut2-vhost-${number}-if2} | vrf=${fib_table_2} +| | END | Initialize IPv4 forwarding with VLAN dot1q sub-interfaces in circular topology | | [Documentation] @@ -510,7 +514,7 @@ | | ... | with /30 prefix on VLAN and set routing on both DUT nodes with prefix | | ... | /30. Set next hop of neighbour DUT interface IPv4 address. All | | ... | interfaces are brought up. -| | ... +| | | | ... | *Arguments:* | | ... | - tg_if1_net - TG interface 1 IP subnet used by traffic generator. | | ... | Type: integer @@ -518,25 +522,25 @@ | | ... | Type: integer | | ... | - subid - ID of the sub-interface to be created. Type: string | | ... | - tag_rewrite - Method of tag rewrite. Type: string -| | ... +| | | | ... | _NOTE:_ This KW uses following test case variables: | | ... | - dut1 - DUT1 node. | | ... | - dut2 - DUT2 node. | | ... | - dut1_if2 - DUT1 interface towards DUT2. | | ... | - dut2_if1 - DUT2 interface towards DUT1. -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Initialize IPv4 forwarding with VLAN dot1q sub-interfaces\ | | ... | in circular topology \| 10.10.10.0 \| 20.20.20.0 \| 10 \| pop-1 \| -| | ... +| | | | [Arguments] | ${tg_if1_net} | ${tg_if2_net} | ${subid} | ${tag_rewrite} -| | ... +| | | | ${dut2_status} | ${value}= | Run Keyword And Ignore Error | | ... | Variable Should Exist | ${dut2} -| | ... +| | | | Set interfaces in path up -| | ... +| | | | Run Keyword If | '${dut2_status}' == 'PASS' | | ... | Initialize VLAN dot1q sub-interfaces in circular topology | | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid} @@ -547,7 +551,7 @@ | | ... | ${subif_index_1} | ${dut2} | ${subif_index_2} | ${tag_rewrite} | | ... | ELSE | Configure L2 tag rewrite method on interfaces | | ... | ${dut1} | ${subif_index_1} | TAG_REWRITE_METHOD=${tag_rewrite} -| | ... +| | | | VPP Add IP Neighbor | ${dut1} | ${dut1_if1} | 1.1.1.1 | ${tg_if1_mac} | | Run Keyword If | '${dut2_status}' == 'PASS' | | ... | VPP Add IP Neighbor diff --git a/resources/libraries/robot/ip/ip6.robot b/resources/libraries/robot/ip/ip6.robot index c4ef0b7c1f..715a5dd353 100644 --- a/resources/libraries/robot/ip/ip6.robot +++ b/resources/libraries/robot/ip/ip6.robot @@ -16,7 +16,7 @@ | Library | resources.libraries.python.IPUtil | Library | resources.libraries.python.IPv6Util | Library | resources.libraries.python.NodePath -| ... +| | Documentation | IPv6 keywords *** Keywords *** @@ -28,25 +28,25 @@ | | ... | links. In case of 3-node topology setup IPv6 adresses with /64 prefix | | ... | on DUT1-DUT2 link and set routing on both DUT nodes with prefix /64 | | ... | and next hop of neighbour DUT interface IPv4 address. -| | ... +| | | | ... | *Arguments:* | | ... | - remote_host1_ip - IP address of remote host1 (Optional). | | ... | Type: string | | ... | - remote_host2_ip - IP address of remote host2 (Optional). | | ... | Type: string -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Initialize IPv6 forwarding in circular topology \ | | ... | \| 3ffe:5f::1 \| 3ffe:5f::2 \| -| | ... +| | | | [Arguments] | ${remote_host1_ip}=${NONE} | ${remote_host2_ip}=${NONE} -| | ... +| | | | ${dut2_status} | ${value}= | Run Keyword And Ignore Error | | ... | Variable Should Exist | ${dut2} -| | ... +| | | | Set interfaces in path up -| | ... +| | | | VPP Add IP Neighbor | ${dut1} | ${dut1_if1} | 2001:1::2 | ${tg_if1_mac} | | Run Keyword If | '${dut2_status}' == 'PASS' | | ... | VPP Add IP Neighbor @@ -61,23 +61,23 @@ | | ... | Set Variable | ${dut2_if2} | | ... | ELSE | Set Variable | ${dut1_if2} | | VPP Add IP Neighbor | ${dut} | ${dut_if2} | 2001:2::2 | ${tg_if2_mac} -| | ... +| | | | VPP Interface Set IP Address | ${dut1} | ${dut1_if1} | 2001:1::1 | 64 | | Run Keyword If | '${dut2_status}' == 'PASS' | | ... | VPP Interface Set IP Address | ${dut1} | ${dut1_if2} | 2001:3::1 | 64 | | Run Keyword If | '${dut2_status}' == 'PASS' | | ... | VPP Interface Set IP Address | ${dut2} | ${dut2_if1} | 2001:3::2 | 64 | | VPP Interface Set IP Address | ${dut} | ${dut_if2} | 2001:2::1 | 64 -| | ... +| | | | Vpp All Ra Suppress Link Layer | ${nodes} -| | ... +| | | | Run Keyword If | '${dut2_status}' == 'PASS' | | ... | Vpp Route Add | ${dut1} | 2001:2::0 | 64 | gateway=2001:3::2 | | ... | interface=${dut1_if2} | | Run Keyword If | '${dut2_status}' == 'PASS' | | ... | Vpp Route Add | ${dut2} | 2001:1::0 | 64 | gateway=2001:3::1 | | ... | interface=${dut2_if1} -| | ... +| | | | Run Keyword Unless | '${remote_host1_ip}' == '${NONE}' | | ... | Vpp Route Add | ${dut1} | ${remote_host1_ip} | 128 | | ... | gateway=2001:1::2 | interface=${dut1_if1} @@ -97,25 +97,25 @@ | | [Documentation] | | ... | Custom setup of IPv6 topology with scalability of ip routes on all | | ... | DUT nodes in 2-node / 3-node circular topology -| | ... +| | | | ... | *Arguments:* | | ... | - count - IP route count. Type: integer -| | ... +| | | | ... | *Return:* | | ... | - No value returned -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Initialize IPv6 forwarding with scaling in circular \ | | ... | topology \| 100000 \| -| | ... +| | | | [Arguments] | ${count} -| | ... +| | | | ${dut2_status} | ${value}= | Run Keyword And Ignore Error | | ... | Variable Should Exist | ${dut2} -| | ... +| | | | Set interfaces in path up -| | ... +| | | | ${prefix}= | Set Variable | 64 | | ${host_prefix}= | Set Variable | 128 | | VPP Interface Set IP Address | ${dut1} | ${dut1_if1} | 2001:3::1 | ${prefix} @@ -162,22 +162,22 @@ | | ... | DUT-TG links. Set routing on DUT nodes in all FIB tables with \ | | ... | prefix /64 and next hop of neighbour IPv6 address. Setup neighbours \ | | ... | on all VPP interfaces. -| | ... +| | | | ... | *Arguments:* | | ... | - nf_nodes - Number of guest VMs. Type: integer -| | ... +| | | | ... | *Note:* | | ... | Socket paths for VM are defined in following format: | | ... | - /var/run/vpp/sock-${VM_ID}-1 | | ... | - /var/run/vpp/sock-${VM_ID}-2 -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| IPv6 forwarding with Vhost-User initialized in a 2-node circular\ | | ... | topology \| 1 \| -| | ... +| | | | [Arguments] | ${nf_nodes}=${1} -| | ... +| | | | Vpp All Ra Suppress Link Layer | ${nodes} | | Set interfaces in path up | | ${prefix}= | Set Variable | 64 @@ -199,7 +199,7 @@ | | ... | interface=${dut1_if1} | vrf=${fib_table_1} | | Vpp Route Add | ${dut1} | 2001:2::0 | 64 | gateway=2001:200::2 | | ... | interface=${dut1_if2} | vrf=${fib_table_2} -| | :FOR | ${number} | IN RANGE | 1 | ${nf_nodes}+1 +| | FOR | ${number} | IN RANGE | 1 | ${nf_nodes}+1 | | | ${fib_table_1}= | Evaluate | ${100}+${number} | | | ${fib_table_2}= | Evaluate | ${fib_table_1}+${1} | | | Configure vhost interfaces | ${dut1} @@ -221,6 +221,7 @@ | | | ... | interface=${dut1-vhost-${number}-if1} | vrf=${fib_table_1} | | | Vpp Route Add | ${dut1} | 2001:1::0 | 64 | gateway=1:2::1 | | | ... | interface=${dut1-vhost-${number}-if2} | vrf=${fib_table_2} +| | END | Initialize IPv6 forwarding with VLAN dot1q sub-interfaces in circular topology | | [Documentation] @@ -233,7 +234,7 @@ | | ... | with /64 prefix on VLAN and set routing on both DUT nodes with prefix | | ... | /64. Set next hop of neighbour DUT interface IPv6 address. All | | ... | interfaces are brought up. -| | ... +| | | | ... | *Arguments:* | | ... | - tg_if1_net - TG interface 1 IPv6 subnet used by traffic generator. | | ... | Type: integer @@ -241,25 +242,25 @@ | | ... | Type: integer | | ... | - subid - ID of the sub-interface to be created. Type: string | | ... | - tag_rewrite - Method of tag rewrite. Type: string -| | ... +| | | | ... | _NOTE:_ This KW uses following test case variables: | | ... | - dut1 - DUT1 node. | | ... | - dut2 - DUT2 node. | | ... | - dut1_if2 - DUT1 interface towards DUT2. | | ... | - dut2_if1 - DUT2 interface towards DUT1. -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Initialize IPv6 forwarding with VLAN dot1q sub-interfaces\ | | ... | in circular topology \| 2001:1::0 \| 2001:2::0 \| 10 \| pop-1 \| -| | ... +| | | | [Arguments] | ${tg_if1_net} | ${tg_if2_net} | ${subid} | ${tag_rewrite} -| | ... +| | | | ${dut2_status} | ${value}= | Run Keyword And Ignore Error | | ... | Variable Should Exist | ${dut2} -| | ... +| | | | Set interfaces in path up -| | ... +| | | | Run Keyword If | '${dut2_status}' == 'PASS' | | ... | Initialize VLAN dot1q sub-interfaces in circular topology | | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid} @@ -270,7 +271,7 @@ | | ... | ${subif_index_1} | ${dut2} | ${subif_index_2} | ${tag_rewrite} | | ... | ELSE | Configure L2 tag rewrite method on interfaces | | ... | ${dut1} | ${subif_index_1} | TAG_REWRITE_METHOD=${tag_rewrite} -| | ... +| | | | ${prefix}= | Set Variable | 64 | | ${host_prefix}= | Set Variable | 64 | | VPP Add IP Neighbor | ${dut1} | ${dut1_if1} | 2002:1::1 | ${tg_if1_mac} diff --git a/resources/libraries/robot/ip/nat.robot b/resources/libraries/robot/ip/nat.robot index bff8b27dbf..bb44fa1a18 100644 --- a/resources/libraries/robot/ip/nat.robot +++ b/resources/libraries/robot/ip/nat.robot @@ -13,32 +13,32 @@ *** Settings *** | Library | resources.libraries.python.NATUtil -| ... +| | Documentation | Keywords for NAT feature in VPP. *** Keywords *** | Configure inside and outside interfaces | | [Documentation] | Configure inside and outside interfaces for NAT44. -| | ... +| | | | ... | *Arguments:* | | ... | - node - DUT node to set NAT44 interfaces on. Type: dictionary | | ... | - int_in - Inside interface. Type: string | | ... | - int_out - Outside interface. Type: string -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Configure inside and outside interfaces \| ${nodes['DUT1']} \ | | ... | \| FortyGigabitEtherneta/0/0 \| FortyGigabitEtherneta/0/1 \| -| | ... +| | | | [Arguments] | ${node} | ${int_in} | ${int_out} -| | ... +| | | | ${int_in_name}= | Set variable | ${node['interfaces']['${int_in}']['name']} | | ${int_out_name}= | Set variable | ${node['interfaces']['${int_out}']['name']} | | Set NAT44 Interfaces | ${node} | ${int_in_name} | ${int_out_name} | Configure deterministic mode for NAT44 | | [Documentation] | Set deterministic behaviour of NAT44. -| | ... +| | | | ... | *Arguments:* | | ... | - node - DUT node to set deterministic mode for NAT44 on. | | ... | Type: dictionary @@ -46,29 +46,29 @@ | | ... | - subnet_in - Inside IP subnet. Type: string | | ... | - ip_out - Outside IP. Type: string | | ... | - subnet_out - Outside IP subnet. Type: string -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Configure deterministic mode for NAT44 \| ${nodes['DUT1']} \ | | ... | \| 100.0.0.0 \| 12 \| 12.1.1.0 \| 24 \| -| | ... +| | | | [Arguments] | ${node} | ${ip_in} | ${subnet_in} | ${ip_out} | ${subnet_out} -| | ... +| | | | Set NAT44 deterministic | ${node} | ${ip_in} | ${subnet_in} | ${ip_out} | | ... | ${subnet_out} | Show NAT verbose | | [Documentation] | Get the NAT settings on the node. -| | ... +| | | | ... | *Arguments:* | | ... | - node - DUT node to show NAT. Type: dictionary -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Show NAT verbose \| ${nodes['DUT1']} \| -| | ... +| | | | [Arguments] | ${node} -| | ... +| | | | Show NAT | ${node} | Initialize NAT44 in circular topology @@ -79,12 +79,12 @@ | | ... | - set ARP | | ... | - create routes | | ... | - set NAT44 - only on DUT1 -| | ... +| | | | ${dut2_status} | ${value}= | Run Keyword And Ignore Error | | ... | Variable Should Exist | ${dut2} -| | ... +| | | | Set interfaces in path up -| | ... +| | | | VPP Interface Set IP Address | ${dut1} | ${dut1_if1} | 10.0.0.1 | 20 | | Run Keyword If | '${dut2_status}' == 'PASS' | | ... | VPP Interface Set IP Address | ${dut1} | ${dut1_if2} @@ -99,7 +99,7 @@ | | ... | Set Variable | ${dut2_if2} | | ... | ELSE | Set Variable | ${dut1_if2} | | VPP Interface Set IP Address | ${dut} | ${dut_if2} | 12.0.0.1 | 20 -| | ... +| | | | VPP Add IP Neighbor | ${dut1} | ${dut1_if1} | 10.0.0.2 | ${tg_if1_mac} | | Run Keyword If | '${dut2_status}' == 'PASS' | | ... | VPP Add IP Neighbor @@ -108,7 +108,7 @@ | | ... | VPP Add IP Neighbor | | ... | ${dut2} | ${dut2_if1} | 11.0.0.1 | ${dut1_if2_mac} | | VPP Add IP Neighbor | ${dut} | ${dut_if2} | 12.0.0.2 | ${tg_if2_mac} -| | ... +| | | | Vpp Route Add | ${dut1} | 20.0.0.0 | 18 | gateway=10.0.0.2 | | ... | interface=${dut1_if1} | | Run Keyword If | '${dut2_status}' == 'PASS' @@ -120,7 +120,7 @@ | | Run Keyword If | '${dut2_status}' == 'PASS' | | ... | Vpp Route Add | ${dut2} | 200.0.0.0 | 30 | gateway=11.0.0.1 | | ... | interface=${dut2_if1} -| | ... +| | | | Configure inside and outside interfaces | | ... | ${dut1} | ${dut1_if1} | ${dut1_if2} | | Configure deterministic mode for NAT44 diff --git a/resources/libraries/robot/l2/l2_bridge_domain.robot b/resources/libraries/robot/l2/l2_bridge_domain.robot index 6c16ed447f..a85cb70ab9 100644 --- a/resources/libraries/robot/l2/l2_bridge_domain.robot +++ b/resources/libraries/robot/l2/l2_bridge_domain.robot @@ -21,28 +21,29 @@ *** Keywords *** | Show Bridge Domain Data On All DUTs | | [Documentation] | Show Bridge Domain data on all DUTs. -| | ... -| | :FOR | ${dut} | IN | @{duts} +| | +| | FOR | ${dut} | IN | @{duts} | | | VPP Get Bridge Domain Data | ${nodes['${dut}']} +| | END | Create bridge domain | | [Documentation] | | ... | Create bridge domain on given VPP node with defined learning status. -| | ... +| | | | ... | *Arguments:* | | ... | - ${dut_node} - DUT node. Type: dictionary | | ... | - ${bd_id} - Bridge domain ID. Type: integer | | ... | - ${learn} - Enable/disable MAC learn. Type: boolean, \ | | ... | default value: ${TRUE} -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Create bridge domain \| ${nodes['DUT1']} \| 2 \| | | ... | \| Create bridge domain \| ${nodes['DUT1']} \| 5 \ | | ... | \| learn=${FALSE} \| -| | ... +| | | | [Arguments] | ${dut_node} | ${bd_id} | ${learn}=${TRUE} -| | ... +| | | | ${learn} = | Set Variable If | ${learn} == ${TRUE} | ${1} | ${0} | | Create L2 BD | ${dut_node} | ${bd_id} | learn=${learn} @@ -50,20 +51,20 @@ | | [Documentation] | | ... | Set given interface admin state to up and add this | | ... | interface to required L2 bridge domain on defined VPP node. -| | ... +| | | | ... | *Arguments:* | | ... | - ${dut_node} - DUT node. Type: dictionary | | ... | - ${dut_if} - DUT node interface name. Type: string | | ... | - ${bd_id} - Bridge domain ID. Type: integer | | ... | - ${shg} - Split-horizon group ID. Type: integer, default value: 0 -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Add interface to bridge domain \| ${nodes['DUT2']} \ | | ... | \| GigabitEthernet0/8/0 \| 3 \| -| | ... +| | | | [Arguments] | ${dut_node} | ${dut_if} | ${bd_id} | ${shg}=0 -| | ... +| | | | Set Interface State | ${dut_node} | ${dut_if} | up | | Add Interface To L2 BD | ${dut_node} | ${dut_if} | ${bd_id} | ${shg} @@ -72,41 +73,43 @@ | | ... | Setup L2 bridge domain topology by adding two interfaces on DUT into | | ... | separate bridge domains that are created automatically starting with | | ... | index 1. Learning is enabled. Interfaces are brought up. -| | ... +| | | | ... | *Arguments:* | | ... | - dut - DUT node. Type: string | | ... | - count - Number of bridge domains interfaces. Type: integer -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Initialize L2 bridge domain on node \| DUT1 \| 1 \| -| | ... +| | | | [Arguments] | ${dut} | ${count}=${1} -| | ... -| | :FOR | ${id} | IN RANGE | 1 | ${count} + 1 +| | +| | FOR | ${id} | IN RANGE | 1 | ${count} + 1 | | | ${dut_str}= | Convert To Lowercase | ${dut} | | | Add Interface To L2 BD | | | ... | ${nodes['${dut}']} | ${${dut_str}_${prev_layer}_${id}_1} | ${id} | | | Add Interface To L2 BD | | | ... | ${nodes['${dut}']} | ${${dut_str}_${prev_layer}_${id}_2} | ${id} +| | END | Initialize L2 bridge domain | | [Documentation] | | ... | Setup L2 bridge domain topology by adding two interfaces on each DUT | | ... | into separate bridge domains that are created automatically starting | | ... | with index 1. Learning is enabled. Interfaces are brought up. -| | ... +| | | | ... | *Arguments:* | | ... | - count - Number of bridge domains. Type: integer -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Initialize L2 bridge domain \| 1 \| -| | ... +| | | | [Arguments] | ${count}=${1} -| | ... -| | :FOR | ${dut} | IN | @{duts} +| | +| | FOR | ${dut} | IN | @{duts} | | | Initialize L2 bridge domain on node | ${dut} | count=${count} +| | END | Initialize L2 bridge domains with Vhost-User on node | | [Documentation] @@ -114,24 +117,24 @@ | | ... | defined VPP node. Add each Vhost-User interface into L2 bridge | | ... | domains with learning enabled with physical inteface or Vhost-User | | ... | interface of another VM. -| | ... +| | | | ... | *Arguments:* | | ... | - dut - DUT node. Type: string | | ... | - nf_chain - NF chain. Type: integer | | ... | - nf_nodes - Number of NFs nodes per chain. Type: integer -| | ... +| | | | ... | *Note:* | | ... | Socket paths for VM are defined in following format: | | ... | - /var/run/vpp/sock-\${VM_ID}-1 | | ... | - /var/run/vpp/sock-\${VM_ID}-2 -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Initialize L2 bridge domains with Vhost-User on node \| DUT1 \ | | ... | \| 1 \| 1 \| -| | ... +| | | | [Arguments] | ${dut} | ${nf_chain}=${1} | ${nf_nodes}=${1} -| | ... +| | | | ${bd_id1}= | Evaluate | ${nf_nodes} * (${nf_chain} - 1) + ${nf_chain} | | ${bd_id2}= | Evaluate | ${nf_nodes} * ${nf_chain} + ${nf_chain} | | ${dut_str}= | Convert To Lowercase | ${dut} @@ -141,7 +144,7 @@ | | Add interface to bridge domain | | ... | ${nodes['${dut}']} | ${${dut_str}_${prev_layer}_${nf_chain}_2} | | ... | ${bd_id2} -| | :FOR | ${nf_node} | IN RANGE | 1 | ${nf_nodes} + 1 +| | FOR | ${nf_node} | IN RANGE | 1 | ${nf_nodes} + 1 | | | ${qemu_id}= | Evaluate | (${nf_chain} - ${1}) * ${nf_nodes} + ${nf_node} | | | Configure vhost interfaces | | | ... | ${nodes['${dut}']} @@ -153,6 +156,7 @@ | | | ... | ${nodes['${dut}']} | ${${dut}-vhost-${qemu_id}-if1} | ${bd_id1} | | | Add interface to bridge domain | | | ... | ${nodes['${dut}']} | ${${dut}-vhost-${qemu_id}-if2} | ${bd_id2} +| | END | Initialize L2 bridge domains with Vhost-User | | [Documentation] @@ -160,20 +164,21 @@ | | ... | on all defined VPP nodes. Add each Vhost-User interface into L2 bridge | | ... | domains with learning enabled with physical inteface or Vhost-User | | ... | interface of another VM. -| | ... +| | | | ... | *Arguments:* | | ... | - nf_chain - NF chain. Type: integer | | ... | - nf_nodes - Number of NFs nodes per chain. Type: integer -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Initialize L2 bridge domains with Vhost-User \| 1 \| 1 \| -| | ... +| | | | [Arguments] | ${nf_chain}=${1} | ${nf_nodes}=${1} -| | ... -| | :FOR | ${dut} | IN | @{duts} +| | +| | FOR | ${dut} | IN | @{duts} | | | Initialize L2 bridge domains with Vhost-User on node | | | ... | ${dut} | nf_chain=${nf_chain} | nf_nodes=${nf_nodes} +| | END | Initialize L2 bridge domains for multiple chains with Vhost-User | | [Documentation] @@ -182,24 +187,25 @@ | | ... | Vhost-User interface into L2 bridge domains with learning enabled | | ... | with physical inteface or Vhost-User interface of another VM. | | ... | Put all interfaces in path up. -| | ... +| | | | ... | *Arguments:* | | ... | - nf_chains - Number of chains of NFs. Type: integer | | ... | - nf_nodes - Number of NFs nodes per chain. Type: integer | | ... | - start - Id of first chain, allows to add chains during test. | | ... | Type: integer -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Initialize L2 bridge domains for multiple chains with Vhost-User \ | | ... | \| 3 \| 1 \| 2 \| -| | ... +| | | | [Arguments] | ${nf_chains}=${1} | ${nf_nodes}=${1} | ${start}=${1} -| | ... +| | | | Set interfaces in path up -| | :FOR | ${nf_chain} | IN RANGE | ${start} | ${nf_chains} + 1 +| | FOR | ${nf_chain} | IN RANGE | ${start} | ${nf_chains} + 1 | | | Initialize L2 bridge domains with Vhost-User | | | ... | nf_chain=${nf_chain} | nf_nodes=${nf_nodes} +| | END | Initialize L2 bridge domain with VXLANoIPv4 in 3-node circular topology | | [Documentation] @@ -208,7 +214,7 @@ | | ... | up. IPv4 addresses with prefix /24 are configured on interfaces | | ... | between DUTs. VXLAN sub-interfaces has same IPv4 address as | | ... | interfaces. -| | ... +| | | | Set interfaces in path up | | VPP Interface Set IP Address | ${dut1} | ${dut1_if2} | 172.16.0.1 | | ... | 24 @@ -232,26 +238,26 @@ | | ... | domain on each DUT. All interfaces are brought up. IPv4 addresses | | ... | with prefix /32 are configured on interfaces between DUTs. VXLAN | | ... | sub-interfaces has same IPv4 address as interfaces. -| | ... +| | | | ... | *Arguments:* | | ... | - vxlan_count - VXLAN count. Type: integer -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Initialize L2 bridge domain with VLAN and VXLANoIPv4 in 3-node \ | | ... | \| circular topology \| ${1} \| -| | ... +| | | | [Arguments] | ${vxlan_count}=${1} -| | ... +| | | | Set interfaces in path up -| | ... +| | | | ${bd_id_start}= | Set Variable | ${1} | | ${vni_start} = | Set Variable | ${20} -| | ... +| | | | ${ip_step} = | Set Variable | ${2} | | ${dut1_ip_start}= | Set Variable | 172.16.0.1 | | ${dut2_ip_start}= | Set Variable | 172.16.0.2 -| | ... +| | | | Vpp create multiple VXLAN IPv4 tunnels | node=${dut1} | | ... | node_vxlan_if=${dut1_if2} | node_vlan_if=${dut1_if1} | | ... | op_node=${dut2} | op_node_if=${dut2_if1} | n_tunnels=${vxlan_count} @@ -274,18 +280,18 @@ | | ... | interfaces on each DUT. All interfaces are brought up. | | ... | IPv4 addresses with prefix /24 are configured on interfaces between | | ... | DUTs. VXLAN sub-interfaces has same IPv4 address as interfaces. -| | ... +| | | | ... | *Arguments:* | | ... | - bd_id1 - Bridge domain ID. Type: integer | | ... | - bd_id2 - Bridge domain ID. Type: integer -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| L2 bridge domains with Vhost-User and VXLANoIPv4 initialized in a\ | | ... | 3-node circular topology \| 1 \| 2 \| -| | ... +| | | | [Arguments] | ${bd_id1} | ${bd_id2} -| | ... +| | | | VPP Interface Set IP Address | ${dut1} | ${dut1_if2} | 172.16.0.1 | | ... | 24 | | VPP Interface Set IP Address | ${dut2} | ${dut2_if1} | 172.16.0.2 @@ -317,38 +323,38 @@ | | ... | interfaces on the DUT. All interfaces are brought up. | | ... | IPv4 addresses with prefix /24 are configured on interfaces between | | ... | DUT and TG. -| | ... +| | | | ... | *Arguments:* | | ... | - dut1_address - Address of physical interface on DUT1. Type: string | | ... | - dut1_address_subnet - Subnet of the address of physical interface on -| | ... | DUT1. Type: string +| | ... | DUT1. Type: string | | ... | - dut2_address - Address of physical interface on DUT2. Type: string | | ... | - dut2_address_subnet - Subnet of the address of physical interface on -| | ... | DUT2. Type: string +| | ... | DUT2. Type: string | | ... | - dut1_gw - Address of the _gateway_ to which the traffic will be -| | ... | forwarded on DUT1. Type: string +| | ... | forwarded on DUT1. Type: string | | ... | - dut2_gw - Address of the _gateway_ to which the traffic will be -| | ... | forwarded on DUT2. Type: string +| | ... | forwarded on DUT2. Type: string | | ... | - dut1_vxlans - List of VXLAN params to be configured on DUT1. -| | ... | Type: list of dicts, dict params vni, vtep +| | ... | Type: list of dicts, dict params vni, vtep | | ... | - dut2_vxlans - List of VXLAN params to be configured on DUT2. -| | ... | Type: list of dicts, dict params vni, vtep -| | ... | - dut1_route_subnet - Subnet address to forward to _gateway_ on DUT1. -| | ... | Type: string -| | ... | - dut1_route_mask - Subnet address mask to forward to _gateway_ -| | ... | on DUT1. Type: string -| | ... | - dut2_route_subnet - Subnet address to forward to _gateway_ on DUT2. -| | ... | Type: string -| | ... | - dut2_route_mask - Subnet address mask to forward to _gateway_ -| | ... | on DUT2. Type: string -| | ... +| | ... | Type: list of dicts, dict params vni, vtep +| | ... | - dut1_route_subnet - Subnet address to forward to _gateway_ on DUT1. +| | ... | Type: string +| | ... | - dut1_route_mask - Subnet address mask to forward to _gateway_ +| | ... | on DUT1. Type: string +| | ... | - dut2_route_subnet - Subnet address to forward to _gateway_ on DUT2. +| | ... | Type: string +| | ... | - dut2_route_mask - Subnet address mask to forward to _gateway_ +| | ... | on DUT2. Type: string +| | | | ... | *Example:* -| | ... +| | | | [Arguments] | ${dut1_address} | ${dut1_address_subnet} | | | ... | ${dut2_address} | ${dut2_address_subnet} | ${dut1_gw} | ${dut2_gw} | | | ... | ${dut1_vxlans} | ${dut2_vxlans} | ${dut1_route_subnet} | | | ... | ${dut1_route_mask} | ${dut2_route_subnet} | ${dut2_route_mask} -| | ... +| | | | Configure vhost interfaces | ${dut1} | | ... | /var/run/vpp/sock-1-${dut1_bd_id1} | | ... | /var/run/vpp/sock-1-${dut1_bd_id2} @@ -359,14 +365,16 @@ | | ${dut1_bd_id1}= | Set Variable | 1 | | ${dut1_bd_id2}= | Set Variable | 2 | | ${dut2_bd_id1}= | Set Variable | 1 -| | :FOR | ${vxlan} | IN | @{dut1_vxlans} +| | FOR | ${vxlan} | IN | @{dut1_vxlans} | | | ${dut1s_vxlan}= | Create VXLAN interface | ${dut1} | ${vxlan.vni} | | | ... | ${dut1_address} | ${vxlan.vtep} | | | Add interface to bridge domain | ${dut1} | ${dut1s_vxlan} | ${dut1_bd_id1} -| | :FOR | ${vxlan} | IN | @{dut2_vxlans} +| | END +| | FOR | ${vxlan} | IN | @{dut2_vxlans} | | | ${dut2s_vxlan}= | Create VXLAN interface | ${dut2} | ${vxlan.vni} | | | ... | ${dut2_address} | ${vxlan.vtep} | | | Add interface to bridge domain | ${dut2} | ${dut2s_vxlan} | ${dut2_bd_id1} +| | END | | VPP Add IP Neighbor | ${dut1} | ${dut1_if1} | ${dut1_gw} | ${tg_if1_mac} | | VPP Add IP Neighbor | ${dut2} | ${dut2_if2} | ${dut2_gw} | ${tg_if2_mac} | | Vpp Route Add | ${dut1} | ${dut1_route_subnet} | ${dut1_route_mask} @@ -385,31 +393,31 @@ | | ... | topology create VLAN sub-interfaces between DUTs. In case of 2-node | | ... | topology create VLAN sub-interface on dut1-if2 interface. All | | ... | interfaces are brought up. -| | ... +| | | | ... | *Arguments:* | | ... | - bd_id1 - Bridge domain ID. Type: integer | | ... | - bd_id2 - Bridge domain ID. Type: integer | | ... | - subid - ID of the sub-interface to be created. Type: string | | ... | - tag_rewrite - Method of tag rewrite. Type: string -| | ... +| | | | ... | _NOTE:_ This KW uses following test case variables: | | ... | - dut1 - DUT1 node. | | ... | - dut2 - DUT2 node. | | ... | - dut1_if2 - DUT1 interface towards DUT2. | | ... | - dut2_if1 - DUT2 interface towards DUT1. -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Initialize L2 bridge domains with VLAN dot1q sub-interfaces | | ... | in a 3-node circular topology \| 1 \| 2 \| 10 \| pop-1 \| -| | ... +| | | | [Arguments] | ${bd_id1} | ${bd_id2} | ${subid} | ${tag_rewrite} -| | ... +| | | | ${dut2_status} | ${value}= | Run Keyword And Ignore Error | | ... | Variable Should Exist | ${dut2} -| | ... +| | | | Set interfaces in path up -| | ... +| | | | Run Keyword If | '${dut2_status}' == 'PASS' | | ... | Initialize VLAN dot1q sub-interfaces in circular topology | | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid} @@ -420,7 +428,7 @@ | | ... | ${subif_index_1} | ${dut2} | ${subif_index_2} | ${tag_rewrite} | | ... | ELSE | Configure L2 tag rewrite method on interfaces | | ... | ${dut1} | ${subif_index_1} | TAG_REWRITE_METHOD=${tag_rewrite} -| | ... +| | | | Add interface to bridge domain | ${dut1} | ${dut1_if1} | ${bd_id1} | | Add interface to bridge domain | ${dut1} | ${subif_index_1} | ${bd_id1} | | Run Keyword If | '${dut2_status}' == 'PASS' @@ -437,25 +445,25 @@ | | ... | with physical inteface. In case of 3-node topology create VLAN | | ... | sub-interfaces between DUTs. In case of 2-node topology create VLAN | | ... | sub-interface on dut1-if2 interface. All interfaces are brought up. -| | ... +| | | | ... | *Arguments:* | | ... | - bd_id1 - Bridge domain ID. Type: integer | | ... | - bd_id2 - Bridge domain ID. Type: integer | | ... | - subid - ID of the sub-interface to be created. Type: string | | ... | - tag_rewrite - Method of tag rewrite. Type: string -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| L2 bridge domains with Vhost-User and VLAN initialized in circular\ | | ... | topology \| 1 \| 2 \| 10 \| pop-1 \| -| | ... +| | | | [Arguments] | ${bd_id1} | ${bd_id2} | ${subid} | ${tag_rewrite} -| | ... +| | | | ${dut2_status} | ${value}= | Run Keyword And Ignore Error | | ... | Variable Should Exist | ${dut2} -| | ... +| | | | Set interfaces in path up -| | ... +| | | | Run Keyword If | '${dut2_status}' == 'PASS' | | ... | Initialize VLAN dot1q sub-interfaces in circular topology | | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid} @@ -466,7 +474,7 @@ | | ... | ${subif_index_1} | ${dut2} | ${subif_index_2} | ${tag_rewrite} | | ... | ELSE | Configure L2 tag rewrite method on interfaces | | ... | ${dut1} | ${subif_index_1} | TAG_REWRITE_METHOD=${tag_rewrite} -| | ... +| | | | Configure vhost interfaces | ${dut1} | | ... | /var/run/vpp/sock-1-${bd_id1} | /var/run/vpp/sock-1-${bd_id2} | | Add interface to bridge domain | ${dut1} | ${dut1_if1} | ${bd_id1} @@ -496,7 +504,7 @@ | | ... | interface towards TG and other Vhost-User interface into L2 bridge | | ... | domains with learning enabled with VLAN sub-interface. All interfaces | | ... | are brought up. -| | ... +| | | | ... | *Arguments:* | | ... | - bd_id1 - Bridge domain ID. Type: integer | | ... | - bd_id2 - Bridge domain ID. Type: integer @@ -504,16 +512,16 @@ | | ... | - tag_rewrite - Method of tag rewrite. Type: string | | ... | - bond_mode - Link bonding mode. Type: string | | ... | - lb_mode - Load balance mode. Type: string -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Initialize L2 bridge domains with Vhost-User and VLAN with VPP\ | | ... | link bonding in a 3-node circular topology \| 1 \| 2 \ | | ... | \| 10 \| pop-1 \| xor \| l34 \| -| | ... +| | | | [Arguments] | ${bd_id1} | ${bd_id2} | ${subid} | ${tag_rewrite} | | ... | ${bond_mode} | ${lb_mode} -| | ... +| | | | Set interfaces in path up | | ${dut1_eth_bond_if1}= | VPP Create Bond Interface | ${dut1} | ${bond_mode} | | ... | ${lb_mode} @@ -570,26 +578,26 @@ | | ... | Create pairs of Memif interfaces on DUT node. Put each Memif interface | | ... | to separate L2 bridge domain with one physical or memif interface | | ... | to create a chain accross DUT node. -| | ... +| | | | ... | *Arguments:* | | ... | - dut - DUT node. Type: dictionary | | ... | - nf_chain - NF chain. Type: integer | | ... | - nf_nodes - Number of NFs nodes per chain. Type: integer | | ... | - auto_scale - Whether to use same amount of RXQs for memif interface | | ... | in containers as vswitch, otherwise use single RXQ. Type: boolean -| | ... +| | | | ... | *Note:* | | ... | Socket paths for Memif are defined in following format: | | ... | - /tmp/memif-\${dut}_CNF\${nf_id}-\${sid} -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Initialize L2 Bridge Domain with memif pairs on DUT node \ | | ... | \| ${dut} \| 1 \| 1 \| -| | ... +| | | | [Arguments] | ${dut} | ${nf_chain}=${1} | ${nf_nodes}=${1} | | ... | ${auto_scale}=${True} -| | ... +| | | | ${rxq}= | Run Keyword If | ${auto_scale} == ${True} | | ... | Set Variable | ${rxq_count_int} | | ... | ELSE | Set Variable | ${1} @@ -602,7 +610,7 @@ | | Add interface to bridge domain | | ... | ${nodes['${dut}']} | ${${dut_str}_${prev_layer}_${nf_chain}_2} | | ... | ${bd_id2} -| | :FOR | ${nf_node} | IN RANGE | 1 | ${nf_nodes}+1 +| | FOR | ${nf_node} | IN RANGE | 1 | ${nf_nodes}+1 | | | ${nf_id}= | Evaluate | (${nf_chain} - ${1}) * ${nf_nodes} + ${nf_node} | | | ${sock1}= | Set Variable | memif-${dut}_CNF | | | ${sock2}= | Set Variable | memif-${dut}_CNF @@ -615,29 +623,31 @@ | | | ... | ${nodes['${dut}']} | ${${dut}-memif-${nf_id}-if1} | ${bd_id1} | | | Add interface to bridge domain | | | ... | ${nodes['${dut}']} | ${${dut}-memif-${nf_id}-if2} | ${bd_id2} +| | END | Initialize L2 Bridge Domain with memif pairs | | [Documentation] | | ... | Create pairs of Memif interfaces on all defined VPP nodes. Put each | | ... | Memif interface to separate L2 bridge domain with one physical or | | ... | virtual interface to create a chain accross DUT node. -| | ... +| | | | ... | *Arguments:* | | ... | - nf_chain - NF chain. Type: integer | | ... | - nf_nodes - Number of NFs nodes per chain. Type: integer | | ... | - auto_scale - Whether to use same amount of RXQs for memif interface | | ... | in containers as vswitch, otherwise use single RXQ. Type: boolean -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Initialize L2 Bridge Domain with memif pairs \| 1 \| 1 \| -| | ... +| | | | [Arguments] | ${nf_chain}=${1} | ${nf_nodes}=${1} | ${auto_scale}=${True} -| | ... -| | :FOR | ${dut} | IN | @{duts} +| | +| | FOR | ${dut} | IN | @{duts} | | | Initialize L2 Bridge Domain with memif pairs on DUT node | ${dut} | | | ... | nf_chain=${nf_chain} | nf_nodes=${nf_nodes} | | | ... | auto_scale=${auto_scale} +| | END | Initialize L2 Bridge Domain for multiple chains with memif pairs | | [Documentation] @@ -645,23 +655,24 @@ | | ... | with defined number of NF nodes on all defined VPP nodes. Add each | | ... | Memif interface into L2 bridge domains with learning enabled | | ... | with physical inteface or Memif interface of another NF. -| | ... +| | | | ... | *Arguments:* | | ... | - nf_chains - Number of chains of NFs. Type: integer | | ... | - nf_nodes - Number of NFs nodes per chain. Type: integer | | ... | - auto_scale - Whether to use same amount of RXQs for memif interface | | ... | in containers as vswitch, otherwise use single RXQ. Type: boolean -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Initialize L2 Bridge Domain for multiple chains with memif pairs \ | | ... | \| 1 \| 1 \| -| | ... +| | | | [Arguments] | ${nf_chains}=${1} | ${nf_nodes}=${1} | ${auto_scale}=${True} -| | ... -| | :FOR | ${nf_chain} | IN RANGE | 1 | ${nf_chains}+1 +| | +| | FOR | ${nf_chain} | IN RANGE | 1 | ${nf_chains}+1 | | | Initialize L2 Bridge Domain with memif pairs | nf_chain=${nf_chain} | | | ... | nf_nodes=${nf_nodes} | auto_scale=${auto_scale} +| | END | | Set interfaces in path up | | Show Memif on all DUTs | ${nodes} | | VPP round robin RX placement on all DUTs | ${nodes} | prefix=memif @@ -671,26 +682,26 @@ | | ... | Create pairs of Memif interfaces on all defined VPP nodes. Put each | | ... | Memif interface to separate L2 bridge domain with one physical or | | ... | virtual interface to create a service pipeline on DUT node. -| | ... +| | | | ... | *Arguments:* | | ... | - nf_chain - NF pipe. Type: integer | | ... | - nf_nodes - Number of NFs nodes per pipeline. Type: integer | | ... | - auto_scale - Whether to use same amount of RXQs for memif interface | | ... | in containers as vswitch, otherwise use single RXQ. Type: boolean -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Initialize L2 Bridge Domain for pipeline with memif pairs \ | | ... | \| 1 \| 1 \| -| | ... +| | | | [Arguments] | ${nf_chain}=${1} | ${nf_nodes}=${1} | ${auto_scale}=${True} -| | ... +| | | | ${rxq}= | Run Keyword If | ${auto_scale} == ${True} | | ... | Set Variable | ${rxq_count_int} | | ... | ELSE | Set Variable | ${1} | | ${bd_id1}= | Evaluate | ${nf_nodes} * (${nf_chain} - 1) + ${nf_chain} | | ${bd_id2}= | Evaluate | ${nf_nodes} * ${nf_chain} + ${nf_chain} -| | :FOR | ${dut} | IN | @{duts} +| | FOR | ${dut} | IN | @{duts} | | | ${dut_str}= | Convert To Lowercase | ${dut} | | | Add interface to bridge domain | | | ... | ${nodes['${dut}']} | ${${dut_str}_${prev_layer}_${nf_chain}_1} @@ -714,6 +725,7 @@ | | | ... | ${nodes['${dut}']} | ${${dut}-memif-${nf_id_frst}-if1} | ${bd_id1} | | | Add interface to bridge domain | | | ... | ${nodes['${dut}']} | ${${dut}-memif-${nf_id_last}-if2} | ${bd_id2} +| | END | Initialize L2 Bridge Domain for multiple pipelines with memif pairs | | [Documentation] @@ -721,24 +733,25 @@ | | ... | with defined number of NF nodes on all defined VPP nodes. Add each | | ... | Memif interface into L2 bridge domains with learning enabled | | ... | with physical inteface or Memif interface of another NF. -| | ... +| | | | ... | *Arguments:* | | ... | - nf_chains - Number of pipelines of NFs. Type: integer | | ... | - nf_nodes - Number of NFs nodes per pipeline. Type: integer | | ... | - auto_scale - Whether to use same amount of RXQs for memif interface | | ... | in containers as vswitch, otherwise use single RXQ. Type: boolean -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Initialize L2 Bridge Domain for multiple pipelines with memif \ | | ... | pairs \| 1 \| 1 \| -| | ... +| | | | [Arguments] | ${nf_chains}=${1} | ${nf_nodes}=${1} | ${auto_scale}=${True} -| | ... -| | :FOR | ${nf_chain} | IN RANGE | 1 | ${nf_chains}+1 +| | +| | FOR | ${nf_chain} | IN RANGE | 1 | ${nf_chains}+1 | | | Initialize L2 Bridge Domain for pipeline with memif pairs | | | ... | nf_chain=${nf_chain} | nf_nodes=${nf_nodes} | | | ... | auto_scale=${auto_scale} +| | END | | Set interfaces in path up | | Show Memif on all DUTs | ${nodes} | | VPP round robin RX placement on all DUTs | ${nodes} | prefix=memif @@ -751,25 +764,25 @@ | | ... | 3-node topology create VLAN sub-interfaces between DUTs. In case of | | ... | 2-node topology create VLAN sub-interface on dut1-if2 interface. All | | ... | interfaces are brought up. -| | ... +| | | | ... | *Arguments:* | | ... | - bd_id1 - Bridge domain ID. Type: integer | | ... | - bd_id2 - Bridge domain ID. Type: integer | | ... | - subid - ID of the sub-interface to be created. Type: string | | ... | - tag_rewrite - Method of tag rewrite. Type: string -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Initialize L2 Bridge Domain with memif pairs and VLAN in circular\ | | ... | topology \| 1 \| 2 \| 10 \| pop-1 \| -| | ... +| | | | [Arguments] | ${bd_id1} | ${bd_id2} | ${subid} | ${tag_rewrite} -| | ... +| | | | ${dut2_status} | ${value}= | Run Keyword And Ignore Error | | ... | Variable Should Exist | ${dut2} -| | ... +| | | | Set interfaces in path up -| | ... +| | | | Run Keyword If | '${dut2_status}' == 'PASS' | | ... | Initialize VLAN dot1q sub-interfaces in circular topology | | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid} @@ -780,7 +793,7 @@ | | ... | ${subif_index_1} | ${dut2} | ${subif_index_2} | ${tag_rewrite} | | ... | ELSE | Configure L2 tag rewrite method on interfaces | | ... | ${dut1} | ${subif_index_1} | TAG_REWRITE_METHOD=${tag_rewrite} -| | ... +| | | | ${number}= | Set Variable | ${1} | | ${sock1}= | Set Variable | memif-DUT1_CNF | | ${sock2}= | Set Variable | memif-DUT1_CNF @@ -816,7 +829,7 @@ | | ... | ${bd_id2} | | Run Keyword If | '${dut2_status}' == 'PASS' | | ... | Add interface to bridge domain | ${dut2} | ${dut2_if2} | ${bd_id2} -| | ... +| | | | Show Memif on all DUTs | ${nodes} | | VPP round robin RX placement on all DUTs | ${nodes} | prefix=memif @@ -824,24 +837,24 @@ | | [Documentation] | | ... | Create single Memif interface on all defined VPP nodes. Put Memif | | ... | interface to separate L2 bridge domain with one physical interface. -| | ... +| | | | ... | *Arguments:* | | ... | - number - Memif ID. Type: integer -| | ... +| | | | ... | *Note:* | | ... | Socket paths for Memif are defined in following format: | | ... | - /tmp/memif-DUT1_CNF\${number}-\${sid} -| | ... +| | | | ... | KW uses test variable ${rxq_count_int} set by KW Add worker threads | | ... | and rxqueues to all DUTs -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Initialize L2 Bridge Domain for single memif \| 1 \| -| | ... +| | | | [Arguments] | ${number}=${1} -| | ... -| | :FOR | ${dut} | IN | @{duts} +| | +| | FOR | ${dut} | IN | @{duts} | | | ${sock}= | Set Variable | memif-${dut}_CNF | | | ${sid}= | Evaluate | (${number} * ${2}) - ${1} | | | Set up single memif interface on DUT node | ${nodes['${dut}']} | ${sock} @@ -851,6 +864,7 @@ | | | ... | ${number} | | | Add interface to bridge domain | ${nodes['${dut}']} | | | ... | ${${dut}-memif-${number}-if1} | ${number} +| | END | | Set single interfaces in path up | | Show Memif on all DUTs | ${nodes} @@ -860,7 +874,7 @@ | | ... | domain that is created automatically with index 1. Learning is | | ... | enabled. Interfaces are brought up. Apply required MACIP ACL rules to | | ... | DUT1 interfaces. -| | ... +| | | | Set interfaces in path up | | VPP Add L2 Bridge Domain | ${dut1} | ${1} | ${dut1_if1} | ${dut1_if2} | | Configure L2XC | ${dut2} | ${dut2_if1} | ${dut2_if2} @@ -872,7 +886,7 @@ | | ... | domain that is created automatically with index 1. Learning is | | ... | enabled. Interfaces are brought up. Apply required ACL rules to DUT1 | | ... | interfaces. -| | ... +| | | | Set interfaces in path up | | VPP Add L2 Bridge Domain | ${dut1} | ${1} | ${dut1_if1} | ${dut1_if2} | | Configure L2XC | ${dut2} | ${dut2_if1} | ${dut2_if2} diff --git a/resources/libraries/robot/l2/l2_patch.robot b/resources/libraries/robot/l2/l2_patch.robot index 196d9e5d7e..836e281758 100644 --- a/resources/libraries/robot/l2/l2_patch.robot +++ b/resources/libraries/robot/l2/l2_patch.robot @@ -20,7 +20,7 @@ | | [Documentation] | | ... | Setup L2 patch topology by cross connecting two interfaces on | | ... | each DUT. Interfaces are brought up. -| | ... +| | | | Set interfaces in path up | | :FOR | ${dut} | IN | @{duts} | | | VPP Setup Bidirectional L2 patch diff --git a/resources/libraries/robot/l2/l2_traffic.robot b/resources/libraries/robot/l2/l2_traffic.robot index 93506d585e..eac0be446b 100644 --- a/resources/libraries/robot/l2/l2_traffic.robot +++ b/resources/libraries/robot/l2/l2_traffic.robot @@ -22,9 +22,9 @@ | | [Documentation] | Send IPv4/IPv6 packet from source interface to \ | | ... | destination interface. Packet can be set with Dot1q or | | ... | Dot1ad tag(s) when required. -| | ... +| | | | ... | *Arguments:* -| | ... +| | | | ... | - tg_node - TG node. Type: dictionary | | ... | - src_int - Source interface. Type: string | | ... | - dst_int - Destination interface. Type: string @@ -37,15 +37,15 @@ | | ... | (Optional). Type: string | | ... | - vlan1_rx - VLAN (outer) tag on RX side (Optional). Type: integer | | ... | - vlan2_rx - VLAN inner tag on RX side (Optional). Type: integer -| | ... +| | | | ... | *Return:* -| | ... +| | | | ... | - No value returned -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | _NOTE:_ Default IP is IPv4 -| | ... +| | | | ... | \| Send IP packet and verify received packet \| ${nodes['TG']} \ | | ... | \| ${tg_to_dut_if1} \| ${tg_to_dut_if2} \| | | ... | \| Send IP packet and verify received packet \| ${nodes['TG']} \ @@ -59,12 +59,12 @@ | | ... | \| Send IP packet and verify received packet \| ${nodes['TG']} \ | | ... | \| ${tg_to_dut1} \| ${tg_to_dut2} \| encaps=Dot1q \| vlan1=110 \ | | ... | \| encaps_rx=Dot1q \| vlan1_rx=120 \| -| | ... +| | | | [Arguments] | ${tg_node} | ${tx_src_port} | ${rx_dst_port} | | ... | ${src_ip}=192.168.100.1 | ${dst_ip}=192.168.100.2 | | ... | ${encaps}=${EMPTY} | ${vlan1}=${EMPTY} | ${vlan2}=${EMPTY} | | ... | ${encaps_rx}=${EMPTY} | ${vlan1_rx}=${EMPTY} | ${vlan2_rx}=${EMPTY} -| | ... +| | | | ${tx_src_mac}= | Get Interface Mac | ${tg_node} | ${tx_src_port} | | ${rx_dst_mac}= | Get Interface Mac | ${tg_node} | ${rx_dst_port} | | Then Send packet and verify headers @@ -75,66 +75,30 @@ | | ... | encaps_rx=${encaps_rx} | vlan_rx=${vlan1_rx} | | ... | vlan_outer_rx=${vlan2_rx} -| ICMP packet transmission should fail -| | [Documentation] | Send ICMPv4/ICMPv6 echo request from source interface to -| | ... | destination interface and expect failure with -| | ... | ICMP echo Rx timeout error message. -| | ... -| | ... | *Arguments:* -| | ... -| | ... | - tg_node - TG node. Type: dictionary -| | ... | - src_int - Source interface. Type: string -| | ... | - dst_int - Destination interface. Type: string -| | ... | - src_ip - Source IP address (Optional). Type: string -| | ... | - dst_ip - Destination IP address (Optional). Type: string -| | ... -| | ... | *Return:* -| | ... -| | ... | - No value returned -| | ... -| | ... | *Example:* -| | ... -| | ... | _NOTE:_ Default IP is IPv4 -| | ... -| | ... | \| ICMP packet transmission should fail\| ${nodes['TG']} \ -| | ... | \| ${tg_to_dut_if1} \| ${tg_to_dut_if2} \| -| | ... -| | [Arguments] | ${tg_node} | ${src_int} | ${dst_int} | -| | ... | ${src_ip}=192.168.100.1 | ${dst_ip}=192.168.100.2 -| | ... -| | ${src_mac}= | Get Interface Mac | ${tg_node} | ${src_int} -| | ${dst_mac}= | Get Interface Mac | ${tg_node} | ${dst_int} -| | ${src_int_name}= | Get interface name | ${tg_node} | ${src_int} -| | ${dst_int_name}= | Get interface name | ${tg_node} | ${dst_int} -| | ${args}= | Traffic Script Gen Arg | ${dst_int_name} | ${src_int_name} -| | ... | ${src_mac} | ${dst_mac} | ${src_ip} | ${dst_ip} -| | Run Keyword And Expect Error | IP echo Rx timeout | -| | ... | Run Traffic Script On Node | send_ip_icmp.py | ${tg_node} | ${args} - | Send IPv4 bidirectionally and verify received packets | | [Documentation] | Send IPv4 packets from both directions, | | ... | from interface1 to interface2 and from interface2 to interface1. -| | ... +| | | | ... | *Arguments:* -| | ... +| | | | ... | - tg_node - TG node. Type: dictionary | | ... | - src_int - Source interface. Type: string | | ... | - dst_int - Destination interface. Type: string | | ... | - src_ip - Source IP address (Optional). Type: string | | ... | - dst_ip - Destination IP address (Optional). Type: string -| | ... +| | | | ... | *Return:* -| | ... +| | | | ... | - No value returned -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Send IPv4 bidirectionally and verify received packets \ | | ... | \| ${nodes['TG']} \| ${tg_to_dut_if1} \| ${tg_to_dut_if2} \| -| | ... +| | | | [Arguments] | ${tg_node} | ${int1} | ${int2} | ${src_ip}=192.168.100.1 | | | ... | ${dst_ip}=192.168.100.2 -| | ... +| | | | Send IP packet and verify received packet | | ... | ${tg_node} | ${int1} | ${int2} | ${src_ip} | ${dst_ip} | | Send IP packet and verify received packet @@ -143,27 +107,27 @@ | Send IPv6 bidirectionally and verify received packets | | [Documentation] | Send IPv6 packets from both directions, | | ... | from interface1 to interface2 and from interface2 to interface1. -| | ... +| | | | ... | *Arguments:* -| | ... +| | | | ... | - tg_node - TG node. Type: dictionary | | ... | - src_int - Source interface. Type: string | | ... | - dst_int - Destination interface. Type: string | | ... | - src_ip - Source IP address (Optional). Type: string | | ... | - dst_ip - Destination IP address (Optional). Type: string -| | ... +| | | | ... | *Return:* -| | ... +| | | | ... | - No value returned -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Send IPv6 bidirectionally and verify received packets \ | | ... | \| ${nodes['TG']} \| ${tg_to_dut_if1} \| ${tg_to_dut_if2} \| -| | ... +| | | | [Arguments] | ${tg_node} | ${int1} | ${int2} | ${src_ip}=3ffe:63::1 | | | ... | ${dst_ip}=3ffe:63::2 -| | ... +| | | | Send IP packet and verify received packet | | ... | ${tg_node} | ${int1} | ${int2} | ${src_ip} | ${dst_ip} | | Send IP packet and verify received packet diff --git a/resources/libraries/robot/l2/l2_xconnect.robot b/resources/libraries/robot/l2/l2_xconnect.robot index 42fe837676..a0c1c24a5d 100644 --- a/resources/libraries/robot/l2/l2_xconnect.robot +++ b/resources/libraries/robot/l2/l2_xconnect.robot @@ -27,45 +27,47 @@ | | [Documentation] | | ... | Setup L2 cross connect topology by connecting RX/TX of two interfaces | | ... | on each DUT. Interfaces are brought up. -| | ... +| | | | ... | *Arguments:* | | ... | - dut - DUT node. Type: string | | ... | - count - Number of interfaces pairs to connect. Type: integer -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Initialize L2 cross connect on node \| DUT1 \| 1 \| -| | ... +| | | | [Arguments] | ${dut} | ${count}=${1} -| | ... -| | :FOR | ${id} | IN RANGE | 1 | ${count} + 1 +| | +| | FOR | ${id} | IN RANGE | 1 | ${count} + 1 | | | ${dut_str}= | Convert To Lowercase | ${dut} | | | VPP Setup Bidirectional Cross Connect | ${nodes['${dut}']} | | | ... | ${${dut_str}_${prev_layer}_${id}_1} | | | ... | ${${dut_str}_${prev_layer}_${id}_2} +| | END | Initialize L2 cross connect | | [Documentation] | | ... | Setup L2 cross connect topology by connecting RX/TX of two interfaces | | ... | on each DUT. Interfaces are brought up. -| | ... +| | | | ... | *Arguments:* | | ... | - count - Number of interfaces pairs to connect. Type: integer -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Initialize L2 cross connect \| 1 \| -| | ... +| | | | [Arguments] | ${count}=${1} -| | ... -| | :FOR | ${dut} | IN | @{duts} +| | +| | FOR | ${dut} | IN | @{duts} | | | Initialize L2 cross connect on node | ${dut} | count=${count} +| | END | Initialize L2 xconnect in 2-node circular topology | | [Documentation] | | ... | Setup L2 xconnect topology by cross connecting two interfaces on | | ... | each DUT. Interfaces are brought up. -| | ... +| | | | Set interfaces in path up | | VPP Setup Bidirectional Cross Connect | ${dut1} | ${dut1_if1} | ${dut1_if2} @@ -85,7 +87,7 @@ | | ... | up. IPv4 addresses with prefix /24 are configured on interfaces | | ... | between DUTs. VXLAN sub-interfaces has same IPv4 address as | | ... | interfaces. -| | ... +| | | | Set interfaces in path up | | VPP Interface Set IP Address | ${dut1} | ${dut1_if2} | 172.16.0.1 | 24 | | VPP Interface Set IP Address | ${dut2} | ${dut2_if1} | 172.16.0.2 | 24 @@ -103,23 +105,23 @@ | | ... | Create pairs of Vhost-User interfaces for defined number of VMs on | | ... | defined VPP node. Add each Vhost-User interface into L2 cross-connect | | ... | with with physical inteface or Vhost-User interface of another VM. -| | ... +| | | | ... | *Arguments:* | | ... | - dut - DUT node. Type: string | | ... | - nf_nodes - VM count. Type: integer -| | ... +| | | | ... | *Note:* | | ... | Socket paths for VM are defined in following format: | | ... | - /tmp/sock-\${VM_ID}-1 | | ... | - /tmp/sock-\${VM_ID}-2 -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Initialize L2 xconnect with Vhost-User on node \| DUT1 \| 1 \| -| | ... +| | | | [Arguments] | ${dut} | ${nf_nodes}=${1} -| | ... -| | :FOR | ${number} | IN RANGE | 1 | ${nf_nodes}+1 +| | +| | FOR | ${number} | IN RANGE | 1 | ${nf_nodes}+1 | | | ${sock1}= | Set Variable | /var/run/vpp/sock-${number}-1 | | | ${sock2}= | Set Variable | /var/run/vpp/sock-${number}-2 | | | ${prev_index}= | Evaluate | ${number}-1 @@ -132,43 +134,45 @@ | | | ... | ${${dut}-vhost-${number}-if1} | | | Run Keyword If | ${number}==${nf_nodes} | Configure L2XC | | | ... | ${nodes['${dut}']} | ${${dut}-vhost-${number}-if2} | ${${dut}_if2} +| | END | Initialize L2 xconnect with Vhost-User | | [Documentation] | | ... | Create pairs of Vhost-User interfaces for defined number of VMs on | | ... | all VPP nodes. Add each Vhost-User interface into L2 cross-connect | | ... | with with physical inteface or Vhost-User interface of another VM. -| | ... +| | | | ... | *Arguments:* | | ... | - nf_nodes - VM count. Type: integer -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Initialize L2 xconnect with Vhost-User \| 1 \| -| | ... +| | | | [Arguments] | ${nf_nodes}=${1} -| | ... -| | :FOR | ${dut} | IN | @{duts} +| | +| | FOR | ${dut} | IN | @{duts} | | | Initialize L2 xconnect with Vhost-User on node | ${dut} | | | ... | nf_nodes=${nf_nodes} +| | END | Initialize L2 xconnect with Vhost-User and VLAN in 3-node circular topology | | [Documentation] | | ... | Create two Vhost-User interfaces on all defined VPP nodes. Cross | | ... | connect each Vhost interface with one physical interface. | | ... | Setup VLAN between DUTs. All interfaces are brought up. -| | ... +| | | | ... | *Arguments:* | | ... | - subid - ID of the sub-interface to be created. Type: string | | ... | - tag_rewrite - Method of tag rewrite. Type: string -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| L2 xconnect with Vhost-User and VLAN initialized in a 3-node\ | | ... | circular topology \| 10 \| pop-1 \| -| | ... +| | | | [Arguments] | ${subid} | ${tag_rewrite} -| | ... +| | | | Set interfaces in path up | | Initialize VLAN dot1q sub-interfaces in circular topology | | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid} @@ -192,20 +196,20 @@ | | ... | VLAN on BondEthernet interfaces between DUTs. Cross connect one Vhost | | ... | interface with physical interface towards TG and other Vhost interface | | ... | with VLAN sub-interface. All interfaces are brought up. -| | ... +| | | | ... | *Arguments:* | | ... | - subid - ID of the sub-interface to be created. Type: string | | ... | - tag_rewrite - Method of tag rewrite. Type: string | | ... | - bond_mode - Link bonding mode. Type: string | | ... | - lb_mode - Load balance mode. Type: string -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Initialize L2 xconnect with Vhost-User and VLAN with VPP link\ | | ... | bonding in 3-node circular topology \| 10 \| pop-1 \| xor \| l34 \| -| | ... +| | | | [Arguments] | ${subid} | ${tag_rewrite} | ${bond_mode} | ${lb_mode} -| | ... +| | | | Set interfaces in path up | | ${dut1_eth_bond_if1}= | VPP Create Bond Interface | ${dut1} | ${bond_mode} | | ... | ${lb_mode} @@ -258,26 +262,26 @@ | | ... | Create pairs of Memif interfaces on DUT node. Cross connect each Memif | | ... | interface with one physical interface or virtual interface to create | | ... | a chain accross DUT node. -| | ... +| | | | ... | *Arguments:* | | ... | - dut - DUT node. Type: dictionary | | ... | - count - Number of memif pairs (containers). Type: integer -| | ... +| | | | ... | *Note:* | | ... | Socket paths for Memif are defined in following format: | | ... | - /tmp/memif-\${dut}_CNF\${number}-\${sid} -| | ... +| | | | ... | KW uses test variable \${rxq_count_int} set by KW Add worker threads | | ... | and rxqueues to all DUTs -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Initialize L2 xconnect with memif pairs on DUT node \| ${dut} \ | | ... | \| ${1} \| -| | ... +| | | | [Arguments] | ${dut} | ${count} -| | ... -| | :FOR | ${number} | IN RANGE | 1 | ${count}+1 +| | +| | FOR | ${number} | IN RANGE | 1 | ${count}+1 | | | ${sock1}= | Set Variable | memif-${dut}_CNF | | | ${sock2}= | Set Variable | memif-${dut}_CNF | | | ${prev_index}= | Evaluate | ${number}-1 @@ -290,24 +294,26 @@ | | | ... | ${${dut}-memif-${number}-if1} | | | Run Keyword If | ${number}==${count} | Configure L2XC | | | ... | ${nodes['${dut}']} | ${${dut}-memif-${number}-if2} | ${${dut}_if2} +| | END | Initialize L2 xconnect with memif pairs | | [Documentation] | | ... | Create pairs of Memif interfaces on all defined VPP nodes. Cross | | ... | connect each Memif interface with one physical interface or virtual | | ... | interface to create a chain accross DUT node. -| | ... +| | | | ... | *Arguments:* | | ... | - count - Number of memif pairs (containers). Type: integer -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Initialize L2 xconnect with memif pairs \| ${1} \| -| | ... +| | | | [Arguments] | ${count}=${1} -| | ... -| | :FOR | ${dut} | IN | @{duts} +| | +| | FOR | ${dut} | IN | @{duts} | | | Initialize L2 xconnect with memif pairs on DUT node | ${dut} | ${count} +| | END | | Set interfaces in path up | | Show Memif on all DUTs | ${nodes} | | VPP round robin RX placement on all DUTs | ${nodes} | prefix=memif @@ -316,24 +322,24 @@ | | [Documentation] | | ... | Create single Memif interface on all defined VPP nodes. Cross | | ... | connect Memif interface with one physical interface. -| | ... +| | | | ... | *Arguments:* | | ... | - number - Memif ID. Type: integer -| | ... +| | | | ... | *Note:* | | ... | Socket paths for Memif are defined in following format: | | ... | - /tmp/memif-DUT1_CNF\${number}-\${sid} -| | ... +| | | | ... | KW uses test variable ${rxq_count_int} set by KW Add worker threads | | ... | and rxqueues to all DUTs -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Initialize L2 xconnect for single memif \| 1 \| -| | ... +| | | | [Arguments] | ${number}=${1} -| | ... -| | :FOR | ${dut} | IN | @{duts} +| | +| | FOR | ${dut} | IN | @{duts} | | | ${sock}= | Set Variable | memif-${dut}_CNF | | | ${sid}= | Evaluate | (${number} * ${2}) - ${1} | | | Set up single memif interface on DUT node | ${nodes['${dut}']} | ${sock} @@ -341,6 +347,7 @@ | | | ... | rxq=${rxq_count_int} | txq=${rxq_count_int} | | | Configure L2XC | ${nodes['${dut}']} | ${${dut}_if1} | | | ... | ${${dut}-memif-${number}-if1} +| | END | | Set single interfaces in path up | | Show Memif on all DUTs | ${nodes} | | VPP round robin RX placement on all DUTs | ${nodes} | prefix=memif diff --git a/resources/libraries/robot/l2/tagging.robot b/resources/libraries/robot/l2/tagging.robot index a48e10c427..273384c5cc 100644 --- a/resources/libraries/robot/l2/tagging.robot +++ b/resources/libraries/robot/l2/tagging.robot @@ -15,7 +15,7 @@ | Library | resources.libraries.python.L2Util | Library | resources.libraries.python.InterfaceUtil | Library | resources.libraries.python.NodePath -| ... +| | Documentation | Keywords for VLAN tests *** Keywords *** @@ -23,7 +23,7 @@ | | [Arguments] | ${DUT1} | ${INT1} | ${DUT2} | ${INT2} | ${SUB_ID} | | ... | ${OUTER_VLAN_ID} | ${INNER_VLAN_ID} | ${TYPE_SUBIF} | | [Documentation] | Create two subinterfaces on DUTs. -| | ... +| | | | ... | *Arguments:* | | ... | - DUT1 - Node to add sub-interface. | | ... | - INT1 - Interface key on which create sub-interface. @@ -33,13 +33,13 @@ | | ... | - OUTER_VLAN_ID - Outer VLAN ID. | | ... | - INNER_VLAN_ID - Inner VLAN ID. | | ... | - TYPE_SUBIF - Type of sub-interface. -| | ... +| | | | ... | _Set testcase variables with name and index of created interfaces:_ | | ... | - subif_name_1 | | ... | - subif_index_1 | | ... | - subif_name_2 | | ... | - subif_index_2 -| | ... +| | | | Set Interface State | ${DUT1} | ${INT1} | up | | Set Interface State | ${DUT2} | ${INT2} | up | | ${INT1_name}= | Get interface name | ${DUT1} | ${INT1} @@ -61,26 +61,26 @@ | | [Arguments] | ${DUT1} | ${INT1} | ${DUT2}=${None} | ${INT2}=${None} | | ... | ${SUB_ID}=10 | | [Documentation] | Create two dot1q subinterfaces on DUTs. -| | ... +| | | | ... | *Arguments:* | | ... | - DUT1 - Node to add sub-interface. | | ... | - INT1 - Interface key on which create VLAN sub-interface. | | ... | - DUT2 - Node to add sub-interface. | | ... | - INT2 - Interface key on which create VLAN sub-interface. | | ... | - SUB_ID - ID of the sub-interface to be created. -| | ... +| | | | ... | _Set testcase variables with name and index of created interfaces:_ | | ... | - subif_name_1 | | ... | - subif_index_1 | | ... | - subif_name_2 | | ... | - subif_index_2 -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Initialize VLAN dot1q sub-interfaces in circular topology \ | | ... | \| ${nodes['DUT1']} \| ${dut1_if2} \| ${nodes['DUT2']} \ | | ... | \| ${dut1_if2} \| 10 \| -| | ... +| | | | Set Interface State | ${DUT1} | ${INT1} | up | | Run Keyword Unless | ${DUT2} == ${None} | | ... | Set Interface State | ${DUT2} | ${INT2} | up @@ -106,21 +106,21 @@ | | [Arguments] | ${DUT1} | ${SUB_INT1} | ${DUT2}=${None} | ${SUB_INT2}=${None} | | ... | ${TAG_REWRITE_METHOD}=${None} | | [Documentation] | Setup tag rewrite on sub-interfaces on DUTs. -| | ... +| | | | ... | *Arguments:* | | ... | - DUT1 - Node to rewrite tags. | | ... | - SUB_INT1 - Interface on which rewrite tags. | | ... | - DUT2 - Node to rewrite tags. | | ... | - SUB_INT2 - Interface on which rewrite tags. | | ... | - TAG_REWRITE_METHOD - Method of tag rewrite. -| | ... +| | | | L2 Vlan tag rewrite | ${DUT1} | ${SUB_INT1} | ${TAG_REWRITE_METHOD} | | Run Keyword Unless | ${DUT2} == ${None} | | ... | L2 Vlan tag rewrite | ${DUT2} | ${SUB_INT2} | ${TAG_REWRITE_METHOD} | Configure L2 tag rewrite method on interface | | [Documentation] | Set L2 tag rewrite on (sub-)interface on DUT -| | ... +| | | | ... | *Arguments:* | | ... | - dut_node - Node to set L2 tag rewrite method. Type: dictionary | | ... | - interface - (Sub-)interface name or SW index to set L2 tag rewrite @@ -130,22 +130,22 @@ | | ... | Dot1ad (Optional). Type: boolean | | ... | - tag1_id - VLAN tag1 ID (Optional). Type: integer | | ... | - tag2_id - VLAN tag2 ID (Optional). Type: integer -| | ... +| | | | ... | *Return:* -| | ... +| | | | ... | - No value returned -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Configure L2 tag rewrite method on interface \| ${nodes['DUT1']} \ | | ... | \| 9 \| pop-1 \| | | ... | \| Configure L2 tag rewrite method on interface \| ${nodes['DUT2']} \ | | ... | \| 10 \| translate-1-2 \| push_dot1q=${False} \| tag1_id=10 \ | | ... | \| tag1_id=20 \| -| | ... +| | | | [Arguments] | ${dut_node} | ${interface} | ${tag_rewrite_method} | | ... | ${push_dot1q}=${True} | ${tag1_id}=${None} | ${tag2_id}=${None} -| | ... +| | | | ${result}= | Evaluate | isinstance($interface, int) | | ${interface_name}= | Run Keyword If | ${result} | | ... | Set Variable | ${interface} diff --git a/resources/libraries/robot/lb/load_balancer.robot b/resources/libraries/robot/lb/load_balancer.robot index 42cac6ae2e..a254acd0f8 100644 --- a/resources/libraries/robot/lb/load_balancer.robot +++ b/resources/libraries/robot/lb/load_balancer.robot @@ -20,9 +20,9 @@ | Library | resources.libraries.python.topology.Topology | Library | resources.libraries.python.LoadBalancerUtil | Library | resources.libraries.python.NodePath -| ... +| | Resource | resources/libraries/robot/shared/interfaces.robot -| ... +| | Documentation | LoadBalancer suite keywords - configuration *** Keywords *** @@ -32,23 +32,23 @@ | | ... | circular topology. Get the interface MAC addresses and setup ARP on | | ... | all VPP interfaces. Setup IPv4 addresses with /24 prefix on DUT-TG | | ... | links. -| | ... +| | | | Set interfaces in path up -| | ... +| | | | ${fib_table}= | Set Variable | ${0} | | Add Fib Table | ${dut1} | ${fib_table} | | Assign Interface To Fib Table | ${dut1} | ${dut1_if1} | ${fib_table} | | Assign Interface To Fib Table | ${dut1} | ${dut1_if2} | ${fib_table} -| | ... +| | | | VPP Interface Set IP Address | ${dut1} | ${dut1_if1} | | ... | 192.168.50.72 | 24 | | VPP Interface Set IP Address | ${dut1} | ${dut1_if2} | | ... | 192.168.60.73 | 24 -| | ... +| | | | Add Ip Neighbors | ${dut1} | ${dut1_if2} | 192.168.60 | ${tg_if2_mac} -| | ... +| | | | Vpp Route Add | ${dut1} | 192.168.60.0 | 24 | interface=${dut1_if2} -| | ... +| | | | Vpp Lb Conf | ${dut1} | ip4_src_addr=192.168.60.73 | buckets_per_core=${128} | | Vpp Lb Add Del Vip | ${dut1} | vip_addr=90.1.2.1 | encap=${0} | | ... | new_len=${1024} @@ -60,23 +60,23 @@ | | ... | circular topology. Get the interface MAC addresses and setup ARP on | | ... | all VPP interfaces. Setup IPv4 addresses with /24 prefix on DUT-TG | | ... | links. -| | ... +| | | | Set interfaces in path up -| | ... +| | | | ${fib_table}= | Set Variable | ${0} | | Add Fib Table | ${dut1} | ${fib_table} | | Assign Interface To Fib Table | ${dut1} | ${dut1_if1} | ${fib_table} | | Assign Interface To Fib Table | ${dut1} | ${dut1_if2} | ${fib_table} -| | ... +| | | | VPP Interface Set IP Address | ${dut1} | ${dut1_if1} | | ... | 192.168.50.72 | 24 | | VPP Interface Set IP Address | ${dut1} | ${dut1_if2} | | ... | 192.168.60.73 | 24 -| | ... +| | | | Add Ip Neighbors | ${dut1} | ${dut1_if2} | 192.168.60 | ${tg_if2_mac} -| | ... +| | | | Vpp Route Add | ${dut1} | 192.168.60.0 | 24 | interface=${dut1_if2} -| | ... +| | | | Vpp Lb Conf | ${dut1} | ip4_src_addr=192.168.60.73 | buckets_per_core=${128} | | Vpp Lb Add Del Vip | ${dut1} | vip_addr=90.1.2.1 | encap=${2} | dscp=${7} | | ... | new_len=${1024} @@ -88,25 +88,25 @@ | | ... | circular topology. Get the interface MAC addresses and setup ARP on | | ... | all VPP interfaces. Setup IPv4 addresses with /24 prefix on DUT-TG | | ... | links. -| | ... +| | | | Set interfaces in path up -| | ... +| | | | ${fib_table}= | Set Variable | ${0} | | Add Fib Table | ${dut1} | ${fib_table} | | Assign Interface To Fib Table | ${dut1} | ${dut1_if1} | ${fib_table} | | Assign Interface To Fib Table | ${dut1} | ${dut1_if2} | ${fib_table} -| | ... +| | | | VPP Interface Set IP Address | ${dut1} | ${dut1_if1} | | ... | 192.168.50.72 | 24 | | VPP Interface Set IP Address | ${dut1} | ${dut1_if2} | | ... | 192.168.60.73 | 24 -| | ... +| | | | Add Ip Neighbors | ${dut1} | ${dut1_if1} | 192.168.50 | ${tg_if1_mac} | | Add Ip Neighbors | ${dut1} | ${dut1_if2} | 192.168.60 | ${tg_if2_mac} -| | ... +| | | | Vpp Route Add | ${dut1} | 192.168.50.0 | 24 | interface=${dut1_if1} | | Vpp Route Add | ${dut1} | 192.168.60.0 | 24 | interface=${dut1_if2} -| | ... +| | | | Vpp Lb Conf | ${dut1} | ip4_src_addr=192.168.60.73 | buckets_per_core=${128} | | Vpp Lb Add Del Vip | ${dut1} | vip_addr=90.1.2.1 | encap=${3} | | ... | protocol=${17} | port=${20000} | target_port=${3307} | new_len=${1024} @@ -116,26 +116,27 @@ | Add Ip Neighbors | | [Documentation] | Add IP neighbors to physical interface on DUT. -| | ... +| | | | ... | *Arguments:* | | ... | - node - VPP node. Type: dictionary | | ... | - interface - Interface key. Type: string | | ... | - ip_addr - IP address of the interface. Type: string | | ... | - mac_addr - MAC address of the interface. Type: string -| | ... +| | | | ... | *Example:* | | ... | \| Add Ip Neighbors \| ${dut1} \| ${dut1_if1} \| 192.168.50 \ | | ... | \| ${tg_if1_mac} -| | ... +| | | | [Arguments] | ${node} | ${interface} | ${ip_addr} | ${mac_addr} -| | ... -| | :FOR | ${number} | IN RANGE | 74 | 80 +| | +| | FOR | ${number} | IN RANGE | 74 | 80 | | | VPP Add IP Neighbor | | | ... | ${node} | ${interface} | ${ip_addr}.${number} | ${mac_addr} +| | END | Add Lb As Addresses | | [Documentation] | Add Lb As Addresses on Vpp node. -| | ... +| | | | ... | *Arguments:* | | ... | - node - VPP node. Type: dictionary | | ... | - vip_addr - IPv4 address to be used as source for IPv4 traffic. @@ -143,18 +144,19 @@ | | ... | - as_addr - The application server address. Type: string | | ... | - protocol - tcp or udp. Type: integer | | ... | - port - destination port. Type: integer -| | ... | - is_del - 1 if the VIP should be removed otherwise 0. Type: integer +| | ... | - is_del - 1 if the VIP should be removed otherwise 0. Type: integer | | ... | - is_flush - 1 if the sessions related to this AS should be flushed | | ... | otherwise 0. Type: integer -| | ... +| | | | ... | *Example:* | | ... | \| Add Lb As Addresses \| ${dut1} \| 90.1.2.1 \| 192.168.60 \ | | ... | \| protocol=${17} \| port=${20000} \| -| | ... +| | | | [Arguments] | ${node} | ${vip_addr} | ${as_addr} | ${protocol}=${255} | | ... | ${port}=${0} | ${is_del}=${0} | ${is_flush}=${0} -| | ... -| | :FOR | ${number} | IN RANGE | 74 | 80 +| | +| | FOR | ${number} | IN RANGE | 74 | 80 | | | VPP Lb Add Del As | | | ... | ${node} | vip_addr=${vip_addr} | protocol=${protocol} | | | ... | port=${port} | as_addr=${as_addr}.${number} +| | END diff --git a/resources/libraries/robot/overlay/lisp.robot b/resources/libraries/robot/overlay/lisp.robot index 826cc3a7b1..f9da0be399 100644 --- a/resources/libraries/robot/overlay/lisp.robot +++ b/resources/libraries/robot/overlay/lisp.robot @@ -23,10 +23,10 @@ *** Keywords *** | Configure topology for IPv4 LISP testing | | [Documentation] | Setup topology for IPv4 LISP testing. -| | ... +| | | | ... | *Example:* | | ... | \| Configure topology for IPv4 LISP testing \| -| | ... +| | | | Set interfaces in path up | | VPP Interface Set IP Address | | ... | ${dut1} | ${dut1_if1} | ${dut_if1_ip4} | ${ip4_plen} @@ -41,10 +41,10 @@ | Configure topology for IPv6 LISP testing | | [Documentation] | Setup topology fo IPv6 LISP testing. -| | ... +| | | | ... | *Example:* | | ... | \| Configure topology for IPv6 LISP testing \| -| | ... +| | | | Set interfaces in path up | | VPP Interface Set IP Address | | ... | ${dut1} | ${dut1_if1} | ${dut_if1_ip6} | ${ip6_plen} @@ -59,7 +59,7 @@ | Configure LISP in 2-node circular topology | | [Documentation] | Configure LISP topology in 2-node circular topology. -| | ... +| | | | ... | *Arguments:* | | ... | - dut1 - DUT1 node. Type: dictionary | | ... | - dut1_if - DUT1 node interface. Type: string @@ -70,27 +70,27 @@ | | ... | - is_gpe - To enable GPE. Other than zero to enable Type: integer | | ... | - vni_table - vni table Eid Table Mapping Type: integer | | ... | - vrf_table - vrf table Eid Table Mapping Type: integer -| | ... +| | | | ... | *Return:* | | ... | - No value returned -| | ... +| | | | ... | *Example:* | | ... | \| Configure LISP in 2-node circular topology \ | | ... | \| ${dut1} \| ${interface_name} \ | | ... | \| None \| ${locator_set} \| ${dut1_eid} \ | | ... | \| ${dut1_static_adjacency} \| -| | ... +| | | | [Arguments] | | ... | ${dut1} | ${dut1_if} | ${dut1_int_index} | | ... | ${locator_set} | ${dut1_eid} | | ... | ${dut1_static_adjacency} | | ... | ${is_gpe}=0 | | ... | ${vni_table}=0 | ${vrf_table}=0 -| | ... -# DUT1 settings: +| | +| | # DUT1 settings: | | ${dut1_int_index}= | Run Keyword If | ${dut1_int_index} is None -| | ... | Get Interface Sw Index | ${dut1} | ${dut1_if} -| | ... | ELSE | Set Variable | ${dut1_int_index} +| | ... | Get Interface Sw Index | ${dut1} | ${dut1_if} +| | ... | ELSE | Set Variable | ${dut1_int_index} | | Enable Lisp | ${dut1} | | Run keyword if | ${is_gpe} != 0 | | ... | Enable Lisp GPE | ${dut1} @@ -118,10 +118,10 @@ | Configure topology for IPv6 LISPoIP4 testing | | [Documentation] | Setup topology fo IPv6 LISPoIPV4 testing. -| | ... +| | | | ... | *Example:* | | ... | \| Configure topology for IPv6 LISPoIP4 testing \| -| | ... +| | | | Set interfaces in path up | | VPP Interface Set IP Address | | ... | ${dut1} | ${dut1_if1} | ${dut_if1_ip6} | ${ip6_plen} @@ -136,10 +136,10 @@ | Configure topology for IPv4 LISPoIP6 testing | | [Documentation] | Setup topology fo IPv4 LISPoIPV6 testing. -| | ... +| | | | ... | *Example:* | | ... | \| Configure topology for IPv4 LISPoIP6 testing \| -| | ... +| | | | Set interfaces in path up | | VPP Interface Set IP Address | | ... | ${dut1} | ${dut1_if1} | ${dut_if1_ip4} | ${ip4_plen} diff --git a/resources/libraries/robot/overlay/lisp_api.robot b/resources/libraries/robot/overlay/lisp_api.robot index b858ef48a7..21f17d51f1 100644 --- a/resources/libraries/robot/overlay/lisp_api.robot +++ b/resources/libraries/robot/overlay/lisp_api.robot @@ -24,24 +24,24 @@ | Generate LISP locator_set data | | [Documentation] | Generate lisp locator_set data for test | | ... | the lisp locator_set and locator API. -| | ... +| | | | ... | *Arguments:* | | ... | - dut_node - DUT node. Type: dictionary | | ... | - locator_set_number - Number how many locator_set data | | ... | will be generated. Type: integer -| | ... +| | | | ... | *Return:* | | ... | - No value returned -| | ... +| | | | ... | _NOTE:_ This KW sets following test case variables: | | ... | - locator_set_values - New generated locator_set data. | | ... | - locator_set_values_vat - New generated locator_set data expected\ | | ... | from VAT. -| | ... +| | | | ... | *Example:* | | ... | \| Given Generate LISP locator_set data \| ${nodes['DUT1']} \ | | ... | \| ${locator_set_number} \| -| | ... +| | | | [Arguments] | ${dut_node} | ${locator_set_number} | | ${locator_set_values} | ${locator_set_values_vat}= | | ... | Generate Unique Lisp Locator Set Data @@ -51,40 +51,40 @@ | Configure LISP locator_set data | | [Documentation] | Set the lisp locator_set and locator on the VPP node. -| | ... +| | | | ... | *Arguments:* | | ... | - dut_node - DUT node. Type: dictionary -| | ... +| | | | ... | *Return:* | | ... | - No value returned -| | ... +| | | | ... | _NOTE:_ This KW requires following test case variables: | | ... | - locator_set_values - Generated locator_set data from | | ... | KW locator_set data is prepared, which will be set on the VPP node. -| | ... +| | | | ... | *Example:* | | ... | \| When Configure LISP locator_set data \| ${nodes['DUT1']} \| -| | ... +| | | | [Arguments] | ${dut_node} | | Vpp Set Lisp Locator Set | ${dut_node} | ${locator_set_values} | LISP locator_set shpuld be configured correctly | | [Documentation] | Test if the locator_set is set correctly on the VPP node. -| | ... +| | | | ... | *Arguments:* | | ... | - dut_node - DUT node. Type: dictionary -| | ... +| | | | ... | *Return:* | | ... | - No value returned -| | ... +| | | | ... | _NOTE:_ This KW requires following test case variables: | | ... | - locator_set_values_vat - Generated locator_set data from | | ... | KW locator_set data is prepared, which are expected from VPP via VAT. -| | ... +| | | | ... | *Example:* | | ... | \| Then LISP locator_set should be configured correctly \ | | ... | \| ${nodes['DUT1']} \| -| | ... +| | | | [Arguments] | ${dut_node} | | ${show_locator_set}= | Vpp Show Lisp Locator Set | ${dut_node} | local | | Lisp Locator S Should Be Equal @@ -92,36 +92,36 @@ | Delete all LISP locator_set from VPP | | [Documentation] | Delete all lisp locator_set on the VPP node. -| | ... +| | | | ... | *Arguments:* | | ... | - dut_node - DUT node. Type: dictionary -| | ... +| | | | ... | *Return:* | | ... | - No value returned -| | ... +| | | | ... | _NOTE:_ This KW requires following test case variables: | | ... | - locator_set_values - Generated locator_set data from | | ... | KW locator_set data is prepared, which was set on the VPP node. -| | ... +| | | | ... | *Example:* | | ... | \| When Delete all LISP locator_set from VPP \ | | ... | \| ${nodes['DUT1']} \| -| | ... +| | | | [Arguments] | ${dut_node} | | Vpp Unset Lisp Locator Set | ${dut_node} | ${locator_set_values} | LISP locator_set should be unset | | [Documentation] | Test if all locator_set are unset from VPP node. -| | ... +| | | | ... | *Arguments:* | | ... | - dut_node - DUT node. Type: dictionary -| | ... +| | | | ... | *Return:* | | ... | - No value returned -| | ... +| | | | ... | *Example:* | | ... | \| Then LISP locator_set should be unset \| ${nodes['DUT1']} \| -| | ... +| | | | [Arguments] | ${dut_node} | | ${show_locator_set}= | Vpp Show Lisp Locator Set | ${dut_node} | ${EMPTY} | | Lisp Is Empty | ${show_locator_set} @@ -129,24 +129,24 @@ | Lisp locator_set data use for test reset locator_set are prepared | | [Documentation] | Generate lisp special type of locator_set data. | | ... | This data will be use for test reset locator_set. -| | ... +| | | | ... | *Arguments:* | | ... | - dut_node - DUT node. Type: dictionary | | ... | - locator_set_number - Number how many locator_set data | | ... | it will generate. Type: integer -| | ... +| | | | ... | *Return:* | | ... | - No value returned -| | ... +| | | | ... | _NOTE:_ This KW sets following test case variables: | | ... | - locator_set_values - New generate locator_set data. | | ... | - locator_set_values_vat - New generated locator_set data expected\ | | ... | from VAT. -| | ... +| | | | ... | *Example:* | | ... | \| Given Lisp locator_set data use for test reset locator_set \ | | ... | are prepared \| ${nodes['DUT1']} \| ${locator_set_number} \| -| | ... +| | | | [Arguments] | ${dut_node} | ${locator_set_number} | | ${locator_set_values} | ${locator_set_values_vat}= | | ... | Generate Duplicate Lisp Locator Set Data @@ -156,244 +156,244 @@ | Configure LISP eid address | | [Documentation] | Set the lisp eid address on the VPP node. -| | ... +| | | | ... | *Arguments:* | | ... | - dut_node - DUT node. Type: dictionary | | ... | - set_eid - Test eid data. Type: list -| | ... +| | | | ... | *Return:* | | ... | - No value returned -| | ... +| | | | ... | *Example:* | | ... | \| When Configure LISP eid address \| ${nodes['DUT1']} \ | | ... | \| ${eid_table} \| -| | ... +| | | | [Arguments] | ${dut_node} | ${set_eid} | | Vpp Set Lisp Eid Table | ${dut_node} | ${set_eid} | LISP eid address should be set correctly to eid table | | [Documentation] | Test if the locator_set is set correctly on the VPP node. -| | ... +| | | | ... | *Arguments:* | | ... | - dut_node - DUT node. Type: dictionary | | ... | - set_eid - Example eid data, which was set to the VPP node. | | ... | Type: list -| | ... +| | | | ... | *Return:* | | ... | - No value returned -| | ... +| | | | ... | _NOTE:_ This KW requires following test case variables: | | ... | - set_eid - Generated eid data, which will be set to the VPP node. -| | ... +| | | | ... | *Example:* | | ... | \| Then LISP eid address should be set correctly to eid table \ | | ... | \| ${nodes['DUT1']} \| ${eid_table} \| -| | ... +| | | | [Arguments] | ${dut_node} | ${set_eid} | | ${show_eid}= | Vpp Show Lisp Eid Table | ${dut_node} | | Lisp Should Be Equal | ${set_eid} | ${show_eid} | Delete all LISP eid address from VPP | | [Documentation] | Delete all lisp eid address from the VPP node. -| | ... +| | | | ... | *Arguments:* | | ... | - dut_node - DUT node. Type: dictionary | | ... | - set_eid - Eid data which will be removed from the VPP node. | | ... | Type: list -| | ... +| | | | ... | *Return:* | | ... | - No value returned -| | ... +| | | | ... | *Example:* | | ... | \| When Delete all LISP eid address from VPP \ | | ... | \| ${nodes['DUT1']} \| ${eid_table} \| -| | ... +| | | | [Arguments] | ${dut_node} | ${set_eid} | | Vpp Unset Lisp Eid Table | ${dut_node} | ${set_eid} | LISP eid table should be empty | | [Documentation] | Test if the eid table is empty. -| | ... +| | | | ... | *Arguments:* | | ... | - dut_node - DUT node. Type: dictionary -| | ... +| | | | ... | *Return:* | | ... | - No value returned -| | ... +| | | | ... | *Example:* | | ... | \| Then LISP eid table should be empty \| ${nodes['DUT1']} \| -| | ... +| | | | [Arguments] | ${dut_node} | | ${show_eid}= | Vpp Show Lisp Eid Table | ${dut_node} | | Lisp Is Empty | ${show_eid} | Configure LISP map resolver address | | [Documentation] | Set the lisp map resolver address in the VPP node. -| | ... +| | | | ... | *Arguments:* | | ... | - dut_node - DUT node. Type: dictionary | | ... | - set_map_resolver - Map resolver data, which will be set on | | ... | the VPP node. Type: list -| | ... +| | | | ... | *Return:* | | ... | - No value returned -| | ... +| | | | ... | *Example:* | | ... | \| When Configure LISP map resolver address \| ${nodes['DUT1']} \ | | ... | \| ${map_resolver} \| -| | ... +| | | | [Arguments] | ${dut_node} | ${set_map_resolver} | | Vpp Set Lisp Map Resolver | ${dut_node} | ${set_map_resolver} | LISP map resolver address should be configured correctly | | [Documentation] | Test if the map resolver address is set correctly | | ... | on the VPP node. -| | ... +| | | | ... | *Arguments:* | | ... | - dut_node - DUT node. Type: dictionary | | ... | - set_map_resolver - Map resolver data, which was set on | | ... | the VPP node. Type: list -| | ... +| | | | ... | *Return:* | | ... | - No value returned -| | ... +| | | | ... | *Example:* | | ... | \| Then LISP map resolver address should be configured correctly \ | | ... | \| ${nodes['DUT1']} \| ${map_resolver} \| -| | ... +| | | | [Arguments] | ${dut_node} | ${set_map_resolver} | | ${show_map_resolver}= | Vpp Show Lisp Map Resolver | ${dut_node} | | Lisp Should Be Equal | ${set_map_resolver} | ${show_map_resolver} | Delete all LISP map resolver address from VPP | | [Documentation] | Delete all lisp map resolver address on the VPP node. -| | ... +| | | | ... | *Arguments:* | | ... | - dut_node - DUT node. Type: dictionary | | ... | - map_resolver - Map resolver data, which will be remove from | | ... | the VPP. Type: list -| | ... +| | | | ... | *Return:* | | ... | - No value returned -| | ... +| | | | ... | *Example:* | | ... | \| When Delete all LISP map resolver address from VPP \ | | ... | \| ${nodes['DUT1']} \| ${map_resolver} \| -| | ... +| | | | [Arguments] | ${dut_node} | ${set_map_resolver} | | Vpp Unset Lisp Map Resolver | ${dut_node} | ${set_map_resolver} | LISP map resolver address should be empty | | [Documentation] | Test if the map resolver are empty. -| | ... +| | | | ... | *Arguments:* | | ... | - dut_node - DUT node. Type: dictionary -| | ... +| | | | ... | *Return:* | | ... | - No value returned -| | ... +| | | | ... | *Example:* | | ... | \| Then LISP map resolver address should be empty \ | | ... | \| ${nodes['DUT1']} \| -| | ... +| | | | [Arguments] | ${dut_node} | | ${show_map_resolver}= | Vpp Show Lisp Map Resolver | ${dut_node} | | Lisp Is Empty | ${show_map_resolver} | Enable LISP | | [Documentation] | Enable LISP on VPP node. -| | ... +| | | | ... | *Arguments:* | | ... | - dut_node - DUT node. Type: dictionary -| | ... +| | | | ... | *Return:* | | ... | - No value returned -| | ... +| | | | ... | *Example:* | | ... | \| Enable LISP \| ${nodes['DUT1']} \| -| | ... +| | | | [Arguments] | ${dut_node} | | Vpp Lisp Enable Disable | ${dut_node} | enable | LISP should be enabled | | [Documentation] | Check if the lisp is enabled. -| | ... +| | | | ... | *Arguments:* | | ... | - dut_node - DUT node. Type: dictionary | | ... | - lisp_status_data - Lisp status data, which was set on | | ... | the VPP node. Type: list -| | ... +| | | | ... | *Return:* | | ... | - No value returned -| | ... +| | | | ... | *Example:* | | ... | \| LISP should be enabled \| ${nodes['DUT1']} \ | | ... | \| ${lisp_status_data} \| -| | ... +| | | | [Arguments] | ${dut_node} | ${lisp_status_data} | | ${show_lisp_stat}= | Vpp Show Lisp State | ${dut_node} | | Lisp Should Be Equal | ${show_lisp_stat} | ${lisp_status_data[1]} | Disable LISP | | [Documentation] | Disable LISP on VPP node. -| | ... +| | | | ... | *Arguments:* | | ... | - dut_node - DUT node. Type: dictionary -| | ... +| | | | ... | *Return:* | | ... | - No value returned -| | ... +| | | | ... | *Example:* | | ... | \| Disable LISP \| ${nodes['DUT1']} \| -| | ... +| | | | [Arguments] | ${dut_node} | | Vpp Lisp Enable Disable | ${dut_node} | disable | LISP Should be disabled | | [Documentation] | LISP Should be disabled. -| | ... +| | | | ... | *Arguments:* | | ... | - dut_node - DUT node. Type: dictionary | | ... | - lisp_status_data - Lisp status data, which was set on | | ... | the VPP node. Type: list -| | ... +| | | | ... | *Return:* | | ... | - No value returned -| | ... +| | | | ... | *Example:* | | ... | \| LISP Should be disabled \| ${nodes['DUT1']} \ | | ... | \| ${lisp_status_data} \| -| | ... +| | | | [Arguments] | ${dut_node} | ${lisp_status_data} | | ${show_lisp_stat}= | Vpp Show Lisp State | ${dut_node} | | Lisp Should Be Equal | ${show_lisp_stat} | ${lisp_status_data[0]} | Enable Lisp Gpe | | [Documentation] | Enable Lisp Gpe on VPP node. -| | ... +| | | | ... | *Arguments:* | | ... | - dut_node - DUT node. Type: dictionary -| | ... +| | | | ... | *Return:* | | ... | - No value returned -| | ... +| | | | ... | *Example:* | | ... | \| Enable Lisp Gpe \| ${nodes['DUT1']} \| -| | ... +| | | | [Arguments] | ${dut_node} | | Vpp Lisp Gpe Enable Disable | ${dut_node} | enable | Disable Lisp Gpe | | [Documentation] | Disable Lisp Gpe on VPP node. -| | ... +| | | | ... | *Arguments:* | | ... | - dut_node - DUT node. Type: dictionary -| | ... +| | | | ... | *Return:* | | ... | - No value returned -| | ... +| | | | ... | *Example:* | | ... | \| Disable Lisp Gpe \| ${nodes['DUT1']} \| -| | ... +| | | | [Arguments] | ${dut_node} | | Vpp Lisp Gpe Enable Disable | ${dut_node} | disable diff --git a/resources/libraries/robot/overlay/lisp_static_adjacency.robot b/resources/libraries/robot/overlay/lisp_static_adjacency.robot index 55dab37d10..a68bb7e747 100644 --- a/resources/libraries/robot/overlay/lisp_static_adjacency.robot +++ b/resources/libraries/robot/overlay/lisp_static_adjacency.robot @@ -18,15 +18,15 @@ | Library | resources.libraries.python.LispSetup.LispLocalEid | Library | resources.libraries.python.LispSetup.LispLocatorSet | Library | resources.libraries.python.LispSetup.LispRemoteMapping -| ... +| | Resource | resources/libraries/robot/overlay/lisp_api.robot -| ... +| | Documentation | Lisp static adjacency suite keywords *** Keywords *** | Configure LISP topology in 3-node circular topology | | [Documentation] | Set up Lisp static adjacency topology. -| | ... +| | | | ... | *Arguments:* | | ... | - dut1_node - DUT1 node. Type: dictionary | | ... | - dut1_int_name - DUT1 node interface name. Type: string @@ -39,17 +39,17 @@ | | ... | - dut2_eid - Dut2 node eid address. Type: dictionary | | ... | - dut1_static_adjacency - Dut1 static adjacency. Type: dictionary | | ... | - dut2_static_adjacency - Dut2 static address. Type: dictionary -| | ... +| | | | ... | *Return:* | | ... | - No value returned -| | ... +| | | | ... | *Example:* | | ... | \| Configure LISP topology in 3-node circular topology \ | | ... | \| ${dut1_node} \| ${interface_name} \| None \ | | ... | \| ${dut2_node} \| ${interface_name} \| None \ | | ... | \| ${locator_set} \| ${dut1_eid} \| ${dut2_eid} \ | | ... | \| ${dut1_static_adjacency} \| ${dut2_static_adjacency} \| -| | ... +| | | | [Arguments] | ${dut1_node} | ${dut1_int_name} | ${dut1_int_index} | | ... | ${dut2_node} | ${dut2_int_name} | ${dut2_int_index} | | ... | ${locator_set} | ${dut1_eid} | ${dut2_eid} @@ -99,7 +99,7 @@ | Change LISP Configuration | | [Documentation] | Change configuration of the Lisp protocol. -| | ... +| | | | ... | *Arguments:* | | ... | - dut1_node - DUT1 node. Type: dictionary | | ... | - dut2_node - DUT2 node. Type: dictionary @@ -118,16 +118,16 @@ | | ... | Type: dictionary | | ... | - new_dut1_static_adjacency - New DUT1 static adjacency. | | ... | Type: dictionary -| | ... +| | | | ... | *Return:* | | ... | - No value returned -| | ... +| | | | ... | *Example:* | | ... | \| Change LISP Configuration \| ${dut1_node} \| ${dut2_node} \ | | ... | \| ${dut1_to_dut2} \| ${dut2_to_dut1} | "08:00:27:20:e0:0d" \ | | ... | \| "08:00:27:b1:94:b1" \| "6.3.0.1" \| "6.3.0.20" \| "24" \ | | ... | \| ${old_dut1_static_adjacency} \| ${new_dut1_static_adjacency} \| -| | ... +| | | | [Arguments] | ${dut1_node} | ${dut2_node} | ${dut1_to_dut2} | | ... | ${dut2_to_dut1} | ${dut1_to_dut2_mac} | ${dut2_to_dut1_mac} | | ... | ${new_dut1_ip} | ${new_dut2_ip} | ${prefix} diff --git a/resources/libraries/robot/overlay/lispgpe.robot b/resources/libraries/robot/overlay/lispgpe.robot index 5c611a56a9..1fa84da721 100644 --- a/resources/libraries/robot/overlay/lispgpe.robot +++ b/resources/libraries/robot/overlay/lispgpe.robot @@ -25,7 +25,7 @@ *** Keywords *** | Configure LISP GPE topology in 3-node circular topology | | [Documentation] | Configure LISP GPE topology in 3-node circular topology. -| | ... +| | | | ... | *Arguments:* | | ... | - dut1_node - DUT1 node. Type: dictionary | | ... | - dut1_if - DUT1 node interface. Type: string @@ -38,23 +38,23 @@ | | ... | - dut2_eid - DUT2 node eid address. Type: dictionary | | ... | - dut1_static_adjacency - DUT1 static adjacency. Type: dictionary | | ... | - dut2_static_adjacency - DUT2 static adjacency. Type: dictionary -| | ... +| | | | ... | *Return:* | | ... | - No value returned -| | ... +| | | | ... | *Example:* | | ... | \| Configure LISP GPE topology in 3-node circular topology \| ${dut1_node} \| ${interface_name} \ | | ... | \| None \| ${dut2_node} \| ${interface_name} \| None \ | | ... | \| ${locator_set} \| ${dut1_eid} \| ${dut2_eid} \ | | ... | \| ${dut1_static_adjacency} \| ${dut2_static_adjacency} \| -| | ... +| | | | [Arguments] | | ... | ${dut1_node} | ${dut1_if} | ${dut1_int_index} | | ... | ${dut2_node} | ${dut2_if} | ${dut2_int_index} | | ... | ${locator_set} | ${dut1_eid} | ${dut2_eid} | | ... | ${dut1_static_adjacency} | ${dut2_static_adjacency} | | ... | ${vni_table}=0 | ${vrf_table}=0 -| | ... +| | # DUT1 settings: | | ${dut1_int_index}= | Run Keyword If | ${dut1_int_index} is None | | | ... | Get Interface Sw Index | ${dut1_node} | ${dut1_if} @@ -89,7 +89,7 @@ | | ... | ${dut1_static_adjacency['prefix']} | | ... | ${dut1_static_adjacency['seid']} | | ... | ${dut1_static_adjacency['prefix']} -| | ... +| | # DUT2 settings: | | ${dut2_int_index}= | Run Keyword If | ${dut2_int_index} is None | | | ... | Get Interface Sw Index | ${dut2_node} | ${dut2_if} diff --git a/resources/libraries/robot/overlay/srv6.robot b/resources/libraries/robot/overlay/srv6.robot index dafc0fe566..8ac0343f9a 100644 --- a/resources/libraries/robot/overlay/srv6.robot +++ b/resources/libraries/robot/overlay/srv6.robot @@ -19,7 +19,7 @@ | Configure SR LocalSID on DUT | | [Documentation] | Create SRv6 LocalSID and binds it to a particular\ | | ... | behavior on the given DUT node. -| | ... +| | | | ... | *Arguments:* | | ... | - dut_node - DUT node where to create localSID on. Type: dictionary | | ... | - local_sid - LocalSID IPv6 address. Type: string @@ -42,9 +42,9 @@ | | ... | to SR-unaware appliance via static proxy). Type: string | | ... | - sid_list - SID list (Optional, default value: []; required for SRv6 | | ... | endpoint to SR-unaware appliance via static proxy). Type: list -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Configure SR LocalSID on DUT \| ${nodes['DUT1']} \| B:: \| end \| | | ... | \| Configure SR LocalSID on DUT \| ${nodes['DUT1']} \| C:: \ | | ... | \| end.dx2 \| interface=GigabitEthernet0/10/0 \| @@ -58,12 +58,12 @@ | | ... | \| Configure SR LocalSID on DUT \| ${nodes['DUT2']} \| E:: \ | | ... | \| end.as \| next_hop=10.0.0.1 \| out_if=DUT2_VHOST1 \ | | ... | \| in_if=DUT2_VHOST2 \| src_addr=B:: \| sid_list=['C::', 'D::'] \| -| | ... +| | | | [Arguments] | ${dut_node} | ${local_sid} | ${behavior} | | ... | ${interface}=${None} | ${next_hop}=${None} | ${fib_table}=${None} | | ... | ${out_if}=${None} | ${in_if}=${None} | ${src_addr}=${None} | | ... | @{sid_list} -| | ... +| | | | Configure SR LocalSID | ${dut_node} | ${local_sid} | ${behavior} | | ... | interface=${interface} | next_hop=${next_hop} | fib_table=${fib_table} | | ... | out_if=${out_if} | in_if=${in_if} | src_addr=${src_addr} @@ -71,55 +71,55 @@ | Show SR LocalSIDs on DUT | | [Documentation] | Show SRv6 LocalSIDs on the given DUT node. -| | ... +| | | | ... | *Arguments:* | | ... | - dut_node - DUT node where to show SR localSIDs on. Type: dictionary -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Show SR LocalSIDs on DUT \| ${nodes['DUT1']} \| -| | ... +| | | | [Arguments] | ${dut_node} -| | ... +| | | | Show SR LocalSIDs | ${dut_node} | Configure SR Policy on DUT | | [Documentation] | Create SRv6 policy on the given DUT node. -| | ... +| | | | ... | *Arguments:* | | ... | - dut_node - DUT node where to create SRv6 policy on. Type: dictionary | | ... | - bsid - BindingSID - local SID IPv6 address. Type: string | | ... | - mode - Encapsulation / insertion mode. Type: string | | ... | - sid_list - SID list. Type: list -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Configure SR Policy on DUT \| ${nodes['DUT2']} \| A:: \| encap \ | | ... | \| B::\| C:: \| | | ... | \| Configure SR Policy on DUT \| ${nodes['DUT2']} \| D:: \| insert \ | | ... | \| E::\| F:: \| -| | ... +| | | | [Arguments] | ${dut_node} | ${bsid} | ${mode} | @{sid_list} -| | ... +| | | | Configure SR Policy | ${dut_node} | ${bsid} | ${sid_list} | mode=${mode} | Show SR Policies on DUT | | [Documentation] | Show SRv6 policies on the given DUT node. -| | ... +| | | | ... | *Arguments:* | | ... | - dut_node - DUT node where to show SR policies on. Type: dictionary -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Show SR Policies on DUT \| ${nodes['DUT1']} \| -| | ... +| | | | [Arguments] | ${dut_node} -| | ... +| | | | Show SR Policies | ${dut_node} | Configure SR Steer on DUT | | [Documentation] | Create SRv6 steering policy on the given DUT node. -| | ... +| | | | ... | *Arguments:* | | ... | - dut_node - DUT node where to create SR steering policy on. | | ... | Type: dictionary @@ -131,99 +131,102 @@ | | ... | in case of L3 mode). Type: string | | ... | - prefix - IP address prefix (Optional, default value: None; required | | ... | for L3 mode). Type: integer -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Configure SR Steer on DUT \| ${nodes['DUT1']} \| L2 \| B:: \ | | ... | \| interface=GigabitEthernet0/10/0 \| | | ... | \| Configure SR Steer on DUT \| ${nodes['DUT1']} \| L3 \| C:: \ | | ... | \| ip_address=2001::1 \| prefix=64 \| -| | ... +| | | | [Arguments] | ${dut_node} | ${mode} | ${bsid} | | ... | ${interface}=${None} | ${ip_addr}=${None} | ${prefix}=${None} -| | ... +| | | | Configure SR Steer | ${dut_node} | ${mode} | ${bsid} | | ... | interface=${interface} | ip_addr=${ip_addr} | prefix=${prefix} | Show SR Steering Policies on DUT | | [Documentation] | Show SRv6 steering policies on the given DUT node. -| | ... +| | | | ... | *Arguments:* | | ... | - dut_node - DUT node where to show SR steering policies on. | | ... | Type: dictionary -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Show SR Steering Policies on DUT \| ${nodes['DUT1']} \| -| | ... +| | | | [Arguments] | ${dut_node} -| | ... +| | | | Show SR Steering Policies | ${dut_node} | Set SR Encaps Source Address on DUT | | [Documentation] | Set SRv6 encapsulation source address on the given DUT | | ... | node. -| | ... +| | | | ... | *Arguments:* | | ... | - dut_node - DUT node where to set SRv6 encapsulation source address | | ... | on. Type: dictionary | | ... | - ip6_addr - Local SID IPv6 address. Type: string -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Set SR Encaps Source Address on DUT \| ${nodes['DUT1']} \| B:: \| -| | ... +| | | | [Arguments] | ${dut_node} | ${ip6_addr} -| | ... +| | | | Set SR Encaps Source Address | ${dut_node} | ip6_addr=${ip6_addr} | Show SR Policies on all DUTs | | [Documentation] | Show SRv6 policies on all DUT nodes in topology. -| | ... +| | | | ... | *Arguments:* | | ... | - nodes - Topology. Type: dictionary -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Show SR Policies on all DUTs \| ${nodes} \| -| | ... +| | | | [Arguments] | ${nodes} -| | ... +| | | | ${duts}= | Get Matches | ${nodes} | DUT* -| | :FOR | ${dut} | IN | @{duts} +| | FOR | ${dut} | IN | @{duts} | | | Show SR Policies | ${nodes['${dut}']} +| | END | Show SR Steering Policies on all DUTs | | [Documentation] | Show SRv6 steering policies on all DUT nodes in topology. -| | ... +| | | | ... | *Arguments:* | | ... | - nodes - Topology. Type: dictionary -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Show SR Steering Policies on all DUTs \| ${nodes} \| -| | ... +| | | | [Arguments] | ${nodes} -| | ... +| | | | ${duts}= | Get Matches | ${nodes} | DUT* -| | :FOR | ${dut} | IN | @{duts} +| | FOR | ${dut} | IN | @{duts} | | | Show SR Steering Policies | ${nodes['${dut}']} +| | END | Show SR LocalSIDs on all DUTs | | [Documentation] | Show SRv6 LocalSIDs on all DUT nodes in topology. -| | ... +| | | | ... | *Arguments:* | | ... | - nodes - Topology. Type: dictionary -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Show SR LocalSIDs on all DUTs \| ${nodes} \| -| | ... +| | | | [Arguments] | ${nodes} -| | ... +| | | | ${duts}= | Get Matches | ${nodes} | DUT* -| | :FOR | ${dut} | IN | @{duts} +| | FOR | ${dut} | IN | @{duts} | | | Show SR LocalSIDs | ${nodes['${dut}']} +| | END | Initialize IPv6 forwarding over SRv6 with encapsulation with '${n}' x SID '${prepos}' decapsulation in 3-node circular topology | | [Documentation] @@ -232,7 +235,7 @@ | | ... | VPP interfaces. Setup IPv6 addresses on all interfaces. Set segment | | ... | routing for IPv6 for required number of SIDs and configure IPv6 routes | | ... | on both DUT nodes. -| | ... +| | | | VPP Interface Set IP Address | | ... | ${dut1} | ${dut1_if1} | ${dut1_if1_ip6} | ${prefix} | | VPP Interface Set IP Address @@ -242,12 +245,13 @@ | | VPP Interface Set IP Address | | ... | ${dut2} | ${dut2_if2} | ${dut2_if2_ip6} | ${prefix} | | Vpp All Ra Suppress Link Layer | ${nodes} -| | :FOR | ${number} | IN RANGE | 2 | ${dst_addr_nr}+2 +| | FOR | ${number} | IN RANGE | 2 | ${dst_addr_nr}+2 | | | ${hexa_nr}= | Convert To Hex | ${number} | | | VPP Add IP Neighbor | ${dut1} | | | ... | ${dut1_if1} | ${tg_if1_ip6_subnet}${hexa_nr} | ${tg_if1_mac} | | | VPP Add IP Neighbor | ${dut2} | | | ... | ${dut2_if2} | ${tg_if2_ip6_subnet}${hexa_nr} | ${tg_if2_mac} +| | END | | VPP Add IP Neighbor | | ... | ${dut1} | ${dut1_if2} | ${dut2_if1_ip6} | ${dut2_if1_mac} | | VPP Add IP Neighbor @@ -314,11 +318,11 @@ | | ... | interfaces. Setup IPv6 addresses on all interfaces. Set segment | | ... | routing for IPv6 with defined behaviour function and configure IPv6 | | ... | routes on both DUT nodes. -| | ... +| | | | ... | *Note:* | | ... | KW uses test variable rxq_count_int set by KW Add worker threads | | ... | and rxqueues to all DUTs -| | ... +| | | | ${sock1}= | Set Variable | memif-DUT1_CNF | | ${sock2}= | Set Variable | memif-DUT2_CNF | | Set up memif interfaces on DUT node | ${dut1} | ${sock1} | ${sock1} @@ -331,8 +335,9 @@ | | ... | ${rxq_count_int} | | VPP Set interface MTU | ${dut2} | ${dut2-memif-1-if1} | | VPP Set interface MTU | ${dut2} | ${dut2-memif-1-if2} -| | :FOR | ${dut} | IN | @{duts} +| | FOR | ${dut} | IN | @{duts} | | | Show Memif | ${nodes['${dut}']} +| | END | | VPP Interface Set IP Address | | ... | ${dut1} | ${dut1_if1} | ${dut1_if1_ip6} | ${prefix} | | VPP Interface Set IP Address diff --git a/resources/libraries/robot/overlay/vxlan.robot b/resources/libraries/robot/overlay/vxlan.robot index f03abdc11a..f98514e2a2 100644 --- a/resources/libraries/robot/overlay/vxlan.robot +++ b/resources/libraries/robot/overlay/vxlan.robot @@ -13,19 +13,19 @@ *** Settings *** | Library | resources.libraries.python.InterfaceUtil -| ... +| | Documentation | VXLAN keywords. *** Keywords *** | Get VXLAN dump | | [Documentation] | Get VXLAN dump. -| | ... +| | | | ... | *Arguments:* | | ... | - node - DUT node data. Type: dictionary | | ... | - interface - Interface on the VPP node (Optional). Type: string -| | ... +| | | | [Arguments] | ${dut_node} | ${interface}=${None} -| | ... +| | | | [Return] | ${vxlan_dump} -| | ... +| | | | ${vxlan_dump}= | VXLAN Dump | ${dut_node} | ${interface} diff --git a/resources/libraries/robot/performance/performance_configuration.robot b/resources/libraries/robot/performance/performance_configuration.robot index 7c7c7bbceb..13acce1524 100644 --- a/resources/libraries/robot/performance/performance_configuration.robot +++ b/resources/libraries/robot/performance/performance_configuration.robot @@ -18,25 +18,25 @@ | Initialize LISP IPv4 forwarding in 3-node circular topology | | [Documentation] | Custom setup of IPv4 addresses on all DUT nodes and TG \ | | ... | Don`t set route. -| | ... +| | | | ... | *Arguments:* | | ... | - dut1_dut2_address - Ip address from DUT1 to DUT2. Type: string | | ... | - dut1_tg_address - Ip address from DUT1 to tg. Type: string | | ... | - dut2_dut1_address - Ip address from DUT2 to DUT1. Type: string | | ... | - dut1_tg_address - Ip address from DUT1 to tg. Type: string | | ... | - duts_prefix - ip prefix. Type: int -| | ... +| | | | ... | *Return:* | | ... | - No value returned -| | ... +| | | | ... | *Example:* | | ... | \| Initialize LISP IPv4 forwarding in 3-node circular topology \ | | ... | \| ${dut1_dut2_address} \| ${dut1_tg_address} \ | | ... | \| ${dut2_dut1_address} \| ${dut2_tg_address} \| ${duts_prefix} \| -| | ... +| | | | [Arguments] | ${dut1_dut2_address} | ${dut1_tg_address} | | ... | ${dut2_dut1_address} | ${dut2_tg_address} | ${duts_prefix} -| | ... +| | | | Set interfaces in path up | | VPP Add IP Neighbor | ${dut1} | ${dut1_if1} | 10.10.10.2 | ${tg_if1_mac} | | VPP Add IP Neighbor @@ -55,20 +55,20 @@ | Initialize LISP GPE IPv4 over IPsec in 3-node circular topology | | [Documentation] | Setup Lisp GPE IPv4 forwarding over IPsec. -| | ... +| | | | ... | *Arguments:* | | ... | - encr_alg - Encryption algorithm. Type: string | | ... | - auth_alg - Authentication algorithm. Type: string -| | ... +| | | | ... | *Return:* | | ... | - No value returned -| | ... +| | | | ... | *Example:* | | ... | \| Initialize LISP GPE IPv4 over IPsec in 3-node circular topology\ | | ... | \| ${encr_alg} \| ${auth_alg} -| | ... +| | | | [Arguments] | ${encr_alg} | ${auth_alg} -| | ... +| | | | Generate keys for IPSec | ${encr_alg} | ${auth_alg} | | Initialize LISP IPv4 forwarding in 3-node circular topology | | ... | ${dut1_to_dut2_ip4} | ${dut1_to_tg_ip4} | ${dut2_to_dut1_ip4} @@ -90,25 +90,25 @@ | Initialize LISP IPv6 forwarding in 3-node circular topology | | [Documentation] | Custom setup of IPv6 topology on all DUT nodes \ | | ... | Don`t set route. -| | ... +| | | | ... | *Arguments:* | | ... | - dut1_dut2_address - Ip address from DUT1 to DUT2. Type: string | | ... | - dut1_tg_address - Ip address from DUT1 to tg. Type: string | | ... | - dut2_dut1_address - Ip address from DUT2 to DUT1. Type: string | | ... | - dut1_tg_address - Ip address from DUT1 to tg. Type: string | | ... | - duts_prefix - ip prefix. Type: int -| | ... +| | | | ... | *Return:* | | ... | - No value returned -| | ... +| | | | ... | *Example:* | | ... | \| Initialize LISP IPv6 forwarding in 3-node circular topology \ | | ... | \| ${dut1_dut2_address} \| ${dut1_tg_address} \ | | ... | \| ${dut2_dut1_address} \| ${dut2_tg_address} \| ${duts_prefix} \| -| | ... +| | | | [Arguments] | ${dut1_dut2_address} | ${dut1_tg_address} | | ... | ${dut2_dut1_address} | ${dut2_tg_address} | ${prefix} -| | ... +| | | | Set interfaces in path up | | VPP Interface Set IP Address | | ... | ${dut1} | ${dut1_if1} | ${dut1_tg_address} | ${prefix} @@ -129,7 +129,7 @@ | Initialize LISP IPv4 over IPv6 forwarding in 3-node circular topology | | [Documentation] | Custom setup of IPv4 over IPv6 topology on all DUT nodes \ | | ... | Don`t set route. -| | ... +| | | | ... | *Arguments:* | | ... | - dut1_dut2_ip6_address - IPv6 address from DUT1 to DUT2. | | ... | Type: string @@ -139,20 +139,20 @@ | | ... | - dut1_tg_ip4_address - IPv4 address from DUT1 to tg. Type: string | | ... | - prefix4 - IPv4 prefix. Type: int | | ... | - prefix6 - IPv6 prefix. Type: int -| | ... +| | | | ... | *Return:* | | ... | - No value returned -| | ... +| | | | ... | *Example:* | | ... | \| Lisp IPv4 over IPv6 forwarding initialized in a 3-node circular \ | | ... | topology \| ${dut1_dut2_ip6_address} \| ${dut1_tg_ip4_address} \ | | ... | \| ${dut2_dut1_ip6_address} \| ${dut2_tg_ip4_address} \ | | ... | \| ${prefix4} \| ${prefix6} \| -| | ... +| | | | [Arguments] | ${dut1_dut2_ip6_address} | ${dut1_tg_ip4_address} | | ... | ${dut2_dut1_ip6_address} | ${dut2_tg_ip4_address} | | ... | ${prefix4} | ${prefix6} -| | ... +| | | | Set interfaces in path up | | VPP Interface Set IP Address | ${dut1} | ${dut1_if1} | | ... | ${dut1_tg_ip4_address} | ${prefix4} @@ -173,7 +173,7 @@ | Initialize LISP IPv6 over IPv4 forwarding in 3-node circular topology | | [Documentation] | Custom setup of IPv4 over IPv6 topology on all DUT nodes \ | | ... | Don`t set route. -| | ... +| | | | ... | *Arguments:* | | ... | - dut1_dut2_ip4_address - IPv4 address from DUT1 to DUT2. | | ... | Type: string @@ -183,20 +183,20 @@ | | ... | - dut1_tg_ip6_address - IPv6 address from DUT1 to tg. Type: string | | ... | - prefix4 - IPv4 prefix. Type: int | | ... | - prefix6 - IPv6 prefix. Type: int -| | ... +| | | | ... | *Return:* | | ... | - No value returned -| | ... +| | | | ... | *Example:* | | ... | \| Lisp IPv6 over IPv4 forwarding initialized in a 3-node circular \ | | ... | topology \| ${dut1_dut2_ip4_address} \| ${dut1_tg_ip6_address} \ | | ... | \| ${dut2_dut1_ip4_address} \| ${dut2_tg_ip6_address} \ | | ... | \| ${prefix6} \| ${prefix4} \| -| | ... +| | | | [Arguments] | ${dut1_dut2_ip4_address} | ${dut1_tg_ip6_address} | | ... | ${dut2_dut1_ip4_address} | ${dut2_tg_ip6_address} | | ... | ${prefix6} | ${prefix4} -| | ... +| | | | Set interfaces in path up | | VPP Interface Set IP Address | | ... | ${dut1} | ${dut1_if1} | ${dut1_tg_ip6_address} | ${prefix6} diff --git a/resources/libraries/robot/performance/performance_limits.robot b/resources/libraries/robot/performance/performance_limits.robot index a80ca2f8d5..82688ac9c6 100644 --- a/resources/libraries/robot/performance/performance_limits.robot +++ b/resources/libraries/robot/performance/performance_limits.robot @@ -21,19 +21,19 @@ | | [Documentation] | | ... | Framesize can be either integer in case of a single packet | | ... | in stream, or set of packets in case of IMIX type or simmilar. -| | ... +| | | | ... | *Arguments:* | | ... | - frame_size - Framesize. Type: integer or string -| | ... +| | | | ... | *Returns:* | | ... | Average frame size. Type: float -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Get Average Frame Size \| IMIX_v4_1 \| -| | ... +| | | | [Arguments] | ${frame_size} -| | ... +| | | | Return From Keyword If | '${frame_size}' == 'IMIX_v4_1' | ${353.83333} | | ${frame_size} = | Convert To Number | ${frame_size} | | Return From Keyword | ${frame_size} @@ -50,31 +50,31 @@ | | ... | whitelisted NIC names. | | ... | The mapping is hardcoded in nic_limits.yaml | | ... | TODO: Make the mapping from NIC names case insensistive. -| | ... +| | | | ... | TODO: Make pps limit also definable per NIC. -| | ... +| | | | ... | This keyword computes maximal unidirectional transmit rate | | ... | and jumbo boolean (some suites need that for configuration decisions). | | ... | To streamline suite autogeneration, both input and output values | | ... | are communicated as test (or broader scope) variables, | | ... | instead of explicit arguments and return values. -| | ... +| | | | ... | *Test (or broader scope) variables read:* -| | ... | - nic_name - Name of bottleneck NIC. Type: string -| | ... | - overhead - Overhead in bytes. Default: 0. Type: integer -| | ... | - frame_size - L2 Frame Size [B] or IMIX string. Type: int or str -| | ... +| | ... | - nic_name - Name of bottleneck NIC. Type: string +| | ... | - overhead - Overhead in bytes. Default: 0. Type: integer +| | ... | - frame_size - L2 Frame Size [B] or IMIX string. Type: int or str +| | | | ... | *Test variables set:* -| | ... | - max_rate - Calculated unidirectional maximal transmit rate [pps]. -| | ... | Type: float -| | ... | - jumbo - Jumbo boolean, true if jumbo packet support -| | ... | has to be enabled. Type: boolean -| | ... +| | ... | - max_rate - Calculated unidirectional maximal transmit rate [pps]. +| | ... | Type: float +| | ... | - jumbo - Jumbo boolean, true if jumbo packet support has to be +| | ... | enabled. Type: boolean +| | | | ... | *Example:* -| | ... +| | | | ... | \| Set test Variable \| \${frame_size} \| IMIX_v4_1 \| | | ... | \| Set Max Rate And Jumbo \| -| | ... +| | | | # Negative overhead is possible, if DUT-DUT traffic is less encapsulated | | # than TG-DUT traffic. | | # TODO: Re-check overhead values in suites with both traffics encapsulated. diff --git a/resources/libraries/robot/performance/performance_utils.robot b/resources/libraries/robot/performance/performance_utils.robot index f917a0c0cd..eac7fe0075 100644 --- a/resources/libraries/robot/performance/performance_utils.robot +++ b/resources/libraries/robot/performance/performance_utils.robot @@ -24,7 +24,7 @@ | Library | resources.libraries.python.TrafficGenerator.TGDropRateSearchImpl | Library | resources.libraries.python.Trace | Variables | resources/libraries/python/Constants.py -| ... +| | Documentation | ... | Performance suite keywords - utilities to find and verify NDR and PDR. @@ -38,19 +38,19 @@ | | ... | Input rates are understood as uni-directional, | | ... | reported result contains aggregate rates. | | ... | Currently, the min_rate value is hardcoded to match test teardowns. -| | ... +| | | | ... | TODO: Should the trial duration of the additional | | ... | measurements be configurable? -| | ... +| | | | ... | Some inputs are read from variables to streamline suites. -| | ... +| | | | ... | *Test (or broader scope) variables read:* | | ... | - traffic_profile - Name of module defining traffc for measurements. | | ... | Type: string | | ... | - frame_size - L2 Frame Size [B] or IMIX string. Type: int or str | | ... | - max_rate - Calculated unidirectional maximal transmit rate [pps]. | | ... | Type: float -| | ... +| | | | ... | *Arguments:* | | ... | - packet_loss_ratio - Accepted loss during search. Type: float | | ... | - final_relative_width - Maximal width multiple of upper. Type: float @@ -61,19 +61,19 @@ | | ... | - doublings - How many doublings to do when expanding [1]. Type: int | | ... | - traffic_directions - Bi- (2) or uni- (1) directional traffic. | | ... | Type: int -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Find NDR and PDR intervals using optimized search \| \${0.005} \ | | ... | \| \${0.005} \| \${30.0} \| \${1.0} \| \${2} \| \${600.0} \| \${2} \ | | ... | \| \${2} \| -| | ... +| | | | [Arguments] | ${packet_loss_ratio}=${0.005} | | ... | ${final_relative_width}=${0.005} | ${final_trial_duration}=${30.0} | | ... | ${initial_trial_duration}=${1.0} | | ... | ${number_of_intermediate_phases}=${2} | ${timeout}=${720.0} | | ... | ${doublings}=${2} | ${traffic_directions}=${2} -| | ... +| | | | ${result} = | Perform optimized ndrpdr search | ${frame_size} | | ... | ${traffic_profile} | ${10000} | ${max_rate} | | ... | ${packet_loss_ratio} | ${final_relative_width} @@ -91,17 +91,17 @@ | | [Documentation] | | ... | Display the number of packets lost (bidirectionally) | | ... | due to reconfiguration under traffic. -| | ... +| | | | ... | *Arguments:* | | ... | - result - Result of bidirectional measurtement. -| | ... | Type: ReceiveRateMeasurement -| | ... +| | ... | Type: ReceiveRateMeasurement +| | | | ... | *Example:* -| | ... +| | | | ... | \| Display Reconfig Test Message \| \${result} \| -| | ... +| | | | [Arguments] | ${result} -| | ... +| | | | Set Test Message | Packets lost due to reconfig: ${result.loss_count} | | ${time_lost} = | Evaluate | ${result.loss_count} / ${result.target_tr} | | Set Test Message | ${\n}Implied time lost: ${time_lost} | append=yes @@ -112,19 +112,19 @@ | | ... | aggregate throughput using MLRsearch algorithm. | | ... | Input rates are understood as uni-directional. | | ... | Currently, the min_rate value is hardcoded to match test teardowns. -| | ... +| | | | ... | TODO: Should the trial duration of the additional | | ... | measurements be configurable? -| | ... +| | | | ... | Some inputs are read from variables to streamline suites. -| | ... +| | | | ... | *Test (or broader scope) variables read:* | | ... | - traffic_profile - Name of module defining traffc for measurements. | | ... | Type: string | | ... | - frame_size - L2 Frame Size [B] or IMIX string. Type: int or str | | ... | - max_rate - Calculated unidirectional maximal transmit rate [pps]. | | ... | Type: float -| | ... +| | | | ... | *Arguments:* | | ... | - packet_loss_ratio - Accepted loss during search. Type: float | | ... | - final_relative_width - Maximal width multiple of upper. Type: float @@ -135,22 +135,22 @@ | | ... | - doublings - How many doublings to do when expanding [1]. Type: int | | ... | - traffic_directions - Bi- (2) or uni- (1) directional traffic. | | ... | Type: int -| | ... +| | | | ... | *Returns:* | | ... | - Lower bound for bi-directional throughput at given PLR. Type: float -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| \${throughpt}= \| Find Throughput Using MLRsearch \| \${0} \ | | ... | \| \${0.001} \| \${10.0}\| \${1.0} \| \${1} \| \${720.0} \| \${2} \ | | ... | \| \${2} \| -| | ... +| | | | [Arguments] | ${packet_loss_ratio}=${0.0} | | ... | ${final_relative_width}=${0.001} | ${final_trial_duration}=${10.0} | | ... | ${initial_trial_duration}=${1.0} | | ... | ${number_of_intermediate_phases}=${1} | ${timeout}=${720.0} | | ... | ${doublings}=${2} | ${traffic_directions}=${2} -| | ... +| | | | ${result} = | Perform optimized ndrpdr search | ${frame_size} | | ... | ${traffic_profile} | ${10000} | ${max_rate} | | ... | ${packet_loss_ratio} | ${final_relative_width} @@ -169,28 +169,28 @@ | | ... | reported result contains aggregate rates. | | ... | Currently, the min_rate value is hardcoded to match test teardowns. | | ... | Some inputs are read from variables to streamline suites. -| | ... +| | | | ... | *Test (or broader scope) variables read:* | | ... | - traffic_profile - Name of module defining traffc for measurements. | | ... | Type: string | | ... | - frame_size - L2 Frame Size [B] or IMIX string. Type: int or str | | ... | - max_rate - Calculated unidirectional maximal transmit rate [pps]. | | ... | Type: float -| | ... +| | | | ... | *Arguments:* | | ... | - packet_loss_ratio - Accepted loss during search. Type: float | | ... | - timeout - Stop when search duration is longer [s]. Type: float | | ... | - traffic_directions - Bi- (2) or uni- (1) directional traffic. | | ... | Type: int -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Find critical load using PLR search \| \${1e-7} \| \${120} \ | | ... | \| \${2} \| -| | ... +| | | | [Arguments] | ${packet_loss_ratio}=${1e-7} | ${timeout}=${1800.0} | | ... | ${traffic_directions}=${2} -| | ... +| | | | ${min_rate} = | Set Variable | ${10000} | | ${average} | ${stdev} = | Perform soak search | ${frame_size} | | ... | ${traffic_profile} | ${min_rate} | ${max_rate} @@ -211,20 +211,20 @@ | | ... | Bandwidth is calculated as: | | ... | (Throughput * (L2 Frame Size + IPG) * 8) | | ... | The given result should contain latency data as well. -| | ... +| | | | ... | *Arguments:* | | ... | - text - Flavor text describing which bound is this. Type: string | | ... | - rate_total - Total (not per stream) measured Tr [pps]. Type: float | | ... | - frame_size - L2 Frame Size [B]. Type: integer | | ... | - latency - Latency data to display if non-empty. Type: string -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Display single bound \| NDR lower bound \| \${12345.67} \ | | ... | \| \${64} \| show_latency=\${EMPTY} \| -| | ... +| | | | [Arguments] | ${text} | ${rate_total} | ${frame_size} | ${latency}=${EMPTY} -| | ... +| | | | ${bandwidth_total} = | Evaluate | ${rate_total} * (${frame_size}+20)*8 / 1e9 | | Set Test Message | ${\n}${text}: ${rate_total} pps, | append=yes | | Set Test Message | ${bandwidth_total} Gbps (initial) | append=yes @@ -242,18 +242,18 @@ | | ... | Bandwidth is calculated as: | | ... | (Throughput * (L2 Frame Size + IPG) * 8) | | ... | The given result should contain latency data as well. -| | ... +| | | | ... | *Test (or broader scope) variables read:* | | ... | - frame_size - L2 Frame Size [B] or IMIX string. Type: int or str | | ... | *Arguments:* | | ... | - result - Measured result data per stream [pps]. Type: NdrPdrResult -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Display result of NDRPDR search \| \${result} \| -| | ... +| | | | [Arguments] | ${result} -| | ... +| | | | ${frame_size} = | Get Average Frame Size | ${frame_size} | | Display single bound | NDR_LOWER | | ... | ${result.ndr_interval.measured_low.transmit_rate} | ${frame_size} @@ -277,22 +277,22 @@ | | ... | (Throughput * (L2 Frame Size + IPG) * 8) | | ... | TODO: Do we want to report some latency data, | | ... | even if not measured at the reported bounds?. -| | ... +| | | | ... | *Test (or broader scope) variables read:* | | ... | - frame_size - L2 Frame Size [B] or IMIX string. Type: int or str | | ... | *Arguments:* | | ... | - avg - Estimated average critical load [pps]. Type: float | | ... | - stdev - Standard deviation of critical load [pps]. Type: float -| | ... +| | | | ... | *Returns:* | | ... | - Lower and upper bound of critical load [pps]. Type: 2-tuple of float -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Display result of soak search \| \${100000} \| \${100} \| -| | ... +| | | | [Arguments] | ${avg} | ${stdev} -| | ... +| | | | ${frame_size} = | Get Average Frame Size | ${frame_size} | | ${avg} = | Convert To Number | ${avg} | | ${stdev} = | Convert To Number | ${stdev} @@ -306,18 +306,18 @@ | | [Documentation] | | ... | Extract loss ratio of lower bound of the interval. | | ... | Fail if it does not reach the allowed value. -| | ... +| | | | ... | *Arguments:* | | ... | - interval - Measured interval. Type: ReceiveRateInterval | | ... | - packet_loss_ratio - Accepted loss (0.0 for NDR). Type: float -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Check NDRPDR interval validity \| \${result.pdr_interval} \ | | ... | \| \${0.005} \| -| | ... +| | | | [Arguments] | ${interval} | ${packet_loss_ratio}=${0.0} -| | ... +| | | | ${lower_bound} = | Set Variable | ${interval.measured_low} | | ${lower_bound_lf} = | Set Variable | ${lower_bound.loss_fraction} | | Return From Keyword If | ${lower_bound_lf} <= ${packet_loss_ratio} @@ -337,21 +337,21 @@ | | ... | additional data for debug purposes. | | ... | Currently, just "Traffic should pass with no loss" is called. | | ... | TODO: Move latency measurements from optimized search here. -| | ... +| | | | ... | *Arguments:* | | ... | - result - Measured result data per stream [pps]. Type: NdrPdrResult | | ... | - frame_size - L2 Frame Size [B] or IMIX string. Type: int or str | | ... | - traffic_profile - Topology profile. Type: string | | ... | - traffic_directions - Bi- (2) or uni- (1) directional traffic. | | ... | Type: int -| | ... +| | | | ... | *Example:* | | ... | \| Perform additional measurements based on NDRPDR result \ | | ... | \| \${result} \| \${64} \| 3-node-IPv4 \| \${2} \| -| | ... +| | | | [Arguments] | ${result} | ${framesize} | ${traffic_profile} | | ... | ${traffic_directions}=${2} -| | ... +| | | | ${duration}= | Set Variable | ${2.0} | | ${rate_sum}= | Set Variable | ${result.ndr_interval.measured_low.target_tr} | | ${rate_per_stream}= | Evaluate | ${rate_sum} / float(${traffic_directions}) @@ -363,7 +363,7 @@ | | [Documentation] | | ... | Send traffic at specified rate. No packet loss is accepted at loss | | ... | evaluation. -| | ... +| | | | ... | *Arguments:* | | ... | - duration - Duration of traffic run [s]. Type: integer | | ... | - rate - Rate for sending packets. Type: string @@ -374,15 +374,15 @@ | | ... | Type: boolean | | ... | - traffic_directions - Bi- (2) or uni- (1) directional traffic. | | ... | Type: int -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Traffic should pass with no loss \| \${10} \| 4.0mpps \| \${64} \ | | ... | \| 3-node-IPv4 \| \${2} \| -| | ... +| | | | [Arguments] | ${duration} | ${rate} | ${frame_size} | ${traffic_profile} | | ... | ${fail_on_loss}=${True} | ${traffic_directions}=${2} -| | ... +| | | | Send traffic at specified rate | ${duration} | ${rate} | ${frame_size} | | ... | ${traffic_profile} | traffic_directions=${traffic_directions} | | Run Keyword If | ${fail_on_loss} | No traffic loss occurred @@ -390,16 +390,16 @@ | Traffic should pass with maximum rate | | [Documentation] | | ... | Send traffic at maximum rate. -| | ... +| | | | ... | Some inputs are read from variables to streamline suites. -| | ... +| | | | ... | *Test (or broader scope) variables read:* | | ... | - traffic_profile - Name of module defining traffc for measurements. | | ... | Type: string | | ... | - frame_size - L2 Frame Size [B] or IMIX string. Type: int or str | | ... | - max_rate - Calculated unidirectional maximal transmit rate [pps]. | | ... | Type: float -| | ... +| | | | ... | *Arguments:* | | ... | - subsamples - How many trials in this measurement. Type: int | | ... | - trial_duration - Duration of single trial [s]. Type: float @@ -408,16 +408,16 @@ | | ... | Type: int | | ... | - tx_port - TX port of TG, default 0. Type: integer | | ... | - rx_port - RX port of TG, default 1. Type: integer -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Traffic should pass with maximum rate \| \${1} \| \${10.0} \ | | ... | \| \${False} \| \${2} \| \${0} \| \${1} \| -| | ... +| | | | [Arguments] | ${trial_duration}=${PERF_TRIAL_DURATION} | | ... | ${fail_no_traffic}=${True} | ${subsamples}=${PERF_TRIAL_MULTIPLICITY} | | ... | ${traffic_directions}=${2} | ${tx_port}=${0} | ${rx_port}=${1} -| | ... +| | | | ${results} = | Send traffic at specified rate | ${trial_duration} | | ... | ${max_rate}pps | ${frame_size} | ${traffic_profile} | ${subsamples} | | ... | ${traffic_directions} | ${tx_port} | ${rx_port} @@ -433,7 +433,7 @@ | | ... | Send traffic at specified rate. | | ... | Return list of measured receive rates. | | ... | The rate argument should be TRex friendly, so it should include "pps". -| | ... +| | | | ... | *Arguments:* | | ... | - trial_duration - Duration of single trial [s]. Type: float | | ... | - rate - Rate for sending packets. Type: string @@ -446,16 +446,16 @@ | | ... | - tx_port - TX port of TG, default 0. Type: integer | | ... | - rx_port - RX port of TG, default 1. Type: integer | | ... | - pkt_trace - True to enable packet trace. Type: boolean -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Send traffic at specified rate \| \${1.0} \| 4.0mpps \| \${64} \ | | ... | \| 3-node-IPv4 \| \${10} \| \${2} \| \${0} | \${1} \| \${False} -| | ... +| | | | [Arguments] | ${trial_duration} | ${rate} | ${frame_size} | | ... | ${traffic_profile} | ${subsamples}=${1} | ${traffic_directions}=${2} | | ... | ${tx_port}=${0} | ${rx_port}=${1} | ${pkt_trace}=${False} -| | ... +| | | | Clear and show runtime counters with running traffic | ${trial_duration} | | ... | ${rate} | ${frame_size} | ${traffic_profile} | | ... | ${traffic_directions} | ${tx_port} | ${rx_port} @@ -466,7 +466,7 @@ | | Run Keyword If | ${dut_stats}==${True} | | ... | VPP enable elog traces on all DUTs | ${nodes} | | ${results} = | Create List -| | :FOR | ${i} | IN RANGE | ${subsamples} +| | FOR | ${i} | IN RANGE | ${subsamples} | | | # The following line is skipping some default arguments, | | | # that is why subsequent arguments have to be named. | | | Send traffic on tg | ${trial_duration} | ${rate} | ${frame_size} @@ -476,6 +476,7 @@ | | | ${rx} = | Get Received | | | ${rr} = | Evaluate | ${rx} / ${trial_duration} | | | Append To List | ${results} | ${rr} +| | END | | Run Keyword If | ${dut_stats}==${True} | Show event logger on all DUTs | | ... | ${nodes} | | Run Keyword If | ${dut_stats}==${True} | Show statistics on all DUTs @@ -489,7 +490,7 @@ | | ... | Start traffic at specified rate then clear runtime counters on all | | ... | DUTs. Wait for specified amount of time and capture runtime counters | | ... | on all DUTs. Finally stop traffic -| | ... +| | | | ... | *Arguments:* | | ... | - duration - Duration of traffic run [s]. Type: integer | | ... | - rate - Unidirectional rate for sending packets. Type: string @@ -500,15 +501,15 @@ | | ... | Type: int | | ... | - tx_port - TX port of TG, default 0. Type: integer | | ... | - rx_port - RX port of TG, default 1. Type: integer -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Clear and show runtime counters with running traffic \| \${10} \ | | ... | \| 4.0mpps \| \${64} \| 3-node-IPv4 \| \${2} \| \${0} \| \${1} \| -| | ... +| | | | [Arguments] | ${duration} | ${rate} | ${frame_size} | ${traffic_profile} | | ... | ${traffic_directions}=${2} | ${tx_port}=${0} | ${rx_port}=${1} -| | ... +| | | | # Duration of -1 means we will stop traffic manually. | | Send traffic on tg | ${-1} | ${rate} | ${frame_size} | ${traffic_profile} | | ... | warmup_time=${0} | async_call=${True} | latency=${False} @@ -524,13 +525,13 @@ | Start Traffic on Background | | [Documentation] | | ... | Start traffic at specified rate then return control to Robot. -| | ... +| | | | ... | This keyword is useful if the test needs to do something | | ... | while traffic is running. | | ... | Just a wrapper around L1 keyword. | | ... | | | ... | TODO: How to make sure the traffic is stopped on any failure? -| | ... +| | | | ... | *Test (or broader scope) variables read:* | | ... | - traffic_profile - Name of module defining traffc for measurements. | | ... | Type: string @@ -541,15 +542,15 @@ | | ... | Type: int | | ... | - tx_port - TX port of TG, default 0. Type: integer | | ... | - rx_port - RX port of TG, default 1. Type: integer -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Start Traffic on Background \| 4.0mpps \| \${2} \| \${0} \ | | ... | \| \${1} \| -| | ... +| | | | [Arguments] | ${rate} | ${traffic_directions}=${2} | ${tx_port}=${0} | | ... | ${rx_port}=${1} -| | ... +| | | | # Duration of -1 means we will stop traffic manually. | | Send traffic on tg | ${-1} | ${rate} | ${frame_size} | ${traffic_profile} | | ... | warmup_time=${0} | async_call=${True} | latency=${False} @@ -560,17 +561,17 @@ | | [Documentation] | | ... | Stop the running traffic, return measurement result. | | ... | For bidirectional traffic, the reported values are bi-directional. -| | ... +| | | | ... | Just a wrapper around L1 keyword. | | ... | | | ... | TODO: Tolerate if traffic was not started. -| | ... +| | | | ... | *Returns:* | | ... | - Measurement result. Type: ReceiveRateMeasurement -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \${result}= \| Stop Running Traffic \| -| | ... +| | | | ${result}= | Stop traffic on tg | | Return From Keyword | ${result} diff --git a/resources/libraries/robot/shared/container.robot b/resources/libraries/robot/shared/container.robot index f440768df5..0b5cd3ee2b 100644 --- a/resources/libraries/robot/shared/container.robot +++ b/resources/libraries/robot/shared/container.robot @@ -13,7 +13,7 @@ *** Settings *** | Documentation | Keywords related to linux containers -| ... +| | Library | resources.libraries.python.CpuUtils | Library | resources.libraries.python.topology.Topology | Variables | resources/libraries/python/Constants.py @@ -21,7 +21,7 @@ *** Keywords *** | Construct container on all DUTs | | [Documentation] | Construct 1 CNF of specific technology on all DUT nodes. -| | ... +| | | | ... | *Arguments:* | | ... | - nf_chains: Total number of chains (Optional). Type: integer, default | | ... | value: ${1} @@ -30,27 +30,28 @@ | | ... | - nf_chain: Chain ID (Optional). Type: integer, default value: ${1} | | ... | - nf_node: Node ID (Optional). Type: integer, default value: ${1} | | ... | - auto_scale - If True, use same amount of Dataplane threads for -| | ... | network function as DUT, otherwise use single physical core for -| | ... | every network function. Type: boolean +| | ... | network function as DUT, otherwise use single physical core for +| | ... | every network function. Type: boolean | | ... | - pinning: Set True if CPU pinning should be done on starting -| | ... | containers. Type: boolean, default value: ${False} -| | ... +| | ... | containers. Type: boolean, default value: ${False} +| | | | ... | *Example:* -| | ... +| | | | ... | \| Construct container on all DUTs \| 1 \| 1 \| 1 \| 1 \| ${True} \| -| | ... +| | | | [Arguments] | ${nf_chains}=${1} | ${nf_nodes}=${1} | ${nf_chain}=${1} | | ... | ${nf_node}=${1} | ${auto_scale}=${True} | ${pinning}=${True} -| | ... +| | | | ${duts}= | Get Matches | ${nodes} | DUT* -| | :FOR | ${dut} | IN | @{duts} +| | FOR | ${dut} | IN | @{duts} | | | Run Keyword | Construct container on DUT | ${dut} | | | ... | ${nf_chains} | ${nf_nodes} | ${nf_chain} | | | ... | ${nf_node} | ${auto_scale} | ${pinning} +| | END | Construct container on DUT | | [Documentation] | Construct 1 CNF of specific technology on specific DUT. -| | ... +| | | | ... | *Arguments:* | | ... | - dut: DUT node to construct the CNF on. Type: string | | ... | - nf_chains: Total number of chains (Optional). Type: integer, default @@ -60,20 +61,20 @@ | | ... | - nf_chain: Chain ID (Optional). Type: integer, default value: ${1} | | ... | - nf_node: Node ID (Optional). Type: integer, default value: ${1} | | ... | - auto_scale - If True, use same amount of Dataplane threads for -| | ... | network function as DUT, otherwise use single physical core for -| | ... | every network function. Type: boolean +| | ... | network function as DUT, otherwise use single physical core for +| | ... | every network function. Type: boolean | | ... | - pinning: Set True if CPU pinning should be done on starting -| | ... | containers. Type: boolean, default value: ${False} -| | ... +| | ... | containers. Type: boolean, default value: ${False} +| | | | ... | *Example:* -| | ... +| | | | ... | \| Construct container on DUT \| DUT1 \| 1 \| 1 \| 1 \| 1 \| | | ... | \| ${True} \| -| | ... +| | | | [Arguments] | ${dut} | | ... | ${nf_chains}=${1} | ${nf_nodes}=${1} | ${nf_chain}=${1} | | ... | ${nf_node}=${1} | ${auto_scale}=${True} | ${pinning}=${True} -| | ... +| | | | ${nf_dtcr_status} | ${value}= | Run Keyword And Ignore Error | | ... | Variable Should Exist | ${nf_dtcr} | | ${nf_dtcr}= | Run Keyword If | '${nf_dtcr_status}' == 'PASS' @@ -112,27 +113,27 @@ | Construct chain of containers | | [Documentation] | Construct 1 chain of 1..N CNFs on selected/all DUT nodes. -| | ... +| | | | ... | *Arguments:* | | ... | - dut: DUT node to start the containers on. Run on all nodes if None. -| | ... | Type: string or None +| | ... | Type: string or None | | ... | - nf_chains: Total number of chains. Type: integer | | ... | - nf_nodes: Total number of nodes per chain. Type: integer | | ... | - nf_chain: Chain ID. Type: integer | | ... | - auto_scale - If True, use same amount of Dataplane threads for -| | ... | network function as DUT, otherwise use single physical core for -| | ... | every network function. Type: boolean +| | ... | network function as DUT, otherwise use single physical core for +| | ... | every network function. Type: boolean | | ... | - pinning: Set True if CPU pinning should be done on starting -| | ... | containers. Type: boolean, default value: ${False} -| | ... +| | ... | containers. Type: boolean, default value: ${False} +| | | | ... | *Example:* -| | ... +| | | | ... | \| Construct chain of containers \| 1 \| 1 \| 1 \| ${True} \| -| | ... +| | | | [Arguments] | ${dut}=${None} | ${nf_chains}=${1} | ${nf_nodes}=${1} | | ... | ${nf_chain}=${1} | ${auto_scale}=${True} | ${pinning}=${True} -| | ... -| | :FOR | ${nf_node} | IN RANGE | 1 | ${nf_nodes}+1 +| | +| | FOR | ${nf_node} | IN RANGE | 1 | ${nf_nodes}+1 | | | Run Keyword If | '${dut}' == '${None}' | | | ... | Construct container on all DUTs | | | ... | nf_chains=${nf_chains} | nf_nodes=${nf_nodes} | nf_chain=${nf_chain} @@ -141,68 +142,70 @@ | | | ... | Construct container on DUT | ${dut} | | | ... | nf_chains=${nf_chains} | nf_nodes=${nf_nodes} | nf_chain=${nf_chain} | | | ... | nf_node=${nf_node} | auto_scale=${auto_scale} | pinning=${pinning} +| | END | Construct chains of containers | | [Documentation] | Construct 1..N chains of 1..N CNFs on selected/all DUT | | ... | nodes. -| | ... +| | | | ... | *Arguments:* | | ... | - dut: DUT node to start the containers on. Run on all nodes if None. -| | ... | Type: string or None +| | ... | Type: string or None | | ... | - nf_chains: Total number of chains (Optional). Type: integer, default -| | ... | value: ${1} +| | ... | value: ${1} | | ... | - nf_nodes: Total number of nodes per chain (Optional). Type: integer, -| | ... | default value: ${1} +| | ... | default value: ${1} | | ... | - auto_scale - If True, use same amount of Dataplane threads for -| | ... | network function as DUT, otherwise use single physical core for -| | ... | every network function. Type: boolean +| | ... | network function as DUT, otherwise use single physical core for +| | ... | every network function. Type: boolean | | ... | - pinning: Set True if CPU pinning should be done on starting -| | ... | containers. Type: boolean, default value: ${True} -| | ... +| | ... | containers. Type: boolean, default value: ${True} +| | | | ... | *Example:* -| | ... +| | | | ... | \| Construct chains of containers \| 1 \| 1 \| -| | ... +| | | | [Arguments] | ${dut}=${None} | ${nf_chains}=${1} | ${nf_nodes}=${1} | | ... | ${auto_scale}=${True} | ${pinning}=${True} -| | ... -| | :FOR | ${nf_chain} | IN RANGE | 1 | ${nf_chains}+1 +| | +| | FOR | ${nf_chain} | IN RANGE | 1 | ${nf_chains}+1 | | | Construct chain of containers | | | ... | dut=${dut} | nf_chains=${nf_chains} | nf_nodes=${nf_nodes} | | | ... | nf_chain=${nf_chain} | auto_scale=${auto_scale} | pinning=${pinning} +| | END | Acquire all '${group}' containers | | [Documentation] | Acquire all container(s) in specific container group on | | ... | all DUT nodes. -| | ... +| | | | Run Keyword | ${group}.Acquire all containers | Create all '${group}' containers | | [Documentation] | Create/deploy all container(s) in specific container group | | ... | on all DUT nodes. -| | ... +| | | | Run Keyword | ${group}.Create all containers | Start VPP in all '${group}' containers | | [Documentation] | Start VPP on all container(s) in specific container | | ... | group on all DUT nodes. -| | ... +| | | | Run Keyword | ${group}.Start VPP In All Containers | Restart VPP in all '${group}' containers | | [Documentation] | Restart VPP on all container(s) in specific container | | ... | group on all DUT nodes. -| | ... +| | | | Run Keyword | ${group}.Restart VPP In All Containers | Configure VPP in all '${group}' containers | | [Documentation] | Configure VPP on all container(s) in specific container | | ... | group on all DUT nodes. -| | ... +| | | | ... | *Test (or broader scope) variables read:* -| | ... | - container_chain_topology - Topology type used for configuring CNF -| | ... | (VPP) in container. Type: string -| | ... +| | ... | - container_chain_topology - Topology type used for configuring CNF +| | ... | (VPP) in container. Type: string +| | | | ${dut1_if2} = | Get Variable Value | \${dut1_if2} | ${None} | | ${dut2_if2} = | Get Variable Value | \${dut2_if2} | ${None} | | Run Keyword If | '${container_chain_topology}' == 'chain_ip4' @@ -227,37 +230,37 @@ | Stop all '${group}' containers | | [Documentation] | Stop all container(s) in specific container group on all | | ... | DUT nodes. -| | ... +| | | | Run Keyword | ${group}.Stop all containers | Destroy all '${group}' containers | | [Documentation] | Destroy all container(s) in specific container group on | | ... | all DUT nodes. -| | ... +| | | | Run Keyword | ${group}.Destroy all containers | Start containers for test | | [Documentation] | | ... | Start containers for test. -| | ... +| | | | ... | *Arguments:* | | ... | - dut: DUT node to start the containers on. Run on all nodes if None. -| | ... | Type: string or None +| | ... | Type: string or None | | ... | - nf_chains: Total number of chains. Type: integer | | ... | - nf_nodes: Total number of nodes per chain. Type: integer | | ... | - auto_scale - If True, use same amount of Dataplane threads for -| | ... | network function as DUT, otherwise use single physical core for -| | ... | every network function. Type: boolean +| | ... | network function as DUT, otherwise use single physical core for +| | ... | every network function. Type: boolean | | ... | - pinning: Set True if CPU pinning should be done on starting -| | ... | containers. Type: boolean, default value: ${False} -| | ... +| | ... | containers. Type: boolean, default value: ${False} +| | | | ... | *Example:* -| | ... +| | | | ... | \| Start containers for test \| 1 \| 1 \| -| | ... +| | | | [Arguments] | ${dut}=${None} | ${nf_chains}=${1} | ${nf_nodes}=${1} | | ... | ${auto_scale}=${True} | ${pinning}=${True} -| | ... +| | | | Set Test Variable | @{container_groups} | @{EMPTY} | | Set Test Variable | ${container_group} | CNF | | Set Test Variable | ${nf_nodes} diff --git a/resources/libraries/robot/shared/default.robot b/resources/libraries/robot/shared/default.robot index c0b61fcea9..26fcbb0c3f 100644 --- a/resources/libraries/robot/shared/default.robot +++ b/resources/libraries/robot/shared/default.robot @@ -15,11 +15,11 @@ | Variables | resources/libraries/python/topology.py | Variables | resources/libraries/python/PapiHistory.py | Variables | resources/libraries/python/Constants.py -| ... +| | Library | Collections | Library | OperatingSystem | Library | String -| ... +| | Library | resources.libraries.python.Classify | Library | resources.libraries.python.CpuUtils | Library | resources.libraries.python.CoreDumpUtil @@ -40,7 +40,7 @@ | Library | resources.libraries.python.Trace | Library | resources.libraries.python.VppCounters | Library | resources.libraries.python.VPPUtil -| ... +| | Resource | resources/libraries/robot/lb/load_balancer.robot | Resource | resources/libraries/robot/crypto/ipsec.robot | Resource | resources/libraries/robot/features/acl.robot @@ -77,45 +77,46 @@ | | [Documentation] | Verify if Crypto QAT device virtual functions are | | ... | initialized on all DUTs. If parameter force_init is set to True, then | | ... | try to initialize/disable. -| | ... +| | | | ... | *Arguments:* | | ... | - crypto_type - Crypto device type - HW_DH895xcc or HW_C3xxx. | | ... | Type: string, default value: HW_DH895xcc | | ... | - numvfs - Number of VFs to initialize, 0 - disable the VFs | | ... | Type: integer, default value: ${32} | | ... | - force_init - Force to initialize. Type: boolean -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Configure crypto device on all DUTs \| HW_DH895xcc \| ${32} \| -| | ... +| | | | [Arguments] | ${crypto_type} | ${numvfs} | ${force_init}=${False} -| | ... -| | :FOR | ${dut} | IN | @{duts} +| | +| | FOR | ${dut} | IN | @{duts} | | | Crypto Device Verify | ${nodes['${dut}']} | ${crypto_type} | | | ... | ${numvfs} | force_init=${force_init} +| | END | Configure kernel module on all DUTs | | [Documentation] | Verify if specific kernel module is loaded on all DUTs. | | ... | If parameter force_load is set to True, then try to load. -| | ... +| | | | ... | *Arguments:* | | ... | - module - Module to verify. Type: string | | ... | - force_load - Try to load module. Type: boolean -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Configure kernel module on all DUTs \| ${True} \| -| | ... +| | | | [Arguments] | ${module} | ${force_load}=${False} -| | ... +| | | | Verify Kernel Module on All DUTs | ${nodes} | ${module} | | ... | force_load=${force_load} | Create base startup configuration of VPP on all DUTs | | [Documentation] | Create base startup configuration of VPP to all DUTs. -| | ... -| | :FOR | ${dut} | IN | @{duts} +| | +| | FOR | ${dut} | IN | @{duts} | | | Import Library | resources.libraries.python.VppConfigGenerator | | | ... | WITH NAME | ${dut} | | | Run keyword | ${dut}.Set Node | ${nodes['${dut}']} @@ -132,6 +133,7 @@ | | | Run keyword | ${dut}.Add IP6 Hash Buckets | 2000000 | | | Run keyword | ${dut}.Add IP6 Heap Size | 4G | | | Run keyword | ${dut}.Add IP Heap Size | 4G +| | END | Add worker threads to all DUTs | | [Documentation] | Setup worker threads in vpp startup configuration on all @@ -142,25 +144,25 @@ | | ... | RXQ are computed automatically by dividing thread count with number 2 | | ... | (TODO: Add division by actual number of interfaces). User can manually | | ... | override RX, RXD, TXD parameters if needed. -| | ... +| | | | ... | *Arguments:* | | ... | - phy_cores - Number of physical cores to use. Type: integer | | ... | - rx_queues - Number of RX queues. Type: integer | | ... | - rxd - Number of RX descriptors. Type: integer | | ... | - txd - Number of TX descriptors. Type: integer -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Add worker threads to all DUTs \| ${1} \| ${1} \| -| | ... +| | | | [Arguments] | ${phy_cores} | ${rx_queues}=${None} | ${rxd}=${None} | | ... | ${txd}=${None} -| | ... +| | | | ${cpu_count_int} | Convert to Integer | ${phy_cores} | | ${thr_count_int} | Convert to Integer | ${phy_cores} | | ${rxd_count_int}= | Set variable | ${rxd} | | ${txd_count_int}= | Set variable | ${txd} -| | :FOR | ${dut} | IN | @{duts} +| | FOR | ${dut} | IN | @{duts} | | | ${if1_status} | ${value}= | Run Keyword And Ignore Error | | | ... | Variable Should Exist | ${${dut}_if1} | | | @{if_list}= | Run Keyword If | '${if1_status}' == 'PASS' @@ -201,6 +203,7 @@ | | | Run keyword if | ${thr_count_int} > 1 | | | ... | Set Tags | MTHREAD | ELSE | Set Tags | STHREAD | | | Set Tags | ${thr_count_int}T${cpu_count_int}C +| | END | | Set Test Variable | ${smt_used} | | Set Test Variable | ${thr_count_int} | | Set Test Variable | ${cpu_count_int} @@ -211,8 +214,8 @@ | Add DPDK pci devices to all DUTs | | [Documentation] | | ... | Add PCI devices to VPP configuration file. -| | ... -| | :FOR | ${dut} | IN | @{duts} +| | +| | FOR | ${dut} | IN | @{duts} | | | ${if1_status} | ${value}= | Run Keyword And Ignore Error | | | ... | Variable Should Exist | ${${dut}_if1} | | | ${if1_pci}= | Run Keyword If | '${if1_status}' == 'PASS' @@ -250,18 +253,20 @@ | | | ... | Set Test Variable | ${${dut}_if2_1_pci} | ${if2_1_pci} | | | Run Keyword Unless | '${if2_status}' == 'PASS' | | | ... | Set Test Variable | ${${dut}_if2_2_pci} | ${if2_2_pci} +| | END | Add DPDK no PCI to all DUTs | | [Documentation] | Add DPDK no-pci to VPP startup configuration to all DUTs. -| | ... -| | :FOR | ${dut} | IN | @{duts} +| | +| | FOR | ${dut} | IN | @{duts} | | | Run keyword | ${dut}.Add DPDK no PCI +| | END | Add VLAN strip offload switch off between DUTs in 3-node single link topology | | [Documentation] | | ... | Add VLAN Strip Offload switch off on PCI devices between DUTs to VPP | | ... | configuration file. -| | ... +| | | | Run keyword | DUT1.Add DPDK Dev Parameter | ${dut1_if2_pci} | | ... | vlan-strip-offload | off | | Run keyword | DUT2.Add DPDK Dev Parameter | ${dut2_if1_pci} @@ -271,7 +276,7 @@ | | [Documentation] | | ... | Add VLAN Strip Offload switch off on PCI devices between DUTs to VPP | | ... | configuration file -| | ... +| | | | Run keyword | DUT1.Add DPDK Dev Parameter | ${dut1_if2_1_pci} | | ... | vlan-strip-offload | off | | Run keyword | DUT1.Add DPDK Dev Parameter | ${dut1_if2_2_pci} @@ -283,33 +288,36 @@ | Add NAT to all DUTs | | [Documentation] | Add NAT configuration to all DUTs. -| | ... -| | :FOR | ${dut} | IN | @{duts} +| | +| | FOR | ${dut} | IN | @{duts} | | | Run keyword | ${dut}.Add NAT +| | END | Write startup configuration on all VPP DUTs | | [Documentation] | Write VPP startup configuration without restarting VPP. -| | ... -| | :FOR | ${dut} | IN | @{duts} +| | +| | FOR | ${dut} | IN | @{duts} | | | Run keyword | ${dut}.Write Config +| | END | Apply startup configuration on all VPP DUTs | | [Documentation] | Write VPP startup configuration and restart VPP on all | | ... | DUTs. -| | ... +| | | | ... | *Arguments:* | | ... | - with_trace - Enable packet trace after VPP restart Type: boolean -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Apply startup configuration on all VPP DUTs \| False \| -| | ... +| | | | [Arguments] | ${with_trace}=${False} -| | ... -| | :FOR | ${dut} | IN | @{duts} +| | +| | FOR | ${dut} | IN | @{duts} | | | Run keyword | ${dut}.Apply Config | | | Add New Socket | ${nodes['${dut}']} | PAPI | ${dut} | ${SOCKSVR_PATH} | | | Add New Socket | ${nodes['${dut}']} | STATS | ${dut} | ${SOCKSTAT_PATH} +| | END | | Save VPP PIDs | | Enable Coredump Limit VPP on All DUTs | ${nodes} | | Update All Interface Data On All Nodes | ${nodes} | skip_tg=${True} @@ -319,20 +327,21 @@ | | [Documentation] | Get PIDs of VPP processes from all DUTs in topology and\ | | ... | set it as a test variable. The PIDs are stored as dictionary items\ | | ... | where the key is the host and the value is the PID. -| | ... +| | | | ${setup_vpp_pids}= | Get VPP PIDs | ${nodes} | | ${keys}= | Get Dictionary Keys | ${setup_vpp_pids} | | ${duts}= | Get Matches | ${nodes} | DUT* -| | :FOR | ${key} | IN | @{keys} +| | FOR | ${key} | IN | @{keys} | | | ${pid}= | Get From Dictionary | ${setup_vpp_pids} | ${key} | | | Run Keyword If | $pid is None | FAIL | No VPP PID found on node ${key} +| | END | | Set Test Variable | ${setup_vpp_pids} | Verify VPP PID in Teardown | | [Documentation] | Check if the VPP PIDs on all DUTs are the same at the end\ | | ... | of test as they were at the begining. If they are not, only a message\ | | ... | is printed on console and to log. The test will not fail. -| | ... +| | | | ${teardown_vpp_pids}= | Get VPP PIDs | ${nodes} | | ${err_msg}= | Catenate | ${SUITE NAME} - ${TEST NAME} | | ... | \nThe VPP PIDs are not equal!\nTest Setup VPP PIDs: @@ -346,7 +355,7 @@ # TODO: Cleanup when VIRL is gone. | Set up functional test | | [Documentation] | Common test setup for functional tests. -| | ... +| | | | Restart Vpp Service On All Duts | ${nodes} | | Verify Vpp On All Duts | ${nodes} | | VPP Enable Traces On All Duts | ${nodes} @@ -355,14 +364,15 @@ | | Update All Interface Data On All Nodes | ${nodes} | | Reset PAPI History On All DUTs | ${nodes} | | ${duts}= | Get Matches | ${nodes} | DUT* -| | :FOR | ${dut} | IN | @{duts} +| | FOR | ${dut} | IN | @{duts} | | | Add New Socket | ${nodes['${dut}']} | PAPI | ${dut} | ${SOCKSVR_PATH} | | | Add New Socket | ${nodes['${dut}']} | STATS | ${dut} | ${SOCKSTAT_PATH} +| | END # TODO: Cleanup when VIRL is gone. | Tear down functional test | | [Documentation] | Common test teardown for functional tests. -| | ... +| | | | Remove All Added Ports On All DUTs From Topology | ${nodes} | | Show Packet Trace on All DUTs | ${nodes} | | Show PAPI History On All DUTs | ${nodes} diff --git a/resources/libraries/robot/shared/interfaces.robot b/resources/libraries/robot/shared/interfaces.robot index 74f10c4ef6..3d2b70d065 100644 --- a/resources/libraries/robot/shared/interfaces.robot +++ b/resources/libraries/robot/shared/interfaces.robot @@ -13,18 +13,19 @@ *** Settings *** | Library | resources.libraries.python.InterfaceUtil | Library | resources.libraries.python.NodePath +| Library | resources.libraries.python.VhostUser *** Keywords *** | Set interfaces in path up | | [Documentation] | | ... | *Set UP state on VPP interfaces in path on all DUT nodes and set | | ... | maximal MTU.* -| | ... +| | # TODO: Rework KW to set all interfaces in path UP and set MTU (including # software interfaces. Run KW at the start phase of VPP setup to split # from other "functional" configuration. This will allow modularity of this # library -| | :FOR | ${dut} | IN | @{duts} +| | FOR | ${dut} | IN | @{duts} | | | ${if1_status} | ${value}= | Run Keyword And Ignore Error | | | ... | Variable Should Exist | ${${dut}_if1} | | | Run Keyword If | '${if1_status}' == 'PASS' @@ -41,7 +42,8 @@ | | | ... | Set Interface State | ${nodes['${dut}']} | ${${dut}_if2_1} | up | | | Run Keyword Unless | '${if2_status}' == 'PASS' | | | ... | Set Interface State | ${nodes['${dut}']} | ${${dut}_if2_2} | up -| | :FOR | ${dut} | IN | @{duts} +| | END +| | FOR | ${dut} | IN | @{duts} | | | ${if1_status} | ${value}= | Run Keyword And Ignore Error | | | ... | Variable Should Exist | ${${dut}_if1} | | | Run Keyword If | '${if1_status}' == 'PASS' @@ -58,18 +60,19 @@ | | | ... | VPP Set Interface MTU | ${nodes['${dut}']} | ${${dut}_if2_1} | | | Run Keyword Unless | '${if2_status}' == 'PASS' | | | ... | VPP Set Interface MTU | ${nodes['${dut}']} | ${${dut}_if2_2} +| | END | | All VPP Interfaces Ready Wait | ${nodes} | retries=${300} | Set single interfaces in path up | | [Documentation] | | ... | *Set UP state on single VPP interfaces in path on all DUT nodes and set | | ... | maximal MTU.* -| | ... +| | # TODO: Rework KW to set all interfaces in path UP and set MTU (including # software interfaces. Run KW at the start phase of VPP setup to split # from other "functional" configuration. This will allow modularity of this # library -| | :FOR | ${dut} | IN | @{duts} +| | FOR | ${dut} | IN | @{duts} | | | ${if1_status} | ${value}= | Run Keyword And Ignore Error | | | ... | Variable Should Exist | ${${dut}_if1} | | | Run Keyword If | '${if1_status}' == 'PASS' @@ -78,7 +81,8 @@ | | | ... | Set Interface State | ${nodes['${dut}']} | ${${dut}_if1_1} | up | | | Run Keyword Unless | '${if1_status}' == 'PASS' | | | ... | Set Interface State | ${nodes['${dut}']} | ${${dut}_if1_2} | up -| | :FOR | ${dut} | IN | @{duts} +| | END +| | FOR | ${dut} | IN | @{duts} | | | ${if1_status} | ${value}= | Run Keyword And Ignore Error | | | ... | Variable Should Exist | ${${dut}_if1} | | | Run Keyword If | '${if1_status}' == 'PASS' @@ -87,79 +91,82 @@ | | | ... | VPP Set Interface MTU | ${nodes['${dut}']} | ${${dut}_if1_1} | | | Run Keyword Unless | '${if1_status}' == 'PASS' | | | ... | VPP Set Interface MTU | ${nodes['${dut}']} | ${${dut}_if1_2} +| | END | | All VPP Interfaces Ready Wait | ${nodes} | Get Vhost dump | | [Documentation] | Get vhost-user dump. -| | ... +| | | | ... | *Arguments:* | | ... | - node - DUT node data. Type: dictionary -| | ... +| | | | [Arguments] | ${dut_node} -| | ... +| | | | [Return] | ${vhost_dump} -| | ... +| | | | ${vhost_dump}= | Vhost User Dump | ${dut_node} | Initialize layer interface on node | | [Documentation] | | ... | Baseline interfaces variables to be created. -| | ... +| | | | ... | *Arguments:* | | ... | - dut - DUT node. Type: string | | ... | - count - Number of baseline interface variables. Type: integer -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Initialize layer interface on node \| DUT1 \| 1 \| -| | ... +| | | | [Arguments] | ${dut} | ${count}=${1} -| | ... +| | | | ${dut_str}= | Convert To Lowercase | ${dut} -| | :FOR | ${id} | IN RANGE | 1 | ${count} + 1 +| | FOR | ${id} | IN RANGE | 1 | ${count} + 1 | | | Set Test Variable | ${${dut_str}_if_${id}_1} | ${${dut_str}_if1} | | | Set Test Variable | ${${dut_str}_if_${id}_2} | ${${dut_str}_if2} +| | END | Initialize layer interface | | [Documentation] | | ... | Physical interfaces variables to be created on all DUTs. -| | ... +| | | | ... | *Arguments:* | | ... | - count - Number of untagged interfaces variables. Type: integer -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Initialize layer interface \| 1 \| -| | ... +| | | | [Arguments] | ${count}=${1} -| | ... -| | :FOR | ${dut} | IN | @{duts} +| | +| | FOR | ${dut} | IN | @{duts} | | | Initialize layer interface on node | ${dut} | count=${count} +| | END | | Set Test Variable | ${prev_layer} | if | Pre-initialize layer driver | | [Documentation] | | ... | Pre-initialize driver based interfaces on each DUT. -| | ... +| | | | ... | *Arguments:* | | ... | - driver - NIC driver used in test [vfio-pci|avf|rdma-core]. | | ... | Type: string -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Pre-initialize layer driver \| vfio-pci \| -| | ... +| | | | [Arguments] | ${driver} -| | ... +| | | | Run Keyword | Pre-initialize layer ${driver} on all DUTs | Pre-initialize layer vfio-pci on all DUTs | | [Documentation] | | ... | Pre-initialize vfio-pci driver by adding related sections to startup | | ... | config on all DUTs. -| | ... +| | | | Add DPDK pci devices to all DUTs -| | :FOR | ${dut} | IN | @{duts} +| | FOR | ${dut} | IN | @{duts} | | | Run Keyword | ${dut}.Add DPDK No Tx Checksum Offload | | | Run Keyword | ${dut}.Add DPDK Log Level | debug | | | Run Keyword | ${dut}.Add DPDK Uio Driver | vfio-pci @@ -172,67 +179,69 @@ | | | ... | ${dut}.Add DPDK Dev Default TXD | ${txd_count_int} | | | Run Keyword If | '${crypto_type}' != '${None}' | | | ... | ${dut}.Add DPDK Cryptodev | ${thr_count_int} +| | END | Pre-initialize layer avf on all DUTs | | [Documentation] | | ... | Pre-initialize avf driver. Currently no operation. -| | ... +| | | | No operation | Pre-initialize layer rdma-core on all DUTs | | [Documentation] | | ... | Pre-initialize rdma-core driver. Currently no operation. -| | ... +| | | | No operation | Initialize layer driver | | [Documentation] | | ... | Initialize driver based interfaces on each DUT. Interfaces are | | ... | brought up. -| | ... +| | | | ... | *Arguments:* | | ... | - driver - NIC driver used in test [vfio-pci|avf|rdma-core]. | | ... | Type: string -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Initialize layer driver \| vfio-pci \| -| | ... +| | | | [Arguments] | ${driver} -| | ... -| | :FOR | ${dut} | IN | @{duts} +| | +| | FOR | ${dut} | IN | @{duts} | | | Run Keyword | Initialize layer ${driver} on node | ${dut} +| | END | | Set Test Variable | ${prev_layer} | vf | | Set interfaces in path up | Initialize layer vfio-pci on node | | [Documentation] | | ... | Initialize vfio-pci interfaces on DUT. Currently no operation. -| | ... +| | | | ... | *Arguments:* | | ... | - dut - DUT node. Type: string -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Initialize layer vfio-pci on node \| DUT1 \| -| | ... +| | | | [Arguments] | ${dut} -| | ... +| | | | No operation | Initialize layer avf on node | | [Documentation] | | ... | Initialize AVF interfaces on DUT. -| | ... +| | | | ... | *Arguments:* | | ... | - dut - DUT node. Type: string -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Initialize layer avf on node \| DUT1 \| -| | ... +| | | | [Arguments] | ${dut} -| | ... +| | | | ${dut_str}= | Convert To Lowercase | ${dut} | | ${if1_vlan}= | Get Interface Vlan | ${nodes['${dut}']} | ${${dut}_if1} | | ${if2_vlan}= | Get Interface Vlan | ${nodes['${dut}']} | ${${dut}_if2} @@ -258,16 +267,16 @@ | Initialize layer rdma-core on node | | [Documentation] | | ... | Initialize rdma-core (MLX) interfaces on DUT. -| | ... +| | | | ... | *Arguments:* | | ... | - dut - DUT node. Type: string -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Initialize layer rdma-core on node \| DUT1 \| -| | ... +| | | | [Arguments] | ${dut} -| | ... +| | | | ${dut_str}= | Convert To Lowercase | ${dut} | | ${if1_vlan}= | Get Interface Vlan | ${nodes['${dut}']} | ${${dut}_if1} | | ${if2_vlan}= | Get Interface Vlan | ${nodes['${dut}']} | ${${dut}_if2} @@ -294,19 +303,19 @@ | | [Documentation] | | ... | Bonded interface and variables to be created on across east and | | ... | west DUT's node interfaces. -| | ... +| | | | ... | *Arguments:* | | ... | - dut - DUT node. Type: string | | ... | - bond_mode - Link bonding mode. Type: string | | ... | - lb_mode - Load balance mode. Type: string | | ... | - count - Number of bond interface variables. Type: integer -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Initialize layer bonding on node \| DUT1 \| xor \| l34 \| 1 \| -| | ... +| | | | [Arguments] | ${dut} | ${bond_mode}=xor | ${lb_mode}=l34 | ${count}=${1} -| | ... +| | | | ${dut_str}= | Convert To Lowercase | ${dut} | | ${if_index}= | VPP Create Bond Interface | | ... | ${nodes['${dut}']} | ${bond_mode} | load_balance=${lb_mode} @@ -316,29 +325,31 @@ | | ... | ${nodes['${dut}']} | ${${dut_str}_${prev_layer}_1_1} | ${if_index} | | VPP Enslave Physical Interface | | ... | ${nodes['${dut}']} | ${${dut_str}_${prev_layer}_1_2} | ${if_index} -| | :FOR | ${id} | IN RANGE | 1 | ${count} + 1 +| | FOR | ${id} | IN RANGE | 1 | ${count} + 1 | | | Set Test Variable | ${${dut_str}_bond_${id}_1} | ${if_index} | | | Set Test Variable | ${${dut_str}_bond_${id}_2} | ${if_index} +| | END | Initialize layer bonding | | [Documentation] | | ... | Bonded interfaces and variables to be created on all DUT's interfaces. -| | ... +| | | | ... | *Arguments:* | | ... | - bond_mode - Link bonding mode. Type: string | | ... | - lb_mode - Load balance mode. Type: string | | ... | - count - Number of bond interface variables. Type: integer -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Initialize layer bonding \| xor \| l34 \| 1 \| -| | ... +| | | | [Arguments] | ${bond_mode}=xor | ${lb_mode}=l34 | ${count}=${1} -| | ... -| | :FOR | ${dut} | IN | @{duts} +| | +| | FOR | ${dut} | IN | @{duts} | | | Initialize layer bonding on node | | | ... | ${dut} | bond_mode=${bond_mode} | lb_mode=${lb_mode} | | | ... | count=${count} +| | END | | Set Test Variable | ${prev_layer} | bond | Initialize layer dot1q on node for chain @@ -346,19 +357,19 @@ | | ... | Optionally create tag popping subinterface per chain. | | ... | Return interface indices for dot1q layer interfaces, | | ... | or Nones if subinterfaces are not created. -| | ... +| | | | ... | *Arguments:* | | ... | - dut - DUT node. Type: string | | ... | - id - Positive index of the chain. Type: integer | | ... | - vlan_per_chain - Whether to create vlan subinterface for each chain. -| | ... | Type: boolean -| | ... +| | ... | Type: boolean +| | | | ... | *Example:* -| | ... +| | | | ... | \| Initialize layer dot1q on node for chain \| DUT1 \| 1 \| True \| -| | ... +| | | | [Arguments] | ${dut} | ${id} | ${vlan_per_chain}=${True} -| | ... +| | | | ${dut_str}= | Convert To Lowercase | ${dut} | | Return From Keyword If | ${id} != ${1} and not ${vlan_per_chain} | | ... | ${NONE} | ${NONE} @@ -389,31 +400,31 @@ | | [Documentation] | | ... | Dot1q interfaces and variables to be created on all DUT's node | | ... | interfaces. -| | ... +| | | | ... | TODO: Unify names for number of chains/pipelines/instances/interfaces. | | ... | Chose names and descriptions that makes sense for both | | ... | nf_density and older tests. | | ... | Note that with vlan_per_chain=False it is not a number of interfaces. | | ... | At least not number of real interfaces, just number of aliases. | | ... | This TODO applies also to all keywords with nf_chains argument. -| | ... +| | | | ... | *Arguments:* | | ... | - dut - DUT node. Type: string | | ... | - count - Number of chains. Type: integer | | ... | - vlan_per_chain - Whether to create vlan subinterface for each chain. -| | ... | Type: boolean +| | ... | Type: boolean | | ... | - start - Id of first chain, allows adding chains during test. -| | ... | Type: integer -| | ... +| | ... | Type: integer +| | | | ... | *Example:* -| | ... +| | | | ... | \| Initialize layer dot1q on node \| DUT1 \| 3 \| True \| 2 \| -| | ... +| | | | [Arguments] | ${dut} | ${count}=${1} | ${vlan_per_chain}=${True} | | ... | ${start}=${1} -| | ... +| | | | ${dut_str}= | Convert To Lowercase | ${dut} -| | :FOR | ${id} | IN RANGE | ${start} | ${count} + 1 +| | FOR | ${id} | IN RANGE | ${start} | ${count} + 1 | | | ${if1_index} | ${if2_index}= | Initialize layer dot1q on node for chain | | | ... | dut=${dut} | id=${id} | vlan_per_chain=${vlan_per_chain} | | | # First id results in non-None indices, after that _1_ are defined. @@ -423,25 +434,27 @@ | | | ... | ${${dut_str}_dot1q_1_2} | ${if2_index} | | | Set Test Variable | ${${dut_str}_dot1q_${id}_1} | ${if1_index} | | | Set Test Variable | ${${dut_str}_dot1q_${id}_2} | ${if2_index} +| | END | Initialize layer dot1q | | [Documentation] | | ... | Dot1q interfaces and variables to be created on all DUT's interfaces. -| | ... +| | | | ... | *Arguments:* | | ... | - count - Number of chains. Type: integer | | ... | - vlan_per_chain - Whether to create vlan subinterface for each chain. -| | ... | Type: boolean +| | ... | Type: boolean | | ... | - start - Id of first chain, allows adding chains during test. -| | ... | Type: integer -| | ... +| | ... | Type: integer +| | | | ... | \| Initialize layer dot1q \| 3 \| True \| 2 \| -| | ... +| | | | [Arguments] | ${count}=${1} | ${vlan_per_chain}=${True} | ${start}=${1} -| | ... -| | :FOR | ${dut} | IN | @{duts} +| | +| | FOR | ${dut} | IN | @{duts} | | | Initialize layer dot1q on node | ${dut} | count=${count} | | | ... | vlan_per_chain=${vlan_per_chain} | start=${start} +| | END | | Set Test Variable | ${prev_layer} | dot1q | Initialize layer ip4vxlan on node @@ -450,19 +463,19 @@ | | ... | physical and vxlan interfaces on each DUT. All interfaces are brought | | ... | up. IPv4 addresses with prefix /24 are configured on interfaces | | ... | towards TG. VXLAN sub-interfaces has same IPv4 address as interfaces. -| | ... +| | | | ... | *Arguments:* | | ... | - dut - DUT node. Type: string | | ... | - count - Number of vxlan interfaces. Type: integer | | ... | - start - Id of first chain, allows adding chains during test. -| | ... | Type: integer -| | ... +| | ... | Type: integer +| | | | ... | *Example:* -| | ... +| | | | ... | \| Initialize layer ip4vxlan on node \| DUT1 \| 3 \| 2 \| -| | ... +| | | | [Arguments] | ${dut} | ${count}=${1} | ${start}=${1} -| | ... +| | | | ${dut_str}= | Convert To Lowercase | ${dut} | | Run Keyword If | "${start}" == "1" | VPP Interface Set IP Address | | ... | ${nodes['${dut}']} | ${${dut_str}_${prev_layer}_1_1} @@ -470,7 +483,7 @@ | | Run Keyword If | "${start}" == "1" | VPP Interface Set IP Address | | ... | ${nodes['${dut}']} | ${${dut_str}_${prev_layer}_1_2} | | ... | 172.26.0.1 | 24 -| | :FOR | ${id} | IN RANGE | ${start} | ${count} + 1 +| | FOR | ${id} | IN RANGE | ${start} | ${count} + 1 | | | ${subnet}= | Evaluate | ${id} - 1 | | | ${vni}= | Evaluate | ${id} - 1 | | | ${ip4vxlan_1}= | Create VXLAN interface @@ -503,29 +516,31 @@ | | | ... | ${${dut_str}_ip4vxlan_${id}_1} | ${ip4vxlan_1} | | | Set Test Variable | | | ... | ${${dut_str}_ip4vxlan_${id}_2} | ${ip4vxlan_2} +| | END | Initialize layer ip4vxlan | | [Documentation] | | ... | VXLAN interfaces and variables to be created on all DUT's interfaces. -| | ... +| | | | ... | *Arguments:* | | ... | - count - Number of vxlan interfaces. Type: integer | | ... | - start - Id of first chain, allows adding chains during test. -| | ... | Type: integer -| | ... +| | ... | Type: integer +| | | | ... | \| Initialize layer ip4vxlan \| 3 \| 2 \| -| | ... +| | | | [Arguments] | ${count}=${1} | ${start}=${1} -| | ... -| | :FOR | ${dut} | IN | @{duts} +| | +| | FOR | ${dut} | IN | @{duts} | | | Initialize layer ip4vxlan on node | ${dut} | count=${count} | | ... | start=${start} +| | END | | Set Test Variable | ${prev_layer} | ip4vxlan | Configure vhost interfaces | | [Documentation] | | ... | Create two Vhost-User interfaces on defined VPP node. -| | ... +| | | | ... | *Arguments:* | | ... | - ${dut_node} - DUT node. Type: dictionary | | ... | - ${sock1} - Socket path for first Vhost-User interface. Type: string @@ -534,22 +549,22 @@ | | ... | Type: string | | ... | - ${vhost_if2} - Name of the second Vhost-User interface (Optional). | | ... | Type: string -| | ... +| | | | ... | _NOTE:_ This KW sets following test case variable: | | ... | - ${${vhost_if1}} - First Vhost-User interface. | | ... | - ${${vhost_if2}} - Second Vhost-User interface. -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Configure vhost interfaces \ | | ... | \| ${nodes['DUT1']} \| /tmp/sock1 \| /tmp/sock2 \| | | ... | \| Configure vhost interfaces \ | | ... | \| ${nodes['DUT2']} \| /tmp/sock1 \| /tmp/sock2 \| dut2_vhost_if1 \ | | ... | \| dut2_vhost_if2 \| -| | ... +| | | | [Arguments] | ${dut_node} | ${sock1} | ${sock2} | ${vhost_if1}=vhost_if1 | | ... | ${vhost_if2}=vhost_if2 -| | ... +| | | | ${vhost_1}= | Vpp Create Vhost User Interface | ${dut_node} | ${sock1} | | ${vhost_2}= | Vpp Create Vhost User Interface | ${dut_node} | ${sock2} | | ${vhost_1_key}= | Get Interface By SW Index | ${dut_node} | ${vhost_1} diff --git a/resources/libraries/robot/shared/memif.robot b/resources/libraries/robot/shared/memif.robot index a0fae656f9..50051ca413 100644 --- a/resources/libraries/robot/shared/memif.robot +++ b/resources/libraries/robot/shared/memif.robot @@ -13,14 +13,14 @@ *** Settings *** | Documentation | Memif interface keyword library. -| ... +| | Library | resources.libraries.python.Memif | Variables | resources/libraries/python/Constants.py *** Keywords *** | Set up memif interfaces on DUT node | | [Documentation] | Create two Memif interfaces on given VPP node. -| | ... +| | | | ... | *Arguments:* | | ... | - dut_node - DUT node. Type: dictionary | | ... | - filename1 - Socket filename for 1st Memif interface. Type: string @@ -35,13 +35,13 @@ | | ... | - txq - TX queues; 0 means do not set (Optional). Type: integer, | | ... | default value: ${1} | | ... | - role - Memif role (Optional). Type: string, default value: SLAVE -| | ... +| | | | ... | _NOTE:_ This KW sets following test case variable: | | ... | - ${${memif_if1}} - 1st Memif interface. | | ... | - ${${memif_if2}} - 2nd Memif interface. -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Set up memif interfaces on DUT node \ | | ... | \| ${nodes['DUT1']} \| sock1 \| sock2 \| 1 \| | | ... | \| Set up memif interfaces on DUT node \ @@ -49,11 +49,11 @@ | | ... | \| dut2_memif_if1 \| dut2_memif_if2 \| 1 \| 1 \| SLAVE \| | | ... | \| ${nodes['DUT2']} \| sock1 \| sock2 \| 1 \| rxq=0 \| txq=0 \ | | ... | \| dcr_uuid=_a5730a0a-2ba1-4fe9-91bd-79b9828e968e \| -| | ... +| | | | [Arguments] | ${dut_node} | ${filename1} | ${filename2} | ${mid}=${1} | | ... | ${memif_if1}=memif_if1 | ${memif_if2}=memif_if2 | ${rxq}=${1} | | ... | ${txq}=${1} | ${role}=SLAVE -| | ... +| | | | ${sid_1}= | Evaluate | (${mid}*2)-1 | | ${sid_2}= | Evaluate | (${mid}*2) | | ${memif_1}= | Create memif interface | ${dut_node} @@ -69,7 +69,7 @@ | Set up single memif interface on DUT node | | [Documentation] | Create single Memif interface on given VPP node. -| | ... +| | | | ... | *Arguments:* | | ... | - dut_node - DUT node. Type: dictionary | | ... | - filename - Socket filename for Memif interface. Type: string @@ -80,19 +80,19 @@ | | ... | - rxq - RX queues (Optional). Type: integer | | ... | - txq - TX queues (Optional). Type: integer | | ... | - role - Memif role (Optional). Type: string -| | ... +| | | | ... | _NOTE:_ This KW sets following test case variable: | | ... | - ${${memif_if}} - Memif interface. -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Set up single memif interface on DUT node \ | | ... | \| ${nodes['DUT1']} \| sock1 \| 1 \| dut1_memif_if1 \| 1 \| 1 \ | | ... | \| SLAVE \| -| | ... +| | | | [Arguments] | ${dut_node} | ${filename} | ${mid}=${1} | ${sid}=${1} | | ... | ${memif_if}=memif_if1 | ${rxq}=${1} | ${txq}=${1} | ${role}=SLAVE -| | ... +| | | | ${memif}= | Create memif interface | ${dut_node} | ${filename}${mid}-${sid} | | ... | ${mid} | ${sid} | rxq=${rxq} | txq=${txq} | role=${role} | | Set Interface State | ${dut_node} | ${memif} | up diff --git a/resources/libraries/robot/shared/suite_setup.robot b/resources/libraries/robot/shared/suite_setup.robot index d5cc5836fb..513cfe8045 100644 --- a/resources/libraries/robot/shared/suite_setup.robot +++ b/resources/libraries/robot/shared/suite_setup.robot @@ -20,7 +20,7 @@ | Library | resources.libraries.python.topology.Topology | Library | resources.libraries.python.TrafficGenerator | Library | resources.tools.wrk.wrk -| ... +| | Documentation | Suite setup keywords. *** Keywords *** @@ -31,7 +31,7 @@ | | ... | Compute path for testing on two given nodes in circular topology | | ... | based on interface model provided as an argument and set | | ... | corresponding suite variables. -| | ... +| | | | ... | _NOTE:_ This KW sets following suite variables: | | ... | - duts - List of DUT nodes | | ... | - duts_count - Number of DUT nodes. @@ -45,21 +45,22 @@ | | ... | - dut{n}_if1_mac - 1st DUT interface MAC address. | | ... | - dut{n}_if2 - 2nd DUT interface. | | ... | - dut{n}_if2_mac - 2nd DUT interface MAC address. -| | ... +| | | | ... | *Arguments:* | | ... | - ${actions} - Additional setup action. Type: list -| | ... +| | | | [Arguments] | @{actions} -| | ... +| | | | ${nic_model_list}= | Create list | ${nic_name} | | Append Node | ${nodes['TG']} | | ${duts}= | Get Matches | ${nodes} | DUT* -| | :FOR | ${dut} | IN | @{duts} +| | FOR | ${dut} | IN | @{duts} | | | Append Node | ${nodes['${dut}']} | filter_list=${nic_model_list} +| | END | | Append Node | ${nodes['TG']} | | Compute Path | always_same_link=${FALSE} | | ${tg_if1} | ${tg}= | Next Interface -| | :FOR | ${dut} | IN | @{duts} +| | FOR | ${dut} | IN | @{duts} | | | ${dutx_if1} | ${dutx}= | Next Interface | | | ${dutx_if2} | ${dutx}= | Next Interface | | | ${dutx_if1_mac}= | Get Interface MAC | ${dutx} | ${dutx_if1} @@ -70,6 +71,7 @@ | | | Set Suite Variable | ${${dut_str}_if2} | ${dutx_if2} | | | Set Suite Variable | ${${dut_str}_if1_mac} | ${dutx_if1_mac} | | | Set Suite Variable | ${${dut_str}_if2_mac} | ${dutx_if2_mac} +| | END | | ${tg_if2} | ${tg}= | Next Interface | | ${tg_if1_mac}= | Get Interface MAC | ${tg} | ${tg_if1} | | ${tg_if2_mac}= | Get Interface MAC | ${tg} | ${tg_if2} @@ -81,8 +83,9 @@ | | Set Suite Variable | ${tg_if1_mac} | | Set Suite Variable | ${tg_if2} | | Set Suite Variable | ${tg_if2_mac} -| | :FOR | ${action} | IN | @{actions} +| | FOR | ${action} | IN | @{actions} | | | Run Keyword | Additional Suite setup Action For ${action} +| | END | Setup suite double link | | [Documentation] @@ -91,10 +94,10 @@ | | ... | Compute path for testing on three given nodes in circular topology | | ... | with double link between DUTs based on interface model provided as an | | ... | argument and set corresponding suite variables. -| | ... +| | | | ... | *Arguments:* | | ... | - ${actions} - Additional setup action. Type: list -| | ... +| | | | ... | _NOTE:_ This KW sets following suite variables: | | ... | - duts - List of DUT nodes | | ... | - duts_count - Number of DUT nodes. @@ -111,9 +114,9 @@ | | ... | - dut2_if1_1 - DUT2 interface 1 towards DUT1. | | ... | - dut2_if1_2 - DUT2 interface 2 towards DUT1. | | ... | - dut2_if2 - DUT2 interface towards TG. -| | ... +| | | | [Arguments] | @{actions} -| | ... +| | | | ${nic_model_list}= | Create list | ${nic_name} | | # Compute path TG - DUT1 with single link in between | | Append Node | ${nodes['TG']} @@ -160,13 +163,14 @@ | | Set Suite Variable | ${dut2_if1_1} | | Set Suite Variable | ${dut2_if1_2} | | Set Suite Variable | ${dut2_if2} -| | :FOR | ${action} | IN | @{actions} +| | FOR | ${action} | IN | @{actions} | | | Run Keyword | Additional Suite setup Action For ${action} +| | END | Additional Suite Setup Action For performance | | [Documentation] | | ... | Additional Setup for suites which uses performance measurement. -| | ... +| | | | Run Keyword If | ${duts_count} == 1 | | ... | Initialize traffic generator | ${tg} | ${tg_if1} | ${tg_if2} | | ... | ${dut1} | ${dut1_if1} | ${dut1} | ${dut1_if2} | ${osi_layer} @@ -177,32 +181,34 @@ | Additional Suite Setup Action For scapy | | [Documentation] | | ... | Additional Setup for suites which uses scapy as Traffic generator. -| | ... +| | | | Set Interface State | ${tg} | ${tg_if1} | up | | Set Interface State | ${tg} | ${tg_if2} | up | Additional Suite Setup Action For dpdk | | [Documentation] | | ... | Additional Setup for suites which uses dpdk. -| | ... -| | :FOR | ${dut} | IN | @{duts} +| | +| | FOR | ${dut} | IN | @{duts} | | | ${dut_str}= | Convert To Lowercase | ${dut} | | | Initialize DPDK Environment | ${nodes['${dut}']} | | | ... | ${${dut_str}_if1} | ${${dut_str}_if2} +| | END | Additional Suite Setup Action For performance_avf | | [Documentation] | | ... | Additional Setup for suites which uses performance measurement over | | ... | SRIOV AVF. -| | ... -| | :FOR | ${dut} | IN | @{duts} +| | +| | FOR | ${dut} | IN | @{duts} | | | ${if1_avf_arr}= | Init AVF interface | ${nodes['${dut}']} | ${${dut}_if1} | | | ... | numvfs=${1} | osi_layer=${osi_layer} | | | ${if2_avf_arr}= | Init AVF interface | ${nodes['${dut}']} | ${${dut}_if2} | | | ... | numvfs=${1} | osi_layer=${osi_layer} -# Currently only one AVF is supported. +| | # Currently only one AVF is supported. | | | Set Suite Variable | ${${dut}_if1_vf0} | ${if1_avf_arr[0]} | | | Set Suite Variable | ${${dut}_if2_vf0} | ${if2_avf_arr[0]} +| | END | | Run Keyword If | ${duts_count} == 1 | | ... | Initialize traffic generator | ${tg} | ${tg_if1} | ${tg_if2} | | ... | ${dut1} | ${dut1_if1_vf0} | ${dut1} | ${dut1_if2_vf0} | ${osi_layer} @@ -213,16 +219,17 @@ | Additional Suite Setup Action For avf | | [Documentation] | | ... | Additional Setup for suites which uses SRIOV AVF. -| | ... -| | :FOR | ${dut} | IN | @{duts} -# Currently only one AVF is supported. +| | +| | FOR | ${dut} | IN | @{duts} +| | # Currently only one AVF is supported. | | | Set Suite Variable | ${${dut}_if1_vf0} | ${${dut}_if1} | | | Set Suite Variable | ${${dut}_if2_vf0} | ${${dut}_if2} +| | END | Additional Suite Setup Action For ipsechw | | [Documentation] | | ... | Additional Setup for suites which uses QAT HW. -| | ... +| | | | ${numvfs}= | Set Variable If | | ... | '${crypto_type}' == 'HW_DH895xcc' | ${32} | | ... | '${crypto_type}' == 'HW_C3xxx' | ${16} @@ -233,7 +240,7 @@ | Additional Suite Setup Action For wrk | | [Documentation] | | ... | Additional Setup for suites which uses WRK TG. -| | ... +| | | | Iface update numa node | ${tg} # Make sure TRex is stopped | | ${running}= | Is TRex running | ${tg} diff --git a/resources/libraries/robot/shared/suite_teardown.robot b/resources/libraries/robot/shared/suite_teardown.robot index 3d976106f4..993d83838f 100644 --- a/resources/libraries/robot/shared/suite_teardown.robot +++ b/resources/libraries/robot/shared/suite_teardown.robot @@ -16,33 +16,35 @@ *** Settings *** | Library | resources.libraries.python.DPDK.DPDKTools | Library | resources.libraries.python.TrafficGenerator -| ... +| | Documentation | Suite teardown keywords. *** Keywords *** | Tear down suite | | [Documentation] | | ... | Common suite teardown for tests. -| | ... +| | | | ... | *Arguments:* | | ... | - ${actions} - Additional teardown action. Type: list -| | ... +| | | | [Arguments] | @{actions} -| | ... -| | :FOR | ${action} | IN | @{actions} +| | +| | FOR | ${action} | IN | @{actions} | | | Run Keyword | Additional Suite Tear Down Action For ${action} +| | END | | Remove All Added VIF Ports On All DUTs From Topology | ${nodes} | Additional Suite Tear Down Action For performance | | [Documentation] | | ... | Additional teardown for suites which uses performance measurement. -| | ... +| | | | Teardown traffic generator | ${tg} | Additional Suite Tear Down Action For dpdk | | [Documentation] | | ... | Additional teardown for suites which uses dpdk. -| | ... -| | :FOR | ${dut} | IN | @{duts} +| | +| | FOR | ${dut} | IN | @{duts} | | | Cleanup DPDK Environment | | | ... | ${nodes['${dut}']} | ${${dut}_if1} | ${${dut}_if2} +| | END diff --git a/resources/libraries/robot/shared/test_setup.robot b/resources/libraries/robot/shared/test_setup.robot index c90ed68a79..941b90490a 100644 --- a/resources/libraries/robot/shared/test_setup.robot +++ b/resources/libraries/robot/shared/test_setup.robot @@ -15,27 +15,29 @@ *** Settings *** | Library | resources.libraries.python.PapiHistory -| ... +| | Documentation | Test Setup keywords. *** Keywords *** | Setup test | | [Documentation] | | ... | Common test setup for tests. -| | ... +| | | | ... | *Arguments:* | | ... | - ${actions} - Additional setup action. Type: list -| | ... +| | | | [Arguments] | @{actions} -| | ... +| | | | Reset PAPI History On All DUTs | ${nodes} | | Create base startup configuration of VPP on all DUTs -| | :FOR | ${action} | IN | @{actions} +| | FOR | ${action} | IN | @{actions} | | | Run Keyword | Additional Test Setup Action For ${action} +| | END | Additional Test Setup Action For namespace | | [Documentation] | | ... | Additional Setup for tests which uses namespace. -| | ... -| | :FOR | ${dut} | IN | @{duts} +| | +| | FOR | ${dut} | IN | @{duts} | | | Clean Up Namespaces | ${nodes['${dut}']} +| | END diff --git a/resources/libraries/robot/shared/test_teardown.robot b/resources/libraries/robot/shared/test_teardown.robot index 336cff5dad..1e7d011fca 100644 --- a/resources/libraries/robot/shared/test_teardown.robot +++ b/resources/libraries/robot/shared/test_teardown.robot @@ -18,19 +18,19 @@ | Library | resources.libraries.python.PapiHistory | Library | resources.libraries.python.topology.Topology | Variables | resources/libraries/python/Constants.py -| ... +| | Documentation | Test teardown keywords. *** Keywords *** | Tear down test | | [Documentation] | | ... | Common test teardown for tests. -| | ... +| | | | ... | *Arguments:* | | ... | - ${actions} - Additional teardown action. Type: list -| | ... +| | | | [Arguments] | @{actions} -| | ... +| | | | Remove All Added Ports On All DUTs From Topology | ${nodes} | | Show PAPI History On All DUTs | ${nodes} | | Show Log On All DUTs | ${nodes} @@ -38,14 +38,15 @@ | | ... | Get Core Files on All Nodes | ${nodes} | | Run Keyword If Test Failed | | ... | Verify VPP PID in Teardown -| | :FOR | ${action} | IN | @{actions} +| | FOR | ${action} | IN | @{actions} | | | Run Keyword | Additional Test Tear Down Action For ${action} +| | END | | Clean Sockets On All Nodes | ${nodes} | Additional Test Tear Down Action For performance | | [Documentation] | | ... | Additional teardown for tests which uses performance measurement. -| | ... +| | | | Run Keyword If Test Failed | | ... | Send traffic at specified rate | ${PERF_TRIAL_DURATION} | 10000pps | | ... | ${frame_size} | ${traffic_profile} | pkt_trace=${True} @@ -53,20 +54,21 @@ | Additional Test Tear Down Action For packet_trace | | [Documentation] | | ... | Additional teardown for tests which uses packet trace. -| | ... +| | | | Show Packet Trace on All DUTs | ${nodes} | Additional Test Tear Down Action For container | | [Documentation] | | ... | Additional teardown for tests which uses containers. -| | ... -| | :FOR | ${container_group} | IN | @{container_groups} +| | +| | FOR | ${container_group} | IN | @{container_groups} | | | Destroy all '${container_group}' containers +| | END | Additional Test Tear Down Action For vhost | | [Documentation] | | ... | Additional teardown for tests which uses vhost(s) and VM(s). -| | ... +| | | | Show VPP vhost on all DUTs | ${nodes} | | ${vnf_status} | ${value}= | Run Keyword And Ignore Error | | ... | Keyword Should Exist | vnf_manager.Kill All VMs @@ -75,29 +77,32 @@ | Additional Test Tear Down Action For nat | | [Documentation] | | ... | Additional teardown for tests which uses NAT feature. -| | ... -| | :FOR | ${dut} | IN | @{duts} +| | +| | FOR | ${dut} | IN | @{duts} | | | Run Keyword If Test Failed | | | ... | Show NAT verbose | ${nodes['${dut}']} +| | END | Additional Test Tear Down Action For namespace | | [Documentation] | | ... | Additional teardown for tests which uses namespace. -| | ... -| | :FOR | ${dut} | IN | @{duts} +| | +| | FOR | ${dut} | IN | @{duts} | | | Clean Up Namespaces | ${nodes['${dut}']} +| | END | Additional Test Tear Down Action For linux_bridge | | [Documentation] | | ... | Additional teardown for tests which uses linux_bridge. -| | ... -| | :FOR | ${dut} | IN | @{duts} +| | +| | FOR | ${dut} | IN | @{duts} | | | Linux Del Bridge | ${nodes['${dut}']} | ${bid_TAP} +| | END | Additional Test Tear Down Action For acl | | [Documentation] | | ... | Additional teardown for tests which uses ACL feature. -| | ... +| | | | Run Keyword If Test Failed | | ... | Vpp Log Plugin Acl Settings | ${dut1} | | Run Keyword If Test Failed @@ -106,7 +111,7 @@ | Additional Test Tear Down Action For macipacl | | [Documentation] | | ... | Additional teardown for tests which uses MACIP ACL feature. -| | ... +| | | | Run Keyword If Test Failed | | ... | Vpp Log Macip Acl Settings | ${dut1} | | Run Keyword If Test Failed @@ -115,14 +120,14 @@ | Additional Test Tear Down Action For classify | | [Documentation] | | ... | Additional teardown for tests which uses classify tables. -| | ... +| | | | Run Keyword If Test Failed | | ... | Show Classify Tables Verbose on all DUTs | ${nodes} | Additional Test Tear Down Action For srv6 | | [Documentation] | | ... | Additional teardown for tests which uses SRv6. -| | ... +| | | | Run Keyword If Test Failed | | ... | Show SR Policies on all DUTs | ${nodes} | | Run Keyword If Test Failed diff --git a/resources/libraries/robot/shared/testing_path.robot b/resources/libraries/robot/shared/testing_path.robot index 2bd0d9f938..696e7397a5 100644 --- a/resources/libraries/robot/shared/testing_path.robot +++ b/resources/libraries/robot/shared/testing_path.robot @@ -18,17 +18,17 @@ *** Keywords *** | Configure path in 2-node circular topology | | [Documentation] | Compute path for testing on two given nodes in circular -| | ... | topology and set corresponding test case variables. -| | ... +| | ... | topology and set corresponding test case variables. +| | | | ... | *Arguments:* | | ... | - ${tg_node} - TG node. Type: dictionary | | ... | - ${dut_node} - DUT node. Type: dictionary | | ... | - ${tg2_node} - Node where the path ends. Must be the same as TG node -| | ... | parameter in circular topology. Type: dictionary -| | ... +| | ... | parameter in circular topology. Type: dictionary +| | | | ... | *Return:* | | ... | - No value returned -| | ... +| | | | ... | _NOTE:_ This KW sets following test case variables: | | ... | - ${tg_node} - TG node. | | ... | - ${tg_to_dut_if1} - 1st TG interface towards DUT. @@ -40,12 +40,12 @@ | | ... | - ${tg_to_dut_if2_mac} | | ... | - ${dut_to_tg_if1_mac} | | ... | - ${dut_to_tg_if2_mac} -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Given Configure path in 2-node circular topology \| ${nodes['TG']} \ | | ... | \| ${nodes['DUT1']} \| ${nodes['TG']} \| -| | ... +| | | | [Arguments] | ${tg_node} | ${dut_node} | ${tg2_node} | | Should Be Equal | ${tg_node} | ${tg2_node} | | Append Nodes | ${tg_node} | ${dut_node} | ${tg_node} @@ -71,24 +71,24 @@ | Set interfaces in 2-node circular topology up | | [Documentation] | Set UP state on interfaces in 2-node path on nodes and -| | ... | wait for all interfaces are ready. Requires more than -| | ... | one link between nodes. -| | ... +| | ... | wait for all interfaces are ready. Requires more than one link +| | ... | between nodes. +| | | | ... | *Arguments:* | | ... | - No arguments. -| | ... +| | | | ... | *Return:* | | ... | - No value returned. -| | ... +| | | | ... | _NOTE:_ This KW uses test variables sets in -| | ... | "Configure path in 2-node circular topology" KW. -| | ... +| | ... | "Configure path in 2-node circular topology" KW. +| | | | ... | *Example:* -| | ... +| | | | ... | \| Given Configure path in 2-node circular topology \| ${nodes['TG']} \ | | ... | \| ${nodes['DUT1']} \| ${nodes['TG']} \| | | ... | \| And Set interfaces in 2-node circular topology up \| -| | ... +| | | | Set Interface State | ${tg_node} | ${tg_to_dut_if1} | up | | Set Interface State | ${tg_node} | ${tg_to_dut_if2} | up | | Set Interface State | ${dut_node} | ${dut_to_tg_if1} | up @@ -97,15 +97,15 @@ | Configure path in 3-node circular topology | | [Documentation] | Compute path for testing on three given nodes in circular -| | ... | topology and set corresponding test case variables. -| | ... +| | ... | topology and set corresponding test case variables. +| | | | ... | *Arguments:* | | ... | - ${tg_node} - TG node. Type: dictionary | | ... | - ${dut1_node} - DUT1 node. Type: dictionary | | ... | - ${dut2_node} - DUT2 node. Type: dictionary | | ... | - ${tg2_node} - Node where the path ends. Must be the same as TG node -| | ... | parameter in circular topology. Type: dictionary -| | ... +| | ... | parameter in circular topology. Type: dictionary +| | | | ... | *Return:* | | ... | - No value returned | | ... | @@ -125,12 +125,12 @@ | | ... | - ${dut1_to_dut2_mac} | | ... | - ${dut2_to_tg_mac} | | ... | - ${dut2_to_dut1_mac} -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Given Configure path in 3-node circular topology \| ${nodes['TG']} \ | | ... | \| ${nodes['DUT1']} \| ${nodes['DUT2']} \| ${nodes['TG']} \| -| | ... +| | | | [Arguments] | ${tg_node} | ${dut1_node} | ${dut2_node} | ${tg2_node} | | Should Be Equal | ${tg_node} | ${tg2_node} | | Append Nodes | ${tg_node} | ${dut1_node} | ${dut2_node} | ${tg_node} @@ -167,22 +167,22 @@ | | [Documentation] | | ... | Set UP state on interfaces in 3-node path on nodes and \ | | ... | wait until all interfaces are ready. -| | ... +| | | | ... | *Arguments:* | | ... | - No arguments. -| | ... +| | | | ... | *Return:* | | ... | - No value returned. -| | ... +| | | | ... | _NOTE:_ This KW uses test variables sets in | | ... | "Configure path in 3-node circular topology" KW. -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Given Configure path in 3-node circular topology \| ${nodes['TG']} \ | | ... | \| ${nodes['DUT1']} \| ${nodes['TG']} \| | | ... | \| And Set interfaces in 3-node circular topology up \| -| | ... +| | | | Set Interface State | ${tg_node} | ${tg_to_dut1} | up | | Set Interface State | ${tg_node} | ${tg_to_dut2} | up | | Set Interface State | ${dut1_node} | ${dut1_to_tg} | up @@ -197,14 +197,14 @@ | | ... | Compute path for testing on three given nodes in circular \ | | ... | topology with double link and set corresponding \ | | ... | test case variables. -| | ... +| | | | ... | *Arguments:* | | ... | - ${tg_node} - TG node. Type: dictionary | | ... | - ${dut1_node} - DUT1 node. Type: dictionary | | ... | - ${dut2_node} - DUT2 node. Type: dictionary | | ... | - ${tg2_node} - Node where the path ends. Must be the same as TG node | | ... | parameter in circular topology. Type: dictionary -| | ... +| | | | ... | *Return:* | | ... | - No value returned. | | ... | @@ -236,12 +236,12 @@ | | ... | - ${dut2_to_dut1_if2} - DUT2 interface towards DUT1 interface 2. | | ... | - ${dut2_to_dut1_mac_if1} - DUT2 towards DUT1 MAC address interface 1. | | ... | - ${dut2_to_dut1_mac_if2} - DUT2 towards DUT1 MAC address interface 2. -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Configure path in double-link 3-node circular topology \| ${nodes['TG']} \ | | ... | \| ${nodes['DUT1']} \| ${nodes['DUT2']} \| ${nodes['TG']} \| -| | ... +| | | | [Arguments] | ${tg_node} | ${dut1_node} | ${dut2_node} | ${tg2_node} | | Should Be Equal | ${tg_node} | ${tg2_node} | | # Compute path TG - DUT1 with two links in between @@ -321,22 +321,22 @@ | | [Documentation] | | ... | Set UP state on interfaces in 3-node double link path \ | | ... | wait until all interfaces are ready. -| | ... +| | | | ... | *Arguments:* | | ... | - No arguments. -| | ... +| | | | ... | *Return:* | | ... | - No value returned. -| | ... +| | | | ... | _NOTE:_ This KW uses test variables sets in | | ... | "Configure path in double-link 3-node circular topology" KW. -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Configure path in double-link 3-node circular topology \| ${nodes['TG']} \ | | ... | \| ${nodes['DUT1']} \| ${nodes['TG']} \| | | ... | \| Interfaces in Double-Link 3-node testing are UP \| -| | ... +| | | | Set Interface State | ${tg_node} | ${tg_to_dut1_if1} | up | | Set Interface State | ${tg_node} | ${tg_to_dut1_if2} | up | | Set Interface State | ${tg_node} | ${tg_to_dut2_if1} | up @@ -356,24 +356,24 @@ | | [Documentation] | | ... | Set UP state on interfaces in 2-node or 3-node path on nodes and \ | | ... | wait until all interfaces are ready. -| | ... +| | | | ... | *Arguments:* | | ... | - No arguments. -| | ... +| | | | ... | *Return:* | | ... | - No value returned. -| | ... +| | | | ... | _NOTE:_ This KW uses test variables sets in\ | | ... | "Configure path in 2-node circular topology" or\ | | ... | "Configure path in 3-node circular topology" KW. -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Configure interfaces in path up \| -| | ... +| | | | ${dut2_status} | ${value}= | Run Keyword And Ignore Error | | ... | Variable Should Exist | ${dut2} -| | ... +| | | | Run Keyword If | '${dut2_status}' == 'PASS' | | ... | Set interfaces in 3-node circular topology up | | ... | ELSE diff --git a/resources/libraries/robot/shared/traffic.robot b/resources/libraries/robot/shared/traffic.robot index df74017f6a..9358daf2d7 100644 --- a/resources/libraries/robot/shared/traffic.robot +++ b/resources/libraries/robot/shared/traffic.robot @@ -20,7 +20,7 @@ | Library | resources.libraries.python.Policer | Library | resources.libraries.python.topology.Topology | Library | resources.libraries.python.TrafficScriptExecutor -| ... +| | Documentation | Traffic keywords *** Keywords *** @@ -28,12 +28,12 @@ | | [Documentation] | Sends packet from IP (with source mac) to IP\ | | ... | (with dest mac). There has to be 4 MAC addresses when using\ | | ... | 2-node + xconnect (one for each eth). -| | ... +| | | | ... | *Arguments:* -| | ... +| | | | ... | _NOTE:_ Arguments are based on topology: | | ... | TG(if1)->(if1)DUT(if2)->TG(if2) -| | ... +| | | | ... | - tg_node - Node to execute scripts on (TG). Type: dictionary | | ... | - src_ip - IP of source interface (TG-if1). Type: string | | ... | - dst_ip - IP of destination interface (TG-if2). Type: string @@ -55,23 +55,23 @@ | | ... | Type: integer | | ... | - traffic_script - Scapy Traffic script used for validation. | | ... | Type: string -| | ... +| | | | ... | *Return:* | | ... | - No value returned -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Send packet and verify headers \| ${nodes['TG']} \| 10.0.0.1 \ | | ... | \| 32.0.0.1 \| eth2 \| 08:00:27:ee:fd:b3 \| 08:00:27:a2:52:5b \ | | ... | \| eth3 \| 08:00:27:4d:ca:7a \| 08:00:27:7d:fd:10 \| -| | ... +| | | | [Arguments] | ${tg_node} | ${src_ip} | ${dst_ip} | ${tx_src_port} | | ... | ${tx_src_mac} | ${tx_dst_mac} | ${rx_dst_port} | ${rx_src_mac} | | ... | ${rx_dst_mac} | ${encaps_tx}=${EMPTY} | ${vlan_tx}=${EMPTY} | | ... | ${vlan_outer_tx}=${EMPTY} | ${encaps_rx}=${EMPTY} | | ... | ${vlan_rx}=${EMPTY} | ${vlan_outer_rx}=${EMPTY} | | ... | ${traffic_script}=send_ip_check_headers -| | ... +| | | | ${tx_port_name}= | Get interface name | ${tg_node} | ${tx_src_port} | | ${rx_port_name}= | Get interface name | ${tg_node} | ${rx_dst_port} | | ${args}= | Catenate | --tg_src_mac ${tx_src_mac} @@ -98,12 +98,12 @@ | | [Documentation] | Sends packet from ip (with specified mac) to ip\ | | ... | (with dest mac). Using keyword : Send packet And Check Headers\ | | ... | and subsequently checks the return value. -| | ... +| | | | ... | *Arguments:* -| | ... +| | | | ... | _NOTE:_ Arguments are based on topology: | | ... | TG(if1)->(if1)DUT(if2)->TG(if2) -| | ... +| | | | ... | - tg_node - Node to execute scripts on (TG). Type: dictionary | | ... | - src_ip - IP of source interface (TG-if1). Type: string | | ... | - dst_ip - IP of destination interface (TG-if2). Type: string @@ -113,12 +113,12 @@ | | ... | - rx_port - Interface of TG-if1. Type: string | | ... | - rx_src_mac - MAC address of DUT1-if2. Type: string | | ... | - rx_dst_mac - MAC address of TG-if2. Type: string -| | ... +| | | | ... | *Return:* | | ... | - No value returned -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Packet transmission from port to port should fail \ | | ... | \| ${nodes['TG']} \| 10.0.0.1 \ \| 32.0.0.1 \| eth2 \ | | ... | \| 08:00:27:a2:52:5b \| eth3 \| 08:00:27:4d:ca:7a \ @@ -126,7 +126,7 @@ | | [Arguments] | ${tg_node} | ${src_ip} | ${dst_ip} | ${tx_src_port} | | ... | ${tx_src_mac} | ${tx_dst_mac} | ${rx_port} | ${rx_src_mac} | | ... | ${rx_dst_mac} -| | ... +| | | | ${tx_port_name}= | Get interface name | ${tg_node} | ${tx_src_port} | | ${rx_port_name}= | Get interface name | ${tg_node} | ${rx_port} | | ${args}= | Catenate | --tg_src_mac ${tx_src_mac} @@ -137,425 +137,9 @@ | | ... | Run Traffic Script On Node | send_ip_check_headers.py | | ... | ${tg_node} | ${args} -| Send packet and verify ARP request -| | [Documentation] | Send IP packet from tx_port and check if ARP Request\ -| | ... | packet is received on rx_port. -| | ... -| | ... | *Arguments:* -| | ... -| | ... | _NOTE:_ Arguments are based on topology: -| | ... | TG(if1)->(if1)DUT(if2)->TG(if2) -| | ... -| | ... | - tg_node - Node to execute scripts on (TG). Type: dictionary -| | ... | - tx_src_ip - Source IP address of transferred packet (TG-if1). -| | ... | Type: string -| | ... | - tx_dst_ip - Destination IP address of transferred packet (TG-if2). -| | ... | Type: string -| | ... | - tx_port - Interface from which the IP packet is sent (TG-if1). -| | ... | Type: string -| | ... | - tx_dst_mac - Destination MAC address of IP packet (DUT-if1). -| | ... | Type: string -| | ... | - rx_port - Interface where the IP packet is received (TG-if2). -| | ... | Type: string -| | ... | - rx_src_mac - Source MAC address of ARP packet (DUT-if2). -| | ... | Type: string -| | ... | - rx_arp_src_ip - Source IP address of ARP packet (DUT-if2). -| | ... | Type: string -| | ... | - rx_arp_dst_ip - Destination IP address of ARP packet. Type: string -| | ... -| | ... | *Return:* -| | ... | - No value returned -| | ... -| | ... | *Example:* -| | ... -| | ... | \| Send Packet And Check ARP Packet \| ${nodes['TG']} \| 16.0.0.1 \ -| | ... | \| 32.0.0.1 \| eth2 \| 08:00:27:cc:4f:54 \ -| | ... | \| eth4 \| 08:00:27:5b:49:dd \| 192.168.2.1 \| 192.168.2.2 \| -| | ... -| | [Arguments] | ${tg_node} | ${tx_src_ip} | ${tx_dst_ip} | ${tx_port} -| | ... | ${tx_dst_mac} | ${rx_port} | ${rx_src_mac} | ${rx_arp_src_ip} -| | ... | ${rx_arp_dst_ip} -| | ... -| | ${tx_port_name}= | Get interface name | ${tg_node} | ${tx_port} -| | ${rx_port_name}= | Get interface name | ${tg_node} | ${rx_port} -| | ${args}= | Catenate | --tx_dst_mac ${tx_dst_mac} -| | ... | --rx_src_mac ${rx_src_mac} | --tx_src_ip ${tx_src_ip} -| | ... | --tx_dst_ip ${tx_dst_ip} | --tx_if ${tx_port_name} -| | ... | --rx_if ${rx_port_name} | --rx_arp_src_ip ${rx_arp_src_ip} -| | ... | --rx_arp_dst_ip ${rx_arp_dst_ip} -| | Run Traffic Script On Node | send_icmp_check_arp.py | ${tg_node} | ${args} - -| Send TCP or UDP packet and verify received packet -| | [Documentation] | Sends TCP or UDP packet with specified source\ -| | ... | and destination port. -| | ... -| | ... | *Arguments:* -| | ... -| | ... | _NOTE:_ Arguments are based on topology: -| | ... | TG(if1)->(if1)DUT(if2)->TG(if2) -| | ... -| | ... | - tg_node - Node to execute scripts on (TG). Type: dictionary -| | ... | - src_ip - IP of source interface (TG-if1). Type: integer -| | ... | - dst_ip - IP of destination interface (TG-if2). Type: integer -| | ... | - tx_port - Source interface (TG-if1). Type: string -| | ... | - tx_mac - MAC address of source interface (TG-if1). Type: string -| | ... | - rx_port - Destionation interface (TG-if1). Type: string -| | ... | - rx_mac - MAC address of destination interface (TG-if1). Type: string -| | ... | - protocol - Type of protocol. Type: string -| | ... | - source_port - Source TCP/UDP port. Type: string or integer -| | ... | - destination_port - Destination TCP/UDP port. Type: string or integer -| | ... -| | ... | *Return:* -| | ... | - No value returned -| | ... -| | ... | *Example:* -| | ... -| | ... | \| Send TCP or UDP packet and verify received packet \ -| | ... | \| ${nodes['TG']} \| 16.0.0.1 \| 32.0.0.1 \| eth2 \ -| | ... | \| 08:00:27:cc:4f:54 \| eth4 \| 08:00:27:c9:6a:d5 \| TCP \| 20 \ -| | ... | 80 \| -| | ... -| | [Arguments] | ${tg_node} | ${src_ip} | ${dst_ip} | ${tx_port} | ${tx_mac} -| | ... | ${rx_port} | ${rx_mac} | ${protocol} | ${source_port} -| | ... | ${destination_port} -| | ... -| | ${tx_port_name}= | Get interface name | ${tg_node} | ${tx_port} -| | ${rx_port_name}= | Get interface name | ${tg_node} | ${rx_port} -| | ${args}= | Catenate | --tx_mac ${tx_mac} | --rx_mac ${rx_mac} -| | ... | --src_ip ${src_ip} | --dst_ip ${dst_ip} -| | ... | --tx_if ${tx_port_name} | --rx_if ${rx_port_name} -| | ... | --protocol ${protocol} | --source_port ${source_port} -| | ... | --destination_port ${destination_port} -| | Run Traffic Script On Node | send_tcp_udp.py -| | ... | ${tg_node} | ${args} - -| TCP or UDP packet transmission should fail -| | [Documentation] | Sends TCP or UDP packet with specified source\ -| | ... | and destination port. -| | ... -| | ... | *Arguments:* -| | ... -| | ... | _NOTE:_ Arguments are based on topology: -| | ... | TG(if1)->(if1)DUT(if2)->TG(if2) -| | ... -| | ... | - tg_node - Node to execute scripts on (TG). Type: dictionary -| | ... | - src_ip - IP of source interface (TG-if1). Type: integer -| | ... | - dst_ip - IP of destination interface (TG-if2). Type: integer -| | ... | - tx_port - Source interface (TG-if1). Type: string -| | ... | - tx_mac - MAC address of source interface (TG-if1). Type: string -| | ... | - rx_port - Destionation interface (TG-if1). Type: string -| | ... | - rx_mac - MAC address of destination interface (TG-if1). Type: string -| | ... | - protocol - Type of protocol. Type: string -| | ... | - source_port - Source TCP/UDP port. Type: string or integer -| | ... | - destination_port - Destination TCP/UDP port. Type: string or integer -| | ... -| | ... | *Return:* -| | ... | - No value returned -| | ... -| | ... | *Example:* -| | ... -| | ... | \| TCP or UDP packet transmission should fail \| ${nodes['TG']} \ -| | ... | \| 16.0.0.1 \| 32.0.0.1 \| eth2 \| 08:00:27:cc:4f:54 \ -| | ... | \| eth4 \| 08:00:27:c9:6a:d5 \| TCP \| 20 \| 80 \| -| | ... -| | [Arguments] | ${tg_node} | ${src_ip} | ${dst_ip} | ${tx_port} | ${tx_mac} -| | ... | ${rx_port} | ${rx_mac} | ${protocol} | ${source_port} -| | ... | ${destination_port} -| | ... -| | ${tx_port_name}= | Get interface name | ${tg_node} | ${tx_port} -| | ${rx_port_name}= | Get interface name | ${tg_node} | ${rx_port} -| | ${args}= | Catenate | --tx_mac ${tx_mac} | --rx_mac ${rx_mac} -| | ... | --src_ip ${src_ip} | --dst_ip ${dst_ip} | --tx_if ${tx_port_name} -| | ... | --rx_if ${rx_port_name} | --protocol ${protocol} -| | ... | --source_port ${source_port} | --destination_port ${destination_port} -| | Run Keyword And Expect Error | TCP/UDP Rx timeout -| | ... | Run Traffic Script On Node | send_tcp_udp.py -| | ... | ${tg_node} | ${args} - -| Receive and verify router advertisement packet -| | [Documentation] | Wait until RA packet is received and then verify\ -| | ... | specific fields of received RA packet. -| | ... -| | ... | *Arguments:* -| | ... -| | ... | - node - Node where to check for RA packet. Type: dictionary -| | ... | - rx_port - Interface where the packet is received. Type: string -| | ... | - src_mac - MAC address of source interface from which the link-local\ -| | ... | IPv6 address is constructed and checked. Type: string -| | ... | - interval - Configured retransmit interval. Optional. Type: integer -| | ... -| | ... | *Return:* -| | ... | - No value returned -| | ... -| | ... | *Example:* -| | ... -| | ... | \| Receive and verify router advertisement packet \ -| | ... | \| ${nodes['DUT1']} \| eth2 \| 08:00:27:cc:4f:54 \| -| | ... -| | [Arguments] | ${node} | ${rx_port} | ${src_mac} | ${interval}=${0} -| | ... -| | ${rx_port_name}= | Get interface name | ${node} | ${rx_port} -| | ${args}= | Catenate | --rx_if ${rx_port_name} | --src_mac ${src_mac} -| | ... | --interval ${interval} -| | Run Traffic Script On Node | check_ra_packet.py | ${node} | ${args} - -| Send router solicitation and verify response -| | [Documentation] | Send RS packet, wait for response and then verify\ -| | ... | specific fields of received RA packet. -| | ... -| | ... | *Arguments:* -| | ... -| | ... | - tg_node - TG node to send RS packet from. Type: dictionary -| | ... | - dut_node - DUT node to send RS packet to. Type: dictionary -| | ... | - rx_port - Interface where the packet is sent from. Type: string -| | ... | - tx_port - Interface where the packet is sent to. Type: string -| | ... | - src_ip - Source IP address of RS packet. Optional. If not provided,\ -| | ... | link local address will be used. Type: string -| | ... -| | ... | *Return:* -| | ... | - No value returned -| | ... -| | ... | *Example:* -| | ... -| | ... | \| Send router solicitation and verify response \ -| | ... | \| ${nodes['TG']} \| ${nodes['DUT1']} \| eth2 \ -| | ... | \| GigabitEthernet0/8/0 \| 10::10 \| -| | ... -| | [Arguments] | ${tg_node} | ${dut_node} | ${tx_port} | ${rx_port} -| | ... | ${src_ip}='' -| | ... -| | ${src_mac}= | Get Interface Mac | ${tg_node} | ${tx_port} -| | ${dst_mac}= | Get Interface Mac | ${dut_node} | ${rx_port} -| | ${src_int_name}= | Get interface name | ${tg_node} | ${tx_port} -| | ${dst_int_name}= | Get interface name | ${dut_node} | ${rx_port} -| | ${args}= | Catenate | --rx_if ${dst_int_name} | --tx_if ${src_int_name} -| | ... | --src_mac ${src_mac} | --dst_mac ${dst_mac} | --src_ip ${src_ip} -| | Run Traffic Script On Node | send_rs_check_ra.py -| | ... | ${tg_node} | ${args} - -| Send ARP Request -| | [Documentation] | Send ARP Request and check if the ARP Response is\ -| | ... | received. -| | ... -| | ... | *Arguments:* -| | ... -| | ... | _NOTE:_ Arguments are based on topology: -| | ... | TG(if1)<->(if1)DUT -| | ... -| | ... | - tg_node - Node to execute scripts on (TG). Type: dictionary -| | ... | - tx_port - Interface from which the ARP packet is sent (TG-if1). -| | ... | Type: string -| | ... | - src_mac - Source MAC address of ARP packet (TG-if1). -| | ... | Type: string -| | ... | - tgt_mac - Target MAC address which is expected in the response -| | ... | (DUT-if1). Type: string -| | ... | - src_ip - Source IP address of ARP packet (TG-if1). -| | ... | Type: string -| | ... | - tgt_ip - Target IP address of ARP packet (DUT-if1). -| | ... | Type: string -| | ... -| | ... | *Return:* -| | ... | - No value returned -| | ... -| | ... | *Example:* -| | ... -| | ... | \| Send ARP Request \| ${nodes['TG']} \| eth3 \ -| | ... | \| 08:00:27:cc:4f:54 \| 08:00:27:c9:6a:d5 \ -| | ... | \| 10.0.0.100 \| 192.168.1.5 \| -| | ... -| | [Arguments] | ${tg_node} | ${tx_port} | ${src_mac} | ${tgt_mac} | ${src_ip} -| | ... | ${tgt_ip} -| | ... -| | ${args}= | Catenate | --tx_if ${tx_port} | --src_mac ${src_mac} -| | ... | --dst_mac ${tgt_mac} | --src_ip ${src_ip} | --dst_ip ${tgt_ip} -| | Run Traffic Script On Node | arp_request.py | ${tg_node} | ${args} - -| ARP request should fail -| | [Documentation] | Send ARP Request and the ARP Response should not\ -| | ... | be received. -| | ... -| | ... | *Arguments:* -| | ... -| | ... | _NOTE:_ Arguments are based on topology: -| | ... | TG(if1)<->(if1)DUT -| | ... -| | ... | - tg_node - Node to execute scripts on (TG). Type: dictionary -| | ... | - tx_port - Interface from which the ARP packet is sent (TG-if1). -| | ... | Type: string -| | ... | - src_mac - Source MAC address of ARP packet (TG-if1). -| | ... | Type: string -| | ... | - tgt_mac - Target MAC address which is expected in the response -| | ... | (DUT-if1). Type: string -| | ... | - src_ip - Source IP address of ARP packet (TG-if1). -| | ... | Type: string -| | ... | - tgt_ip - Target IP address of ARP packet (DUT-if1). -| | ... | Type: string -| | ... -| | ... | *Return:* -| | ... | - No value returned -| | ... -| | ... | *Example:* -| | ... -| | ... | \| ARP request should fail \| ${nodes['TG']} \| eth3 \ -| | ... | \| 08:00:27:cc:4f:54 \| 08:00:27:c9:6a:d5 \ -| | ... | \| 10.0.0.100 \| 192.168.1.5 \| -| | ... -| | [Arguments] | ${tg_node} | ${tx_port} | ${src_mac} | ${tgt_mac} | ${src_ip} -| | ... | ${tgt_ip} -| | ... -| | ${args}= | Catenate | --tx_if ${tx_port} | --src_mac ${src_mac} -| | ... | --dst_mac ${tgt_mac} | --src_ip ${src_ip} | --dst_ip ${tgt_ip} -| | Run Keyword And Expect Error | ARP reply timeout -| | ... | Run Traffic Script On Node | arp_request.py | ${tg_node} | ${args} - -| Send packets and verify multipath routing -| | [Documentation] | Send 100 IP ICMP packets traffic and check if it is\ -| | ... | divided into two paths. -| | ... -| | ... | *Arguments:* -| | ... -| | ... | _NOTE:_ Arguments are based on topology: -| | ... | TG(if1)->(if1)DUT(if2)->TG(if2) -| | ... -| | ... | - tg_node - Node to execute scripts on (TG). Type: dictionary -| | ... | - src_port - Interface of TG-if1. Type: string -| | ... | - dst_port - Interface of TG-if2. Type: string -| | ... | - src_ip - IP of source interface (TG-if1). Type: string -| | ... | - dst_ip - IP of destination interface (TG-if2). Type: string -| | ... | - tx_src_mac - MAC address of TG-if1. Type: string -| | ... | - tx_dst_mac - MAC address of DUT-if1. Type: string -| | ... | - rx_src_mac - MAC address of DUT-if2. Type: string -| | ... | - rx_dst_mac_1 - MAC address of interface for path 1. Type: string -| | ... | - rx_dst_mac_2 - MAC address of interface for path 2. Type: string -| | ... -| | ... | *Return:* -| | ... | - No value returned -| | ... -| | ... | *Example:* -| | ... -| | ... | \| Send Packet And Check Multipath Routing \| ${nodes['TG']} \ -| | ... | \| eth2 \| eth3 \| 16.0.0.1 \| 32.0.0.1 \ -| | ... | \| 08:00:27:cc:4f:54 \| 08:00:27:c9:6a:d5 \| 08:00:27:54:59:f9 \ -| | ... | \| 02:00:00:00:00:02 \| 02:00:00:00:00:03 \| -| | ... -| | [Arguments] | ${tg_node} | ${src_port} | ${dst_port} | ${src_ip} | ${dst_ip} -| | ... | ${tx_src_mac} | ${tx_dst_mac} | ${rx_src_mac} | ${rx_dst_mac_1} -| | ... | ${rx_dst_mac_2} -| | ... -| | ${src_port_name}= | Get interface name | ${tg_node} | ${src_port} -| | ${dst_port_name}= | Get interface name | ${tg_node} | ${dst_port} -| | ${args}= | Catenate | --tx_if ${src_port_name} -| | ... | --rx_if ${dst_port_name} | --src_ip ${src_ip} | --dst_ip ${dst_ip} -| | ... | --tg_if1_mac ${tx_src_mac} | --dut_if1_mac ${tx_dst_mac} -| | ... | --dut_if2_mac ${rx_src_mac} | --path_1_mac ${rx_dst_mac_1} -| | ... | --path_2_mac ${rx_dst_mac_2} -| | Run Traffic Script On Node | send_icmp_check_multipath.py | ${tg_node} -| | ... | ${args} - -| Send IPv4 ping packet and verify headers -| | [Documentation] | Send ICMP Echo Request message from source port of source\ -| | ... | node to destination port of destination node and check the received\ -| | ... | ICMP Echo Reply message for correctness inlcuding source and\ -| | ... | destination IPv4 and MAC addresses and ttl value. If the destination\ -| | ... | node is TG type the ttl of received ICMP Echo Request message is\ -| | ... | checked too and corresponding ICMP Echo Reply message is created. -| | ... -| | ... | *Arguments:* -| | ... -| | ... | _NOTE:_ Arguments are based on topology: -| | ... | TG(if1)->(if1)DUT(if2)->TG(if2) -| | ... -| | ... | - tx_node - Source node to execute scripts on (mostly TG). -| | ... | Type: dictionary -| | ... | - tx_port - Source interface of tx_node. Type: string -| | ... | - rx_node - Destinantion node. Type: dictionary -| | ... | - rx_port - Destination interface of rx_node. Type: string -| | ... | - src_ip - IP address of source interface or source remote host. -| | ... | Type: string -| | ... | - dst_ip - IP address of destination interface or destination remote -| | ... | host. Type: string -| | ... | - first_hop_mac - Destination MAC address for the first hop in -| | ... | the path. Type: string -| | ... | - hops - Expected number of hops. Type: string or integer -| | ... -| | ... | *Return:* -| | ... | - No value returned -| | ... -| | ... | *Example:* -| | ... -| | ... | \| Send IPv4 ping packet and verify headers \| ${nodes['TG']} \ -| | ... | \| eth2 \| ${nodes['DUT1']} \| eth3 \| 16.0.0.1 \| 32.0.0.1 \ -| | ... | \| 08:00:27:cc:4f:54 \| 1 \| -| | ... -| | [Arguments] | ${tx_node} | ${tx_port} | ${rx_node} | ${rx_port} -| | ... | ${src_ip} | ${dst_ip} | ${first_hop_mac} | ${hops} -| | ... -| | ${src_mac}= | Get interface MAC | ${tx_node} | ${tx_port} -| | ${dst_mac}= | Get interface MAC | ${rx_node} | ${rx_port} -| | ${is_dst_tg}= | Is TG node | ${rx_node} -| | ${tx_port_name}= | Get interface name | ${tx_node} | ${tx_port} -| | ${rx_port_name}= | Get interface name | ${rx_node} | ${rx_port} -| | ${args}= | Traffic Script Gen Arg | ${rx_port_name} | ${tx_port_name} -| | ... | ${src_mac} | ${dst_mac} | ${src_ip} | ${dst_ip} -| | ${args}= | Catenate | ${args} | --hops ${hops} -| | ... | --first_hop_mac ${first_hop_mac} | --is_dst_tg ${is_dst_tg} -| | Run Traffic Script On Node | ipv4_ping_ttl_check.py | ${tx_node} | ${args} - -| Send IPv6 echo request packet and verify headers -| | [Documentation] | Send ICMPv6 Echo Request message from source port of\ -| | ... | source node to destination port of destination node and check\ -| | ... | the received ICMPv6 Echo Reply message for correctness inlcuding\ -| | ... | source and destination IPv4 and MAC addresses and hlim value. If\ -| | ... | the destination node is TG type the hlim of received ICMP Echo\ -| | ... | Request message is checked too and corresponding ICMP Echo Reply\ -| | ... | message is created and sent. -| | ... -| | ... | *Arguments:* -| | ... -| | ... | _NOTE:_ Arguments are based on topology: -| | ... | TG(if1)->(if1)DUT(if2)->TG(if2) -| | ... -| | ... | - tx_node - Source node to execute scripts on (mostly TG). -| | ... | Type: dictionary -| | ... | - tx_port - Source interface of tx_node. Type: string -| | ... | - rx_node - Destinantion node. Type: dictionary -| | ... | - rx_port - Destination interface of rx_node. Type: string -| | ... | - src_ip - IPv6 address of source interface or source remote host. -| | ... | Type: string -| | ... | - dst_ip - IPv6 address of destination interface or destination remote -| | ... | host. Type: string -| | ... | - src_nh_mac - Destination MAC address for the first hop in -| | ... | the path in direction from source node. Type: string -| | ... | - hops - Expected number of hops. Type: string or integer -| | ... | - dst_nh_mac - Destination MAC address for the first hop in -| | ... | the path in direction from destination node (Optional). Type: string -| | ... -| | ... | *Return:* -| | ... | - No value returned -| | ... -| | ... | *Example:* -| | ... -| | ... | \| Send IPv6 echo request packet and verify headers \ -| | ... | \| ${nodes['TG']} \| eth2 \| ${nodes['DUT1']} \| eth3 \| 3ffe:5f::1 \ -| | ... | \| 3ffe:5f::2 \| 08:00:27:cc:4f:54 \| 1 \| -| | ... -| | [Arguments] | ${tx_node} | ${tx_port} | ${rx_node} | ${rx_port} | ${src_ip} -| | ... | ${dst_ip} | ${src_nh_mac} | ${hops} | ${dst_nh_mac}=${NONE} -| | ... -| | ${src_mac}= | Get interface MAC | ${tx_node} | ${tx_port} -| | ${dst_mac}= | Get interface MAC | ${rx_node} | ${rx_port} -| | ${is_dst_tg}= | Is TG node | ${rx_node} -| | ${tx_port_name}= | Get interface name | ${tx_node} | ${tx_port} -| | ${rx_port_name}= | Get interface name | ${rx_node} | ${rx_port} -| | ${args}= | Traffic Script Gen Arg | ${rx_port_name} | ${tx_port_name} -| | ... | ${src_mac} | ${dst_mac} | ${src_ip} | ${dst_ip} -| | ${args}= | Catenate | ${args} | --h_num ${hops} | --src_nh_mac ${src_nh_mac} -| | ... | --dst_nh_mac ${dst_nh_mac} | --is_dst_tg ${is_dst_tg} -| | Run Traffic Script On Node | icmpv6_echo_req_resp.py | ${tx_node} | ${args} - | Send packet and verify marking | | [Documentation] | Send packet and verify DSCP of the received packet. -| | ... +| | | | ... | *Arguments:* | | ... | - node - TG node. Type: dictionary | | ... | - tx_if - TG transmit interface. Type: string @@ -564,15 +148,15 @@ | | ... | - dst_mac - Packet destination MAC. Type: string | | ... | - src_ip - Packet source IP address. Type: string | | ... | - dst_ip - Packet destination IP address. Type: string -| | ... +| | | | ... | *Example:* | | ... | \| Send packet and verify marking \| ${nodes['TG']} \| eth1 \| eth2 \ | | ... | \| 08:00:27:87:4d:f7 \| 52:54:00:d4:d8:22 \| 192.168.122.2 \ | | ... | \| 192.168.122.1 \| -| | ... +| | | | [Arguments] | ${node} | ${tx_if} | ${rx_if} | ${src_mac} | ${dst_mac} | | ... | ${src_ip} | ${dst_ip} -| | ... +| | | | ${tx_if_name}= | Get Interface Name | ${node} | ${tx_if} | | ${rx_if_name}= | Get Interface Name | ${node} | ${rx_if} | | ${args}= | Traffic Script Gen Arg | ${rx_if_name} | ${tx_if_name} @@ -584,7 +168,7 @@ | Send VXLAN encapsulated packet and verify received packet | | [Documentation] | Send VXLAN encapsulated Ethernet frame and check \ | | ... | received one. -| | ... +| | | | ... | *Arguments:* | | ... | - tg_node - Node where to run traffic script. Type: dictionary | | ... | - tx_if - Interface from where send VXLAN packet. Type: string @@ -599,17 +183,17 @@ | | ... | - rx_dst_ip - Destination IP address of received VXLAN packet. | | ... | Type: string | | ... | - rx_vni - VNI of received VXLAN packet. Type: string -| | ... +| | | | ... | *Return:* | | ... | - No value returned -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Send VXLAN encapsulated packet and verify received packet \ | | ... | \| ${tg_node} \| port4 \| port4 \ | | ... | \| fa:16:3e:6d:f9:c5 \| fa:16:3e:e6:6d:9a \| 192.168.0.1 \ | | ... | \| 192.168.0.2 \| ${101} \| 192.168.0.2 \| 192.168.0.1 \| ${102} \| -| | ... +| | | | [Arguments] | ${tg_node} | ${tx_if} | ${rx_if} | | ... | ${tx_src_mac} | ${tx_dst_mac} | | ... | ${tx_src_ip} | ${tx_dst_ip} | ${tx_vni} @@ -630,187 +214,10 @@ | | Run Traffic Script On Node | send_vxlan_check_vxlan.py | ${tg_node} | | ... | ${args} -| Send Packet And Check Received Copies -| | [Documentation] | Sends an ARP or ICMP packet from TG to DUT using one\ -| | ... | link, then receive a copy of both the sent packet and the DUT's reply\ -| | ... | on the second link. -| | ... -| | ... | Used by Honeycomb. -| | ... -| | ... | *Arguments:* -| | ... -| | ... | - tg_node - Node to execute scripts on (TG). Type: dictionary -| | ... | - tx_src_port - First interface on TG. Type: string -| | ... | - tx_src_mac - MAC address of the first interface on TG. Type: string -| | ... | - tx_dst_mac - MAC address of the first interface on DUT. Type: string -| | ... | - rx_port - Second interface on TG. Type: string -| | ... | - src_ip - Packet source IP address. Type: string -| | ... | - dst_ip - Packet destination IP address. Type: string -| | ... | - ptype - Type of payload, ARP, ICMP or ICMPv6. Type: string -| | ... -| | ... | *Return:* -| | ... | - No value returned -| | ... -| | ... | *Example:* -| | ... -| | ... | \| Send Packet And Check Received Copies \| ${nodes['TG']} \| eth1 \ -| | ... | \| 8:00:27:ee:fd:b3 \| 08:00:27:a2:52:5b \ -| | ... | \| eth3 \| 192.168.0.2 \| 192.168.0.3 \| ARP \| -| | ... -| | [Arguments] | ${tg_node} | ${tx_src_port} -| | ... | ${tx_src_mac} | ${tx_dst_mac} | ${rx_port} -| | ... | ${src_ip} | ${dst_ip} | ${ptype} -| | ${tx_port_name}= | Get interface name | ${tg_node} | ${tx_src_port} -| | ${rx_port_name}= | Get interface name | ${tg_node} | ${rx_port} -| | ${args}= | Catenate -| | ... | --tg_src_mac ${tx_src_mac} --dut_if1_mac ${tx_dst_mac} -| | ... | --src_ip ${src_ip} --dst_ip ${dst_ip} -| | ... | --tx_if ${tx_port_name} --rx_if | ${rx_port_name} -| | ... | --ptype ${ptype} -| | Run Traffic Script On Node | span_check.py | ${tg_node} | -| | ... | ${args} - -| Send ICMPv4 and check received GRE header -| | [Documentation] | Send ICMPv4 packet and check if received packed contains \ -| | ... | correct GRE, IP, MAC headers. -| | ... -| | ... | *Arguments:* -| | ... | - tg_node - Node where to run traffic script. Type: dictionary -| | ... | - tx_if - Interface from where send ICPMv4 packet. Type: string -| | ... | - rx_if - Interface where to receive GRE packet. Type: string -| | ... | - tx_dst_mac - Destination MAC address of ICMP packet. Type: string -| | ... | - rx_dst_mac - Expected destination MAC address of GRE packet. -| | ... | Type: string -| | ... | - inner_src_ip - Source IP address of ICMP packet. Type: string -| | ... | - inner_dst_ip - Destination IP address of ICMP packet. -| | ... | Type: string -| | ... | - outer_src_ip - Source IP address of GRE packet. Type: string -| | ... | - outer_dst_ip - Destination IP address of GRE packet. -| | ... | Type: string -| | ... -| | ... | *Return:* -| | ... | - No value returned -| | ... -| | ... | *Example:* -| | ... -| | ... | \| Send ICMPv4 and check received GRE header \ -| | ... | \| ${tg_node} \| ${tg_to_dut_if1} \| ${tg_to_dut_if2} \ -| | ... | \| ${tx_dst_mac} \| ${rx_dst_mac} \| ${net1_host_address} \ -| | ... | \| ${net2_host_address} \| ${dut1_ip_address} \| ${dut2_ip_address} \| -| | ... -| | [Arguments] | ${tg_node} | ${tx_if} | ${rx_if} -| | ... | ${tx_dst_mac} | ${rx_dst_mac} -| | ... | ${inner_src_ip} | ${inner_dst_ip} -| | ... | ${outer_src_ip} | ${outer_dst_ip} -| | ${tx_if_name}= | Get interface name | ${tg_node} | ${tx_if} -| | ${rx_if_name}= | Get interface name | ${tg_node} | ${rx_if} -| | ${args}= | Catenate | --tx_if | ${tx_if_name} | --rx_if | ${rx_if_name} -| | ... | --tx_dst_mac | ${tx_dst_mac} | --rx_dst_mac | ${rx_dst_mac} -| | ... | --inner_src_ip | ${inner_src_ip} | --inner_dst_ip | ${inner_dst_ip} -| | ... | --outer_src_ip | ${outer_src_ip} | --outer_dst_ip | ${outer_dst_ip} -| | Run Traffic Script On Node -| | ... | send_icmp_check_gre_headers.py | ${tg_node} | ${args} - -| Send GRE and check received ICMPv4 header -| | [Documentation] | Send IPv4 ICMPv4 packet encapsulated into GRE and \ -| | ... | check IP, MAC headers on received packed. -| | ... -| | ... | *Arguments:* -| | ... | - tg_node - Node where to run traffic script. Type: dictionary -| | ... | - tx_if - Interface from where send ICPMv4 packet. Type: string -| | ... | - rx_if - Interface where receive GRE packet. Type: string -| | ... | - tx_dst_mac - Destination MAC address of GRE packet. Type: string -| | ... | - rx_dst_mac - Expected destination MAC address of ICMP packet. -| | ... | Type: string -| | ... | - inner_src_ip - Source IP address of ICMP packet. Type: string -| | ... | - inner_dst_ip - Destination IP address of ICMP packet. -| | ... | Type: string -| | ... | - outer_src_ip - Source IP address of GRE packet. Type: string -| | ... | - outer_dst_ip - Destination IP address of GRE packet. -| | ... | Type: string -| | ... -| | ... | *Return:* -| | ... | - No value returned -| | ... -| | ... | *Example:* -| | ... -| | ... | \| Send GRE and check received ICMPv4 header \| ${tg_node} \ -| | ... | \| ${tg_to_dut_if2} \| ${tg_to_dut_if1} \| ${tx_dst_mac} \ -| | ... | \| ${rx_dst_mac} \| ${net2_host_address} \| ${net1_host_address} \ -| | ... | \| ${dut2_ip_address} \| ${dut1_ip_address} \| -| | ... -| | [Arguments] | ${tg_node} | ${tx_if} | ${rx_if} -| | ... | ${tx_dst_mac} | ${rx_dst_mac} -| | ... | ${inner_src_ip} | ${inner_dst_ip} -| | ... | ${outer_src_ip} | ${outer_dst_ip} -| | ${tx_if_name}= | Get interface name | ${tg_node} | ${tx_if} -| | ${rx_if_name}= | Get interface name | ${tg_node} | ${rx_if} -| | ${args}= | Catenate | --tx_if | ${tx_if_name} | --rx_if | ${rx_if_name} -| | ... | --tx_dst_mac | ${tx_dst_mac} | --rx_dst_mac | ${rx_dst_mac} -| | ... | --inner_src_ip | ${inner_src_ip} | --inner_dst_ip | ${inner_dst_ip} -| | ... | --outer_src_ip | ${outer_src_ip} | --outer_dst_ip | ${outer_dst_ip} -| | Run Traffic Script On Node -| | ... | send_gre_check_icmp_headers.py | ${tg_node} | ${args} - -| Send GRE and check received GRE header -| | [Documentation] | Send IPv4 UDP packet encapsulated into GRE and \ -| | ... | check if received packed contains correct MAC GRE, IP, UDP headers. -| | ... -| | ... | *Arguments:* -| | ... | - tg_node - Node where to run traffic script. Type: dictionary -| | ... | - tx_if - Interface from where send GRE packet. Type: string -| | ... | - rx_if - Interface where to receive GRE packet. Type: string -| | ... | - tx_dst_mac - Destination MAC address of transferred packet. -| | ... | Type: string -| | ... | - tx_src_mac - Source MAC address of transferred packet. Type: string -| | ... | - tx_outer_dst_ip - Destination IP address of GRE packet. Type: string -| | ... | - tx_outer_src_ip - Source IP address of GRE packet. Type: string -| | ... | - tx_inner_dst_ip - Destination IP address of UDP packet. Type: string -| | ... | - tx_inner_src_ip - Source IP address of UDP packet. Type: string -| | ... | - rx_dst_mac - Expected destination MAC address. Type: string -| | ... | - rx_src_mac - Expected source MAC address. Type: string -| | ... | - rx_outer_dst_ip - Expected destination IP address of received GRE -| | ... | packet. Type: string -| | ... | - rx_outer_src_ip - Expected source IP address of received GRE -| | ... | packet. Type: string -| | ... -| | ... | __Note:__ -| | ... | rx_inner_dst_ip and rx_inner_src_ip should be same as transferred -| | ... -| | ... | *Return:* -| | ... | - No value returned -| | ... -| | ... | *Example:* -| | ... | \| Send GRE and check received GRE header \| ${tg_node} \ -| | ... | \| port3 \| port3 \| 08:00:27:f3:be:f0 \| 08:00:27:46:2b:4c \ -| | ... | \| 10.0.0.1 \| 10.0.0.2 \| 192.168.3.100 \| 192.168.2.100 \ -| | ... | \| 08:00:27:46:2b:4c \| 08:00:27:f3:be:f0 \| 10.0.0.3 \| 10.0.0.1 \| -| | ... -| | [Arguments] | ${tg_node} | ${tx_if} | ${rx_if} -| | ... | ${tx_dst_mac} | ${tx_src_mac} -| | ... | ${tx_outer_dst_ip} | ${tx_outer_src_ip} -| | ... | ${tx_inner_dst_ip} | ${tx_inner_src_ip} -| | ... | ${rx_dst_mac} | ${rx_src_mac} -| | ... | ${rx_outer_dst_ip} | ${rx_outer_src_ip} -| | ${tx_if_name}= | Get interface name | ${tg_node} | ${tx_if} -| | ${rx_if_name}= | Get interface name | ${tg_node} | ${rx_if} -| | ${args}= | Catenate | --tx_if | ${tx_if_name} | --rx_if | ${rx_if_name} -| | ... | --tx_dst_mac | ${tx_dst_mac} | --tx_src_mac | ${tx_src_mac} -| | ... | --tx_outer_dst_ip | ${tx_outer_dst_ip} -| | ... | --tx_outer_src_ip | ${tx_outer_src_ip} -| | ... | --tx_inner_dst_ip | ${tx_inner_dst_ip} -| | ... | --tx_inner_src_ip | ${tx_inner_src_ip} -| | ... | --rx_dst_mac | ${rx_dst_mac} -| | ... | --rx_src_mac | ${rx_src_mac} -| | ... | --rx_outer_dst_ip | ${rx_outer_dst_ip} -| | ... | --rx_outer_src_ip | ${rx_outer_src_ip} -| | Run Traffic Script On Node -| | ... | send_gre_check_gre_headers.py | ${tg_node} | ${args} - | Send ICMP echo request and verify answer | | [Documentation] | Run traffic script that waits for ICMP reply and ignores | | ... | all other packets. -| | ... +| | | | ... | *Arguments:* | | ... | - tg_node - TG node where run traffic script. Type: dictionary | | ... | - tg_interface - TG interface where send ICMP echo request. @@ -820,17 +227,17 @@ | | ... | - dst_ip - Destination IP address. Type: string | | ... | - src_ip - Source IP address. Type: string | | ... | - timeout - Wait timeout in seconds (Default: 10). Type: integer -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Send ICMP echo request and verify answer \ | | ... | \| ${nodes['TG']} \| eth2 \ | | ... | \| 08:00:27:46:2b:4c \| 08:00:27:66:b8:57 \ | | ... | \| 192.168.23.10 \| 192.168.23.1 \| 10 \| -| | ... +| | | | [Arguments] | ${tg_node} | ${tg_interface} | | ... | ${dst_mac} | ${src_mac} | ${dst_ip} | ${src_ip} | ${timeout}=${10} -| | ... +| | | | ${tg_interface_name}= | Get interface name | ${tg_node} | ${tg_interface} | | ${args}= | Catenate | --rx_if ${tg_interface_name} | | ... | --tx_if ${tg_interface_name} | --dst_mac ${dst_mac} @@ -842,7 +249,7 @@ | Send IPsec Packet and verify ESP encapsulation in received packet | | [Documentation] | Send IPsec packet from TG to DUT. Receive IPsec packet\ | | ... | from DUT on TG and verify ESP encapsulation. -| | ... +| | | | ... | *Arguments:* | | ... | - node - TG node. Type: dictionary | | ... | - tx_interface - TG Interface 1. Type: string @@ -861,7 +268,7 @@ | | ... | - r_ip - Remote IP address. Type: string | | ... | - l_tunnel - Local tunnel IP address (optional). Type: string | | ... | - r_tunnel - Remote tunnel IP address (optional). Type: string -| | ... +| | | | ... | *Example:* | | ... | \| ${encr_alg}= \| Crypto Alg AES CBC 128 \| | | ... | \| ${auth_alg}= \| Integ Alg SHA1 96 \| @@ -871,12 +278,12 @@ | | ... | \| sixteenbytes_key \| ${auth_alg} \| twentybytessecretkey \ | | ... | \| ${1001} \| ${1000} \| 192.168.3.3 \| 192.168.4.4 \| 192.168.100.2 \ | | ... | \| 192.168.100.3 \| -| | ... +| | | | [Arguments] | ${node} | ${tx_interface} | ${rx_interface} | ${tx_dst_mac} | | ... | ${rx_src_mac} | ${crypto_alg} | ${crypto_key} | ${integ_alg} | | ... | ${integ_key} | ${l_spi} | ${r_spi} | ${l_ip} | ${r_ip} | | ... | ${l_tunnel}=${None} | ${r_tunnel}=${None} -| | ... +| | | | ${tx_src_mac}= | Get Interface Mac | ${node} | ${tx_interface} | | ${tx_if_name}= | Get Interface Name | ${node} | ${tx_interface} | | ${rx_dst_mac}= | Get Interface Mac | ${node} | ${tx_interface} @@ -899,12 +306,12 @@ | Send packet and verify LISP encap | | [Documentation] | Send ICMP packet to DUT out one interface and receive\ | | ... | a LISP encapsulated packet on the other interface. -| | ... +| | | | ... | *Arguments:* -| | ... +| | | | ... | _NOTE:_ Arguments are based on topology: | | ... | TG(if1)->(if1)DUT(if2)->TG(if2) -| | ... +| | | | ... | - tg_node - Node to execute scripts on (TG). Type: dictionary | | ... | - src_ip - IP of source interface (TG-if1). Type: string | | ... | - dst_ip - IP of destination interface (TG-if2). Type: string @@ -916,21 +323,21 @@ | | ... | - rx_dst_mac - MAC address of TG-if2. Type: string | | ... | - src_rloc - configured RLOC source address. Type: string | | ... | - dst_rloc - configured RLOC destination address. Type: string -| | ... +| | | | ... | *Return:* | | ... | - No value returned -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Send packet and verify LISP encap \| ${nodes['TG']} \| 10.0.0.1 \ | | ... | \| 32.0.0.1 \| eth2 \| 08:00:27:ee:fd:b3 \| 08:00:27:a2:52:5b \ | | ... | \| eth3 \| 08:00:27:4d:ca:7a \| 08:00:27:7d:fd:10 \| 10.0.1.1 \ | | ... | \| 10.0.1.2 \| -| | ... +| | | | [Arguments] | ${tg_node} | ${src_ip} | ${dst_ip} | ${tx_src_port} | | ... | ${tx_src_mac} | ${tx_dst_mac} | ${rx_port} | ${rx_src_mac} | | ... | ${rx_dst_mac} | ${src_rloc} | ${dst_rloc} -| | ... +| | | | ${tx_port_name}= | Get interface name | ${tg_node} | ${tx_src_port} | | ${rx_port_name}= | Get interface name | ${tg_node} | ${rx_port} | | ${args}= | Catenate | --tg_src_mac | ${tx_src_mac} | --tg_dst_mac @@ -944,12 +351,12 @@ | Send packet and verify LISP GPE encap | | [Documentation] | Send ICMP packet to DUT out one interface and receive\ | | ... | a LISP-GPE encapsulated packet on the other interface. -| | ... +| | | | ... | *Arguments:* -| | ... +| | | | ... | _NOTE:_ Arguments are based on topology: -| | ... | TG(if1)->(if1)DUT(if2)->TG(if2) -| | ... +| | ... | TG(if1)->(if1)DUT(if2)->TG(if2) +| | | | ... | - tg_node - Node to execute scripts on (TG). Type: dictionary | | ... | - src_ip - IP of source interface (TG-if1). Type: string | | ... | - dst_ip - IP of destination interface (TG-if2). Type: string @@ -961,22 +368,22 @@ | | ... | - rx_dst_mac - MAC address of TG-if2. Type: string | | ... | - src_rloc - configured RLOC source address. Type: string | | ... | - dst_rloc - configured RLOC destination address. Type: string -| | ... +| | | | ... | *Return:* | | ... | - No value returned -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Send packet and verify LISP GPE encap \| ${nodes['TG']} \ | | ... | \| 10.0.0.1 \| 32.0.0.1 \ | | ... | \| eth2 \| 08:00:27:ee:fd:b3 \| 08:00:27:a2:52:5b \ | | ... | \| eth3 \| 08:00:27:4d:ca:7a \| 08:00:27:7d:fd:10 \ | | ... | \| 10.0.1.1 \| 10.0.1.2 \| -| | ... +| | | | [Arguments] | ${tg_node} | ${src_ip} | ${dst_ip} | ${tx_src_port} | | | ... | ${tx_src_mac} | ${tx_dst_mac} | ${rx_port} | ${rx_src_mac} | | ... | ${rx_dst_mac} | ${src_rloc} | ${dst_rloc} -| | ... +| | | | ${tx_port_name}= | Get interface name | ${tg_node} | ${tx_src_port} | | ${rx_port_name}= | Get interface name | ${tg_node} | ${rx_port} | | ${args}= | Catenate | --tg_src_mac | ${tx_src_mac} | --tg_dst_mac @@ -990,12 +397,12 @@ | Send packet and verify LISPoTunnel encap | | [Documentation] | Send ICMP packet to DUT out one interface and receive\ | | ... | a LISP encapsulated packet on the other interface. -| | ... +| | | | ... | *Arguments:* -| | ... +| | | | ... | _NOTE:_ Arguments are based on topology: | | ... | TG(if1)->(if1)DUT(if2)->TG(if2) -| | ... +| | | | ... | - tg_node - Node to execute scripts on (TG). Type: dictionary | | ... | - src_ip - IP of source interface (TG-if1). Type: string | | ... | - dst_ip - IP of destination interface (TG-if2). Type: string @@ -1008,21 +415,21 @@ | | ... | - src_rloc - configured RLOC source address. Type: string | | ... | - dst_rloc - configured RLOC destination address. Type: string | | ... | - ot_mode - overlay tunnel mode. Type: string -| | ... +| | | | ... | *Return:* | | ... | - No value returned -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Send packet and verify LISP encap \| ${nodes['TG']} \| 10.0.0.1 \ | | ... | \| 32.0.0.1 \| eth2 \| 08:00:27:ee:fd:b3 \| 08:00:27:a2:52:5b \ | | ... | \| eth3 \| 08:00:27:4d:ca:7a \| 08:00:27:7d:fd:10 \| 10.0.1.1 \ | | ... | \| 10.0.1.2 \| -| | ... +| | | | [Arguments] | ${tg_node} | ${src_ip} | ${dst_ip} | ${tx_src_port} | | ... | ${tx_src_mac} | ${tx_dst_mac} | ${rx_port} | ${rx_src_mac} | | ... | ${rx_dst_mac} | ${src_rloc} | ${dst_rloc} | ${ot_mode} -| | ... +| | | | ${tx_port_name}= | Get interface name | ${tg_node} | ${tx_src_port} | | ${rx_port_name}= | Get interface name | ${tg_node} | ${rx_port} | | ${args}= | Catenate | --tg_src_mac | ${tx_src_mac} | --tg_dst_mac diff --git a/resources/libraries/robot/shared/vm.robot b/resources/libraries/robot/shared/vm.robot index c6e5373c8b..bdb1964bd3 100644 --- a/resources/libraries/robot/shared/vm.robot +++ b/resources/libraries/robot/shared/vm.robot @@ -21,7 +21,7 @@ | | [Documentation] | | ... | Start 1..N chains of 1..N QEMU guests (VNFs) with two vhost-user\ | | ... | interfaces and interconnecting NF. -| | ... +| | | | ... | *Arguments:* | | ... | - nf_chains - Number of chains of NFs. Type: integer | | ... | - nf_nodes - Number of NFs nodes per chain. Type: integer @@ -34,16 +34,16 @@ | | ... | in containers as vswitch, otherwise use single RXQ. Type: boolean | | ... | - vnf - Network function as a payload. Type: string | | ... | - pinning - Whether to pin QEMU VMs to specific cores -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Configure chains of VMs connected via vhost-user | | ... | \| 1 \| 1 \| False \| 1024 \| False \| False \| vpp \| True \| -| | ... +| | | | [Arguments] | ${nf_chains}=${1} | ${nf_nodes}=${1} | ${jumbo}=${False} | | ... | ${perf_qemu_qsz}=${1024} | ${use_tuned_cfs}=${False} | | ... | ${auto_scale}=${True} | ${vnf}=vpp | ${pinning}=${True} -| | ... +| | | | Import Library | resources.libraries.python.QemuManager | ${nodes} | | ... | WITH NAME | vnf_manager | | Run Keyword | vnf_manager.Construct VMs on all nodes @@ -61,7 +61,7 @@ | | [Documentation] | | ... | Start 1..N chains of 1..N QEMU guests (VNFs) with two vhost-user\ | | ... | interfaces and interconnecting NF on single DUT node. -| | ... +| | | | ... | *Arguments:* | | ... | - node - DUT node. Type: dictionary | | ... | - nf_chains - Number of chains of NFs. Type: integer @@ -75,18 +75,18 @@ | | ... | in containers as vswitch, otherwise use single RXQ. Type: boolean | | ... | - vnf - Network function as a payload. Type: string | | ... | - pinning - Whether to pin QEMU VMs to specific cores -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Configure chains of NFs connected via vhost-user on single node | | ... | \| DUT1 \| 1 \| 1 \| False \| 1024 \| False \| False \| vpp \| | | ... | True \| -| | ... +| | | | [Arguments] | ${node} | ${nf_chains}=${1} | ${nf_nodes}=${1} | | ... | ${jumbo}=${False} | ${perf_qemu_qsz}=${1024} | | ... | ${use_tuned_cfs}=${False} | ${auto_scale}=${True} | ${vnf}=vpp | | ... | ${pinning}=${True} -| | ... +| | | | Import Library | resources.libraries.python.QemuManager | ${nodes} | | ... | WITH NAME | vnf_manager | | Run Keyword | vnf_manager.Initialize diff --git a/resources/libraries/robot/tcp/tcp_setup.robot b/resources/libraries/robot/tcp/tcp_setup.robot index 91192639c1..718070979f 100644 --- a/resources/libraries/robot/tcp/tcp_setup.robot +++ b/resources/libraries/robot/tcp/tcp_setup.robot @@ -15,9 +15,9 @@ | Library | resources.libraries.python.InterfaceUtil | Library | resources.libraries.python.IPUtil | Library | resources.libraries.python.tcp.TCPUtils -| ... +| | Resource | resources/libraries/robot/ip/ip4.robot -| ... +| | Documentation | L2 keywords to set up VPP to test tcp. *** Keywords *** @@ -25,7 +25,7 @@ | | [Documentation] | | ... | Configure IP address on the port, set it up and start HTTP server on | | ... | the VPP. -| | ... +| | | | ... | *Arguments:* | | ... | - http_static_plugin - Use the HTTP static plugin http server. | | ... | Type: boolean @@ -34,15 +34,15 @@ | | ... | - fifo_size - FIFO size in kB. Type: string | | ... | - private_segment_size - Private segment size. Number + unit. | | ... | Type: string -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Set up HTTP server with paramters on the VPP node \| ${true}\ | | ... | \| 400 \| 4096 \| 2g \| -| | ... +| | | | [Arguments] | ${http_static_plugin} | ${prealloc_fifos} | ${fifo_size} | | ... | ${private_segment_size} -| | ... +| | | | Set Interface State | ${dut1} | ${dut1_if1} | up | | VPP Interface Set IP Address | ${dut1} | ${dut1_if1} | 192.168.10.2 | 24 | | VPP Interface Set IP Address | ${dut1} | ${dut1_if1} | 192.168.20.2 | 24 diff --git a/resources/libraries/robot/wrk/wrk_utils.robot b/resources/libraries/robot/wrk/wrk_utils.robot index 1c65228130..1f6261af5a 100644 --- a/resources/libraries/robot/wrk/wrk_utils.robot +++ b/resources/libraries/robot/wrk/wrk_utils.robot @@ -17,7 +17,7 @@ | Library | resources.libraries.python.DUTSetup | Library | resources.libraries.python.TrafficGenerator | Library | resources.libraries.python.topology.Topology -| ... +| | Documentation | L2 keywords to set up wrk and to measure performance | ... | parameters using wrk. @@ -25,17 +25,17 @@ | Measure throughput | | [Documentation] | | ... | Measure throughput using wrk. -| | ... +| | | | ... | *Arguments:* | | ... | - ${profile} - The name of the wrk traffic profile defining the | | ... | traffic. Type: string -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Measure throughput \| wrk-bw-1url-1core-50con \| -| | ... +| | | | [Arguments] | ${profile} -| | ... +| | | | ${tg_numa}= | Get interfaces numa node | ${tg} | ${tg_if1} | ${tg_if2} | | ${output}= | Run wrk | ${tg} | ${profile} | ${tg_numa} | bw | | Set test message | ${output} @@ -43,17 +43,17 @@ | Measure requests per second | | [Documentation] | | ... | Measure number of requests per second using wrk. -| | ... +| | | | ... | *Arguments:* | | ... | - ${profile} - The name of the wrk traffic profile defining the | | ... | traffic. Type: string -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Measure requests per second \| wrk-bw-1url-1core-50con \| -| | ... +| | | | [Arguments] | ${profile} -| | ... +| | | | ${tg_numa}= | Get interfaces numa node | ${tg} | ${tg_if1} | ${tg_if2} | | ${output}= | Run wrk | ${tg} | ${profile} | ${tg_numa} | rps | | Set test message | ${output} @@ -61,17 +61,17 @@ | Measure connections per second | | [Documentation] | | ... | Measure number of connections per second using wrk. -| | ... +| | | | ... | *Arguments:* | | ... | - ${profile} - The name of the wrk traffic profile defining the | | ... | traffic. Type: string -| | ... +| | | | ... | *Example:* -| | ... +| | | | ... | \| Measure connections per second \| wrk-bw-1url-1core-50con \| -| | ... +| | | | [Arguments] | ${profile} -| | ... +| | | | ${tg_numa}= | Get interfaces numa node | ${tg} | ${tg_if1} | ${tg_if2} | | ${output}= | Run wrk | ${tg} | ${profile} | ${tg_numa} | cps | | Set test message | ${output} |