def run(): channel = grpc.insecure_channel('192.168.10.1:50051') stub = gobgp_pb2_grpc.GobgpApiStub(channel) nlri = Any() nlri.Pack( attribute_pb2.IPAddressPrefix( prefix_len=24, prefix="192.168.10.0", )) origin = Any() origin.Pack(attribute_pb2.OriginAttribute( origin=2, # INCOMPLETE )) next_hop = Any() next_hop.Pack(attribute_pb2.NextHopAttribute(next_hop="0.0.0.0", )) attributes = [origin, next_hop] stub.AddPath( gobgp_pb2.AddPathRequest(table_type=gobgp_pb2.GLOBAL, path=gobgp_pb2.Path( nlri=nlri, pattrs=attributes, family=gobgp_pb2.Family( afi=gobgp_pb2.Family.AFI_IP, safi=gobgp_pb2.Family.SAFI_UNICAST), )), _TIMEOUT_SECONDS, )
def run(prefix, af, gobgpd_addr, withdraw=False, **kw): route_family = libgobgp.get_route_family(_AF_NAME[af]) joined_args = prefix + " " + " ".join( map(lambda x: "{} {}".format(*x), kw.items())) serialized_path = libgobgp.serialize_path( route_family, joined_args, ).contents # nlri nlri = unpack_buf(serialized_path.nlri) # pattrs pattrs = [] for pattr_p in serialized_path.path_attributes.contents[:serialized_path. path_attributes_len]: pattrs.append(unpack_buf(pattr_p.contents)) # path dict path = dict([ ("family", route_family), ("nlri", nlri), ("pattrs", pattrs), ]) # grpc request channel = implementations.insecure_channel(gobgpd_addr, 50051) try: with gobgp_pb2.beta_create_GobgpApi_stub(channel) as stub: if not withdraw: res = stub.AddPath(gobgp_pb2.AddPathRequest(path=path), _TIMEOUT_SECONDS) # AddPathResponse uuid seems to have become empty since uuid became a member of Path structure. if res.uuid: print str(UUID(bytes=res.uuid)) else: path["is_withdraw"] = True res = stub.DeletePath(gobgp_pb2.DeletePathRequest(path=path), _TIMEOUT_SECONDS) except ExpirationError: print >> sys.stderr, "grpc request timed out!" except: traceback.print_exc()
def run(): channel = grpc.insecure_channel('localhost:50051') stub = gobgp_pb2_grpc.GobgpApiStub(channel) nlri = Any() nlri.Pack(attribute_pb2.IPAddressPrefix( prefix_len=24, prefix="10.0.0.0", )) origin = Any() origin.Pack(attribute_pb2.OriginAttribute( origin=2, # INCOMPLETE )) as_segment = attribute_pb2.AsSegment( # type=2, # "type" causes syntax error numbers=[100, 200], ) as_segment.type = 2 # SEQ as_path = Any() as_path.Pack(attribute_pb2.AsPathAttribute( segments=[as_segment], )) next_hop = Any() next_hop.Pack(attribute_pb2.NextHopAttribute( next_hop="1.1.1.1", )) attributes = [origin, as_path, next_hop] stub.AddPath( gobgp_pb2.AddPathRequest( table_type=gobgp_pb2.GLOBAL, path=gobgp_pb2.Path( nlri=nlri, pattrs=attributes, family=gobgp_pb2.Family(afi=gobgp_pb2.Family.AFI_IP, safi=gobgp_pb2.Family.SAFI_UNICAST), ) ), _TIMEOUT_SECONDS, )
def go_bgp_subnet(color, endpoint_device, target_device, sid_list, bsid_value, nh): """ inject or delete an route with <ACME>-CIDR and <ACME>-SCRUBBING community NLRI ORIGIN AS_PATH LP EXTENDED COMMUNITIES RT TUNNEL ENCAP TLVs SR Policy SUB-TLVs Preference Binding-SID SEG-LIST WEIGHT SEGMENT(1..n) """ channel = grpc.insecure_channel("localhost:50051") stub = gobgp_pb2_grpc.GobgpApiStub(channel) attributes = [] segments = [] # bgp-sr-te safi family = gobgp_pb2.Family( afi=gobgp_pb2.Family.AFI_IP, safi=gobgp_pb2.Family.SAFI_SR_POLICY ) # sr-te policy nlri nlri = Any() nlri.Pack( attribute_pb2.SRPolicyNLRI( color=color, distinguisher=2, endpoint=bytes(map(int, endpoint_device.split("."))), length=96, ) ) # next-hop next_hop = Any() next_hop.Pack( attribute_pb2.NextHopAttribute( next_hop=nh, ) ) attributes.append(next_hop) # Origin origin = Any() origin.Pack(attribute_pb2.OriginAttribute(origin=0)) attributes.append(origin) # Ext RT Communities rt = Any() rt.Pack( attribute_pb2.IPv4AddressSpecificExtended( address=target_device, local_admin=0, sub_type=0x02, is_transitive=False ) ) communities = Any() communities.Pack( attribute_pb2.ExtendedCommunitiesAttribute( communities=[rt], ) ) attributes.append(communities) # generic sid used for bsid sid = Any() sid.Pack( attribute_pb2.SRBindingSID( s_flag=False, i_flag=False, sid=(bsid_value).to_bytes(4, byteorder="big") ) ) # bsid bsid = Any() bsid.Pack(attribute_pb2.TunnelEncapSubTLVSRBindingSID(bsid=sid)) # generic segment lbl for n in sid_list: segment = Any() segment.Pack( attribute_pb2.SegmentTypeA( flags=attribute_pb2.SegmentFlags(s_flag=False), label=n << 12 ) ) segments.append(segment) # segment list seglist = Any() seglist.Pack( attribute_pb2.TunnelEncapSubTLVSRSegmentList( weight=attribute_pb2.SRWeight(flags=0, weight=12), segments=segments, ) ) # pref pref = Any() pref.Pack(attribute_pb2.TunnelEncapSubTLVSRPreference(flags=0, preference=11)) # path name not used for now cpn = Any() cpn.Pack( attribute_pb2.TunnelEncapSubTLVSRCandidatePathName( candidate_path_name="test-path" ) ) # priority not used for now pri = Any() pri.Pack(attribute_pb2.TunnelEncapSubTLVSRPriority(priority=10)) tun = Any() # generate tunnel tun.Pack( attribute_pb2.TunnelEncapAttribute( tlvs=[ attribute_pb2.TunnelEncapTLV( type=15, tlvs=[ pref, bsid, seglist, # cpn, # pri, ], ) ] ) ) attributes.append(tun) stub.AddPath( gobgp_pb2.AddPathRequest( table_type=gobgp_pb2.GLOBAL, path=gobgp_pb2.Path( nlri=nlri, pattrs=attributes, family=family, best=True, ), ), _TIMEOUT_SECONDS, )