Exemple #1
0
    def fetch(
        self,
        client: OpenrCtrl.Client,
        prefixes: List[str],
        node: Optional[str],
        area: Optional[str],
    ) -> List[ctrl_types.AdvertisedRouteDetail]:
        """
        Fetch the requested data
        """

        # Create filter
        route_filter = ctrl_types.ReceivedRouteFilter()
        if prefixes:
            route_filter.prefixes = [
                ipnetwork.ip_str_to_prefix(p) for p in prefixes
            ]
        if node:
            route_filter.nodeName = node
        if area:
            route_filter.areaName = area

        # Get routes
        # pyre-fixme[7]: Expected `List[ctrl_types.AdvertisedRouteDetail]` but got
        #  `List[ctrl_types.ReceivedRouteDetail]`.
        return client.getReceivedRoutesFiltered(route_filter)
Exemple #2
0
def build_routes(prefixes, nexthops):
    """
    :param prefixes: List of prefixes in string representation
    :param nexthops: List of nexthops ip addresses in string presentation

    :returns: list network_types.UnicastRoute (structured routes)
    :rtype: list
    """

    prefixes = [ipnetwork.ip_str_to_prefix(p) for p in prefixes]
    nhs = []
    for nh_iface in nexthops:
        iface, addr = None, None
        # Nexthop may or may not be link-local. Handle it here well
        if "@" in nh_iface:
            addr, iface = nh_iface.split("@")
        elif "%" in nh_iface:
            addr, iface = nh_iface.split("%")
        else:
            addr = nh_iface
        nexthop = ipnetwork.ip_str_to_addr(addr)
        nexthop.ifName = iface
        nhs.append(nexthop)
    return [
        network_types.UnicastRoute(
            dest=p,
            deprecatedNexthops=nhs,
            nextHops=[network_types.NextHopThrift(address=nh) for nh in nhs],
        ) for p in prefixes
    ]
Exemple #3
0
        def _prefix_mgr_client():
            prefix_mgr_client_inst = prefix_mgr_client.PrefixMgrClient(
                zmq.Context(), socket_url)

            resp = prefix_mgr_client_inst.add_prefix(
                ['2620:0:1cff:dead:bef1:ffff:ffff:4/128'], 'LOOPBACK')
            self.assertTrue(resp.success)

            resp = prefix_mgr_client_inst.view_prefix()
            prefix_entry4 = lsdb_types.PrefixEntry(
                prefix=ip_str_to_prefix(
                    '2620:0:1cff:dead:bef1:ffff:ffff:4/128'),
                type=lsdb_types.PrefixType.LOOPBACK)
            self.assertTrue(resp.success)
            self.assertTrue(prefix_entry4 in resp.prefixes)

            resp = prefix_mgr_client_inst.withdraw_prefix(
                ['2620:0:1cff:dead:bef1:ffff:ffff:4/128'])
            self.assertTrue(resp.success)

            resp = prefix_mgr_client_inst.view_prefix()
            self.assertTrue(resp.success)
            self.assertFalse(prefix_entry4 in resp.prefixes)

            resp = prefix_mgr_client_inst.withdraw_prefix(
                ['2620:0:1cff:dead:bef1:ffff:ffff:5/128'])
            self.assertFalse(resp.success)
Exemple #4
0
    def _run(self, client: OpenrCtrl.Client, node_name: str,
             prefix_str: str) -> None:
        key = Consts.STATIC_PREFIX_ALLOC_PARAM_KEY

        # Retrieve previous allocation
        resp = client.getKvStoreKeyVals([key])
        allocs = None
        if key in resp.keyVals:
            allocs = serializer.deserialize_thrift_object(
                resp.keyVals.get(key).value, alloc_types.StaticAllocation)
        else:
            allocs = alloc_types.StaticAllocation(nodePrefixes={})

        # Return if there is no change
        prefix = ipnetwork.ip_str_to_prefix(prefix_str)
        if allocs.nodePrefixes.get(node_name) == prefix:
            print("No changes needed. {}'s prefix is already set to {}".format(
                node_name, prefix_str))
            return

        # Update value in KvStore
        allocs.nodePrefixes[node_name] = prefix
        value = serializer.serialize_thrift_object(allocs)

        super(AllocationsSetCmd, self)._run(client, key, value, "breeze", None,
                                            Consts.CONST_TTL_INF)
