Add Honeycomb TAP interface test
[csit.git] / resources / libraries / python / InterfaceUtil.py
index 6790fb7..838ba3b 100644 (file)
@@ -490,7 +490,7 @@ class InterfaceUtil(object):
         if output["retval"] == 0:
             return output["sw_if_index"]
         else:
-            raise RuntimeError('Unable to create VXLAN interface on node {}'
+            raise RuntimeError('Unable to create VXLAN interface on node {0}'
                                .format(node))
 
     @staticmethod
@@ -504,7 +504,7 @@ class InterfaceUtil(object):
         :type interface: int or str
         :return: Dictionary containing data for the given VxLAN interface or if
         interface=None, the list of dictionaries with all VxLAN interfaces.
-        :rtype dict or list
+        :rtype: dict or list
         """
         param = "sw_if_index"
         if interface is None:
@@ -528,6 +528,45 @@ class InterfaceUtil(object):
             return {}
         return response[0]
 
+    @staticmethod
+    def vhost_user_dump(node):
+        """Get vhost-user data for the given node.
+
+        :param node: VPP node to get interface data from.
+        :type node: dict
+        :return: List of dictionaries with all vhost-user interfaces.
+        :rtype: list
+        """
+        with VatTerminal(node) as vat:
+            response = vat.vat_terminal_exec_cmd_from_template(
+                "vhost_user_dump.vat")
+
+        return response[0]
+
+    @staticmethod
+    def tap_dump(node, name=None):
+        """Get all TAP interface data from the given node, or data about
+        a specific TAP interface.
+
+        :param node: VPP node to get data from.
+        :param name: Optional name of a specific TAP interface.
+        :type node: dict
+        :type name: str
+        :return: Dictionary of information about a specific TAP interface, or
+        a List of dictionaries containing all TAP data for the given node.
+        :rtype: dict or list
+        """
+        with VatTerminal(node) as vat:
+            response = vat.vat_terminal_exec_cmd_from_template(
+                "tap_dump.vat")
+        if name is None:
+            return response[0]
+        else:
+            for item in response[0]:
+                if name == item['dev_name']:
+                    return item
+            return {}
+
     @staticmethod
     def create_subinterface(node, interface, sub_id, outer_vlan_id,
                             inner_vlan_id, type_subif):
@@ -572,7 +611,40 @@ class InterfaceUtil(object):
         with VatTerminal(node) as vat:
             vat.vat_terminal_exec_cmd('exec show interfaces')
 
-        return '{}.{}'.format(interface, sub_id), sw_subif_index
+        name = '{}.{}'.format(interface, sub_id)
+        return name, sw_subif_index
+
+    @staticmethod
+    def create_gre_tunnel_interface(node, source_ip, destination_ip):
+        """Create GRE tunnel interface on node.
+
+        :param node: VPP node to add tunnel interface.
+        :param source_ip: Source of the GRE tunnel.
+        :param destination_ip: Destination of the GRE tunnel.
+        :type node: dict
+        :type source_ip: str
+        :type destination_ip: str
+        :return: Name and index of created GRE tunnel interface.
+        :rtype: tuple
+        :raises RuntimeError: If unable to create GRE tunnel interface.
+        """
+        output = VatExecutor.cmd_from_template(node, "create_gre.vat",
+                                               src=source_ip,
+                                               dst=destination_ip)
+        output = output[0]
+
+        if output["retval"] == 0:
+            sw_if_index = output["sw_if_index"]
+
+            vat_executor = VatExecutor()
+            vat_executor.execute_script_json_out("dump_interfaces.vat", node)
+            interface_dump_json = vat_executor.get_script_stdout()
+            name = VatJsonUtil.get_interface_name_from_json(
+                interface_dump_json, sw_if_index)
+            return name, sw_if_index
+        else:
+            raise RuntimeError('Unable to create GRE tunnel on node {}.'
+                               .format(node))
 
     @staticmethod
     def vpp_create_loopback(node):