+
+ @staticmethod
+ def get_bgp_local_rib(node):
+ """Get local RIB table from the Honeycomb node.
+
+ :param node: Honeycomb node.
+ :type node: dict
+ :returns: RIB operational data.
+ :rtype: dict
+ :raises HoneycombError: If the status code in response is not 200 = OK.
+ """
+
+ path = "loc-rib"
+
+ status_code, resp = HcUtil. \
+ get_honeycomb_data(node, "oper_bgp", path)
+
+ if status_code != HTTPCodes.OK:
+ raise HoneycombError(
+ "Not possible to get operational data from BGP local RIB."
+ " Status code: {0}.".format(status_code))
+
+ return resp
+
+ @staticmethod
+ def configure_bgp_base(node, ip_address, port, as_number):
+ """Modify BGP config file. Requires a restart of Honeycomb to take
+ effect.
+
+ :param node: Honeycomb node.
+ :param ip_address: BGP peer identifier/binding address.
+ :param port: BGP binding port.
+ :param as_number: Autonomous System ID number.
+ :type node: dict
+ :type ip_address: str
+ :type port: int
+ :type as_number: int
+ :raises HoneycombError: If modifying the configuration fails.
+ """
+
+ from resources.libraries.python.ssh import SSH
+
+ config = {
+ '\\"bgp-binding-address\\"': '\\"{0}\\"'.format(ip_address),
+ '\\"bgp-port\\"': port,
+ '\\"bgp-as-number\\"': as_number}
+
+ path = "{0}/config/bgp.json".format(Const.REMOTE_HC_DIR)
+
+ for key, value in config.items():
+ find = key
+ replace = '"{0}": "{1}",'.format(key, value)
+
+ argument = '"/{0}/c\\ {1}"'.format(find, replace)
+ command = "sed -i {0} {1}".format(argument, path)
+
+ ssh = SSH()
+ ssh.connect(node)
+ (ret_code, _, stderr) = ssh.exec_command_sudo(command)
+ if ret_code != 0:
+ raise HoneycombError("Failed to modify configuration on "
+ "node {0}, {1}".format(node, stderr))
+
+ @staticmethod
+ def compare_rib_tables(data, ref):
+ """Compare provided RIB table with reference. All reference entries must
+ be present in data. Data entries not present in reference are ignored.
+
+ :param data: Data from Honeycomb node.
+ :param ref: Reference data to compare against.
+ :type data: dict
+ :type ref: dict
+ :raises HoneycombError: If the tables do not match.
+ """
+
+ # Remove runtime attributes from data
+ for item in data:
+ item.pop("attributes", "")
+
+ for item in ref:
+ if item not in data:
+ raise HoneycombError(
+ "RIB entry {0} not found in operational data {1}."
+ .format(item, data))