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)
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 ]
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)
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)
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)
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)
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)
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)))
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
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 ]
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])
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)
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]
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)