From 981bc57e281bc2f6920f7690eccc3106419474d2 Mon Sep 17 00:00:00 2001 From: Tibor Frank Date: Fri, 13 May 2016 10:25:16 +0200 Subject: [PATCH] Add possibility to create a VxLAN interface. 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 --- resources/libraries/python/InterfaceUtil.py | 33 +++++++---- .../python/honeycomb/HcAPIKwInterfaces.py | 64 ++++++++++++++++++++++ resources/templates/vat/vxlan_dump.vat | 2 +- 3 files changed, 86 insertions(+), 13 deletions(-) diff --git a/resources/libraries/python/InterfaceUtil.py b/resources/libraries/python/InterfaceUtil.py index 3da0e1a204..6790fb7221 100644 --- a/resources/libraries/python/InterfaceUtil.py +++ b/resources/libraries/python/InterfaceUtil.py @@ -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, diff --git a/resources/libraries/python/honeycomb/HcAPIKwInterfaces.py b/resources/libraries/python/honeycomb/HcAPIKwInterfaces.py index 854bc07ee6..7bdfa19831 100644 --- a/resources/libraries/python/honeycomb/HcAPIKwInterfaces.py +++ b/resources/libraries/python/honeycomb/HcAPIKwInterfaces.py @@ -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. diff --git a/resources/templates/vat/vxlan_dump.vat b/resources/templates/vat/vxlan_dump.vat index 0be6d9ff69..6f41f311bc 100644 --- a/resources/templates/vat/vxlan_dump.vat +++ b/resources/templates/vat/vxlan_dump.vat @@ -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 -- 2.16.6