Exemple #5
0
    def run_set(self, node_name, prefix_str):
        key = Consts.STATIC_PREFIX_ALLOC_PARAM_KEY
        prefix = ipnetwork.ip_str_to_prefix(prefix_str)

        # Retrieve previous allocation
        resp = self.client.get_keys([key])
        allocs = None
        if key in resp.keyVals:
            allocs = serializer.deserialize_thrift_object(
                resp.keyVals.get(key).value, alloc_types.StaticAllocation
            )
        else:
            allocs = alloc_types.StaticAllocation(nodePrefixes={})

        # Return if there is no change
        if allocs.nodePrefixes.get(node_name) == prefix:
            print(
                "No changes needed. {}'s prefix is already set to {}".format(
                    node_name, prefix_str
                )
            )
            return

        # Update value in KvStore
        allocs.nodePrefixes[node_name] = prefix
        value = serializer.serialize_thrift_object(allocs)
        self.run(key, value, "breeze", None, Consts.CONST_TTL_INF)
Exemple #6
0
        def _prefix_mgr_client():
            prefix_mgr_client_inst = prefix_mgr_client.PrefixMgrClient(
                bunch.Bunch({
                    "ctx": zmq.Context(),
                    "host": "localhost",
                    "prefix_mgr_cmd_port": 5000,
                }))

            resp = prefix_mgr_client_inst.add_prefix(
                ["2620:0:1cff:dead:bef1:ffff:ffff:4/128"], "LOOPBACK")
            self.assertTrue(resp.success)

            resp = prefix_mgr_client_inst.view_prefix()
            prefix_entry4 = lsdb_types.PrefixEntry(
                prefix=ip_str_to_prefix(
                    "2620:0:1cff:dead:bef1:ffff:ffff:4/128"),
                type=network_types.PrefixType.LOOPBACK,
            )
            self.assertTrue(resp.success)
            self.assertTrue(prefix_entry4 in resp.prefixes)

            resp = prefix_mgr_client_inst.withdraw_prefix(
                ["2620:0:1cff:dead:bef1:ffff:ffff:4/128"])
            self.assertTrue(resp.success)

            resp = prefix_mgr_client_inst.view_prefix()
            self.assertTrue(resp.success)
            self.assertFalse(prefix_entry4 in resp.prefixes)

            resp = prefix_mgr_client_inst.withdraw_prefix(
                ["2620:0:1cff:dead:bef1:ffff:ffff:5/128"])
            self.assertFalse(resp.success)
Exemple #7
0
    def send_cmd_to_prefix_mgr(self,
                               cmd,
                               prefixes=None,
                               prefix_type="BREEZE",
                               forwarding_type="IP"):
        """ Send the given cmd to prefix manager and return resp """

        PREFIX_TYPE_TO_VALUES = network_types.PrefixType._NAMES_TO_VALUES
        if prefix_type not in PREFIX_TYPE_TO_VALUES:
            raise Exception("Unknown type {}. Use any of {}".format(
                prefix_type, ", ".join(PREFIX_TYPE_TO_VALUES.keys())))

        FORWARDING_TYPE_TO_VALUES = lsdb_types.PrefixForwardingType._NAMES_TO_VALUES
        if forwarding_type not in FORWARDING_TYPE_TO_VALUES:
            raise Exception("Unknown forwarding type {}. Use any of {}".format(
                forwarding_type, ", ".join(FORWARDING_TYPE_TO_VALUES.keys())))

        req_msg = prefix_mgr_types.PrefixManagerRequest()
        req_msg.cmd = cmd
        req_msg.type = PREFIX_TYPE_TO_VALUES[prefix_type]
        req_msg.prefixes = []
        if prefixes is not None:
            for prefix in prefixes:
                req_msg.prefixes.append(
                    lsdb_types.PrefixEntry(
                        prefix=ipnetwork.ip_str_to_prefix(prefix),
                        type=PREFIX_TYPE_TO_VALUES[prefix_type],
                        forwardingType=FORWARDING_TYPE_TO_VALUES[
                            forwarding_type],
                    ))

        return self.send_and_recv_thrift_obj(
            req_msg, prefix_mgr_types.PrefixManagerResponse)
