Skip to content

Commit b82115c

Browse files
Add show CLI for bmp related dataset. (sonic-net#3289)
* Add CLI for bmp state_db dataset show. * Add CLI for bmp state_db dataset show. * Update db instance * Update db instance * update test
1 parent 785d7bd commit b82115c

File tree

6 files changed

+351
-0
lines changed

6 files changed

+351
-0
lines changed

show/main.py

+133
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@
7272
PLATFORM_JSON = 'platform.json'
7373
HWSKU_JSON = 'hwsku.json'
7474
PORT_STR = "Ethernet"
75+
BMP_STATE_DB = 'BMP_STATE_DB'
7576

7677
VLAN_SUB_INTERFACE_SEPARATOR = '.'
7778

@@ -2128,6 +2129,138 @@ def ztp(status, verbose):
21282129
run_command(cmd, display_cmd=verbose)
21292130

21302131

2132+
#
2133+
# 'bmp' group ("show bmp ...")
2134+
#
2135+
@cli.group(cls=clicommon.AliasedGroup)
2136+
def bmp():
2137+
"""Show details of the bmp dataset"""
2138+
pass
2139+
2140+
2141+
# 'bgp-neighbor-table' subcommand ("show bmp bgp-neighbor-table")
2142+
@bmp.command('bgp-neighbor-table')
2143+
@clicommon.pass_db
2144+
def bmp_neighbor_table(db):
2145+
"""Show bmp bgp-neighbor-table information"""
2146+
bmp_headers = ["Neighbor_Address", "Peer_Address", "Peer_ASN", "Peer_RD", "Peer_Port",
2147+
"Local_Address", "Local_ASN", "Local_Port", "Advertised_Capabilities", "Received_Capabilities"]
2148+
2149+
# BGP_NEIGHBOR_TABLE|10.0.1.2
2150+
bmp_keys = db.db.keys(BMP_STATE_DB, "BGP_NEIGHBOR_TABLE|*")
2151+
2152+
click.echo("Total number of bmp neighbors: {}".format(0 if bmp_keys is None else len(bmp_keys)))
2153+
2154+
bmp_body = []
2155+
if bmp_keys is not None:
2156+
for key in bmp_keys:
2157+
values = db.db.get_all(BMP_STATE_DB, key)
2158+
bmp_body.append([
2159+
values["peer_addr"], # Neighbor_Address
2160+
values["peer_addr"],
2161+
values["peer_asn"],
2162+
values["peer_rd"],
2163+
values["peer_port"],
2164+
values["local_addr"],
2165+
values["local_asn"],
2166+
values["local_port"],
2167+
values["sent_cap"],
2168+
values["recv_cap"]
2169+
])
2170+
2171+
click.echo(tabulate(bmp_body, bmp_headers))
2172+
2173+
2174+
# 'bmp-rib-out-table' subcommand ("show bmp bgp-rib-out-table")
2175+
@bmp.command('bgp-rib-out-table')
2176+
@clicommon.pass_db
2177+
def bmp_rib_out_table(db):
2178+
"""Show bmp bgp-rib-out-table information"""
2179+
bmp_headers = ["Neighbor_Address", "NLRI", "Origin", "AS_Path", "Origin_AS", "Next_Hop", "Local_Pref",
2180+
"Originator_ID", "Community_List", "Ext_Community_List"]
2181+
2182+
# BGP_RIB_OUT_TABLE|192.181.168.0/25|10.0.0.59
2183+
bmp_keys = db.db.keys(BMP_STATE_DB, "BGP_RIB_OUT_TABLE|*")
2184+
delimiter = db.db.get_db_separator(BMP_STATE_DB)
2185+
2186+
click.echo("Total number of bmp bgp-rib-out-table: {}".format(0 if bmp_keys is None else len(bmp_keys)))
2187+
2188+
bmp_body = []
2189+
if bmp_keys is not None:
2190+
for key in bmp_keys:
2191+
key_values = key.split(delimiter)
2192+
if len(key_values) < 3:
2193+
continue
2194+
values = db.db.get_all(BMP_STATE_DB, key)
2195+
bmp_body.append([
2196+
key_values[2], # Neighbor_Address
2197+
key_values[1], # NLRI
2198+
values["origin"],
2199+
values["as_path"],
2200+
values["origin_as"],
2201+
values["next_hop"],
2202+
values["local_pref"],
2203+
values["originator_id"],
2204+
values["community_list"],
2205+
values["ext_community_list"]
2206+
])
2207+
2208+
click.echo(tabulate(bmp_body, bmp_headers))
2209+
2210+
2211+
# 'bgp-rib-in-table' subcommand ("show bmp bgp-rib-in-table")
2212+
@bmp.command('bgp-rib-in-table')
2213+
@clicommon.pass_db
2214+
def bmp_rib_in_table(db):
2215+
"""Show bmp bgp-rib-in-table information"""
2216+
bmp_headers = ["Neighbor_Address", "NLRI", "Origin", "AS_Path", "Origin_AS", "Next_Hop", "Local_Pref",
2217+
"Originator_ID", "Community_List", "Ext_Community_List"]
2218+
2219+
# BGP_RIB_IN_TABLE|20c0:ef50::/64|10.0.0.57
2220+
bmp_keys = db.db.keys(BMP_STATE_DB, "BGP_RIB_IN_TABLE|*")
2221+
delimiter = db.db.get_db_separator(BMP_STATE_DB)
2222+
2223+
click.echo("Total number of bmp bgp-rib-in-table: {}".format(0 if bmp_keys is None else len(bmp_keys)))
2224+
2225+
bmp_body = []
2226+
if bmp_keys is not None:
2227+
for key in bmp_keys:
2228+
key_values = key.split(delimiter)
2229+
if len(key_values) < 3:
2230+
continue
2231+
values = db.db.get_all(BMP_STATE_DB, key)
2232+
bmp_body.append([
2233+
key_values[2], # Neighbor_Address
2234+
key_values[1], # NLRI
2235+
values["origin"],
2236+
values["as_path"],
2237+
values["origin_as"],
2238+
values["next_hop"],
2239+
values["local_pref"],
2240+
values["originator_id"],
2241+
values["community_list"],
2242+
values["ext_community_list"]
2243+
])
2244+
2245+
click.echo(tabulate(bmp_body, bmp_headers))
2246+
2247+
2248+
# 'tables' subcommand ("show bmp tables")
2249+
@bmp.command('tables')
2250+
@clicommon.pass_db
2251+
def tables(db):
2252+
"""Show bmp table status information"""
2253+
bmp_headers = ["Table_Name", "Enabled"]
2254+
bmp_body = []
2255+
click.echo("BMP tables: ")
2256+
bmp_keys = db.cfgdb.get_table('BMP')
2257+
if bmp_keys['table']:
2258+
bmp_body.append(['bgp_neighbor_table', bmp_keys['table']['bgp_neighbor_table']])
2259+
bmp_body.append(['bgp_rib_in_table', bmp_keys['table']['bgp_rib_in_table']])
2260+
bmp_body.append(['bgp_rib_out_table', bmp_keys['table']['bgp_rib_out_table']])
2261+
click.echo(tabulate(bmp_body, bmp_headers))
2262+
2263+
21312264
#
21322265
# 'bfd' group ("show bfd ...")
21332266
#

tests/mock_tables/asic0/database_config.json

+10
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@
44
"hostname" : "127.0.0.1",
55
"port" : 6379,
66
"unix_socket_path" : "/var/run/redis/redis.sock"
7+
},
8+
"redis_bmp": {
9+
"hostname" : "127.0.0.1",
10+
"port" : 6400,
11+
"unix_socket_path" : "/var/run/redis/redis_bmp.sock"
712
}
813
},
914
"DATABASES" : {
@@ -51,6 +56,11 @@
5156
"id" : 7,
5257
"separator": "|",
5358
"instance" : "redis"
59+
},
60+
"BMP_STATE_DB" : {
61+
"id" : 20,
62+
"separator": "|",
63+
"instance" : "redis_bmp"
5464
}
5565
},
5666
"VERSION" : "1.1"

