diff options
Diffstat (limited to 'resources/libraries/robot/shared')
-rw-r--r-- | resources/libraries/robot/shared/container.robot | 121 | ||||
-rw-r--r-- | resources/libraries/robot/shared/default.robot | 98 | ||||
-rw-r--r-- | resources/libraries/robot/shared/interfaces.robot | 225 | ||||
-rw-r--r-- | resources/libraries/robot/shared/memif.robot | 26 | ||||
-rw-r--r-- | resources/libraries/robot/shared/suite_setup.robot | 57 | ||||
-rw-r--r-- | resources/libraries/robot/shared/suite_teardown.robot | 18 | ||||
-rw-r--r-- | resources/libraries/robot/shared/test_setup.robot | 16 | ||||
-rw-r--r-- | resources/libraries/robot/shared/test_teardown.robot | 45 | ||||
-rw-r--r-- | resources/libraries/robot/shared/testing_path.robot | 96 | ||||
-rw-r--r-- | resources/libraries/robot/shared/traffic.robot | 711 | ||||
-rw-r--r-- | resources/libraries/robot/shared/vm.robot | 20 |
11 files changed, 442 insertions, 991 deletions
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 |