Skip to content

Commit f53a5c1

Browse files
[config show]BGP Suppress fib pending config and display for multi-asic (sonic-net#3948)
CLI commands part of the fix for issue (sonic-net#19022) How I did it To send the suppress-fib-pending configuration to all asics in multi-asic system Show command to diplay current suppress-fib-pending configuration for all available asics Unit tests to test the multi-asic support of suppress-fib-pending configuration --------- Signed-off-by: vedganes <[email protected]>
1 parent b3de0af commit f53a5c1

3 files changed

Lines changed: 83 additions & 6 deletions

File tree

config/main.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2572,8 +2572,15 @@ def suppress_pending_fib(db, state):
25722572
''' Enable or disable pending FIB suppression. Once enabled,
25732573
BGP will not advertise routes that are not yet installed in the hardware '''
25742574

2575-
config_db = db.cfgdb
2576-
config_db.mod_entry('DEVICE_METADATA', 'localhost', {"suppress-fib-pending": state})
2575+
namespace_list = [multi_asic.DEFAULT_NAMESPACE]
2576+
2577+
# For multi-asic system apply configuration to all asics
2578+
if multi_asic.get_num_asics() > 1:
2579+
namespace_list = multi_asic.get_namespaces_from_linux()
2580+
2581+
for ns in namespace_list:
2582+
config_db = db.cfgdb_clients[ns]
2583+
config_db.mod_entry('DEVICE_METADATA', 'localhost', {"suppress-fib-pending": state})
25772584

25782585
#
25792586
# 'yang_config_validation' command ('config yang_config_validation ...')

show/main.py

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
if os.environ["UTILITIES_UNIT_TESTING_TOPOLOGY"] == "multi_asic":
3434
import mock_tables.mock_multi_asic
3535
reload(mock_tables.mock_multi_asic)
36-
reload(mock_tables.dbconnector)
3736
mock_tables.dbconnector.load_namespace_config()
3837

3938
except KeyError:
@@ -2697,9 +2696,22 @@ def peer(db, peer_ip, namespace):
26972696
def suppress_pending_fib(db):
26982697
""" Show the status of suppress pending FIB feature """
26992698

2700-
field_values = db.cfgdb.get_entry('DEVICE_METADATA', 'localhost')
2701-
state = field_values.get('suppress-fib-pending', 'disabled').title()
2702-
click.echo(state)
2699+
if multi_asic.get_num_asics() > 1:
2700+
namespace_list = multi_asic.get_namespaces_from_linux()
2701+
masic = True
2702+
else:
2703+
namespace_list = [multi_asic.DEFAULT_NAMESPACE]
2704+
masic = False
2705+
2706+
for ns in namespace_list:
2707+
config_db = db.cfgdb_clients[ns]
2708+
field_values = config_db.get_entry('DEVICE_METADATA', 'localhost')
2709+
state = field_values.get('suppress-fib-pending', 'enabled').title()
2710+
2711+
if masic:
2712+
click.echo("{}: {}".format(ns, state))
2713+
else:
2714+
click.echo("{}".format(state))
27032715

27042716

27052717
# asic-sdk-health-event subcommand ("show asic-sdk-health-event")

tests/suppress_pending_fib_test.py

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import os
2+
import importlib
13
from click.testing import CliRunner
24

35
import config.main as config
@@ -32,3 +34,59 @@ def test_synchronous_mode(self):
3234
result = runner.invoke(config.config.commands['suppress-fib-pending'], ['invalid-input'], obj=db)
3335
print(result.output)
3436
assert result.exit_code != 0
37+
38+
39+
class TestSuppressFibPendingMultiAsic(object):
40+
@classmethod
41+
def setup_class(cls):
42+
print("SETUP")
43+
os.environ["UTILITIES_UNIT_TESTING"] = "2"
44+
os.environ["UTILITIES_UNIT_TESTING_TOPOLOGY"] = "multi_asic"
45+
import show.main
46+
importlib.reload(show.main)
47+
import config.main
48+
importlib.reload(config.main)
49+
from .mock_tables import dbconnector
50+
from .mock_tables import mock_multi_asic
51+
importlib.reload(mock_multi_asic)
52+
dbconnector.load_namespace_config()
53+
54+
def test_config_suppress_fib_pending_all_asics(self):
55+
runner = CliRunner()
56+
db = Db()
57+
cfgdb0 = db.cfgdb_clients['asic0']
58+
cfgdb1 = db.cfgdb_clients['asic1']
59+
60+
# Test config = disable and db check for all asics (asic0 and asic1)
61+
result = runner.invoke(config.config.commands['suppress-fib-pending'], ['disabled'], obj=db)
62+
print(result.output)
63+
assert result.exit_code == 0
64+
assert cfgdb0.get_entry('DEVICE_METADATA', 'localhost')['suppress-fib-pending'] == 'disabled'
65+
assert cfgdb1.get_entry('DEVICE_METADATA', 'localhost')['suppress-fib-pending'] == 'disabled'
66+
67+
# Show disable for all asics
68+
result = runner.invoke(show.cli.commands['suppress-fib-pending'], obj=db)
69+
assert result.exit_code == 0
70+
assert result.output == 'asic0: Disabled\nasic1: Disabled\n'
71+
72+
# Test config = enable and db check for all asics (asic0 and asic1)
73+
result = runner.invoke(config.config.commands['suppress-fib-pending'], ['enabled'], obj=db)
74+
print(result.output)
75+
assert result.exit_code == 0
76+
assert cfgdb0.get_entry('DEVICE_METADATA', 'localhost')['suppress-fib-pending'] == 'enabled'
77+
assert cfgdb1.get_entry('DEVICE_METADATA', 'localhost')['suppress-fib-pending'] == 'enabled'
78+
79+
# Show enable for all asics
80+
result = runner.invoke(show.cli.commands['suppress-fib-pending'], obj=db)
81+
assert result.exit_code == 0
82+
assert result.output == 'asic0: Enabled\nasic1: Enabled\n'
83+
84+
@classmethod
85+
def teardown_class(cls):
86+
print("TEARDOWN")
87+
os.environ["UTILITIES_UNIT_TESTING"] = "0"
88+
os.environ["UTILITIES_UNIT_TESTING_TOPOLOGY"] = ""
89+
from .mock_tables import dbconnector
90+
from .mock_tables import mock_single_asic
91+
importlib.reload(mock_single_asic)
92+
dbconnector.load_namespace_config()

0 commit comments

Comments
 (0)