diff options
Diffstat (limited to 'resources/libraries')
-rw-r--r-- | resources/libraries/python/DUTSetup.py | 14 | ||||
-rw-r--r-- | resources/libraries/python/VhostUser.py | 12 | ||||
-rw-r--r-- | resources/libraries/python/VppCounters.py | 84 | ||||
-rw-r--r-- | resources/libraries/robot/ip/ip6.robot | 26 | ||||
-rw-r--r-- | resources/libraries/robot/performance/performance_setup.robot | 22 | ||||
-rw-r--r-- | resources/libraries/robot/performance/performance_utils.robot | 12 | ||||
-rw-r--r-- | resources/libraries/robot/shared/counters.robot | 68 | ||||
-rw-r--r-- | resources/libraries/robot/shared/default.robot | 18 |
8 files changed, 148 insertions, 108 deletions
diff --git a/resources/libraries/python/DUTSetup.py b/resources/libraries/python/DUTSetup.py index 7260292959..bccf108524 100644 --- a/resources/libraries/python/DUTSetup.py +++ b/resources/libraries/python/DUTSetup.py @@ -15,8 +15,7 @@ from robot.api import logger -from resources.libraries.python.topology import NodeType -from resources.libraries.python.topology import Topology +from resources.libraries.python.topology import NodeType, Topology from resources.libraries.python.ssh import SSH from resources.libraries.python.constants import Constants from resources.libraries.python.VatExecutor import VatExecutor @@ -50,6 +49,17 @@ class DUTSetup(object): vat.execute_script("show_version_verbose.vat", node, json_out=False) @staticmethod + def show_vpp_version_on_all_duts(nodes): + """Show VPP version verbose on all DUTs. + + :param nodes: VPP nodes + :type nodes: dict + """ + for node in nodes.values(): + if node['type'] == NodeType.DUT: + DUTSetup.vpp_show_version_verbose(node) + + @staticmethod def vpp_api_trace_save(node): """Run "api trace save" CLI command. diff --git a/resources/libraries/python/VhostUser.py b/resources/libraries/python/VhostUser.py index 385d0f24cc..680d4ae300 100644 --- a/resources/libraries/python/VhostUser.py +++ b/resources/libraries/python/VhostUser.py @@ -14,6 +14,7 @@ """Vhost-user interfaces library.""" from resources.libraries.python.VatExecutor import VatExecutor, VatTerminal +from resources.libraries.python.topology import NodeType class VhostUser(object): @@ -86,3 +87,14 @@ class VhostUser(object): """ vat = VatExecutor() vat.execute_script("show_vhost.vat", node, json_out=False) + + @staticmethod + def show_vpp_vhost_on_all_duts(nodes): + """Show Vhost User on all DUTs. + + :param nodes: VPP nodes. + :type nodes: dict + """ + for node in nodes.values(): + if node['type'] == NodeType.DUT: + VhostUser.vpp_show_vhost(node) diff --git a/resources/libraries/python/VppCounters.py b/resources/libraries/python/VppCounters.py index 6b2265db27..8247a1e8ab 100644 --- a/resources/libraries/python/VppCounters.py +++ b/resources/libraries/python/VppCounters.py @@ -16,7 +16,6 @@ import time from robot.api import logger - from resources.libraries.python.topology import NodeType, Topology from resources.libraries.python.VatExecutor import VatExecutor, VatTerminal @@ -61,7 +60,7 @@ class VppCounters(object): def vpp_show_errors_on_all_duts(nodes, verbose=False): """Show errors on all DUTs. - :param nodes: VPP nodes + :param nodes: VPP nodes. :param verbose: If True show verbose output. :type nodes: dict :type verbose: bool @@ -85,6 +84,17 @@ class VppCounters(object): vat.execute_script("show_runtime.vat", node, json_out=False) @staticmethod + def show_runtime_counters_on_all_duts(nodes): + """Clear VPP runtime counters on all DUTs. + + :param nodes: VPP nodes. + :type nodes: dict + """ + for node in nodes.values(): + if node['type'] == NodeType.DUT: + VppCounters.vpp_show_runtime(node) + + @staticmethod def vpp_show_runtime_verbose(node): """Run "show runtime verbose" CLI command. @@ -115,6 +125,17 @@ class VppCounters(object): vat.execute_script("clear_runtime.vat", node, json_out=False) @staticmethod + def clear_runtime_counters_on_all_duts(nodes): + """Run "clear runtime" CLI command on all DUTs. + + :param nodes: VPP nodes. + :type nodes: dict + """ + for node in nodes.values(): + if node['type'] == NodeType.DUT: + VppCounters.vpp_clear_runtime(node) + + @staticmethod def vpp_clear_interface_counters(node): """Clear interface counters on VPP node. @@ -126,6 +147,17 @@ class VppCounters(object): vat.script_should_have_passed() @staticmethod + def clear_interface_counters_on_all_duts(nodes): + """Clear interface counters on all DUTs. + + :param nodes: VPP nodes. + :type nodes: dict + """ + for node in nodes.values(): + if node['type'] == NodeType.DUT: + VppCounters.vpp_clear_interface_counters(node) + + @staticmethod def vpp_clear_hardware_counters(node): """Clear interface hardware counters on VPP node. @@ -137,6 +169,17 @@ class VppCounters(object): vat.script_should_have_passed() @staticmethod + def clear_hardware_counters_on_all_duts(nodes): + """Clear hardware counters on all DUTs. + + :param nodes: VPP nodes. + :type nodes: dict + """ + for node in nodes.values(): + if node['type'] == NodeType.DUT: + VppCounters.vpp_clear_hardware_counters(node) + + @staticmethod def vpp_clear_errors_counters(node): """Clear errors counters on VPP node. @@ -147,6 +190,17 @@ class VppCounters(object): vat.execute_script('clear_errors.vat', node) vat.script_should_have_passed() + @staticmethod + def clear_error_counters_on_all_duts(nodes): + """Clear VPP errors counters on all DUTs. + + :param nodes: VPP nodes. + :type nodes: dict + """ + for node in nodes.values(): + if node['type'] == NodeType.DUT: + VppCounters.vpp_clear_errors_counters(node) + def vpp_dump_stats_table(self, node): """Dump stats table on VPP node. @@ -219,3 +273,29 @@ class VppCounters(object): logger.trace('{i} {v} counter not found.'.format(i=interface, v=version)) return 0 + + @staticmethod + def show_vpp_statistics(node): + """Show [error, hardware, interface] stats. + + :param node: VPP node. + :type node: dict + """ + VppCounters.vpp_show_errors(node) + VppCounters.vpp_show_hardware_detail(node) + VppCounters.vpp_show_runtime(node) + + @staticmethod + def show_statistics_on_all_duts(nodes, sleeptime=5): + """Show VPP statistics on all DUTs. + + :param nodes: VPP nodes. + :type nodes: dict + :param sleeptime: Time to wait for traffic to arrive back to TG. + :type sleeptime: int + """ + logger.trace('Waiting for statistics to be collected') + time.sleep(sleeptime) + for node in nodes.values(): + if node['type'] == NodeType.DUT: + VppCounters.show_vpp_statistics(node) diff --git a/resources/libraries/robot/ip/ip6.robot b/resources/libraries/robot/ip/ip6.robot index 43b0b8c646..f80d98f177 100644 --- a/resources/libraries/robot/ip/ip6.robot +++ b/resources/libraries/robot/ip/ip6.robot @@ -39,11 +39,13 @@ | | ${dst_mac}= | Get Interface Mac | ${dst_node} | ${dst_port} | | ${src_port_name}= | Get interface name | ${src_node} | ${src_port} | | ${args}= | Traffic Script Gen Arg | ${src_port_name} | ${src_port_name} | ${src_mac} -| | | ... | ${dst_mac} | ${src_ip} | ${dst_ip} +| | ... | ${dst_mac} | ${src_ip} | ${dst_ip} | | Run Traffic Script On Node | icmpv6_echo.py | ${tg_node} | ${args} -| | Get interface statistics | ${dst_node} -| | ${ipv6_counter}= | Get interface ipv6 counter | ${dst_node} | ${dst_port} -| | Should Be Equal | ${ipv6_counter} | ${2} | #ICMPv6 neighbor advertisement + ICMPv6 echo request +| | Vpp Dump Stats Table | ${dst_node} +| | ${ipv6_counter}= | Vpp Get Ipv6 Interface Counter | ${dst_node} +| | ... | ${dst_port} +| | Should Be Equal | ${ipv6_counter} | ${2} +| | ... | #ICMPv6 neighbor advertisement + ICMPv6 echo request | Execute IPv6 ICMP echo sweep | | [Documentation] | Type of the src_node must be TG and dst_node must be DUT @@ -61,9 +63,9 @@ | | ${dst_mac}= | Get Interface Mac | ${dst_node} | ${dst_port} | | ${src_port_name}= | Get interface name | ${src_node} | ${src_port} | | ${args}= | Traffic Script Gen Arg | ${src_port_name} | ${src_port_name} -| | | ... | ${src_mac} | ${dst_mac} | ${src_ip} | ${dst_ip} +| | ... | ${src_mac} | ${dst_mac} | ${src_ip} | ${dst_ip} | | ${args}= | Set Variable -| | ... | ${args} --start_size ${start_size} --end_size ${end_size} --step ${step} +| | ... | ${args} --start_size ${start_size} --end_size ${end_size} --step ${step} | | Run Traffic Script On Node | ipv6_sweep_ping.py | ${src_node} | ${args} | | ... | timeout=${180} @@ -81,7 +83,7 @@ | | ${dst_mac}= | Get Interface Mac | ${hop_node} | ${hop_port} | | ${src_port_name}= | Get interface name | ${src_node} | ${src_port} | | ${args}= | Traffic Script Gen Arg | ${src_port_name} | ${src_port_name} | ${src_mac} -| | | ... | ${dst_mac} | ${src_ip} | ${dst_ip} +| | ... | ${dst_mac} | ${src_ip} | ${dst_ip} | | Run Traffic Script On Node | icmpv6_echo.py | ${tg_node} | ${args} @@ -99,7 +101,7 @@ | | ${dst_mac}= | Get Interface Mac | ${hop_node} | ${hop_port} | | ${src_port_name}= | Get interface name | ${src_node} | ${src_port} | | ${args}= | Traffic Script Gen Arg | ${src_port_name} | ${src_port_name} | ${src_mac} -| | | ... | ${dst_mac} | ${src_ip} | ${dst_ip} +| | ... | ${dst_mac} | ${src_ip} | ${dst_ip} | | Run Traffic Script On Node | icmpv6_echo.py | ${tg_node} | ${args} | Send IPv6 ICMP echo request to DUT2 egress interface via DUT1 and verify answer @@ -116,7 +118,7 @@ | | ${dst_mac}= | Get Interface Mac | ${hop_node} | ${hop_port} | | ${src_port_name}= | Get interface name | ${src_node} | ${src_port} | | ${args}= | Traffic Script Gen Arg | ${src_port_name} | ${src_port_name} | ${src_mac} -| | | ... | ${dst_mac} | ${src_ip} | ${dst_ip} +| | ... | ${dst_mac} | ${src_ip} | ${dst_ip} | | Run Traffic Script On Node | icmpv6_echo.py | ${tg_node} | ${args} | Ipv6 tg to tg routed @@ -138,9 +140,9 @@ | | ${src_port_name}= | Get interface name | ${src_node} | ${src_port} | | ${dst_port_name}= | Get interface name | ${dst_node} | ${dst_port} | | ${args}= | Traffic Script Gen Arg | ${src_port_name} | ${dst_port_name} | ${src_mac} -| | | ... | ${dst_mac} | ${src_ip} | ${dst_ip} +| | ... | ${dst_mac} | ${src_ip} | ${dst_ip} | | ${args}= | Catenate | ${args} | --src_nh_mac ${src_nh_mac} -| | | ... | --dst_nh_mac ${dst_nh_mac} | --h_num 2 +| | ... | --dst_nh_mac ${dst_nh_mac} | --h_num 2 | | Run Traffic Script On Node | icmpv6_echo_req_resp.py | ${tg_node} | ${args} | Send IPv6 neighbor solicitation and verify answer @@ -156,7 +158,7 @@ | | ${dst_mac}= | Get Interface Mac | ${dst_node} | ${dst_port} | | ${src_port_name}= | Get interface name | ${src_node} | ${src_port} | | ${args}= | Traffic Script Gen Arg | ${src_port_name} | ${src_port_name} | ${src_mac} -| | | ... | ${dst_mac} | ${src_ip} | ${dst_ip} +| | ... | ${dst_mac} | ${src_ip} | ${dst_ip} | | Run Traffic Script On Node | ipv6_ns.py | ${src_node} | ${args} | Configure IPv6 on all DUTs in topology diff --git a/resources/libraries/robot/performance/performance_setup.robot b/resources/libraries/robot/performance/performance_setup.robot index 5838590e31..9f6d5aeac8 100644 --- a/resources/libraries/robot/performance/performance_setup.robot +++ b/resources/libraries/robot/performance/performance_setup.robot @@ -12,6 +12,8 @@ # limitations under the License. *** Settings *** +| Library | resources.libraries.python.DUTSetup +| Library | resources.libraries.python.VhostUser | Resource | resources/libraries/robot/performance/performance_configuration.robot | Resource | resources/libraries/robot/performance/performance_utils.robot | Documentation | Performance suite keywords - Suite and test setups and @@ -240,7 +242,7 @@ | | ... | | [Arguments] | ${topology_type} | ${nic_model} | | ... -| | Show vpp version on all DUTs +| | Show vpp version on all DUTs | ${nodes} | | Set variables in 2-node circular topology with DUT interface model | | ... | ${nic_model} | | Initialize traffic generator | ${tg} | ${tg_if1} | ${tg_if2} @@ -267,7 +269,7 @@ | | [Arguments] | ${topology_type} | ${nic_model} | ${tg_if1_dest_mac} | | ... | ${tg_if2_dest_mac} | | ... -| | Show vpp version on all DUTs +| | Show vpp version on all DUTs | ${nodes} | | Set variables in 2-node circular topology with DUT interface model | | ... | ${nic_model} | | Initialize traffic generator | ${tg} | ${tg_if1} | ${tg_if2} @@ -292,7 +294,7 @@ | | ... | | [Arguments] | ${topology_type} | ${nic_model} | | ... -| | Show vpp version on all DUTs +| | Show vpp version on all DUTs | ${nodes} | | Set variables in 3-node circular topology with DUT interface model | | ... | ${nic_model} | | Initialize traffic generator | ${tg} | ${tg_if1} | ${tg_if2} @@ -425,7 +427,7 @@ | | [Arguments] | ${rate} | ${framesize} | ${topology_type} | | ... | | Show VAT History On All DUTs | ${nodes} -| | Show statistics on all DUTs +| | Show statistics on all DUTs | ${nodes} | | Run Keyword If Test Failed | | ... | Traffic should pass with no loss | ${perf_trial_duration} | ${rate} | | ... | ${framesize} | ${topology_type} | fail_on_loss=${False} @@ -434,13 +436,13 @@ | | [Documentation] | Common test teardown for ndrchk performance tests. | | ... | | Show VAT History On All DUTs | ${nodes} -| | Show statistics on all DUTs +| | Show statistics on all DUTs | ${nodes} | Tear down performance pdrchk test | | [Documentation] | Common test teardown for pdrchk performance tests. | | ... | | Show VAT History On All DUTs | ${nodes} -| | Show statistics on all DUTs +| | Show statistics on all DUTs | ${nodes} | Tear down performance test with vhost and VM with dpdk-testpmd | | [Documentation] | Common test teardown for performance tests which use @@ -466,8 +468,8 @@ | | ... | ${dut2_node}=${None} | ${dut2_vm_refs}=${None} | | ... | | Show VAT History On All DUTs | ${nodes} -| | Show VPP vhost on all DUTs -| | Show statistics on all DUTs +| | Show VPP vhost on all DUTs | ${nodes} +| | Show statistics on all DUTs | ${nodes} | | Run Keyword If Test Failed | | ... | Traffic should pass with no loss | ${perf_trial_duration} | ${rate} | | ... | ${framesize} | ${topology_type} | fail_on_loss=${False} @@ -500,8 +502,8 @@ | | ... | ${dut2_node}=${None} | ${dut2_vm_refs}=${None} | | ... | | Show VAT History On All DUTs | ${nodes} -| | Show VPP vhost on all DUTs -| | Show statistics on all DUTs +| | Show VPP vhost on all DUTs | ${nodes} +| | Show statistics on all DUTs | ${nodes} | | Run keyword unless | ${dut1_node}==${None} | | ... | Tear down guest VM with dpdk-testpmd | ${dut1} | ${dut1_vm_refs} | | Run keyword unless | ${dut2_node}==${None} diff --git a/resources/libraries/robot/performance/performance_utils.robot b/resources/libraries/robot/performance/performance_utils.robot index 6c9f3a5930..e045075686 100644 --- a/resources/libraries/robot/performance/performance_utils.robot +++ b/resources/libraries/robot/performance/performance_utils.robot @@ -454,7 +454,7 @@ | | Run Keyword If | ${ret}==${FALSE} | Clear all counters on all DUTs | | Send traffic on tg | ${duration} | ${rate}pps | ${framesize} | | ... | ${topology_type} | warmup_time=0 -| | Run Keyword If | ${ret}==${FALSE} | Show statistics on all DUTs +| | Run Keyword If | ${ret}==${FALSE} | Show statistics on all DUTs | ${nodes} | | Run keyword and return | Get latency | Traffic should pass with no loss @@ -484,7 +484,7 @@ | | Run Keyword If | ${ret}==${FALSE} | Clear all counters on all DUTs | | Send traffic on tg | ${duration} | ${rate} | ${framesize} | | ... | ${topology_type} | warmup_time=0 -| | Run Keyword If | ${ret}==${FALSE} | Show statistics on all DUTs +| | Run Keyword If | ${ret}==${FALSE} | Show statistics on all DUTs | ${nodes} | | Run Keyword If | ${fail_on_loss} | No traffic loss occurred | Traffic should pass with partial loss @@ -515,7 +515,7 @@ | | Run Keyword If | ${ret}==${FALSE} | Clear all counters on all DUTs | | Send traffic on tg | ${duration} | ${rate} | ${framesize} | | ... | ${topology_type} | warmup_time=0 -| | Run Keyword If | ${ret}==${FALSE} | Show statistics on all DUTs +| | Run Keyword If | ${ret}==${FALSE} | Show statistics on all DUTs | ${nodes} | | Run Keyword If | ${fail_on_loss} | Partial traffic loss accepted | | ... | ${loss_acceptance} | ${loss_acceptance_type} @@ -541,7 +541,9 @@ | | Send traffic on tg | -1 | ${rate} | ${framesize} | ${topology_type} | | ... | warmup_time=0 | async_call=${True} | latency=${False} | | ${ret}= | Is DPDK performance test -| | Run Keyword If | ${ret}==${FALSE} | Clear runtime counters on all DUTs +| | Run Keyword If | ${ret}==${FALSE} +| | ... | Clear runtime counters on all DUTs | ${nodes} | | Sleep | ${duration} -| | Run Keyword If | ${ret}==${FALSE} | Show runtime counters on all DUTs +| | Run Keyword If | ${ret}==${FALSE} +| | ... | Show runtime counters on all DUTs | ${nodes} | | Stop traffic on tg diff --git a/resources/libraries/robot/shared/counters.robot b/resources/libraries/robot/shared/counters.robot index 3591dd5fe7..8a3e611faa 100644 --- a/resources/libraries/robot/shared/counters.robot +++ b/resources/libraries/robot/shared/counters.robot @@ -13,7 +13,7 @@ *** Settings *** | Documentation | VPP counters keywords -| Library | resources/libraries/python/VppCounters.py +| Library | resources.libraries.python.VppCounters *** Keywords *** | Clear interface counters on all vpp nodes in topology @@ -21,71 +21,17 @@ | | [Arguments] | ${nodes} | | Vpp Nodes Clear Interface Counters | ${nodes} -| Get interface statistics -| | [Documentation] | Dump stats table on VPP node -| | [Arguments] | ${node} -| | Vpp Dump Stats Table | ${node} - -| Get interface ipv6 counter -| | [Documentation] | Return IPv6 statistics for node interface -| | [Arguments] | ${node} | ${interface} -| | ${ipv6_counter}= | Vpp Get Ipv6 Interface Counter | ${node} | ${interface} -| | [Return] | ${ipv6_counter} - | Check ipv4 interface counter | | [Documentation] | Check that ipv4 interface counter has right value | | [Arguments] | ${node} | ${interface} | ${value} -| | ${ipv4_counter}= | Vpp get ipv4 interface counter | ${node} | ${interface} +| | ${ipv4_counter}= | Vpp get ipv4 interface counter | ${node} +| | ... | ${interface} | | Should Be Equal | ${ipv4_counter} | ${value} -| Show statistics on all DUTs -| | [Documentation] | Show VPP statistics on all DUTs -| | Sleep | 10 | Waiting for statistics to be collected -| | ${duts}= | Get Matches | ${nodes} | DUT* -| | :FOR | ${dut} | IN | @{duts} -| | | Show vpp statistics | ${nodes['${dut}']} - -| Show vpp statistics -| | [Documentation] | Show [error, hardware, interface] stats -| | [Arguments] | ${node} -| | Vpp Show Errors | ${node} -| | Vpp Show Hardware Detail | ${node} -| | Vpp Show Runtime | ${node} - | Clear all counters on all DUTs | | [Documentation] | Clear runtime, interface, hardware and error counters | | ... | on all DUTs with VPP instance -| | Clear runtime counters on all DUTs -| | Clear interface counters on all DUTs -| | Clear hardware counters on all DUTs -| | Clear error counters on all DUTs - -| Clear runtime counters on all DUTs -| | [Documentation] | Clear VPP runtime counters on all DUTs -| | ${duts}= | Get Matches | ${nodes} | DUT* -| | :FOR | ${dut} | IN | @{duts} -| | | Vpp clear runtime | ${nodes['${dut}']} - -| Clear interface counters on all DUTs -| | [Documentation] | Clear VPP interface counters on all DUTs -| | ${duts}= | Get Matches | ${nodes} | DUT* -| | :FOR | ${dut} | IN | @{duts} -| | | Vpp clear interface counters | ${nodes['${dut}']} - -| Clear hardware counters on all DUTs -| | [Documentation] | Clear VPP hardware counters on all DUTs -| | ${duts}= | Get Matches | ${nodes} | DUT* -| | :FOR | ${dut} | IN | @{duts} -| | | Vpp clear hardware counters | ${nodes['${dut}']} - -| Clear error counters on all DUTs -| | [Documentation] | Clear VPP errors counters on all DUTs -| | ${duts}= | Get Matches | ${nodes} | DUT* -| | :FOR | ${dut} | IN | @{duts} -| | | Vpp clear errors counters | ${nodes['${dut}']} - -| Show runtime counters on all DUTs -| | [Documentation] | Show VPP runtime counters on all DUTs -| | ${duts}= | Get Matches | ${nodes} | DUT* -| | :FOR | ${dut} | IN | @{duts} -| | | Vpp show runtime | ${nodes['${dut}']} +| | Clear runtime counters on all DUTs | ${nodes} +| | Clear interface counters on all DUTs | ${nodes} +| | Clear hardware counters on all DUTs | ${nodes} +| | Clear error counters on all DUTs | ${nodes} diff --git a/resources/libraries/robot/shared/default.robot b/resources/libraries/robot/shared/default.robot index 48b61e5f86..ddf20405fe 100644 --- a/resources/libraries/robot/shared/default.robot +++ b/resources/libraries/robot/shared/default.robot @@ -23,8 +23,8 @@ | Library | resources.libraries.python.TGSetup | Library | resources.libraries.python.L2Util | Library | resources.libraries.python.Tap -| Library | resources/libraries/python/VppConfigGenerator.py -| Library | resources/libraries/python/VppCounters.py +| Library | resources.libraries.python.VppConfigGenerator +| Library | resources.libraries.python.VppCounters | Library | Collections *** Keywords *** @@ -38,13 +38,6 @@ | | ... | | All TGs Set Interface Default Driver | ${nodes} -| Show VPP version on all DUTs -| | [Documentation] | Show VPP version verbose on all DUTs. -| | ... -| | ${duts}= | Get Matches | ${nodes} | DUT* -| | :FOR | ${dut} | IN | @{duts} -| | | Vpp show version verbose | ${nodes['${dut}']} - | Show Vpp Errors On All DUTs | | [Documentation] | Show VPP errors verbose on all DUTs. | | ... @@ -60,13 +53,6 @@ | | | Vpp api trace save | ${nodes['${dut}']} | | | Vpp api trace dump | ${nodes['${dut}']} -| Show VPP vhost on all DUTs -| | [Documentation] | Show Vhost User on all DUTs. -| | ... -| | ${duts}= | Get Matches | ${nodes} | DUT* -| | :FOR | ${dut} | IN | @{duts} -| | | Vpp Show Vhost | ${nodes['${dut}']} - | Show Bridge Domain Data On All DUTs | | [Documentation] | Show Bridge Domain data on all DUTs. | | ... |