Add Tests for Honeycomb VxLAN GPE support
[csit.git] / resources / libraries / python / InterfaceUtil.py
index 6790fb7..a84d595 100644 (file)
@@ -190,15 +190,15 @@ class InterfaceUtil(object):
 
         if interface is not None:
             if isinstance(interface, basestring):
-                sw_if_index = Topology.get_interface_sw_index(node, interface)
+                param = "interface_name"
+            elif isinstance(interface, int):
+                param = "sw_if_index"
             else:
-                sw_if_index = interface
-
+                raise TypeError
             for data_if in data:
-                if data_if["sw_if_index"] == sw_if_index:
-
+                if data_if[param] == interface:
                     return data_if
-
+            return dict()
         return data
 
     @staticmethod
@@ -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):
@@ -614,3 +686,53 @@ class InterfaceUtil(object):
                                                     sw_if_index=sw_if_index,
                                                     ip_version=ip_version,
                                                     table_index=table_index)
+
+    @staticmethod
+    def get_sw_if_index(node, interface_name):
+        """Get sw_if_index for the given interface from actual interface dump.
+
+        :param node: VPP node to get interface data from.
+        :param interface_name: Name of the specific interface.
+        :type node: dict
+        :type interface_name: str
+        :return: sw_if_index of the given interface.
+        :rtype: str
+        """
+
+        with VatTerminal(node) as vat:
+            if_data = vat.vat_terminal_exec_cmd_from_template(
+                "interface_dump.vat")
+        for interface in if_data[0]:
+            if interface["interface_name"] == interface_name:
+                return interface["sw_if_index"]
+
+        return None
+
+    @staticmethod
+    def vxlan_gpe_dump(node, interface_name=None):
+        """Get VxLAN GPE data for the given interface.
+
+        :param node: VPP node to get interface data from.
+        :param interface_name: Name of the specific interface. If None,
+        information about all VxLAN GPE interfaces is returned.
+        :type node: dict
+        :type interface_name: str
+        :return: Dictionary containing data for the given VxLAN GPE interface or
+        if interface=None, the list of dictionaries with all VxLAN GPE
+        interfaces.
+        :rtype: dict or list
+        """
+
+        with VatTerminal(node) as vat:
+            vxlan_gpe_data = vat.vat_terminal_exec_cmd_from_template(
+                "vxlan_gpe_dump.vat")
+
+        if interface_name:
+            sw_if_index = InterfaceUtil.get_sw_if_index(node, interface_name)
+            if sw_if_index:
+                for vxlan_gpe in vxlan_gpe_data[0]:
+                    if vxlan_gpe["sw_if_index"] == sw_if_index:
+                        return vxlan_gpe
+            return {}
+
+        return vxlan_gpe_data[0]