The keywords make possible to put and get configuration data and to get
operational data.
"""
+from robot.api import logger
+from resources.libraries.python.topology import Topology
from resources.libraries.python.HTTPRequest import HTTPCodes
from resources.libraries.python.honeycomb.HoneycombSetup import HoneycombError
from resources.libraries.python.honeycomb.HoneycombUtil \
status_code, resp = HcUtil.\
put_honeycomb_data(node, "config_vpp_interfaces", data,
data_representation=data_representation)
- if status_code != HTTPCodes.OK:
+ if status_code not in (HTTPCodes.OK, HTTPCodes.ACCEPTED):
raise HoneycombError(
"The configuration of interface '{0}' was not successful. "
"Status code: {1}.".format(interface, status_code))
except (KeyError, TypeError):
return []
+ @staticmethod
+ def get_disabled_interfaces_oper_data(node):
+ """Get operational data about all disabled interfaces from Honeycomb.
+
+ :param node: Honeycomb node.
+ :type node: dict
+ :return: Operational data about disabled interfaces.
+ :rtype: list
+ :raises HoneycombError: If it is not possible to get operational data.
+ """
+
+ status_code, resp = HcUtil. \
+ get_honeycomb_data(node, "oper_disabled_interfaces")
+ if status_code == HTTPCodes.NOT_FOUND:
+ raise HoneycombError(
+ "No disabled interfaces present on node."
+ )
+ if status_code != HTTPCodes.OK:
+ raise HoneycombError(
+ "Not possible to get operational information about the "
+ "interfaces. Status code: {0}.".format(status_code))
+ try:
+ return resp["disabled-interfaces"]["disabled-interface-index"]
+
+ except (KeyError, TypeError):
+ return []
+
@staticmethod
def get_interface_oper_data(node, interface):
"""Get operational data about the given interface from Honeycomb.
depending on the parameter "state".
:param node: Honeycomb node.
- :param interface: The name of interface.
+ :param interface: Interface name, key, link name or sw_if_index.
:param state: The requested state, only "up" and "down" are valid
values.
:type node: dict
intf_state = {"up": "true",
"down": "false"}
+ interface = Topology.convert_interface_reference(
+ node, interface, "name")
+
intf = interface.replace("/", "%2F")
path = "/interface/{0}".format(intf)
status_code, resp = HcUtil. \
put_honeycomb_data(node, "config_vpp_interfaces", resp, path,
data_representation=DataRepresentation.JSON)
- if status_code != HTTPCodes.OK:
+ if status_code not in (HTTPCodes.OK, HTTPCodes.ACCEPTED):
raise HoneycombError(
"The configuration of interface '{0}' was not successful. "
"Status code: {1}.".format(interface, status_code))
"""Add a new bridge domain to an interface and set its parameters.
:param node: Honeycomb node.
- :param interface: The name of interface.
+ :param interface: Interface name, key, link name or sw_if_index.
:param bd_name: Bridge domain name.
:param split_horizon_group: Split-horizon group name.
:param bvi: The bridged virtual interface.
:raises HoneycombError: If the interface is not present on the node.
"""
+ interface = Topology.convert_interface_reference(
+ node, interface, "name")
+
v3po_l2 = {"bridge-domain": str(bd_name)}
if split_horizon_group:
v3po_l2["split-horizon-group"] = str(split_horizon_group)
return InterfaceKeywords._set_interface_properties(
node, interface, path, v3po_l2)
+ @staticmethod
+ def remove_bridge_domain_from_interface(node, interface):
+ """Remove bridge domain assignment from interface.
+
+ :param node: Honeycomb node.
+ :param interface: Interface name, key, link name or sw_if_index.
+ :type node: dict
+ :type interface: str or int
+
+ :raises HoneycombError: If the operation fails.
+ """
+
+ interface = Topology.convert_interface_reference(
+ node, interface, "name")
+
+ intf = interface.replace("/", "%2F")
+
+ path = "/interface/{0}/v3po:l2".format(intf)
+
+ status_code, response = HcUtil.delete_honeycomb_data(
+ node, "config_vpp_interfaces", path)
+
+ if status_code != HTTPCodes.OK:
+ if '"error-tag":"data-missing"' in response:
+ logger.debug("Data does not exist in path.")
+ else:
+ raise HoneycombError(
+ "Could not remove bridge domain assignment from interface "
+ "'{0}'. Status code: {1}.".format(interface, status_code))
+
@staticmethod
def get_bd_oper_data_from_interface(node, interface):
"""Returns operational data about bridge domain settings in the
@staticmethod
def configure_interface_ipv4(node, interface, param, value):
- """Configure IPv4 parameters of interface
+ """Configure IPv4 parameters of interface.
:param node: Honeycomb node.
:param interface: The name of interface.
:raises HoneycombError: If the parameter is not valid.
"""
+ interface = Topology.convert_interface_reference(
+ node, interface, "name")
+
if param not in InterfaceKeywords.IPV4_PARAMS:
raise HoneycombError("The parameter {0} is invalid.".format(param))
:raises HoneycombError: If the provided netmask or prefix is not valid.
"""
+ interface = Topology.convert_interface_reference(
+ node, interface, "name")
+
path = ("interfaces", ("interface", "name", interface), "ietf-ip:ipv4")
if isinstance(network, basestring):
address = {"address": [{"ip": ip_addr, "netmask": network}, ]}
:raises HoneycombError: If the provided netmask or prefix is not valid.
"""
+ interface = Topology.convert_interface_reference(
+ node, interface, "name")
+
path = ("interfaces", ("interface", "name", interface), "ietf-ip:ipv4",
"address")
if isinstance(network, basestring):
node, super_interface, path, None)
@staticmethod
- def compare_data_structures(data, ref, ignore=()):
+ def compare_data_structures(data, ref, ignore=(), list_order=True):
"""Checks if data obtained from UUT is as expected.
:param data: Data to be checked.
:param ref: Referential data used for comparison.
:param ignore: Dictionary keys to be ignored.
+ :param list_order: Whether to consider the order of list items\
+ in comparison.
:type data: dict
:type ref: dict
:type ignore: iterable
+ :type list_order: bool
+
:raises HoneycombError: If a parameter from referential data is not
present in operational data or if it has different value.
"""
continue
try:
if data[key] != item:
- errors += ("\nThe value of parameter '{0}' is "
- "incorrect. It should be "
- "'{1}' but it is '{2}'".
- format(key, item, data[key]))
+ if not list_order and sorted(data[key]) == sorted(item):
+ pass
+ else:
+ errors += ("\nThe value of parameter '{0}' is "
+ "incorrect. It should be "
+ "'{1}' but it is '{2}'".
+ format(key, item, data[key]))
except KeyError:
errors += ("\nThe parameter '{0}' is not present in "
"operational data".format(key))
data = {
"v3po:acl": {
- "l2-acl": {
- "classify-table": table_name
- },
- "ip4-acl": {
- "classify-table": table_name
+ "ingress": {
+ "ip4-acl": {
+ "classify-table": table_name
+ },
+ "l2-acl": {
+ "classify-table": table_name
+ }
}
}
}
status_code, resp = HcUtil.\
put_honeycomb_data(node, "config_vpp_interfaces", data, path,
data_representation=DataRepresentation.JSON)
- if status_code != HTTPCodes.OK:
+ if status_code not in (HTTPCodes.OK, HTTPCodes.ACCEPTED):
raise HoneycombError(
"The configuration of interface '{0}' was not successful. "
"Status code: {1}.".format(interface, status_code))
status_code, resp = HcUtil. \
put_honeycomb_data(node, "config_vpp_interfaces", params, path,
data_representation=DataRepresentation.JSON)
- if status_code != HTTPCodes.OK:
+ if status_code not in (HTTPCodes.OK, HTTPCodes.ACCEPTED):
raise HoneycombError(
"The configuration of PBB sub-interface '{0}' was not "
"successful. Status code: {1}.".format(intf, status_code))
interface = "{0}.{1}".format(intf, sub_if_id)
return InterfaceKeywords.get_interface_oper_data(node, interface)
+
+ @staticmethod
+ def check_disabled_interface(node, interface):
+ """Retrieves list of disabled interface indices from Honeycomb,
+ and matches with the provided interface by index.
+
+ :param node: Honeycomb node.
+ :param interface: Index number of an interface on the node.
+ :type node: dict
+ :type interface: int
+ :return: True if the interface exists in disabled interfaces.
+ :rtype: bool
+ :raises HoneycombError: If the interface is not present
+ in retrieved list of disabled interfaces.
+ """
+ data = InterfaceKeywords.get_disabled_interfaces_oper_data(node)
+ # decrement by one = conversion from HC if-index to VPP sw_if_index
+ interface -= 1
+
+ for item in data:
+ if item["index"] == interface:
+ return True
+ raise HoneycombError("Interface index {0} not present in list"
+ " of disabled interfaces.".format(interface))