tests/mock_tables/asic1/database_config.json

+10
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@
44
"hostname" : "127.0.0.1",
55
"port" : 6379,
66
"unix_socket_path" : "/var/run/redis/redis.sock"
7+
},
8+
"redis_bmp": {
9+
"hostname" : "127.0.0.1",
10+
"port" : 6400,
11+
"unix_socket_path" : "/var/run/redis/redis_bmp.sock"
712
}
813
},
914
"DATABASES" : {
@@ -51,6 +56,11 @@
5156
"id" : 7,
5257
"separator": "|",
5358
"instance" : "redis"
59+
},
60+
"BMP_STATE_DB" : {
61+
"id" : 20,
62+
"separator": "|",
63+
"instance" : "redis_bmp"
5464
}
5565
},
5666
"VERSION" : "1.1"

tests/mock_tables/asic2/database_config.json

+10
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@
44
"hostname" : "127.0.0.1",
55
"port" : 6379,
66
"unix_socket_path" : "/var/run/redis/redis.sock"
7+
},
8+
"redis_bmp": {
9+
"hostname" : "127.0.0.1",
10+
"port" : 6400,
11+
"unix_socket_path" : "/var/run/redis/redis_bmp.sock"
712
}
813
},
914
"DATABASES" : {
@@ -51,6 +56,11 @@
5156
"id" : 7,
5257
"separator": "|",
5358
"instance" : "redis"
59+
},
60+
"BMP_STATE_DB" : {
61+
"id" : 20,
62+
"separator": "|",
63+
"instance" : "redis_bmp"
5464
}
5565
},
5666
"VERSION" : "1.1"

tests/mock_tables/database_config.json

+10
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@
44
"hostname" : "227.0.0.1",
55
"port" : 6379,
66
"unix_socket_path" : "/var/run/redis/redis.sock"
7+
},
8+
"redis_bmp": {
9+
"hostname" : "127.0.0.1",
10+
"port" : 6400,
11+
"unix_socket_path" : "/var/run/redis/redis_bmp.sock"
712
}
813
},
914
"DATABASES" : {
@@ -61,6 +66,11 @@
6166
"id" : 13,
6267
"separator": "|",
6368
"instance" : "redis"
69+
},
70+
"BMP_STATE_DB" : {
71+
"id" : 20,
72+
"separator": "|",
73+
"instance" : "redis_bmp"
6474
}
6575
},
6676
"VERSION" : "1.1"

0 commit comments

Comments
 (0)