X-Git-Url: https://gerrit.fd.io/r/gitweb?p=csit.git;a=blobdiff_plain;f=resources%2Flibraries%2Fpython%2Fhoneycomb%2FRouting.py;h=4c6a3f205bc5e6689b467c451ed1efcf500a9ba2;hp=d0f23892af798b1384e0fcef354162f69f3306d3;hb=5a02dd13563a5c67e336f04eb526cbea206da29b;hpb=0b4ceb8d40f0b667eb6083298a4f133b8ae9adaa diff --git a/resources/libraries/python/honeycomb/Routing.py b/resources/libraries/python/honeycomb/Routing.py index d0f23892af..4c6a3f205b 100644 --- a/resources/libraries/python/honeycomb/Routing.py +++ b/resources/libraries/python/honeycomb/Routing.py @@ -16,6 +16,7 @@ Honeycomb REST API.""" 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 \ @@ -91,7 +92,7 @@ class RoutingKeywords(object): if special: ip_version = "hc2vpp-ietf-{0}-unicast-routing:{0}".format( ip_version) - protocol = "vpp-routing-ra:vpp-protocol-attributes" + protocol = "vpp-routing:vpp-protocol-attributes" else: ip_version = ip_version protocol = "vpp-protocol-attributes" @@ -156,7 +157,7 @@ class RoutingKeywords(object): if status_code != HTTPCodes.OK: raise HoneycombError( "Not possible to get operational information about the " - "classify tables. Status code: {0}.".format(status_code)) + "routing tables. Status code: {0}.".format(status_code)) data = RoutingKeywords.clean_routing_oper_data( resp['routing-protocol'][0]['static-routes'] @@ -199,3 +200,133 @@ class RoutingKeywords(object): with VatTerminal(node) as vat: vat.vat_terminal_exec_cmd("ip_fib_dump") + + @staticmethod + def configure_interface_slaac(node, interface, slaac_data=None): + """Configure SLAAC on the specified interfaces. + + :param node: Honeycomb node. + :param interface: Interface to configure SLAAC. + :param slaac_data: Dictionary of configurations to apply. \ + If it is None then the existing configuration is removed. + :type node: dict + :type interface: str + :type slaac_data: dict of dicts + :returns: Content of response. + :rtype: bytearray + :raises HoneycombError: If RA could not be configured. + """ + + interface = Topology.convert_interface_reference( + node, interface, 'name') + interface_orig = interface + interface = interface.replace('/', '%2F') + path = 'interface/' + interface + + if not slaac_data: + status_code, _ = HcUtil.delete_honeycomb_data( + node, 'config_slaac', path) + else: + data = { + 'interface': [ + { + 'name': interface_orig, + 'ipv6-router-advertisements': slaac_data + } + ] + } + + status_code, _ = HcUtil.put_honeycomb_data( + node, 'config_slaac', data, path) + + if status_code not in (HTTPCodes.OK, HTTPCodes.ACCEPTED): + raise HoneycombError( + 'Configuring SLAAC failed. Status code:{0}'.format(status_code)) + + @staticmethod + def get_interface_slaac_oper_data(node, interface): + """Get operational data about SLAAC table present on the node. + + :param node: Honeycomb node. + :param interface: Interface SLAAC data are retrieved from. + :type node: dict + :type interface: str + :returns: dict of SLAAC operational data. + :rtype: dict + :raises HoneycombError: If status code differs from successful. + """ + interface = Topology.convert_interface_reference( + node, interface, 'name') + interface = interface.replace('/', '%2F') + path = 'interface/' + interface + + status_code, resp = HcUtil.\ + get_honeycomb_data(node, "config_slaac", path) + + if status_code != HTTPCodes.OK: + raise HoneycombError( + "Not possible to get operational information about SLAAC. " + "Status code: {0}.".format(status_code)) + try: + dict_of_str = resp['interface'][0][ + 'hc2vpp-ietf-ipv6-unicast-routing:ipv6-router-advertisements'] + return {k: str(v) for k, v in dict_of_str.items()} + except (KeyError, TypeError): + return {} + + @staticmethod + def configure_policer(node, policy_name, policer_data=None): + """Configure Policer on the specified node. + + :param node: Honeycomb node. + :param policer_data: Dictionary of configurations to apply. \ + If it is None then the existing configuration is removed. + :type node: dict + :type policer_data: dict + :returns: Content of response. + :rtype: bytearray + :raises HoneycombError: If policer could not be configured. + """ + + path = '/' + policy_name + + if not policer_data: + status_code, _ = HcUtil.delete_honeycomb_data( + node, 'config_policer', path) + else: + data = { + 'policer': policer_data + } + + status_code, _ = HcUtil.put_honeycomb_data( + node, 'config_policer', data, path) + + if status_code not in (HTTPCodes.OK, HTTPCodes.ACCEPTED): + raise HoneycombError( + 'Configuring policer failed. Status code:{0}'\ + .format(status_code)) + + @staticmethod + def get_policer_oper_data(node, policy_name): + """Get operational data about Policer on the node. + + :param node: Honeycomb node. + :type node: dict + :returns: dict of Policer operational data. + :rtype: dict + :raises HoneycombError: If status code differs from successful. + """ + + path = '/' + policy_name + + status_code, resp = HcUtil.\ + get_honeycomb_data(node, "oper_policer", path) + + if status_code != HTTPCodes.OK: + raise HoneycombError( + "Not possible to get operational information about Policer. " + "Status code: {0}.".format(status_code)) + try: + return resp['policer'] + except (KeyError, TypeError): + return {}