Honeycomb setup and utils
[csit.git] / resources / libraries / python / InterfaceUtil.py
index c074a88..25503c0 100644 (file)
@@ -30,10 +30,10 @@ class InterfaceUtil(object):
         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
         """
@@ -45,15 +45,57 @@ class InterfaceUtil(object):
             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):
@@ -66,11 +108,10 @@ class InterfaceUtil(object):
         :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:
@@ -86,10 +127,9 @@ class InterfaceUtil(object):
             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):
@@ -98,7 +138,7 @@ class InterfaceUtil(object):
 
         :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.
         """
@@ -112,10 +152,42 @@ class InterfaceUtil(object):
 
         :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