aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--resources/libraries/python/InterfaceUtil.py71
-rw-r--r--resources/libraries/robot/bridge_domain.robot3
-rw-r--r--resources/libraries/robot/ipv4.robot3
-rw-r--r--resources/libraries/robot/ipv6.robot3
-rw-r--r--tests/suites/l2_xconnect/l2_xconnect_untagged.robot3
5 files changed, 77 insertions, 6 deletions
diff --git a/resources/libraries/python/InterfaceUtil.py b/resources/libraries/python/InterfaceUtil.py
index 38b476ed52..c074a88ac3 100644
--- a/resources/libraries/python/InterfaceUtil.py
+++ b/resources/libraries/python/InterfaceUtil.py
@@ -13,9 +13,11 @@
"""Interface util library"""
+from time import time, sleep
+from robot.api import logger
from resources.libraries.python.ssh import exec_cmd_no_error
from resources.libraries.python.topology import NodeType, Topology
-from resources.libraries.python.VatExecutor import VatExecutor
+from resources.libraries.python.VatExecutor import VatExecutor, VatTerminal
class InterfaceUtil(object):
@@ -41,7 +43,7 @@ class InterfaceUtil(object):
elif state == 'down':
state = 'admin-down'
else:
- raise Exception('Unexpected interface state: {}'.format(state))
+ raise ValueError('Unexpected interface state: {}'.format(state))
sw_if_index = Topology.get_interface_sw_index(node, interface)
VatExecutor.cmd_from_template(node, 'set_if_state.vat',
@@ -52,3 +54,68 @@ class InterfaceUtil(object):
exec_cmd_no_error(node, cmd, sudo=True)
else:
raise Exception('Unknown NodeType: "{}"'.format(node['type']))
+
+ @staticmethod
+ def vpp_node_interfaces_ready_wait(node, timeout=10):
+ """Wait until all interfaces with admin-up are in link-up state.
+
+ :param node: Node to wait on.
+ :param timeout: Waiting timeout in seconds (optional, default 10s)
+ :type node: dict
+ :type timeout: int
+ :raises: RuntimeError if the timeout period value has elapsed.
+ """
+ if_ready = False
+ vat = VatTerminal(node)
+ not_ready = []
+ start = time()
+ while if_ready != True:
+ out = vat.vat_terminal_exec_cmd('sw_interface_dump')
+ if time() - start > timeout:
+ for interface in out:
+ if interface.get('admin_up_down') == 1:
+ if interface.get('link_up_down') != 1:
+ logger.debug('{0} link-down'.format(
+ interface.get('interface_name')))
+ raise RuntimeError('timeout, not up {0}'.format(not_ready))
+ not_ready = []
+ for interface in out:
+ if interface.get('admin_up_down') == 1:
+ if interface.get('link_up_down') != 1:
+ not_ready.append(interface.get('interface_name'))
+ if not not_ready:
+ if_ready = True
+ else:
+ logger.debug('Interfaces still in link-down state: {0}, ' \
+ 'waiting...'.format(not_ready))
+ sleep(1)
+ vat.vat_terminal_close()
+
+ @staticmethod
+ def vpp_nodes_interfaces_ready_wait(nodes, timeout=10):
+ """Wait until all interfaces with admin-up are in link-up state for
+ listed nodes.
+
+ :param nodes: List of nodes to wait on.
+ :param timeout: Seconds to wait per node for all interfaces to come up.
+ :type node: list
+ :type timeout: int
+ :raises: RuntimeError if the timeout period value has elapsed.
+ """
+ for node in nodes:
+ InterfaceUtil.vpp_node_interfaces_ready_wait(node, timeout)
+
+ @staticmethod
+ def all_vpp_interfaces_ready_wait(nodes, timeout=10):
+ """Wait until all interfaces with admin-up are in link-up state for all
+ nodes in the topology.
+
+ :param nodes: Nodes in the topology.
+ :param timeout: Seconds to wait per node for all interfaces to come up.
+ :type node: dict
+ :type timeout: int
+ :raises: RuntimeError if the timeout period value has elapsed.
+ """
+ for node in nodes.values():
+ if node['type'] == NodeType.DUT:
+ InterfaceUtil.vpp_node_interfaces_ready_wait(node, timeout)
diff --git a/resources/libraries/robot/bridge_domain.robot b/resources/libraries/robot/bridge_domain.robot
index f433599bbd..99ba375c68 100644
--- a/resources/libraries/robot/bridge_domain.robot
+++ b/resources/libraries/robot/bridge_domain.robot
@@ -15,6 +15,7 @@
| Library | resources.libraries.python.topology.Topology
| Library | resources.libraries.python.TrafficScriptExecutor
| Library | resources.libraries.python.L2Util
+| Library | resources.libraries.python.InterfaceUtil
*** Keywords ***
| Vpp l2bd forwarding setup
@@ -24,7 +25,7 @@
| | Vpp Add L2 Bridge Domain | ${node} | ${1} | ${if1} | ${if2} | ${learn}
| | Run Keyword If | ${learn} == ${FALSE}
| | ... | Vpp Add L2fib Entry | ${node} | ${mac} | ${if2} | ${1}
-| | Sleep | 5 | # Wait some time after interface is set up
+| | All Vpp Interfaces Ready Wait | ${nodes}
| Send and receive traffic
| | [Documentation] | Send traffic from source interface to destination interface
diff --git a/resources/libraries/robot/ipv4.robot b/resources/libraries/robot/ipv4.robot
index 0cfb73b7b7..4ed0181d52 100644
--- a/resources/libraries/robot/ipv4.robot
+++ b/resources/libraries/robot/ipv4.robot
@@ -18,6 +18,7 @@
| Library | resources.libraries.python.NodePath
| Library | resources.libraries.python.Routing
| Library | resources.libraries.python.TrafficScriptExecutor
+| Library | resources.libraries.python.InterfaceUtil
| Variables | resources/libraries/python/IPv4NodeAddress.py | ${nodes}
*** Keywords ***
@@ -52,7 +53,7 @@
| | Setup IPv4 adresses on all DUT nodes in topology | ${nodes} | ${nodes_ipv4_addr}
| | Setup ARP on all DUTs | ${nodes} | ${nodes_ipv4_addr}
| | Routes are set up for IPv4 testing | ${nodes} | ${nodes_ipv4_addr}
-| | Sleep | 10
+| | All Vpp Interfaces Ready Wait | ${nodes}
| TG interface "${tg_port}" can route to node "${node}" interface "${port}" "${hops}" hops away using IPv4
| | Node "${nodes['TG']}" interface "${tg_port}" can route to node "${node}" interface "${port}" "${hops}" hops away using IPv4
diff --git a/resources/libraries/robot/ipv6.robot b/resources/libraries/robot/ipv6.robot
index 6cd6640b0a..4783b070ab 100644
--- a/resources/libraries/robot/ipv6.robot
+++ b/resources/libraries/robot/ipv6.robot
@@ -19,6 +19,7 @@
| Library | resources/libraries/python/TrafficScriptExecutor.py
| Library | resources/libraries/python/NodePath.py
| Library | resources/libraries/python/Routing.py
+| Library | resources/libraries/python/InterfaceUtil.py
| Library | resources.libraries.python.topology.Topology
| Resource | resources/libraries/robot/default.robot
| Resource | resources/libraries/robot/counters.robot
@@ -152,7 +153,7 @@
| | [Arguments] | ${nodes} | ${nodes_addr}
| | Setup all DUTs before test
| | Nodes Setup Ipv6 Addresses | ${nodes} | ${nodes_addr}
-| | Sleep | 10
+| | All Vpp Interfaces Ready Wait | ${nodes}
| Clear ipv6 on all dut in topology
| | [Documentation] | Remove IPv6 address on all DUTs
diff --git a/tests/suites/l2_xconnect/l2_xconnect_untagged.robot b/tests/suites/l2_xconnect/l2_xconnect_untagged.robot
index f811612051..033a109ef1 100644
--- a/tests/suites/l2_xconnect/l2_xconnect_untagged.robot
+++ b/tests/suites/l2_xconnect/l2_xconnect_untagged.robot
@@ -15,6 +15,7 @@
| Resource | resources/libraries/robot/default.robot
| Resource | resources/libraries/robot/l2_xconnect.robot
+| Library | resources.libraries.python.InterfaceUtil
| Library | resources.libraries.python.NodePath
| Force Tags | 3_NODE_SINGLE_LINK_TOPO | HW_ENV | VM_ENV
| Test Setup | Setup all DUTs before test
@@ -34,5 +35,5 @@
| | ${dst_if} | ${tg}= | Next Interface
| | L2 setup xconnect on DUT | ${dut1} | ${dut1_if1} | ${dut1_if2}
| | L2 setup xconnect on DUT | ${dut2} | ${dut2_if1} | ${dut2_if2}
-| | Sleep | 10 | Work around VPP interface up taking too long.
+| | All Vpp Interfaces Ready Wait | ${nodes}
| | Send and receive traffic | ${tg} | ${src_if} | ${dst_if}