Exemple #8
0
    def run(self, prefixes):
        prefixes = [ipnetwork.ip_str_to_prefix(p) for p in prefixes.split(',')]
        try:
            self.client.deleteUnicastRoutes(self.client.client_id, prefixes)
        except Exception as e:
            print('Failed to delete routes.')
            print('Exception: {}'.format(e))
            sys.exit(1)

        print('Deleted {} routes.'.format(len(prefixes)))
Exemple #9
0
    def run(self, prefixes):
        prefixes = [ipnetwork.ip_str_to_prefix(p) for p in prefixes.split(",")]
        try:
            self.client.deleteUnicastRoutes(self.client.client_id, prefixes)
        except Exception as e:
            print("Failed to delete routes.")
            print("Exception: {}".format(e))
            return 1

        print("Deleted {} routes.".format(len(prefixes)))
        return 0
Exemple #10
0
 def to_thrift_prefixes(
     self,
     prefixes: List[str],
     prefix_type: network_types.PrefixType,
     forwarding_type: PrefixForwardingType = PrefixForwardingType.IP,
 ) -> List[openr_types.PrefixEntry]:
     return [
         openr_types.PrefixEntry(
             prefix=ipnetwork.ip_str_to_prefix(prefix),
             type=prefix_type,
             forwardingType=forwarding_type,
         ) for prefix in prefixes
     ]
Exemple #11
0
    def test_parse_prefix_database(self):
        bgp1 = openr_types.PrefixEntry(
            prefix=ipnetwork.ip_str_to_prefix("1.0.0.0/8"),
            type=network_types.PrefixType.BGP,
        )
        bgp2 = openr_types.PrefixEntry(
            prefix=ipnetwork.ip_str_to_prefix("2.0.0.0/8"),
            type=network_types.PrefixType.BGP,
        )
        loop1 = openr_types.PrefixEntry(
            prefix=ipnetwork.ip_str_to_prefix("10.0.0.1/32"),
            type=network_types.PrefixType.LOOPBACK,
        )
        prefix_db = openr_types.PrefixDatabase(
            thisNodeName="node1",
            prefixEntries=[bgp1, bgp2, loop1],
            deletePrefix=False,
            perfEvents=None,
        )

        # No filter and ensure we receive everything back
        data = {}
        parse_prefix_database("", "", data, prefix_db)
        self.assertEqual(data["node1"].prefixEntries, [bgp1, bgp2, loop1])

        # Filter on prefix
        data = {}
        parse_prefix_database("10.0.0.1/32", "", data, prefix_db)
        self.assertEqual(data["node1"].prefixEntries, [loop1])

        # Filter on type
        data = {}
        parse_prefix_database("", "bgp", data, prefix_db)
        self.assertEqual(data["node1"].prefixEntries, [bgp1, bgp2])

        # Filter on prefix and type both
        data = {}
        parse_prefix_database("2.0.0.0/8", "bgp", data, prefix_db)
        self.assertEqual(data["node1"].prefixEntries, [bgp2])
