Skip to content

Commit

Permalink
Add show CLI for bmp related dataset. (sonic-net#3289)
Browse files Browse the repository at this point in the history
* Add CLI for bmp state_db dataset show.

* Add CLI for bmp state_db dataset show.

* Update db instance

* Update db instance

* update test
  • Loading branch information
FengPan-Frank authored Sep 6, 2024
1 parent 785d7bd commit b82115c
Show file tree
Hide file tree
Showing 6 changed files with 351 additions and 0 deletions.
133 changes: 133 additions & 0 deletions show/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@
PLATFORM_JSON = 'platform.json'
HWSKU_JSON = 'hwsku.json'
PORT_STR = "Ethernet"
BMP_STATE_DB = 'BMP_STATE_DB'

VLAN_SUB_INTERFACE_SEPARATOR = '.'

Expand Down Expand Up @@ -2128,6 +2129,138 @@ def ztp(status, verbose):
run_command(cmd, display_cmd=verbose)


#
# 'bmp' group ("show bmp ...")
#
@cli.group(cls=clicommon.AliasedGroup)
def bmp():
"""Show details of the bmp dataset"""
pass


# 'bgp-neighbor-table' subcommand ("show bmp bgp-neighbor-table")
@bmp.command('bgp-neighbor-table')
@clicommon.pass_db
def bmp_neighbor_table(db):
"""Show bmp bgp-neighbor-table information"""
bmp_headers = ["Neighbor_Address", "Peer_Address", "Peer_ASN", "Peer_RD", "Peer_Port",
"Local_Address", "Local_ASN", "Local_Port", "Advertised_Capabilities", "Received_Capabilities"]

# BGP_NEIGHBOR_TABLE|10.0.1.2
bmp_keys = db.db.keys(BMP_STATE_DB, "BGP_NEIGHBOR_TABLE|*")

click.echo("Total number of bmp neighbors: {}".format(0 if bmp_keys is None else len(bmp_keys)))

bmp_body = []
if bmp_keys is not None:
for key in bmp_keys:
values = db.db.get_all(BMP_STATE_DB, key)
bmp_body.append([
values["peer_addr"], # Neighbor_Address
values["peer_addr"],
values["peer_asn"],
values["peer_rd"],
values["peer_port"],
values["local_addr"],
values["local_asn"],
values["local_port"],
values["sent_cap"],
values["recv_cap"]
])

click.echo(tabulate(bmp_body, bmp_headers))


# 'bmp-rib-out-table' subcommand ("show bmp bgp-rib-out-table")
@bmp.command('bgp-rib-out-table')
@clicommon.pass_db
def bmp_rib_out_table(db):
"""Show bmp bgp-rib-out-table information"""
bmp_headers = ["Neighbor_Address", "NLRI", "Origin", "AS_Path", "Origin_AS", "Next_Hop", "Local_Pref",
"Originator_ID", "Community_List", "Ext_Community_List"]

# BGP_RIB_OUT_TABLE|192.181.168.0/25|10.0.0.59
bmp_keys = db.db.keys(BMP_STATE_DB, "BGP_RIB_OUT_TABLE|*")
delimiter = db.db.get_db_separator(BMP_STATE_DB)

click.echo("Total number of bmp bgp-rib-out-table: {}".format(0 if bmp_keys is None else len(bmp_keys)))

bmp_body = []
if bmp_keys is not None:
for key in bmp_keys:
key_values = key.split(delimiter)
if len(key_values) < 3:
continue
values = db.db.get_all(BMP_STATE_DB, key)
bmp_body.append([
key_values[2], # Neighbor_Address
key_values[1], # NLRI
values["origin"],
values["as_path"],
values["origin_as"],
values["next_hop"],
values["local_pref"],
values["originator_id"],
values["community_list"],
values["ext_community_list"]
])

click.echo(tabulate(bmp_body, bmp_headers))


# 'bgp-rib-in-table' subcommand ("show bmp bgp-rib-in-table")
@bmp.command('bgp-rib-in-table')
@clicommon.pass_db
def bmp_rib_in_table(db):
"""Show bmp bgp-rib-in-table information"""
bmp_headers = ["Neighbor_Address", "NLRI", "Origin", "AS_Path", "Origin_AS", "Next_Hop", "Local_Pref",
"Originator_ID", "Community_List", "Ext_Community_List"]

# BGP_RIB_IN_TABLE|20c0:ef50::/64|10.0.0.57
bmp_keys = db.db.keys(BMP_STATE_DB, "BGP_RIB_IN_TABLE|*")
delimiter = db.db.get_db_separator(BMP_STATE_DB)

click.echo("Total number of bmp bgp-rib-in-table: {}".format(0 if bmp_keys is None else len(bmp_keys)))

bmp_body = []
if bmp_keys is not None:
for key in bmp_keys:
key_values = key.split(delimiter)
if len(key_values) < 3:
continue
values = db.db.get_all(BMP_STATE_DB, key)
bmp_body.append([
key_values[2], # Neighbor_Address
key_values[1], # NLRI
values["origin"],
values["as_path"],
values["origin_as"],
values["next_hop"],
values["local_pref"],
values["originator_id"],
values["community_list"],
values["ext_community_list"]
])

click.echo(tabulate(bmp_body, bmp_headers))


# 'tables' subcommand ("show bmp tables")
@bmp.command('tables')
@clicommon.pass_db
def tables(db):
"""Show bmp table status information"""
bmp_headers = ["Table_Name", "Enabled"]
bmp_body = []
click.echo("BMP tables: ")
bmp_keys = db.cfgdb.get_table('BMP')
if bmp_keys['table']:
bmp_body.append(['bgp_neighbor_table', bmp_keys['table']['bgp_neighbor_table']])
bmp_body.append(['bgp_rib_in_table', bmp_keys['table']['bgp_rib_in_table']])
bmp_body.append(['bgp_rib_out_table', bmp_keys['table']['bgp_rib_out_table']])
click.echo(tabulate(bmp_body, bmp_headers))


#
# 'bfd' group ("show bfd ...")
#
Expand Down
10 changes: 10 additions & 0 deletions tests/mock_tables/asic0/database_config.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,11 @@
"hostname" : "127.0.0.1",
"port" : 6379,
"unix_socket_path" : "/var/run/redis/redis.sock"
},
"redis_bmp": {
"hostname" : "127.0.0.1",
"port" : 6400,
"unix_socket_path" : "/var/run/redis/redis_bmp.sock"
}
},
"DATABASES" : {
Expand Down Expand Up @@ -51,6 +56,11 @@
"id" : 7,
"separator": "|",
"instance" : "redis"
},
"BMP_STATE_DB" : {
"id" : 20,
"separator": "|",
"instance" : "redis_bmp"
}
},
"VERSION" : "1.1"
Expand Down
10 changes: 10 additions & 0 deletions tests/mock_tables/asic1/database_config.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,11 @@
"hostname" : "127.0.0.1",
"port" : 6379,
"unix_socket_path" : "/var/run/redis/redis.sock"
},
"redis_bmp": {
"hostname" : "127.0.0.1",
"port" : 6400,
"unix_socket_path" : "/var/run/redis/redis_bmp.sock"
}
},
"DATABASES" : {
Expand Down Expand Up @@ -51,6 +56,11 @@
"id" : 7,
"separator": "|",
"instance" : "redis"
},
"BMP_STATE_DB" : {
"id" : 20,
"separator": "|",
"instance" : "redis_bmp"
}
},
"VERSION" : "1.1"
Expand Down
10 changes: 10 additions & 0 deletions tests/mock_tables/asic2/database_config.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,11 @@
"hostname" : "127.0.0.1",
"port" : 6379,
"unix_socket_path" : "/var/run/redis/redis.sock"
},
"redis_bmp": {
"hostname" : "127.0.0.1",
"port" : 6400,
"unix_socket_path" : "/var/run/redis/redis_bmp.sock"
}
},
"DATABASES" : {
Expand Down Expand Up @@ -51,6 +56,11 @@
"id" : 7,
"separator": "|",
"instance" : "redis"
},
"BMP_STATE_DB" : {
"id" : 20,
"separator": "|",
"instance" : "redis_bmp"
}
},
"VERSION" : "1.1"
Expand Down
10 changes: 10 additions & 0 deletions tests/mock_tables/database_config.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,11 @@
"hostname" : "227.0.0.1",
"port" : 6379,
"unix_socket_path" : "/var/run/redis/redis.sock"
},
"redis_bmp": {
"hostname" : "127.0.0.1",
"port" : 6400,
"unix_socket_path" : "/var/run/redis/redis_bmp.sock"
}
},
"DATABASES" : {
Expand Down Expand Up @@ -61,6 +66,11 @@
"id" : 13,
"separator": "|",
"instance" : "redis"
},
"BMP_STATE_DB" : {
"id" : 20,
"separator": "|",
"instance" : "redis_bmp"
}
},
"VERSION" : "1.1"
Expand Down
Loading

0 comments on commit b82115c

Please sign in to comment.