import HoneycombUtil as HcUtil
+# pylint: disable=too-many-public-methods
+# pylint: disable=too-many-lines
class InterfaceKeywords(object):
"""Keywords for Interface manipulation.
"""
INTF_PARAMS = ("name", "description", "type", "enabled",
- "link-up-down-trap-enable")
+ "link-up-down-trap-enable", "v3po:l2", "v3po:vxlan-gpe",
+ "vpp-vlan:sub-interfaces")
IPV4_PARAMS = ("enabled", "forwarding", "mtu")
IPV6_PARAMS = ("enabled", "forwarding", "mtu", "dup-addr-detect-transmits")
IPV6_AUTOCONF_PARAMS = ("create-global-addresses",
VXLAN_PARAMS = ("src", "dst", "vni", "encap-vrf-id")
L2_PARAMS = ("bridge-domain", "split-horizon-group",
"bridged-virtual-interface")
+ TAP_PARAMS = ("tap-name", "mac", "device-instance")
+ VHOST_USER_PARAMS = ("socket", "role")
+ SUB_IF_PARAMS = ("identifier",
+ "vlan-type",
+ "enabled")
+ SUB_IF_MATCH = ("default",
+ "untagged",
+ "vlan-tagged",
+ "vlan-tagged-exact-match")
+ BD_PARAMS = ("bridge-domain",
+ "split-horizon-group",
+ "bridged-virtual-interface")
+ VXLAN_GPE_PARAMS = ("local",
+ "remote",
+ "vni",
+ "next-protocol",
+ "encap-vrf-id",
+ "decap-vrf-id")
def __init__(self):
pass
return InterfaceKeywords._set_interface_properties(
node, interface, path, v3po_l2)
+ @staticmethod
+ def get_bd_oper_data_from_interface(node, interface):
+ """Returns operational data about bridge domain settings in the
+ interface.
+
+ :param node: Honeycomb node.
+ :param interface: The name of interface.
+ :type interface: str
+ :type node: dict
+ :return: Operational data about bridge domain settings in the
+ interface.
+ :rtype: dict
+ """
+
+ if_data = InterfaceKeywords.get_interface_oper_data(node, interface)
+
+ if if_data:
+ try:
+ return if_data["v3po:l2"]
+ except KeyError:
+ return {}
+ return {}
+
@staticmethod
def configure_interface_base(node, interface, param, value):
"""Configure the base parameters of interface.
node, interface, path, value)
@staticmethod
- def add_first_ipv4_address(node, interface, ip_addr, netmask):
+ def add_first_ipv4_address(node, interface, ip_addr, network):
"""Add the first IPv4 address.
If there are any other addresses configured, they will be removed.
:param node: Honeycomb node.
:param interface: The name of interface.
:param ip_addr: IPv4 address to be set.
- :param netmask: Netmask.
+ :param network: Netmask or length of network prefix.
:type node: dict
:type interface: str
:type ip_addr: str
- :type netmask: str
+ :type network: str or int
:return: Content of response.
:rtype: bytearray
+ :raises HoneycombError: If the provided netmask or prefix is not valid.
"""
path = ("interfaces", ("interface", "name", interface), "ietf-ip:ipv4")
- address = {"address": [{"ip": ip_addr, "netmask": netmask}, ]}
+ if isinstance(network, basestring):
+ address = {"address": [{"ip": ip_addr, "netmask": network}, ]}
+ elif isinstance(network, int) and (0 < network < 33):
+ address = {"address": [{"ip": ip_addr, "prefix-length": network}, ]}
+ else:
+ raise HoneycombError("Value {0} is not a valid netmask or network "
+ "prefix length.".format(network))
return InterfaceKeywords._set_interface_properties(
node, interface, path, address)
@staticmethod
- def add_ipv4_address(node, interface, ip_addr, netmask):
+ def add_ipv4_address(node, interface, ip_addr, network):
"""Add IPv4 address.
:param node: Honeycomb node.
:param interface: The name of interface.
:param ip_addr: IPv4 address to be set.
- :param netmask: Netmask.
+ :param network: Netmask or length of network prefix.
:type node: dict
:type interface: str
:type ip_addr: str
- :type netmask: str
+ :type network: str or int
:return: Content of response.
:rtype: bytearray
+ :raises HoneycombError: If the provided netmask or prefix is not valid.
"""
path = ("interfaces", ("interface", "name", interface), "ietf-ip:ipv4",
"address")
- address = [{"ip": ip_addr, "prefix-length": netmask}, ]
+ if isinstance(network, basestring):
+ address = {"address": [{"ip": ip_addr, "netmask": network}, ]}
+ elif isinstance(network, int) and (0 < network < 33):
+ address = {"address": [{"ip": ip_addr, "prefix-length": network}, ]}
+ else:
+ raise HoneycombError("Value {0} is not a valid netmask or network "
+ "prefix length.".format(network))
return InterfaceKeywords._set_interface_properties(
node, interface, path, address)
return InterfaceKeywords._set_interface_properties(
node, interface, path, None)
- @staticmethod
- def add_first_ipv4_neighbor(node, interface, ip_addr, link_layer_address):
- """Add the first IPv4 neighbour.
-
- If there are any other neighbours configured, they will be removed.
-
- :param node: Honeycomb node.
- :param interface: The name of interface.
- :param ip_addr: IPv4 address of neighbour to be set.
- :param link_layer_address: Link layer address.
- :type node: dict
- :type interface: str
- :type ip_addr: str
- :type link_layer_address: str
- :return: Content of response.
- :rtype: bytearray
- """
-
- path = ("interfaces", ("interface", "name", interface), "ietf-ip:ipv4")
- neighbor = {"neighbor": [{"ip": ip_addr,
- "link-layer-address": link_layer_address}, ]}
- return InterfaceKeywords._set_interface_properties(
- node, interface, path, neighbor)
-
@staticmethod
def add_ipv4_neighbor(node, interface, ip_addr, link_layer_address):
"""Add the IPv4 neighbour.
return InterfaceKeywords._set_interface_properties(
node, interface, path, None)
- @staticmethod
- def add_first_ipv6_neighbor(node, interface, ip_addr, link_layer_address):
- """Add the first IPv6 neighbour.
-
- If there are any other neighbours configured, they will be removed.
-
- :param node: Honeycomb node.
- :param interface: The name of interface.
- :param ip_addr: IPv6 address of neighbour to be set.
- :param link_layer_address: Link layer address.
- :type node: dict
- :type interface: str
- :type ip_addr: str
- :type link_layer_address: str
- :return: Content of response.
- :rtype: bytearray
- """
-
- path = ("interfaces", ("interface", "name", interface), "ietf-ip:ipv6")
- neighbor = {"neighbor": [{"ip": ip_addr,
- "link-layer-address": link_layer_address}, ]}
- return InterfaceKeywords._set_interface_properties(
- node, interface, path, neighbor)
-
@staticmethod
def add_ipv6_neighbor(node, interface, ip_addr, link_layer_address):
"""Add the IPv6 neighbour.
node, interface, path, value)
@staticmethod
- def configure_interface_vxlan(node, interface, param, value):
- """Configure the VxLAN parameters of interface.
+ def create_vxlan_interface(node, interface, **kwargs):
+ """Create a new VxLAN interface.
:param node: Honeycomb node.
:param interface: The name of interface.
- :param param: Parameter to configure (set, change, remove)
- :param value: The value of parameter. If None, the parameter will be
- removed.
+ :param kwargs: Parameters and their values. The accepted parameters are
+ defined in InterfaceKeywords.VXLAN_PARAMS.
:type node: dict
:type interface: str
- :type param: str
- :type value: str
+ :type kwargs: dict
:return: Content of response.
:rtype: bytearray
:raises HoneycombError: If the parameter is not valid.
"""
- if param not in InterfaceKeywords.VXLAN_PARAMS:
- raise HoneycombError("The parameter {0} is invalid.".format(param))
+ 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)
- path = ("interfaces", ("interface", "name", interface), "v3po:vxlan",
- param)
+ @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.
+
+ The keyword configures VxLAN parameters on the given interface. The type
+ of interface must be set to "v3po:vxlan-tunnel".
+ The new VxLAN parameters overwrite the current configuration. If a
+ parameter in new configuration is missing, it is removed from VxLAN
+ configuration.
+ If the dictionary kwargs is empty, VxLAN configuration is removed.
+
+ :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.
+ """
+
+ vx_lan_structure = dict()
+ for param, value in kwargs.items():
+ if param not in InterfaceKeywords.VXLAN_PARAMS:
+ raise HoneycombError("The parameter {0} is invalid.".
+ format(param))
+ vx_lan_structure[param] = value
+
+ path = ("interfaces", ("interface", "name", interface), "v3po:vxlan")
return InterfaceKeywords._set_interface_properties(
- node, interface, path, value)
+ node, interface, path, vx_lan_structure)
@staticmethod
def configure_interface_l2(node, interface, param, value):
param)
return InterfaceKeywords._set_interface_properties(
node, interface, path, value)
+
+ @staticmethod
+ def create_tap_interface(node, interface, **kwargs):
+ """Create a new TAP interface.
+
+ :param node: Honeycomb node.
+ :param interface: The name of interface.
+ :param kwargs: Parameters and their values. The accepted parameters are
+ defined in InterfaceKeywords.TAP_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_tap = {
+ "name": interface,
+ "type": "v3po:tap",
+ "v3po:tap": {}
+ }
+ for param, value in kwargs.items():
+ if param not in InterfaceKeywords.TAP_PARAMS:
+ raise HoneycombError("The parameter {0} is invalid.".
+ format(param))
+ new_tap["v3po:tap"][param] = value
+
+ path = ("interfaces", "interface")
+ new_tap_structure = [new_tap, ]
+ return InterfaceKeywords._set_interface_properties(
+ node, interface, path, new_tap_structure)
+
+ @staticmethod
+ def configure_interface_tap(node, interface, **kwargs):
+ """Configure TAP on the interface.
+
+ The keyword configures TAP parameters on the given interface. The type
+ of interface must be set to "v3po:tap".
+ The new TAP parameters overwrite the current configuration. If a
+ parameter in new configuration is missing, it is removed from TAP
+ configuration.
+ If the dictionary kwargs is empty, TAP configuration is removed.
+
+ :param node: Honeycomb node.
+ :param interface: The name of interface.
+ :param kwargs: Parameters and their values. The accepted parameters are
+ defined in InterfaceKeywords.TAP_PARAMS.
+ :type node: dict
+ :type interface: str
+ :type kwargs: dict
+ :return: Content of response.
+ :rtype: bytearray
+ :raises HoneycombError: If the parameter is not valid.
+ """
+
+ tap_structure = dict()
+ for param, value in kwargs.items():
+ if param not in InterfaceKeywords.TAP_PARAMS:
+ raise HoneycombError("The parameter {0} is invalid.".
+ format(param))
+ tap_structure[param] = value
+
+ path = ("interfaces", ("interface", "name", interface), "v3po:tap")
+ return InterfaceKeywords._set_interface_properties(
+ node, interface, path, tap_structure)
+
+ @staticmethod
+ def configure_interface_vhost_user(node, interface, **kwargs):
+ """Configure vhost-user on the interface.
+
+ The keyword configures vhost-user parameters on the given interface.
+ The type of interface must be set to "v3po:vhost-user".
+ The new vhost-user parameters overwrite the current configuration. If a
+ parameter in new configuration is missing, it is removed from vhost-user
+ configuration.
+ If the dictionary kwargs is empty, vhost-user configuration is removed.
+
+ :param node: Honeycomb node.
+ :param interface: The name of interface.
+ :param kwargs: Parameters and their values. The accepted parameters are
+ defined in InterfaceKeywords.VHOST_USER_PARAMS.
+ :type node: dict
+ :type interface: str
+ :type kwargs: dict
+ :return: Content of response.
+ :rtype: bytearray
+ :raises HoneycombError: If the parameter is not valid.
+ """
+
+ vhost_structure = dict()
+ for param, value in kwargs.items():
+ if param not in InterfaceKeywords.VHOST_USER_PARAMS:
+ raise HoneycombError("The parameter {0} is invalid.".
+ format(param))
+ vhost_structure[param] = value
+
+ path = ("interfaces", ("interface", "name", interface),
+ "v3po:vhost-user")
+ return InterfaceKeywords._set_interface_properties(
+ node, interface, path, vhost_structure)
+
+ @staticmethod
+ def create_vhost_user_interface(node, interface, **kwargs):
+ """Create a new vhost-user interface.
+
+ :param node: Honeycomb node.
+ :param interface: The name of interface.
+ :param kwargs: Parameters and their values. The accepted parameters are
+ defined in InterfaceKeywords.VHOST_USER_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_vhost = {
+ "name": interface,
+ "type": "v3po:vhost-user",
+ "v3po:vhost-user": {}
+ }
+ for param, value in kwargs.items():
+ if param not in InterfaceKeywords.VHOST_USER_PARAMS:
+ raise HoneycombError("The parameter {0} is invalid.".
+ format(param))
+ new_vhost["v3po:vhost-user"][param] = value
+
+ path = ("interfaces", "interface")
+ new_vhost_structure = [new_vhost, ]
+ return InterfaceKeywords._set_interface_properties(
+ node, interface, path, new_vhost_structure)
+
+ @staticmethod
+ def create_sub_interface(node, super_interface, match, tags=None, **kwargs):
+ """Create a new sub-interface.
+
+ :param node: Honeycomb node.
+ :param super_interface: Super interface.
+ :param match: Match type. The valid values are defined in
+ InterfaceKeywords.SUB_IF_MATCH.
+ :param tags: List of tags.
+ :param kwargs: Parameters and their values. The accepted parameters are
+ defined in InterfaceKeywords.SUB_IF_PARAMS.
+ :type node: dict
+ :type super_interface: str
+ :type match: str
+ :type tags: list
+ :type kwargs: dict
+ :return: Content of response.
+ :rtype: bytearray
+ :raises HoneycombError: If the parameter is not valid.
+ :raises KeyError: If the parameter 'match' is invalid.
+ """
+
+ match_type = {
+ "default":
+ {"default": {}},
+ "untagged":
+ {"untagged": {}},
+ "vlan-tagged":
+ {"vlan-tagged": {"match-exact-tags": "false"}},
+ "vlan-tagged-exact-match":
+ {"vlan-tagged": {"match-exact-tags": "true"}}
+ }
+
+ new_sub_interface = {
+ "tags": {
+ "tag": []
+ },
+ }
+
+ for param, value in kwargs.items():
+ if param in InterfaceKeywords.SUB_IF_PARAMS:
+ new_sub_interface[param] = value
+ else:
+ raise HoneycombError("The parameter {0} is invalid.".
+ format(param))
+ try:
+ new_sub_interface["match"] = match_type[match]
+ except KeyError:
+ raise HoneycombError("The value '{0}' of parameter 'match' is "
+ "invalid.".format(match))
+
+ if tags:
+ new_sub_interface["tags"]["tag"].extend(tags)
+
+ path = ("interfaces",
+ ("interface", "name", super_interface),
+ "vpp-vlan:sub-interfaces",
+ "sub-interface")
+ new_sub_interface_structure = [new_sub_interface, ]
+ return InterfaceKeywords._set_interface_properties(
+ node, super_interface, path, new_sub_interface_structure)
+
+ @staticmethod
+ def get_sub_interface_oper_data(node, super_interface, identifier):
+ """Retrieves sub-interface operational data using Honeycomb API.
+
+ :param node: Honeycomb node.
+ :param super_interface: Super interface.
+ :param identifier: The ID of sub-interface.
+ :type node: dict
+ :type super_interface: str
+ :type identifier: int
+ :return: Sub-interface operational data.
+ :rtype: dict
+ :raises HoneycombError: If there is no sub-interface with the given ID.
+ """
+
+ if_data = InterfaceKeywords.get_interface_oper_data(node,
+ super_interface)
+ for sub_if in if_data["vpp-vlan:sub-interfaces"]["sub-interface"]:
+ if str(sub_if["identifier"]) == str(identifier):
+ return sub_if
+
+ raise HoneycombError("The interface {0} does not have sub-interface "
+ "with ID {1}".format(super_interface, identifier))
+
+ @staticmethod
+ def remove_all_sub_interfaces(node, super_interface):
+ """Remove all sub-interfaces from the given interface.
+
+ :param node: Honeycomb node.
+ :param super_interface: Super interface.
+ :type node: dict
+ :type super_interface: str
+ :return: Content of response.
+ :rtype: bytearray
+ """
+
+ path = ("interfaces",
+ ("interface", "name", super_interface),
+ "vpp-vlan:sub-interfaces")
+
+ return InterfaceKeywords._set_interface_properties(
+ node, super_interface, path, {})
+
+ @staticmethod
+ def set_sub_interface_state(node, super_interface, identifier, state):
+ """Set the administrative state of sub-interface.
+
+ :param node: Honeycomb node.
+ :param super_interface: Super interface.
+ :param identifier: The ID of sub-interface.
+ :param state: Required sub-interface state - up or down.
+ :type node: dict
+ :type super_interface: str
+ :type identifier: int
+ :type state: str
+ :return: Content of response.
+ :rtype: bytearray
+ """
+
+ intf_state = {"up": "true",
+ "down": "false"}
+
+ path = ("interfaces",
+ ("interface", "name", super_interface),
+ "vpp-vlan:sub-interfaces",
+ ("sub-interface", "identifier", identifier),
+ "enabled")
+
+ return InterfaceKeywords._set_interface_properties(
+ node, super_interface, path, intf_state[state])
+
+ @staticmethod
+ def add_bridge_domain_to_sub_interface(node, super_interface, identifier,
+ config):
+ """Add a sub-interface to a bridge domain and set its parameters.
+
+ :param node: Honeycomb node.
+ :param super_interface: Super interface.
+ :param identifier: The ID of sub-interface.
+ :param config: Bridge domain configuration.
+ :type node: dict
+ :type super_interface: str
+ :type identifier: int
+ :type config: dict
+ :return: Content of response.
+ :rtype: bytearray
+ """
+
+ path = ("interfaces",
+ ("interface", "name", super_interface),
+ "vpp-vlan:sub-interfaces",
+ ("sub-interface", "identifier", int(identifier)),
+ "l2")
+
+ return InterfaceKeywords._set_interface_properties(
+ node, super_interface, path, config)
+
+ @staticmethod
+ def get_bd_data_from_sub_interface(node, super_interface, identifier):
+ """Get the operational data about the bridge domain from sub-interface.
+
+ :param node: Honeycomb node.
+ :param super_interface: Super interface.
+ :param identifier: The ID of sub-interface.
+ :type node: dict
+ :type super_interface: str
+ :type identifier: int
+ :return: Operational data about the bridge domain.
+ :rtype: dict
+ :raises HoneycombError: If there is no sub-interface with the given ID.
+ """
+
+ try:
+ bd_data = InterfaceKeywords.get_sub_interface_oper_data(
+ node, super_interface, identifier)["l2"]
+ return bd_data
+ except KeyError:
+ raise HoneycombError("The operational data does not contain "
+ "information about a bridge domain.")
+
+ @staticmethod
+ def configure_tag_rewrite(node, super_interface, identifier, config):
+ """Add / change / disable vlan tag rewrite on a sub-interface.
+
+ :param node: Honeycomb node.
+ :param super_interface: Super interface.
+ :param identifier: The ID of sub-interface.
+ :param config: Rewrite tag configuration.
+ :type node: dict
+ :type super_interface: str
+ :type identifier: int
+ :type config: dict
+ :return: Content of response.
+ :rtype: bytearray
+ """
+
+ path = ("interfaces",
+ ("interface", "name", super_interface),
+ "vpp-vlan:sub-interfaces",
+ ("sub-interface", "identifier", int(identifier)),
+ "l2",
+ "rewrite")
+
+ return InterfaceKeywords._set_interface_properties(
+ node, super_interface, path, config)
+
+ @staticmethod
+ def get_tag_rewrite_oper_data(node, super_interface, identifier):
+ """Get the operational data about tag rewrite.
+
+ :param node: Honeycomb node.
+ :param super_interface: Super interface.
+ :param identifier: The ID of sub-interface.
+ :type node: dict
+ :type super_interface: str
+ :type identifier: int
+ :return: Operational data about tag rewrite.
+ :rtype: dict
+ :raises HoneycombError: If there is no sub-interface with the given ID.
+ """
+
+ try:
+ tag_rewrite = InterfaceKeywords.get_sub_interface_oper_data(
+ node, super_interface, identifier)["l2"]["rewrite"]
+ return tag_rewrite
+ except KeyError:
+ raise HoneycombError("The operational data does not contain "
+ "information about the tag-rewrite.")
+
+ @staticmethod
+ def add_ipv4_address_to_sub_interface(node, super_interface, identifier,
+ ip_addr, network):
+ """Add an ipv4 address to the specified sub-interface, with the provided
+ netmask or network prefix length. Any existing ipv4 addresses on the
+ sub-interface will be replaced.
+
+ :param node: Honeycomb node.
+ :param super_interface: Super interface.
+ :param identifier: The ID of sub-interface.
+ :param ip_addr: IPv4 address to be set.
+ :param network: Network mask or network prefix length.
+ :type node: dict
+ :type super_interface: str
+ :type identifier: int
+ :type ip_addr: str
+ :type network: str or int
+ :return: Content of response.
+ :rtype: bytearray
+ :raises HoneycombError: If the provided netmask or prefix is not valid.
+ """
+
+ path = ("interfaces",
+ ("interface", "name", super_interface),
+ "vpp-vlan:sub-interfaces",
+ ("sub-interface", "identifier", int(identifier)),
+ "ipv4")
+
+ if isinstance(network, basestring):
+ address = {"address": [{"ip": ip_addr, "netmask": network}, ]}
+
+ elif isinstance(network, int) and 0 < network < 33:
+ address = {"address": [{"ip": ip_addr, "prefix-length": network}, ]}
+
+ else:
+ raise HoneycombError("{0} is not a valid netmask or prefix length."
+ .format(network))
+
+ return InterfaceKeywords._set_interface_properties(
+ node, super_interface, path, address)
+
+ @staticmethod
+ def remove_all_ipv4_addresses_from_sub_interface(node, super_interface, # pylint: disable=invalid-name
+ identifier):
+ """Remove all ipv4 addresses from the specified sub-interface.
+
+ :param node: Honeycomb node.
+ :param super_interface: Super interface.
+ :param identifier: The ID of sub-interface.
+ :type node: dict
+ :type super_interface: str
+ :type identifier: int
+ :return: Content of response.
+ :rtype: bytearray
+ """
+
+ path = ("interfaces",
+ ("interface", "name", super_interface),
+ "vpp-vlan:sub-interfaces",
+ ("sub-interface", "identifier", int(identifier)),
+ "ipv4", "address")
+
+ return InterfaceKeywords._set_interface_properties(
+ node, super_interface, path, None)
+
+ @staticmethod
+ def compare_data_structures(data, ref):
+ """Checks if data obtained from UUT is as expected.
+
+ :param data: Data to be checked.
+ :param ref: Referential data used for comparison.
+ :type data: dict
+ :type ref: dict
+ :raises HoneycombError: If a parameter from referential data is not
+ present in operational data or if it has different value.
+ """
+
+ for key, item in ref.items():
+ try:
+ if data[key] != item:
+ raise HoneycombError("The value of parameter '{0}' is "
+ "incorrect. It should be "
+ "'{1}' but it is '{2}'".
+ format(key, item, data[key]))
+ except KeyError:
+ raise HoneycombError("The parameter '{0}' is not present in "
+ "operational data".format(key))
+
+ @staticmethod
+ def compare_interface_lists(list1, list2):
+ """Compare provided lists of interfaces by name.
+
+ :param list1: List of interfaces.
+ :param list2: List of interfaces.
+ :type list1: list
+ :type list2: list
+ :raises HoneycombError: If an interface exists in only one of the lists.
+ """
+
+ ignore = ["vx_tunnel0", "vxlan_gpe_tunnel0"]
+ # these have no equivalent in config data and no effect on VPP
+
+ names1 = [x['name'] for x in list1]
+ names2 = [x['name'] for x in list2]
+
+ for name in names1:
+ if name not in names2 and name not in ignore:
+ raise HoneycombError("Interface {0} not present in list {1}"
+ .format(name, list2))
+ for name in names2:
+ if name not in names1 and name not in ignore:
+ raise HoneycombError("Interface {0} not present in list {1}"
+ .format(name, list1))
+
+ @staticmethod
+ def create_vxlan_gpe_interface(node, interface, **kwargs):
+ """Create a new VxLAN GPE interface.
+
+ :param node: Honeycomb node.
+ :param interface: The name of interface to be created.
+ :param kwargs: Parameters and their values. The accepted parameters are
+ defined in InterfaceKeywords.VXLAN_GPE_PARAMS.
+ :type node: dict
+ :type interface: str
+ :type kwargs: dict
+ :return: Content of response.
+ :rtype: bytearray
+ :raises HoneycombError: If a parameter in kwargs is not valid.
+ """
+
+ new_vxlan_gpe = {
+ "name": interface,
+ "type": "v3po:vxlan-gpe-tunnel",
+ "v3po:vxlan-gpe": {}
+ }
+ for param, value in kwargs.items():
+ if param in InterfaceKeywords.INTF_PARAMS:
+ new_vxlan_gpe[param] = value
+ elif param in InterfaceKeywords.VXLAN_GPE_PARAMS:
+ new_vxlan_gpe["v3po:vxlan-gpe"][param] = value
+ else:
+ raise HoneycombError("The parameter {0} is invalid.".
+ format(param))
+ path = ("interfaces", "interface")
+ vxlan_gpe_structure = [new_vxlan_gpe, ]
+ return InterfaceKeywords._set_interface_properties(
+ node, interface, path, vxlan_gpe_structure)
+
+ @staticmethod
+ def enable_acl_on_interface(node, interface, table_name):
+ """Enable ACL on the given interface.
+
+ :param node: Honeycomb node.
+ :param interface: The interface where the ACL will be enabled.
+ :param table_name: Name of the classify table.
+ :type node: dict
+ :type interface: str
+ :type table_name: str
+ :return: Content of response.
+ :rtype: bytearray
+ :raises HoneycombError: If the configuration of interface is not
+ successful.
+ """
+
+ interface = interface.replace("/", "%2F")
+
+ data = {
+ "v3po:acl": {
+ "l2-acl": {
+ "classify-table": table_name
+ },
+ "ip4-acl": {
+ "classify-table": table_name
+ }
+ }
+ }
+
+ path = "/interface/" + interface + "/v3po:acl"
+ status_code, resp = HcUtil.\
+ put_honeycomb_data(node, "config_vpp_interfaces", data, path,
+ data_representation=DataRepresentation.JSON)
+ if status_code != HTTPCodes.OK:
+ raise HoneycombError(
+ "The configuration of interface '{0}' was not successful. "
+ "Status code: {1}.".format(interface, status_code))
+ return resp
+
+ @staticmethod
+ def disable_acl_on_interface(node, interface):
+ """Disable ACL on the given interface.
+
+ :param node: Honeycomb node.
+ :param interface: The interface where the ACL will be disabled.
+ :type node: dict
+ :type interface: str
+ :return: Content of response.
+ :rtype: bytearray
+ :raises HoneycombError: If the configuration of interface is not
+ successful.
+ """
+
+ interface = interface.replace("/", "%2F")
+
+ path = "/interface/" + interface + "/v3po:acl"
+
+ status_code, resp = HcUtil.\
+ delete_honeycomb_data(node, "config_vpp_interfaces", path)
+
+ if status_code != HTTPCodes.OK:
+ raise HoneycombError(
+ "The configuration of interface '{0}' was not successful. "
+ "Status code: {1}.".format(interface, status_code))
+ return resp