Add possibility to create a VxLAN interface. 94/1094/3
authorTibor Frank <tifrank@cisco.com>
Fri, 13 May 2016 08:25:16 +0000 (10:25 +0200)
committerTibor Frank <tifrank@cisco.com>
Fri, 13 May 2016 12:39:44 +0000 (14:39 +0200)
JIRA: CSIT-51

- add a keyword which adds a new VxLAN interface
- change InterfaceUtil.vxlan_dump to be able to return info about all VxLAN
  interfaces.

Change-Id: I8ad3dc1d414924e74ea1ecea1f316ca5c648e2d0
Signed-off-by: Tibor Frank <tifrank@cisco.com>
resources/libraries/python/InterfaceUtil.py
resources/libraries/python/honeycomb/HcAPIKwInterfaces.py
resources/templates/vat/vxlan_dump.vat

index 3da0e1a..6790fb7 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)
-
-        for vxlan in response[0]:
-            if vxlan["sw_if_index"] == sw_if_index:
-                return vxlan
-        return {}
+                "vxlan_dump.vat", param=param, sw_if_index=sw_if_index)
+
+        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,
index 854bc07..7bdfa19 100644 (file)
@@ -673,6 +673,70 @@ class InterfaceKeywords(object):
         return InterfaceKeywords._set_interface_properties(
             node, interface, path, value)
 
+    @staticmethod
+    def create_vxlan_interface(node, interface, **kwargs):
+        """Create a new VxLAN interface.
+
+        :param node: Honeycomb node.
+        :param interface: The name of interface.
+        :param kwargs: Parameters and their values. The accepted parameters are
+        defined in InterfaceKeywords.VXLAN_PARAMS.
+        :type node: dict
+        :type interface: str
+        :type kwargs: dict
+        :return: Content of response.
+        :rtype: bytearray
+        :raises HoneycombError: If the parameter is not valid.
+        """
+
+        new_vx_lan = {
+            "name": interface,
+            "type": "v3po:vxlan-tunnel",
+            "v3po:vxlan": {}
+        }
+        for param, value in kwargs.items():
+            if param not in InterfaceKeywords.VXLAN_PARAMS:
+                raise HoneycombError("The parameter {0} is invalid.".
+                                     format(param))
+            new_vx_lan["v3po:vxlan"][param] = value
+
+        path = ("interfaces", "interface")
+        vx_lan_structure = [new_vx_lan, ]
+        return InterfaceKeywords._set_interface_properties(
+            node, interface, path, vx_lan_structure)
+
+    @staticmethod
+    def delete_interface(node, interface):
+        """Delete an interface.
+
+        :param node: Honeycomb node.
+        :param interface: The name of interface.
+        :type node: dict
+        :type interface: str
+        :return: Content of response.
+        :rtype: bytearray
+        :raises HoneycombError: If it is not possible to get information about
+        interfaces or it is not possible to delete the interface.
+        """
+
+        path = ("interfaces", ("interface", "name", interface))
+
+        status_code, resp = HcUtil.\
+            get_honeycomb_data(node, "config_vpp_interfaces")
+        if status_code != HTTPCodes.OK:
+            raise HoneycombError(
+                "Not possible to get configuration information about the "
+                "interfaces. Status code: {0}.".format(status_code))
+
+        new_data = HcUtil.remove_item(resp, path)
+        status_code, resp = HcUtil.\
+            put_honeycomb_data(node, "config_vpp_interfaces", new_data)
+        if status_code != HTTPCodes.OK:
+            raise HoneycombError("Not possible to remove interface {0}. "
+                                 "Status code: {1}.".
+                                 format(interface, status_code))
+        return resp
+
     @staticmethod
     def configure_interface_vxlan(node, interface, **kwargs):
         """Configure VxLAN on the interface.
index 0be6d9f..6f41f31 100644 (file)
@@ -1 +1 @@
-vxlan_tunnel_dump sw_if_index {sw_if_index}
\ No newline at end of file
+vxlan_tunnel_dump {param} {sw_if_index}
\ No newline at end of file