Function can be used for DUTs as well as for TGs.
:param node: node where the interface is
- :param interface: interface name
+ :param interface: interface name or sw_if_index
:param state: one of 'up' or 'down'
:type node: dict
- :type interface: str
+ :type interface: str or int
:type state: str
:return: nothing
"""
else:
raise ValueError('Unexpected interface state: {}'.format(state))
- sw_if_index = Topology.get_interface_sw_index(node, interface)
+ if isinstance(interface, basestring):
+ sw_if_index = Topology.get_interface_sw_index(node, interface)
+ else:
+ sw_if_index = interface
+
VatExecutor.cmd_from_template(node, 'set_if_state.vat',
sw_if_index=sw_if_index, state=state)
- elif node['type'] == NodeType.TG:
+ elif node['type'] == NodeType.TG or node['type'] == NodeType.VM:
cmd = 'ip link set {} {}'.format(interface, state)
exec_cmd_no_error(node, cmd, sudo=True)
else:
- raise Exception('Unknown NodeType: "{}"'.format(node['type']))
+ raise Exception('Node {} has unknown NodeType: "{}"'.
+ format(node['host'], node['type']))
+
+ @staticmethod
+ def set_interface_ethernet_mtu(node, interface, mtu):
+ """Set Ethernet MTU for specified interface.
+
+ Function can be used only for TGs.
+
+ :param node: node where the interface is
+ :param interface: interface name
+ :param mtu: MTU to set
+ :type node: dict
+ :type interface: str
+ :type mtu: int
+ :return: nothing
+ """
+ if node['type'] == NodeType.DUT:
+ ValueError('Node {}: Setting Ethernet MTU for interface '
+ 'on DUT nodes not supported', node['host'])
+ elif node['type'] == NodeType.TG:
+ cmd = 'ip link set {} mtu {}'.format(interface, mtu)
+ exec_cmd_no_error(node, cmd, sudo=True)
+ else:
+ raise ValueError('Node {} has unknown NodeType: "{}"'.
+ format(node['host'], node['type']))
+
+ @staticmethod
+ def set_default_ethernet_mtu_on_all_interfaces_on_node(node):
+ """Set default Ethernet MTU on all interfaces on node.
+
+ Function can be used only for TGs.
+
+ :param node: node where to set default MTU
+ :type node: dict
+ :return: nothing
+ """
+ for ifc in node['interfaces'].values():
+ InterfaceUtil.set_interface_ethernet_mtu(node, ifc['name'], 1500)
@staticmethod
def vpp_node_interfaces_ready_wait(node, timeout=10):
: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')
+ while not if_ready:
+ out = InterfaceUtil.vpp_get_interface_data(node)
if time() - start > timeout:
for interface in out:
if interface.get('admin_up_down') == 1:
if not not_ready:
if_ready = True
else:
- logger.debug('Interfaces still in link-down state: {0}, ' \
+ 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):
: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 nodes: list
:type timeout: int
:raises: RuntimeError if the timeout period value has elapsed.
"""
:param nodes: Nodes in the topology.
:param timeout: Seconds to wait per node for all interfaces to come up.
- :type node: dict
+ :type nodes: 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)
+
+ @staticmethod
+ def vpp_get_interface_data(node, interface=None):
+ """Get all interface data from a VPP node. If a name or
+ sw_interface_index is provided, return only data for the matching
+ interface.
+ :param node: VPP node to get interface data from.
+ :param interface: Numeric index or name string of a specific interface.
+ :type node: dict
+ :type interface: int or str
+ :return: List of dictionaries containing data for each interface, or a
+ single dictionary for the specified interface.
+ :rtype: list or dict
+ """
+ with VatTerminal(node) as vat:
+ response = vat.vat_terminal_exec_cmd_from_template(
+ "interface_dump.vat")
+
+ data = response[0]
+
+ if interface is not None:
+ if isinstance(interface, basestring):
+ sw_if_index = Topology.get_interface_sw_index(node, interface)
+ else:
+ sw_if_index = interface
+
+ for data_if in data:
+ if data_if["sw_if_index"] == sw_if_index:
+
+ return data_if
+
+ return data