CSIT-18: Add GRE tunnel libraries and tests.
[csit.git] / resources / libraries / python / InterfaceUtil.py
index 3da0e1a..94250fb 100644 (file)
@@ -494,30 +494,39 @@ class InterfaceUtil(object):
                                .format(node))
 
     @staticmethod
-    def vxlan_dump(node, interface):
+    def vxlan_dump(node, interface=None):
         """Get VxLAN data for the given interface.
 
         :param node: VPP node to get interface data from.
         :param interface: Numeric index or name string of a specific interface.
+        If None, information about all VxLAN interfaces is returned.
         :type node: dict
         :type interface: int or str
-        :return: Dictionary containing data for the given VxLAN.
-        :rtype dict
+        :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
         """
-
-        if isinstance(interface, basestring):
+        param = "sw_if_index"
+        if interface is None:
+            param = ''
+            sw_if_index = ''
+        elif isinstance(interface, basestring):
             sw_if_index = Topology.get_interface_sw_index(node, interface)
-        else:
+        elif isinstance(interface, int):
             sw_if_index = interface
+        else:
+            raise Exception("Wrong interface format {0}".format(interface))
 
         with VatTerminal(node) as vat:
             response = vat.vat_terminal_exec_cmd_from_template(
-                "vxlan_dump.vat", sw_if_index=sw_if_index)
+                "vxlan_dump.vat", param=param, sw_if_index=sw_if_index)
 
-        for vxlan in response[0]:
-            if vxlan["sw_if_index"] == sw_if_index:
-                return vxlan
-        return {}
+        if sw_if_index:
+            for vxlan in response[0]:
+                if vxlan["sw_if_index"] == sw_if_index:
+                    return vxlan
+            return {}
+        return response[0]
 
     @staticmethod
     def create_subinterface(node, interface, sub_id, outer_vlan_id,
@@ -563,7 +572,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):