diff options
Diffstat (limited to 'resources/libraries/robot')
-rw-r--r-- | resources/libraries/robot/ip/ip4.robot | 13 | ||||
-rw-r--r-- | resources/libraries/robot/ip/nat.robot | 127 | ||||
-rw-r--r-- | resources/libraries/robot/performance/performance_limits.robot | 88 | ||||
-rw-r--r-- | resources/libraries/robot/performance/performance_utils.robot | 158 | ||||
-rw-r--r-- | resources/libraries/robot/shared/default.robot | 101 | ||||
-rw-r--r-- | resources/libraries/robot/shared/test_teardown.robot | 11 |
6 files changed, 313 insertions, 185 deletions
diff --git a/resources/libraries/robot/ip/ip4.robot b/resources/libraries/robot/ip/ip4.robot index 2dc2a72857..9855e129a4 100644 --- a/resources/libraries/robot/ip/ip4.robot +++ b/resources/libraries/robot/ip/ip4.robot @@ -32,13 +32,16 @@ | | ... | Type: string | | ... | - remote_host2_ip - IP address of remote host2 (Optional). | | ... | Type: string +| | ... | - remote_host_mask - Mask of remote host IP addresses (Optional). +| | ... | Type: string | | | | ... | *Example:* | | | | ... | \| Initialize IPv4 forwarding in circular topology \ -| | ... | \| 192.168.0.1 \| 192.168.0.2 \| +| | ... | \| 192.168.0.1 \| 192.168.0.2 \| 24 \| | | | | [Arguments] | ${remote_host1_ip}=${NONE} | ${remote_host2_ip}=${NONE} +| | ... | ${remote_host_mask}=32 | | | | ${dut2_status} | ${value}= | Run Keyword And Ignore Error | | ... | Variable Should Exist | ${dut2} @@ -81,18 +84,18 @@ | | ... | interface=${DUT2_${int}1}[0] | | | | Run Keyword Unless | '${remote_host1_ip}' == '${NONE}' -| | ... | Vpp Route Add | ${dut1} | ${remote_host1_ip} | 24 +| | ... | Vpp Route Add | ${dut1} | ${remote_host1_ip} | ${remote_host_mask} | | ... | gateway=10.10.10.2 | interface=${DUT1_${int}1}[0] | | Run Keyword Unless | '${remote_host2_ip}' == '${NONE}' -| | ... | Vpp Route Add | ${dut} | ${remote_host2_ip} | 24 +| | ... | Vpp Route Add | ${dut} | ${remote_host2_ip} | ${remote_host_mask} | | ... | gateway=20.20.20.2 | interface=${dut_if2} | | Run Keyword Unless | '${remote_host1_ip}' == '${NONE}' | | ... | Run Keyword If | '${dut2_status}' == 'PASS' -| | ... | Vpp Route Add | ${dut1} | ${remote_host1_ip} | 24 +| | ... | Vpp Route Add | ${dut1} | ${remote_host1_ip} | ${remote_host_mask} | | ... | gateway=1.1.1.2 | interface=${DUT1_${int}2}[0] | | Run Keyword Unless | '${remote_host2_ip}' == '${NONE}' | | ... | Run Keyword If | '${dut2_status}' == 'PASS' -| | ... | Vpp Route Add | ${dut2} | ${remote_host2_ip} | 24 +| | ... | Vpp Route Add | ${dut2} | ${remote_host2_ip} | ${remote_host_mask} | | ... | gateway=1.1.1.1 | interface=${DUT2_${int}1}[0] | Initialize IPv4 forwarding with scaling in circular topology diff --git a/resources/libraries/robot/ip/nat.robot b/resources/libraries/robot/ip/nat.robot index e1c302e98a..8a970cf556 100644 --- a/resources/libraries/robot/ip/nat.robot +++ b/resources/libraries/robot/ip/nat.robot @@ -72,86 +72,81 @@ | | | | Show NAT | ${node} -| Initialize NAT44 in circular topology -| | [Documentation] | Initialization of 2-node / 3-node topology with NAT44 -| | ... | between DUTs: +| Initialize NAT44 deterministic mode in circular topology +| | [Documentation] | Initialization of NAT44 deterministic mode on DUT1 +| | +| | Configure inside and outside interfaces +| | ... | ${dut1} | ${DUT1_${int}1}[0] | ${DUT1_${int}2}[0] +| | Configure deterministic mode for NAT44 +| | ... | ${dut1} | ${in_net} | ${in_mask} | ${out_net} | ${out_mask} + +| Initialize NAT44 endpoint-dependent mode in circular topology +| | [Documentation] | Initialization of NAT44 endpoint-dependent mode on DUT1 +| | +| | Configure inside and outside interfaces +| | ... | ${dut1} | ${DUT1_${int}1}[0] | ${DUT1_${int}2}[0] +| | Set NAT44 Address Range +| | ... | ${dut1} | ${out_net} | ${out_net_end} + +# TODO: Remove when 'ip4.Initialize IPv4 forwarding in circular topology' KW +# adapted to use IP values from variables +| Initialize IPv4 forwarding for NAT44 in circular topology +| | [Documentation] +| | ... | Set IPv4 forwarding for NAT44: | | ... | - set interfaces up | | ... | - set IP addresses | | ... | - set ARP | | ... | - create routes -| | ... | - set NAT44 - only on DUT1 | | -| | ${dut2_status} | ${value}= | Run Keyword And Ignore Error +| | ${status} | ${value}= | Run Keyword And Ignore Error | | ... | Variable Should Exist | ${dut2} +| | ${dut2_status}= | Set Variable If | '${status}' == 'PASS' | ${True} +| | ... | ${False} | | | | Set interfaces in path up | | -| | ${tg_if1_ip4}= | Get Variable Value | ${tg_if1_ip4} | 10.0.0.2 -| | ${tg_if1_mask}= | Get Variable Value | ${tg_if1_mask} | 20 -| | ${tg_if2_ip4}= | Get Variable Value | ${tg_if2_ip4} | 12.0.0.2 -| | ${tg_if2_mask}= | Get Variable Value | ${tg_if2_mask} | 20 -| | ${dut1_if1_ip4}= | Get Variable Value | ${dut1_if1_ip4} | 10.0.0.1 -| | ${dut1_if1_mask}= | Get Variable Value | ${dut1_if1_mask} | 20 -| | ${dut1_if2_ip4}= | Get Variable Value | ${dut1_if2_ip4} | 11.0.0.1 -| | ${dut1_if2_mask}= | Get Variable Value | ${dut2_if2_mask} | 20 -| | ${dut2_if1_ip4}= | Get Variable Value | ${dut2_if1_ip4} | 11.0.0.2 -| | ${dut2_if1_mask}= | Get Variable Value | ${dut2_if1_mask} | 20 -| | ${dut2_if2_ip4}= | Get Variable Value | ${dut2_if2_ip4} | 12.0.0.1 -| | ${dut2_if2_mask}= | Get Variable Value | ${dut2_if2_mask} | 20 -| | ${inside_net}= | Get Variable Value | ${inside_net} | 192.168.0.0 -| | ${inside_mask}= | Get Variable Value | ${inside_mask} | 16 -| | ${nat_net}= | Get Variable Value | ${nat_net} | 109.146.163.128 -| | ${nat_mask}= | Get Variable Value | ${nat_mask} | 26 -| | ${dest_net}= | Get Variable Value | ${dest_net} | 20.0.0.0 -| | ${dest_mask}= | Get Variable Value | ${dest_mask} | 24 -| | -| | VPP Interface Set IP Address | ${dut1} | ${DUT1_${int}1}[0] -| | ... | ${dut1_if1_ip4} | ${dut1_if1_mask} -| | Run Keyword If | '${dut2_status}' == 'PASS' -| | ... | VPP Interface Set IP Address | ${dut1} | ${DUT1_${int}2}[0] -| | ... | ${dut1_if2_ip4} | ${dut1_if2_mask} -| | Run Keyword If | '${dut2_status}' == 'PASS' -| | ... | VPP Interface Set IP Address | ${dut2} | ${DUT2_${int}1}[0] -| | ... | ${dut2_if1_ip4} | ${dut2_if1_mask} -| | ${dut}= | Run Keyword If | '${dut2_status}' == 'PASS' -| | ... | Set Variable | ${dut2} -| | ... | ELSE | Set Variable | ${dut1} -| | ${dut_if2}= | Run Keyword If | '${dut2_status}' == 'PASS' -| | ... | Set Variable | ${DUT2_${int}2}[0] -| | ... | ELSE | Set Variable | ${DUT1_${int}2}[0] -| | VPP Interface Set IP Address | ${dut} | ${dut_if2} | ${dut2_if2_ip4} -| | ... | ${dut2_if2_mask} +| | VPP Interface Set IP Address +| | ... | ${dut1} | ${DUT1_${int}1}[0] | ${dut1_if1_ip4} | ${dut1_if1_mask} +| | VPP Interface Set IP Address +| | ... | ${dut1} | ${DUT1_${int}2}[0] | ${dut1_if2_ip4} | ${dut1_if2_mask} +| | Run Keyword If | ${dut2_status} +| | ... | VPP Interface Set IP Address +| | ... | ${dut2} | ${DUT2_${int}1}[0] | ${dut2_if1_ip4} | ${dut2_if1_mask} +| | Run Keyword If | ${dut2_status} +| | ... | VPP Interface Set IP Address +| | ... | ${dut2} | ${DUT2_${int}2}[0] | ${dut2_if2_ip4} | ${dut2_if2_mask} | | | | VPP Add IP Neighbor | | ... | ${dut1} | ${DUT1_${int}1}[0] | ${tg_if1_ip4} | ${TG_pf1_mac}[0] -| | Run Keyword If | '${dut2_status}' == 'PASS' +| | Run Keyword If | ${dut2_status} | | ... | VPP Add IP Neighbor | | ... | ${dut1} | ${DUT1_${int}2}[0] | ${dut2_if1_ip4} | | ... | ${DUT2_${int}1_mac}[0] -| | Run Keyword If | '${dut2_status}' == 'PASS' +| | ... | ELSE | VPP Add IP Neighbor +| | ... | ${dut1} | ${DUT1_${int}2}[0] | ${tg_if2_ip4} | ${TG_pf2_mac}[0] +| | Run Keyword If | ${dut2_status} | | ... | VPP Add IP Neighbor -| | ... | ${dut2} | ${DUT2_${int}1}[0] | ${dut1_if2_ip4} +| | ... | ${dut2} | ${DUT2_${int}1}[0] | ${dut1_if1_ip4} | | ... | ${DUT1_${int}2_mac}[0] -| | VPP Add IP Neighbor -| | ... | ${dut} | ${dut_if2} | ${tg_if2_ip4} | ${TG_pf2_mac}[0] -| | -| | Vpp Route Add | ${dut1} | ${inside_net} | ${inside_mask} -| | ... | gateway=${tg_if1_ip4} | interface=${DUT1_${int}1}[0] -| | Run Keyword If | '${dut2_status}' == 'PASS' -| | ... | Vpp Route Add | ${dut1} | ${dest_net} | ${dest_mask} -| | ... | gateway=${dut2_if1_ip4} | interface=${DUT1_${int}2}[0] -| | Run Keyword Unless | '${dut2_status}' == 'PASS' -| | ... | Vpp Route Add | ${dut1} | ${dest_net} | ${dest_mask} -| | ... | gateway=${tg_if2_ip4} | interface=${DUT1_${int}2}[0] -| | Run Keyword If | '${dut2_status}' == 'PASS' -| | ... | Vpp Route Add | ${dut2} | ${dest_net} | ${dest_mask} -| | ... | gateway=${tg_if2_ip4} | interface=${DUT2_${int}2}[0] -| | Run Keyword If | '${dut2_status}' == 'PASS' -| | ... | Vpp Route Add | ${dut2} | ${nat_net} | ${nat_mask} -| | ... | gateway=${dut1_if2_ip4} | interface=${DUT2_${int}1}[0] -| | -| | Configure inside and outside interfaces -| | ... | ${dut1} | ${DUT1_${int}1}[0] | ${DUT1_${int}2}[0] -| | Configure deterministic mode for NAT44 -| | ... | ${dut1} | ${inside_net} | ${inside_mask} | ${nat_net} | ${nat_mask} - +| | Run Keyword If | ${dut2_status} +| | ... | VPP Add IP Neighbor +| | ... | ${dut2} | ${DUT2_${int}2}[0] | ${tg_if2_ip4}| ${TG_pf2_mac}[0] +| | +| | Vpp Route Add +| | ... | ${dut1} | ${in_net} | ${in_mask} | gateway=${tg_if1_ip4} +| | ... | interface=${DUT1_${int}1}[0] +| | Run Keyword If | ${dut2_status} +| | ... | Vpp Route Add +| | ... | ${dut1} | ${dest_net} | ${dest_mask} | gateway=${dut2_if1_ip4} +| | ... | interface=${DUT1_${int}2}[0] +| | ... | ELSE | Vpp Route Add +| | ... | ${dut1} | ${dest_net} | ${dest_mask} | gateway=${tg_if2_ip4} +| | ... | interface=${DUT1_${int}2}[0] +| | Run Keyword If | ${dut2_status} +| | ... | Vpp Route Add +| | ... | ${dut2} | ${dest_net} | ${dest_mask} | gateway=${tg_if2_ip4} +| | ... | interface=${DUT2_${int}2}[0] +| | Run Keyword If | ${dut2_status} +| | ... | Vpp Route Add +| | ... | ${dut2} | ${out_net} | ${out_mask} | gateway=${dut1_if2_ip4} +| | ... | interface=${DUT2_${int}1}[0] diff --git a/resources/libraries/robot/performance/performance_limits.robot b/resources/libraries/robot/performance/performance_limits.robot index 82688ac9c6..332ed9368b 100644 --- a/resources/libraries/robot/performance/performance_limits.robot +++ b/resources/libraries/robot/performance/performance_limits.robot @@ -1,4 +1,4 @@ -# Copyright (c) 2019 Cisco and/or its affiliates. +# Copyright (c) 2020 Cisco and/or its affiliates. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at: @@ -24,19 +24,48 @@ | | | | ... | *Arguments:* | | ... | - frame_size - Framesize. Type: integer or string +| | ... | - overhead - Overhead in bytes; default value: ${0}. Type: integer | | | | ... | *Returns:* -| | ... | Average frame size. Type: float +| | ... | Average frame size including overhead. Type: float | | | | ... | *Example:* | | | | ... | \| Get Average Frame Size \| IMIX_v4_1 \| | | -| | [Arguments] | ${frame_size} +| | [Arguments] | ${frame_size} | ${overhead}=${0} | | -| | Return From Keyword If | '${frame_size}' == 'IMIX_v4_1' | ${353.83333} -| | ${frame_size} = | Convert To Number | ${frame_size} -| | Return From Keyword | ${frame_size} +| | ${frame_size} = | Run Keyword If | '${frame_size}' == 'IMIX_v4_1' +| | ... | Set Variable | ${353.83333} +| | ... | ELSE +| | ... | Convert To Number | ${frame_size} +| | ${avg_frame_size} = | Evaluate | ${frame_size} + ${overhead} +| | Return From Keyword | ${avg_frame_size} + +| Get Maximum Frame Size +| | [Documentation] +| | ... | Framesize can be either integer in case of a single packet +| | ... | in stream, or set of packets in case of IMIX type or simmilar. +| | +| | ... | *Arguments:* +| | ... | - frame_size - Framesize. Type: integer or string +| | ... | - overhead - Overhead in bytes; default value: ${0}. Type: integer +| | +| | ... | *Returns:* +| | ... | Maximum frame size including overhead. Type: float +| | +| | ... | *Example:* +| | +| | ... | \| Get Maximum Frame Size \| IMIX_v4_1 \| +| | +| | [Arguments] | ${frame_size} | ${overhead}=${0} +| | +| | ${frame_size} = | Run Keyword If | '${frame_size}' == 'IMIX_v4_1' +| | ... | Set Variable | ${1518} +| | ... | ELSE +| | ... | Convert To Number | ${frame_size} +| | ${max_frame_size} = | Evaluate | ${frame_size} + ${overhead} +| | Return From Keyword | ${max_frame_size} | Set Max Rate And Jumbo | | [Documentation] @@ -61,8 +90,9 @@ | | | | ... | *Test (or broader scope) variables read:* | | ... | - nic_name - Name of bottleneck NIC. Type: string -| | ... | - overhead - Overhead in bytes. Default: 0. Type: integer -| | ... | - frame_size - L2 Frame Size [B] or IMIX string. Type: int or str +| | ... | - overhead - Overhead in bytes; default value: 0. Type: integer +| | ... | - frame_size - L2 Frame Size [B] or IMIX string. Type: integer or +| | ... | string | | | | ... | *Test variables set:* | | ... | - max_rate - Calculated unidirectional maximal transmit rate [pps]. @@ -72,7 +102,7 @@ | | | | ... | *Example:* | | -| | ... | \| Set test Variable \| \${frame_size} \| IMIX_v4_1 \| +| | ... | \| Set Test Variable \| \${frame_size} \| IMIX_v4_1 \| | | ... | \| Set Max Rate And Jumbo \| | | | | # Negative overhead is possible, if DUT-DUT traffic is less encapsulated @@ -84,16 +114,40 @@ | | ... | ${NIC_NAME_TO_PPS_LIMIT} | ${nic_name} | | ${bps_limit} = | Get From Dictionary | | ... | ${NIC_NAME_TO_BPS_LIMIT} | ${nic_name} -| | ${avg_size} = | Get Average Frame Size | ${frame_size} -| | ${max_size} = | Set Variable If | '${frame_size}' == 'IMIX_v4_1' -| | ... | ${1518} | ${frame_size} | | # swo := size_with_overhead -| | ${avg_swo} = | Evaluate | ${avg_size} + ${overhead} -| | ${max_swo} = | Evaluate | ${max_size} + ${overhead} -| | ${jumbo} = | Set Variable If | ${max_swo} < 1522 -| | ... | ${False} | ${True} +| | ${avg_swo} = | Get Average Frame Size | ${frame_size} | ${overhead} | | ${rate} = | Evaluate | ${bps_limit} / ((${avg_swo} + 20.0) * 8) | | ${max_rate} = | Set Variable If | ${rate} > ${pps_limit} | | ... | ${pps_limit} | ${rate} -| | Set Test Variable | \${jumbo} | | Set Test Variable | \${max_rate} +| | Set Jumbo + +| Set Jumbo +| | [Documentation] +| | ... | For jumbo frames detection, the maximal packet size is relevant, +| | ... | encapsulation overhead (if any) has effect. +| | +| | ... | This keyword computes jumbo boolean (some suites need that for +| | ... | configuration decisions). +| | ... | To streamline suite autogeneration, both input and output values +| | ... | are communicated as test (or broader scope) variables, +| | ... | instead of explicit arguments and return values. +| | +| | ... | *Test (or broader scope) variables read:* +| | ... | - overhead - Overhead in bytes; default value: 0. Type: integer +| | ... | - frame_size - L2 Frame Size [B] or IMIX string. Type: integer or +| | ... | string +| | +| | ... | *Test variables set:* +| | ... | - jumbo - Jumbo boolean, true if jumbo packet support has to be +| | ... | enabled. Type: boolean +| | +| | ... | *Example:* +| | +| | ... | \| Set Jumnbo \| +| | +| | ${overhead} = | Set Variable If | ${overhead} >= 0 | ${overhead} | ${0} +| | ${max_swo} = | Get Maximum Frame Size | ${frame_size} | ${overhead} +| | ${jumbo} = | Set Variable If | ${max_swo} < 1522 +| | ... | ${False} | ${True} +| | Set Test Variable | \${jumbo} diff --git a/resources/libraries/robot/performance/performance_utils.robot b/resources/libraries/robot/performance/performance_utils.robot index dcabbb9fac..84113709cf 100644 --- a/resources/libraries/robot/performance/performance_utils.robot +++ b/resources/libraries/robot/performance/performance_utils.robot @@ -50,7 +50,8 @@ | | ... | *Test (or broader scope) variables read:* | | ... | - traffic_profile - Name of module defining traffc for measurements. | | ... | Type: string -| | ... | - frame_size - L2 Frame Size [B] or IMIX string. Type: int or str +| | ... | - frame_size - L2 Frame Size [B] or IMIX string. Type: integer or +| | ... | string | | ... | - max_rate - Calculated unidirectional maximal transmit rate [pps]. | | ... | Type: float | | @@ -59,12 +60,16 @@ | | ... | - final_relative_width - Maximal width multiple of upper. Type: float | | ... | - final_trial_duration - Duration of final trials [s]. Type: float | | ... | - initial_trial_duration - Duration of initial trials [s]. Type: float -| | ... | - intermediate phases - Number of intermediate phases [1]. Type: int +| | ... | - intermediate phases - Number of intermediate phases [1]. +| | ... | Type: integer | | ... | - timeout - Fail if search duration is longer [s]. Type: float -| | ... | - doublings - How many doublings to do when expanding [1]. Type: int +| | ... | - doublings - How many doublings to do when expanding [1]. +| | ... | Type: integer | | ... | - traffic_directions - Bi- (2) or uni- (1) directional traffic. -| | ... | Type: int +| | ... | Type: integer | | ... | - latency_duration - Duration for latency-specific trials. Type: float +| | ... | - latency - False to disable latency measurement; default value: True. +| | ... | Type: boolean | | | | ... | *Example:* | | @@ -78,6 +83,7 @@ | | ... | ${number_of_intermediate_phases}=${2} | ${timeout}=${720.0} | | ... | ${doublings}=${2} | ${traffic_directions}=${2} | | ... | ${latency_duration}=${PERF_TRIAL_LATENCY_DURATION} +| | ... | ${latency}=${True} | | | | # Latency measurements will need more than 9000 pps. | | ${result} = | Perform optimized ndrpdr search | ${frame_size} @@ -86,6 +92,7 @@ | | ... | ${final_trial_duration} | ${initial_trial_duration} | | ... | ${number_of_intermediate_phases} | timeout=${timeout} | | ... | doublings=${doublings} | traffic_directions=${traffic_directions} +| | ... | latency=${latency} | | Display result of NDRPDR search | ${result} | | Check NDRPDR interval validity | ${result.pdr_interval} | | ... | ${packet_loss_ratio} @@ -95,18 +102,22 @@ | | ${ndr_sum}= | Set Variable | ${result.ndr_interval.measured_low.target_tr} | | ${ndr_per_stream}= | Evaluate | ${ndr_sum} / float(${traffic_directions}) | | ${rate}= | Evaluate | 0.9 * ${pdr_per_stream} -| | Measure and show latency at specified rate | Latency at 90% PDR: +| | Run Keyword If | ${latency} +| | ... | Measure and show latency at specified rate | Latency at 90% PDR: | | ... | ${latency_duration} | ${rate} | ${framesize} | | ... | ${traffic_profile} | ${traffic_directions} | | ${rate}= | Evaluate | 0.5 * ${pdr_per_stream} -| | Measure and show latency at specified rate | Latency at 50% PDR: +| | Run Keyword If | ${latency} +| | ... | Measure and show latency at specified rate | Latency at 50% PDR: | | ... | ${latency_duration} | ${rate} | ${framesize} | | ... | ${traffic_profile} | ${traffic_directions} | | ${rate}= | Evaluate | 0.1 * ${pdr_per_stream} -| | Measure and show latency at specified rate | Latency at 10% PDR: +| | Run Keyword If | ${latency} +| | ... | Measure and show latency at specified rate | Latency at 10% PDR: | | ... | ${latency_duration} | ${rate} | ${framesize} | | ... | ${traffic_profile} | ${traffic_directions} -| | Measure and show latency at specified rate | Latency at 0% PDR: +| | Run Keyword If | ${latency} +| | ... | Measure and show latency at specified rate | Latency at 0% PDR: | | ... | ${latency_duration} | ${0} | ${framesize} | | ... | ${traffic_profile} | ${traffic_directions} | | # Finally, trials with runtime and other stats. @@ -128,7 +139,8 @@ | | ... | *Test (or broader scope) variables read:* | | ... | - traffic_profile - Name of module defining traffc for measurements. | | ... | Type: string -| | ... | - frame_size - L2 Frame Size [B] or IMIX string. Type: int or str +| | ... | - frame_size - L2 Frame Size [B] or IMIX string. Type: integer or +| | ... | string | | ... | - max_rate - Calculated unidirectional maximal transmit rate [pps]. | | ... | Type: float | | @@ -137,11 +149,15 @@ | | ... | - final_relative_width - Maximal width multiple of upper. Type: float | | ... | - final_trial_duration - Duration of final trials [s]. Type: float | | ... | - initial_trial_duration - Duration of initial trials [s]. Type: float -| | ... | - intermediate phases - Number of intermediate phases [1]. Type: int +| | ... | - intermediate phases - Number of intermediate phases [1]. +| | ... | Type: integer | | ... | - timeout - Fail if search duration is longer [s]. Type: float -| | ... | - doublings - How many doublings to do when expanding [1]. Type: int +| | ... | - doublings - How many doublings to do when expanding [1]. +| | ... | Type: integer | | ... | - traffic_directions - Bi- (2) or uni- (1) directional traffic. -| | ... | Type: int +| | ... | Type: integer +| | ... | - latency - True to enable latency measurement; default value: False. +| | ... | Type: boolean | | | | ... | *Returns:* | | ... | - Lower bound for bi-directional throughput at given PLR. Type: float @@ -156,7 +172,7 @@ | | ... | ${final_relative_width}=${0.001} | ${final_trial_duration}=${10.0} | | ... | ${initial_trial_duration}=${1.0} | | ... | ${number_of_intermediate_phases}=${1} | ${timeout}=${720.0} -| | ... | ${doublings}=${2} | ${traffic_directions}=${2} +| | ... | ${doublings}=${2} | ${traffic_directions}=${2} | ${latency}=${False} | | | | ${result} = | Perform optimized ndrpdr search | ${frame_size} | | ... | ${traffic_profile} | ${10000} | ${max_rate} @@ -164,6 +180,7 @@ | | ... | ${final_trial_duration} | ${initial_trial_duration} | | ... | ${number_of_intermediate_phases} | timeout=${timeout} | | ... | doublings=${doublings} | traffic_directions=${traffic_directions} +| | ... | latency=${latency} | | Check NDRPDR interval validity | ${result.pdr_interval} | | ... | ${packet_loss_ratio} | | Return From Keyword | ${result.pdr_interval.measured_low.target_tr} @@ -181,7 +198,8 @@ | | ... | *Test (or broader scope) variables read:* | | ... | - traffic_profile - Name of module defining traffc for measurements. | | ... | Type: string -| | ... | - frame_size - L2 Frame Size [B] or IMIX string. Type: int or str +| | ... | - frame_size - L2 Frame Size [B] or IMIX string. Type: integer or +| | ... | string | | ... | - max_rate - Calculated unidirectional maximal transmit rate [pps]. | | ... | Type: float | | @@ -189,7 +207,9 @@ | | ... | - packet_loss_ratio - Accepted loss during search. Type: float | | ... | - timeout - Stop when search duration is longer [s]. Type: float | | ... | - traffic_directions - Bi- (2) or uni- (1) directional traffic. -| | ... | Type: int +| | ... | Type: integer +| | ... | - latency - True to enable latency measurement; default value: False. +| | ... | Type: boolean | | | | ... | *Example:* | | @@ -197,13 +217,13 @@ | | ... | \| \${2} \| | | | | [Arguments] | ${packet_loss_ratio}=${1e-7} | ${timeout}=${1800.0} -| | ... | ${traffic_directions}=${2} +| | ... | ${traffic_directions}=${2} | ${latency}=${False} | | | | ${min_rate} = | Set Variable | ${10000} | | ${average} | ${stdev} = | Perform soak search | ${frame_size} | | ... | ${traffic_profile} | ${min_rate} | ${max_rate} | | ... | ${packet_loss_ratio} | timeout=${timeout} -| | ... | traffic_directions=${traffic_directions} +| | ... | traffic_directions=${traffic_directions} | latency=${latency} | | ${lower} | ${upper} = | Display result of soak search | | ... | ${average} | ${stdev} | | Should Not Be True | 1.1 * ${traffic_directions} * ${min_rate} > ${lower} @@ -229,7 +249,7 @@ | | ... | *Example:* | | | | ... | \| Display single bound \| NDR lower bound \| \${12345.67} \ -| | ... | \| \${64} \| show_latency=\${EMPTY} \| +| | ... | \| \${64} \| latency=\${EMPTY} \| | | | | [Arguments] | ${text} | ${rate_total} | ${frame_size} | ${latency}=${EMPTY} | | @@ -271,7 +291,8 @@ | | ... | The given result should contain latency data as well. | | | | ... | *Test (or broader scope) variables read:* -| | ... | - frame_size - L2 Frame Size [B] or IMIX string. Type: int or str +| | ... | - frame_size - L2 Frame Size [B] or IMIX string. Type: integer or +| | ... | string | | ... | *Arguments:* | | ... | - result - Measured result data per stream [pps]. Type: NdrPdrResult | | @@ -304,7 +325,8 @@ | | ... | (Throughput * (L2 Frame Size + IPG) * 8) | | | | ... | *Test (or broader scope) variables read:* -| | ... | - frame_size - L2 Frame Size [B] or IMIX string. Type: int or str +| | ... | - frame_size - L2 Frame Size [B] or IMIX string. Type: integer or +| | ... | string | | ... | *Arguments:* | | ... | - avg - Estimated average critical load [pps]. Type: float | | ... | - stdev - Standard deviation of critical load [pps]. Type: float @@ -360,36 +382,36 @@ | | ... | Send traffic at maximum rate. | | | | ... | *Test (or broader scope) variables read:* -| | ... | - traffic_profile - Name of module defining traffc for measurements. +| | ... | - traffic_profile - Name of module defining traffic for measurements. | | ... | Type: string -| | ... | - frame_size - L2 Frame Size [B] or IMIX string. Type: int or str +| | ... | - frame_size - L2 Frame Size [B] or IMIX string. Type: integer or +| | ... | string | | ... | - max_rate - Calculated unidirectional maximal transmit rate [pps]. | | ... | Type: float | | | | ... | *Arguments:* -| | ... | - trial_duration - Duration of single trial [s]. -| | ... | Type: float -| | ... | - fail_no_traffic - Whether to fail on zero receive count. -| | ... | Type: boolean +| | ... | - trial_duration - Duration of single trial [s]. Type: float +| | ... | - fail_no_traffic - Whether to fail on zero receive count; +| | ... | default value: True. Type: boolean | | ... | - trial_multiplicity - How many trials in this measurement. -| | ... | Type: int -| | ... | - traffic_directions - Bi- (2) or uni- (1) directional traffic. -| | ... | Type: int -| | ... | - tx_port - TX port of TG, default 0. -| | ... | Type: integer -| | ... | - rx_port - RX port of TG, default 1. | | ... | Type: integer +| | ... | - traffic_directions - Bi- (2) or uni- (1) directional traffic; +| | ... | default value: 2. Type: integer +| | ... | - tx_port - TX port of TG; default value: 0. Type: integer +| | ... | - rx_port - RX port of TG; default value: 1. Type: integer +| | ... | - latency - True to enable latency measurement; default value: False. +| | ... | Type: boolean | | | | ... | *Example:* | | -| | ... | \| Traffic should pass with maximum rate \| \${1} \| \${10.0} \ -| | ... | \| \${False} \| \${2} \| \${0} \| \${1} \| +| | ... | \| Traffic should pass with maximum rate \| \${1} \| \${False} \ +| | ... | \| \${10.0} \| \${2} \| \${0} \| \${1} \| \${True} \| | | | | [Arguments] | ${trial_duration}=${trial_duration} | | ... | ${fail_no_traffic}=${True} | | ... | ${trial_multiplicity}=${trial_multiplicity} | | ... | ${traffic_directions}=${2} | ${tx_port}=${0} | ${rx_port}=${1} -| | ... | ${latency}=${True} +| | ... | ${latency}=${False} | | | | ${results}= | Send traffic at specified rate | | ... | ${trial_duration} | ${max_rate} | ${frame_size} @@ -411,35 +433,39 @@ | | ... | - trial_duration - Duration of single trial [s]. Type: float | | ... | - rate - Target aggregate transmit rate [pps] / Connections per second | | ... | (CPS) for UDP/TCP flows. Type: float -| | ... | - frame_size - L2 Frame Size [B]. Type: integer/string +| | ... | - frame_size - L2 Frame Size [B]. Type: integer or string | | ... | - traffic_profile - Name of module defining traffc for measurements. | | ... | Type: string | | ... | - trial_multiplicity - How many trials in this measurement. -| | ... | Type: int -| | ... | - traffic_directions - Bi- (2) or uni- (1) directional traffic. -| | ... | Type: int -| | ... | - tx_port - TX port of TG, default 0. | | ... | Type: integer -| | ... | - rx_port - RX port of TG, default 1. +| | ... | - traffic_directions - Bi- (2) or uni- (1) directional traffic. | | ... | Type: integer -| | ... | - extended_debug- True to enable extended debug. +| | ... | - tx_port - TX port of TG; default value: 0. Type: integer +| | ... | - rx_port - RX port of TG; default value: 1. Type: integer +| | ... | - extended_debug - True to enable extended debug. +| | ... | Type: boolean +| | ... | - latency - True to enable latency measurement; default value: False. | | ... | Type: boolean | | | | ... | *Example:* | | | | ... | \| Send traffic at specified rate \| \${1.0} \| ${4000000.0} \ | | ... | \| \${64} \| 3-node-IPv4 \| \${10} \| \${2} \| \${0} \| \${1} \ -| | ... | \${False} \| +| | ... | \| ${False} \| ${True} \| | | | | [Arguments] | ${trial_duration} | ${rate} | ${frame_size} | | ... | ${traffic_profile} | ${trial_multiplicity}=${trial_multiplicity} | | ... | ${traffic_directions}=${2} | ${tx_port}=${0} | ${rx_port}=${1} -| | ... | ${extended_debug}=${extended_debug} | ${latency}=${True} +| | ... | ${extended_debug}=${extended_debug} | ${latency}=${False} | | | | Set Test Variable | ${extended_debug} -| | Clear and show runtime counters with running traffic | ${trial_duration} -| | ... | ${rate} | ${frame_size} | ${traffic_profile} -| | ... | ${traffic_directions} | ${tx_port} | ${rx_port} +| | # Following setting of test variables is needed as +| | # "Clear and show runtime counters with running traffic" has been moved to +| | # pre_stats actions. +| | Set Test Variable | ${rate} +| | Set Test Variable | ${traffic_directions} +| | Set Test Variable | ${tx_port} +| | Set Test Variable | ${rx_port} | | FOR | ${action} | IN | @{pre_stats} | | | Run Keyword | Additional Statistics Action For ${action} | | END @@ -473,15 +499,15 @@ | | ... | - rate - Rate [pps] for sending packets in case of T-Rex stateless | | ... | mode or multiplier of profile CPS in case of T-Rex astf mode. | | ... | Type: float -| | ... | - frame_size - L2 Frame Size [B]. Type: integer/string +| | ... | - frame_size - L2 Frame Size [B]. Type: integer or string | | ... | - traffic_profile - Name of module defining traffic for measurements. | | ... | Type: string | | ... | - traffic_directions - Bi- (2) or uni- (1) directional traffic. -| | ... | Type: int -| | ... | - tx_port - TX port of TG, default 0. Type: integer -| | ... | - rx_port - RX port of TG, default 1. Type: integer +| | ... | Type: integer +| | ... | - tx_port - TX port of TG; default value: 0. Type: integer +| | ... | - rx_port - RX port of TG; default value: 1. Type: integer | | ... | - safe_rate - To apply if rate is below this, as latency pps is fixed. -| | ... | In pps, type int. +| | ... | In pps. Type: integer. | | | | ... | *Example:* | | @@ -514,13 +540,13 @@ | | ... | - rate - Rate [pps] for sending packets in case of T-Rex stateless | | ... | mode or multiplier of profile CPS in case of T-Rex astf mode. | | ... | Type: float -| | ... | - frame_size - L2 Frame Size [B] or IMIX_v4_1. Type: integer/string +| | ... | - frame_size - L2 Frame Size [B] or IMIX_v4_1. Type: integer or string | | ... | - traffic_profile - Name of module defining traffc for measurements. | | ... | Type: string | | ... | - traffic_directions - Bi- (2) or uni- (1) directional traffic. -| | ... | Type: int -| | ... | - tx_port - TX port of TG, default 0. Type: integer -| | ... | - rx_port - RX port of TG, default 1. Type: integer +| | ... | Type: integer +| | ... | - tx_port - TX port of TG; default value: 0. Type: integer +| | ... | - rx_port - RX port of TG, default value: 1. Type: integer | | | | ... | *Example:* | | @@ -553,15 +579,16 @@ | | ... | *Test (or broader scope) variables read:* | | ... | - traffic_profile - Name of module defining traffc for measurements. | | ... | Type: string -| | ... | - frame_size - L2 Frame Size [B] or IMIX string. Type: int or str +| | ... | - frame_size - L2 Frame Size [B] or IMIX string. Type: integer or +| | ... | string | | ... | *Arguments:* | | ... | - rate - Rate [pps] for sending packets in case of T-Rex stateless | | ... | mode or multiplier of profile CPS in case of T-Rex astf mode. | | ... | Type: float | | ... | - traffic_directions - Bi- (2) or uni- (1) directional traffic. -| | ... | Type: int -| | ... | - tx_port - TX port of TG, default 0. Type: integer -| | ... | - rx_port - RX port of TG, default 1. Type: integer +| | ... | Type: integer +| | ... | - tx_port - TX port of TG; default value: 0. Type: integer +| | ... | - rx_port - RX port of TG; default value: 1. Type: integer | | | | ... | *Example:* | | @@ -647,4 +674,13 @@ | | ... | Additional Statistics Action for bash command "perf stat". | | | | Run Keyword If | ${extended_debug}==${True} -| | ... | Perf Stat On All DUTs | ${nodes}
\ No newline at end of file +| | ... | Perf Stat On All DUTs | ${nodes} + +| Additional Statistics Action For vpp-clear-show-runtime-with-traffic +| | [Documentation] +| | ... | Additional Statistics Action for clear and show runtime counters with +| | ... | running traffic. +| | +| | Clear and show runtime counters with running traffic +| | ... | ${trial_duration} | ${rate} | ${frame_size} | ${traffic_profile} +| | ... | ${traffic_directions} | ${tx_port} | ${rx_port} diff --git a/resources/libraries/robot/shared/default.robot b/resources/libraries/robot/shared/default.robot index 6e1e5416e2..51ce513078 100644 --- a/resources/libraries/robot/shared/default.robot +++ b/resources/libraries/robot/shared/default.robot @@ -77,10 +77,10 @@ | | ... | 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} +| | ... | - crypto_type - Crypto device type - HW_DH895xcc or HW_C3xxx; default +| | ... | value: HW_DH895xcc. Type: string +| | ... | - numvfs - Number of VFs to initialize, 0 - disable the VFs; default +| | ... | value: ${32} Type: integer | | ... | - force_init - Force to initialize. Type: boolean | | | | ... | *Example:* @@ -127,7 +127,7 @@ | | [Arguments] | ${dutx} | ${dut_keys} | | | | FOR | ${key} | IN | @{dut_keys} -| | | ${found_key} | ${value}= | Run Keyword and Ignore Error +| | | ${found_key} | ${value}= | Run Keyword And Ignore Error | | | ... | Dictionaries Should Be Equal | ${nodes['${key}']} | ${dutx} | | | Run Keyword If | '${found_key}' == 'PASS' | EXIT FOR LOOP | | END @@ -142,21 +142,21 @@ | | FOR | ${dut} | IN | @{duts} | | | Import Library | resources.libraries.python.VppConfigGenerator | | | ... | WITH NAME | ${dut} -| | | Run keyword | ${dut}.Set Node | ${nodes['${dut}']} | node_key=${dut} -| | | Run keyword | ${dut}.Add Unix Log -| | | Run keyword | ${dut}.Add Unix CLI Listen -| | | Run keyword | ${dut}.Add Unix Nodaemon -| | | Run keyword | ${dut}.Add Unix Coredump -| | | Run keyword | ${dut}.Add Socksvr | ${SOCKSVR_PATH} -| | | Run keyword | ${dut}.Add Heapsize | 4G -| | | Run keyword | ${dut}.Add Statseg size | 4G -| | | Run keyword | ${dut}.Add Statseg Per Node Counters | on -| | | Run keyword | ${dut}.Add Plugin | disable | default -| | | Run keyword | ${dut}.Add Plugin | enable | @{plugins_to_enable} -| | | Run keyword | ${dut}.Add IP6 Hash Buckets | 2000000 -| | | Run keyword | ${dut}.Add IP6 Heap Size | 4G -| | | Run keyword | ${dut}.Add IP Heap Size | 4G -| | | Run keyword | ${dut}.Add Graph Node Variant | ${GRAPH_NODE_VARIANT} +| | | Run Keyword | ${dut}.Set Node | ${nodes['${dut}']} | node_key=${dut} +| | | Run Keyword | ${dut}.Add Unix Log +| | | Run Keyword | ${dut}.Add Unix CLI Listen +| | | Run Keyword | ${dut}.Add Unix Nodaemon +| | | Run Keyword | ${dut}.Add Unix Coredump +| | | Run Keyword | ${dut}.Add Socksvr | ${SOCKSVR_PATH} +| | | Run Keyword | ${dut}.Add Heapsize | 4G +| | | Run Keyword | ${dut}.Add Statseg size | 4G +| | | Run Keyword | ${dut}.Add Statseg Per Node Counters | on +| | | Run Keyword | ${dut}.Add Plugin | disable | default +| | | Run Keyword | ${dut}.Add Plugin | enable | @{plugins_to_enable} +| | | Run Keyword | ${dut}.Add IP6 Hash Buckets | 2000000 +| | | Run Keyword | ${dut}.Add IP6 Heap Size | 4G +| | | Run Keyword | ${dut}.Add IP Heap Size | 4G +| | | Run Keyword | ${dut}.Add Graph Node Variant | ${GRAPH_NODE_VARIANT} | | END | Add worker threads to all DUTs @@ -194,26 +194,26 @@ | | | ${cpu_main}= | Cpu list per node str | ${nodes['${dut}']} | ${numa} | | | ... | skip_cnt=${skip_cnt} | cpu_cnt=${CPU_CNT_MAIN} | | | ${skip_cnt}= | Evaluate | ${CPU_CNT_SYSTEM} + ${CPU_CNT_MAIN} -| | | ${cpu_wt}= | Run keyword if | ${cpu_count_int} > 0 | +| | | ${cpu_wt}= | Run Keyword If | ${cpu_count_int} > 0 | | | | ... | Cpu list per node str | ${nodes['${dut}']} | ${numa} | | | ... | skip_cnt=${skip_cnt} | cpu_cnt=${cpu_count_int} | | | ... | smt_used=${smt_used} -| | | ${thr_count_int}= | Run keyword if | ${smt_used} +| | | ${thr_count_int}= | Run Keyword If | ${smt_used} | | | ... | Evaluate | int(${cpu_count_int}*2) | | | ... | ELSE | Set variable | ${thr_count_int} -| | | ${rxq_count_int}= | Run keyword if | ${rx_queues} +| | | ${rxq_count_int}= | Run Keyword If | ${rx_queues} | | | ... | Set variable | ${rx_queues} | | | ... | ELSE | Evaluate | int(${thr_count_int}/2) -| | | ${rxq_count_int}= | Run keyword if | ${rxq_count_int} == 0 +| | | ${rxq_count_int}= | Run Keyword If | ${rxq_count_int} == 0 | | | ... | Set variable | ${1} | | | ... | ELSE | Set variable | ${rxq_count_int} | | | Run Keyword | ${dut}.Add CPU Main Core | ${cpu_main} -| | | Run keyword if | ${cpu_count_int} > 0 +| | | Run Keyword If | ${cpu_count_int} > 0 | | | ... | ${dut}.Add CPU Corelist Workers | ${cpu_wt} -| | | Run keyword if | ${smt_used} -| | | ... | Run keyword | ${dut}.Add Buffers Per Numa | ${215040} | ELSE -| | | ... | Run keyword | ${dut}.Add Buffers Per Numa | ${107520} -| | | Run keyword if | ${thr_count_int} > 1 +| | | Run Keyword If | ${smt_used} +| | | ... | Run Keyword | ${dut}.Add Buffers Per Numa | ${215040} | ELSE +| | | ... | Run Keyword | ${dut}.Add Buffers Per Numa | ${107520} +| | | 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 @@ -245,15 +245,44 @@ | Add NAT to all DUTs | | [Documentation] | Add NAT configuration to all DUTs. | | +| | ... | *Arguments:* +| | ... | - nat_mode - NAT mode; default value: deterministic. Type: string +| | +| | ... | *Example:* +| | +| | ... | \| Add NAT to all DUTs \| nat_mode=endpoint-dependent \| +| | +| | [Arguments] | ${nat_mode}=deterministic +| | +| | FOR | ${dut} | IN | @{duts} +| | | Run Keyword | ${dut}.Add NAT | value=${nat_mode} +| | END + +| Add NAT max translations per thread to all DUTs +| | [Documentation] | Add NAT maximum number of translations per thread +| | ... | configuration. +| | +| | ... | *Arguments:* +| | ... | - max_translations_per_thread - NAT maximum number of translations per +| | ... | thread. Type: string +| | +| | ... | *Example:* +| | +| | ... | \| Add NAT translation memory to all DUTs \ +| | ... | \| max_translations_per_thread=2048 \| +| | +| | [Arguments] | ${max_translations_per_thread}=1024 +| | | | FOR | ${dut} | IN | @{duts} -| | | Run keyword | ${dut}.Add NAT +| | | Run Keyword | ${dut}.Add NAT max translations per thread +| | | ... | value=${max_translations_per_thread} | | END | Write startup configuration on all VPP DUTs | | [Documentation] | Write VPP startup configuration without restarting VPP. | | | | FOR | ${dut} | IN | @{duts} -| | | Run keyword | ${dut}.Write Config +| | | Run Keyword | ${dut}.Write Config | | END | Apply startup configuration on all VPP DUTs @@ -270,12 +299,12 @@ | | [Arguments] | ${with_trace}=${False} | | | | FOR | ${dut} | IN | @{duts} -| | | Run keyword | ${dut}.Apply Config +| | | Run Keyword | ${dut}.Apply Config | | END | | Save VPP PIDs | | Enable Coredump Limit VPP on All DUTs | ${nodes} | | Update All Interface Data On All Nodes | ${nodes} | skip_tg=${True} -| | Run keyword If | ${with_trace} | VPP Enable Traces On All Duts | ${nodes} +| | Run Keyword If | ${with_trace} | VPP Enable Traces On All Duts | ${nodes} | Apply startup configuration on VPP DUT | | [Documentation] | Write VPP startup configuration and restart VPP DUT. @@ -286,13 +315,13 @@ | | | | [Arguments] | ${dut} | ${with_trace}=${False} | | -| | Run keyword | ${dut}.Apply Config +| | Run Keyword | ${dut}.Apply Config | | Save VPP PIDs on DUT | ${dut} | | Enable Coredump Limit VPP on DUT | ${nodes['${dut}']} | | ${dutnode}= | Copy Dictionary | ${nodes} | | Keep In Dictionary | ${dutnode} | ${dut} | | Update All Interface Data On All Nodes | ${dutnode} | skip_tg=${True} -| | Run keyword If | ${with_trace} | VPP Enable Traces On Dut +| | Run Keyword If | ${with_trace} | VPP Enable Traces On Dut | | ... | ${nodes['${dut}']} | Save VPP PIDs @@ -335,7 +364,7 @@ | | ${err_msg}= | Catenate | ${SUITE NAME} - ${TEST NAME} | | ... | \nThe VPP PIDs are not equal!\nTest Setup VPP PIDs: | | ... | ${setup_vpp_pids}\nTest Teardown VPP PIDs: ${teardown_vpp_pids} -| | ${rc} | ${msg}= | Run keyword and ignore error +| | ${rc} | ${msg}= | Run Keyword And Ignore Error | | ... | Dictionaries Should Be Equal | | ... | ${setup_vpp_pids} | ${teardown_vpp_pids} | | Run Keyword And Return If | '${rc}'=='FAIL' | Log | ${err_msg} diff --git a/resources/libraries/robot/shared/test_teardown.robot b/resources/libraries/robot/shared/test_teardown.robot index b5cdab0664..5d71db4edc 100644 --- a/resources/libraries/robot/shared/test_teardown.robot +++ b/resources/libraries/robot/shared/test_teardown.robot @@ -110,6 +110,17 @@ | | | ... | Show NAT verbose | ${nodes['${dut}']} | | END +| Additional Test Tear Down Action For nat-ed +| | [Documentation] +| | ... | Additional teardown for tests which uses NAT feature. +| | +| | FOR | ${dut} | IN | @{duts} +| | | Show NAT Config | ${nodes['${dut}']} +| | | Show NAT44 Summary | ${nodes['${dut}']} +| | | Show NAT Base Data | ${nodes['${dut}']} +| | | Vpp Get Ip Table Summary | ${nodes['${dut}']} +| | END + | Additional Test Tear Down Action For namespace | | [Documentation] | | ... | Additional teardown for tests which uses namespace. |