Exemple #12
0
    def fetch(
            self, client: OpenrCtrl.Client, prefixes: List[str],
            prefix_type: Optional[str]
    ) -> List[ctrl_types.AdvertisedRouteDetail]:
        """
        Fetch the requested data
        """

        # Create filter
        route_filter = ctrl_types.AdvertisedRouteFilter()
        if prefixes:
            route_filter.prefixes = [
                ipnetwork.ip_str_to_prefix(p) for p in prefixes
            ]
        if prefix_type:
            route_filter.prefixType = self.to_thrift_prefix_type(prefix_type)

        # Get routes
        return client.getAdvertisedRoutesFiltered(route_filter)
    def send_cmd_to_prefix_mgr(self, cmd, prefixes=None,
                               prefix_type='BREEZE'):
        ''' Send the given cmd to prefix manager and return resp '''

        TYPE_TO_VALUES = lsdb_types.PrefixType._NAMES_TO_VALUES
        if prefix_type not in TYPE_TO_VALUES:
            raise Exception('Unknown type {}. Use any of {}'.format(
                            prefix_type, ', '.join(TYPE_TO_VALUES.keys())))

        req_msg = prefix_mgr_types.PrefixManagerRequest()
        req_msg.cmd = cmd
        req_msg.type = TYPE_TO_VALUES[prefix_type]
        req_msg.prefixes = []
        if prefixes is not None:
            for prefix in prefixes:
                req_msg.prefixes.append(lsdb_types.PrefixEntry(
                    prefix=ipnetwork.ip_str_to_prefix(prefix),
                    type=TYPE_TO_VALUES[prefix_type]))

        self._prefix_mgr_cmd_socket.send_thrift_obj(req_msg)

        return self._prefix_mgr_cmd_socket.recv_thrift_obj(
            prefix_mgr_types.PrefixManagerResponse)
Exemple #14
0
def build_routes(prefixes, nexthops):
    '''
    :param prefixes: List of prefixes in string representation
    :param nexthops: List of nexthops ip addresses in string presentation

    :returns: list ip_types.UnicastRoute (structured routes)
    :rtype: list
    '''

    prefixes = [ipnetwork.ip_str_to_prefix(p) for p in prefixes]
    nhs = []
    for nh_iface in nexthops:
        iface, addr = None, None
        # Nexthop may or may not be link-local. Handle it here well
        if '@' in nh_iface:
            addr, iface = nh_iface.split('@')
        elif '%' in nh_iface:
            addr, iface = nh_iface.split('%')
        else:
            addr = nh_iface
        nexthop = ipnetwork.ip_str_to_addr(addr)
        nexthop.ifName = iface
        nhs.append(nexthop)
    return [ip_types.UnicastRoute(dest=p, nexthops=nhs) for p in prefixes]
Exemple #15
0
from __future__ import print_function
from __future__ import unicode_literals
from __future__ import division

from openr.utils import socket
from openr.clients import prefix_mgr_client
from openr.PrefixManager import ttypes as prefix_mgr_types
from openr.Lsdb import ttypes as lsdb_types
from openr.utils.ipnetwork import ip_str_to_prefix, sprint_prefix

import zmq
import unittest
from multiprocessing import Process

prefix_entry1 = lsdb_types.PrefixEntry(
    prefix=ip_str_to_prefix('2620:0:1cff:dead:bef1:ffff:ffff:1/128'),
    type=lsdb_types.PrefixType.LOOPBACK)

prefix_entry2 = lsdb_types.PrefixEntry(
    prefix=ip_str_to_prefix('2620:0:1cff:dead:bef1:ffff:ffff:2/128'),
    type=lsdb_types.PrefixType.LOOPBACK)

prefix_entry3 = lsdb_types.PrefixEntry(
    prefix=ip_str_to_prefix('2620:0:1cff:dead:bef1:ffff:ffff:3/128'),
    type=lsdb_types.PrefixType.LOOPBACK)


class PrefixMgr():
    def __init__(self, zmq_ctx, url):
        self._prefix_mgr_server_socket = socket.Socket(zmq_ctx, zmq.REP)
        self._prefix_mgr_server_socket.bind(url)