Skip to content

Commit 9419627

Browse files
authored
[Multi-asic] Enhanced Feature Table configuration for multi-asic platforms (sonic-net#1152)
Enhanced Feature Table configuration for multi-asic platforms to programmed for all config db's.
1 parent 155f6d5 commit 9419627

File tree

7 files changed

+152
-12
lines changed

7 files changed

+152
-12
lines changed

config/feature.py

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,25 @@ def feature():
2020
@pass_db
2121
def feature_state(db, name, state):
2222
"""Enable/disable a feature"""
23-
entry_data = db.cfgdb.get_entry('FEATURE', name)
23+
entry_data_set = set()
2424

25-
if not entry_data:
26-
click.echo("Feature '{}' doesn't exist".format(name))
25+
for ns, cfgdb in db.cfgdb_clients.items():
26+
entry_data = cfgdb.get_entry('FEATURE', name)
27+
if not entry_data:
28+
click.echo("Feature '{}' doesn't exist".format(name))
29+
sys.exit(1)
30+
entry_data_set.add(entry_data['state'])
31+
32+
if len(entry_data_set) > 1:
33+
click.echo("Feature '{}' state is not consistent across namespaces".format(name))
2734
sys.exit(1)
2835

2936
if entry_data['state'] == "always_enabled":
3037
click.echo("Feature '{}' state is always enabled and can not be modified".format(name))
3138
return
3239

33-
db.cfgdb.mod_entry('FEATURE', name, {'state': state})
40+
for ns, cfgdb in db.cfgdb_clients.items():
41+
cfgdb.mod_entry('FEATURE', name, {'state': state})
3442

3543
#
3644
# 'autorestart' command ('config feature autorestart ...')
@@ -41,14 +49,22 @@ def feature_state(db, name, state):
4149
@pass_db
4250
def feature_autorestart(db, name, autorestart):
4351
"""Enable/disable autorestart of a feature"""
44-
entry_data = db.cfgdb.get_entry('FEATURE', name)
52+
entry_data_set = set()
53+
54+
for ns, cfgdb in db.cfgdb_clients.items():
55+
entry_data = cfgdb.get_entry('FEATURE', name)
56+
if not entry_data:
57+
click.echo("Feature '{}' doesn't exist".format(name))
58+
sys.exit(1)
59+
entry_data_set.add(entry_data['auto_restart'])
4560

46-
if not entry_data:
47-
click.echo("Feature '{}' doesn't exist".format(name))
61+
if len(entry_data_set) > 1:
62+
click.echo("Feature '{}' auto-restart is not consistent across namespaces".format(name))
4863
sys.exit(1)
4964

5065
if entry_data['auto_restart'] == "always_enabled":
5166
click.echo("Feature '{}' auto-restart is always enabled and can not be modified".format(name))
5267
return
5368

54-
db.cfgdb.mod_entry('FEATURE', name, {'auto_restart': autorestart})
69+
for ns, cfgdb in db.cfgdb_clients.items():
70+
cfgdb.mod_entry('FEATURE', name, {'auto_restart': autorestart})

tests/crm_test.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import os
22
import sys
3+
from importlib import reload
34

45
from click.testing import CliRunner
56
import crm.main as crm
@@ -1298,3 +1299,4 @@ def teardown_class(cls):
12981299
os.environ["UTILITIES_UNIT_TESTING"] = "0"
12991300
os.environ["UTILITIES_UNIT_TESTING_TOPOLOGY"] = ""
13001301
from .mock_tables import mock_single_asic
1302+
reload(mock_single_asic)

tests/feature_test.py

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

35
from utilities_common.db import Db
@@ -76,6 +78,12 @@
7678
--------- --------------
7779
database always_enabled
7880
"""
81+
config_feature_bgp_inconsistent_state_output="""\
82+
Feature 'bgp' state is not consistent across namespaces
83+
"""
84+
config_feature_bgp_inconsistent_autorestart_output="""\
85+
Feature 'bgp' auto-restart is not consistent across namespaces
86+
"""
7987

8088
class TestFeature(object):
8189
@classmethod
@@ -217,3 +225,102 @@ def test_config_unknown_feature(self, get_cmd_module):
217225
@classmethod
218226
def teardown_class(cls):
219227
print("TEARDOWN")
228+
229+
class TestFeatureMultiAsic(object):
230+
@classmethod
231+
def setup_class(cls):
232+
print("SETUP")
233+
234+
def test_config_bgp_feature_inconsistent_state(self, get_cmd_module):
235+
from .mock_tables import dbconnector
236+
from .mock_tables import mock_multi_asic_3_asics
237+
reload(mock_multi_asic_3_asics)
238+
dbconnector.load_namespace_config()
239+
(config, show) = get_cmd_module
240+
db = Db()
241+
runner = CliRunner()
242+
result = runner.invoke(config.config.commands["feature"].commands["state"], ["bgp", "disabled"], obj=db)
243+
print(result.exit_code)
244+
print(result.output)
245+
assert result.exit_code == 1
246+
assert result.output == config_feature_bgp_inconsistent_state_output
247+
result = runner.invoke(config.config.commands["feature"].commands["state"], ["bgp", "enabled"], obj=db)
248+
print(result.exit_code)
249+
print(result.output)
250+
assert result.exit_code == 1
251+
assert result.output == config_feature_bgp_inconsistent_state_output
252+
253+
def test_config_bgp_feature_inconsistent_autorestart(self, get_cmd_module):
254+
from .mock_tables import dbconnector
255+
from .mock_tables import mock_multi_asic_3_asics
256+
reload(mock_multi_asic_3_asics)
257+
dbconnector.load_namespace_config()
258+
(config, show) = get_cmd_module
259+
db = Db()
260+
runner = CliRunner()
261+
result = runner.invoke(config.config.commands["feature"].commands["autorestart"], ["bgp", "disabled"], obj=db)
262+
print(result.exit_code)
263+
print(result.output)
264+
assert result.exit_code == 1
265+
assert result.output == config_feature_bgp_inconsistent_autorestart_output
266+
result = runner.invoke(config.config.commands["feature"].commands["autorestart"], ["bgp", "enabled"], obj=db)
267+
print(result.exit_code)
268+
print(result.output)
269+
assert result.exit_code == 1
270+
assert result.output == config_feature_bgp_inconsistent_autorestart_output
271+
272+
def test_config_bgp_feature_consistent_state(self, get_cmd_module):
273+
from .mock_tables import dbconnector
274+
from .mock_tables import mock_multi_asic
275+
reload(mock_multi_asic)
276+
dbconnector.load_namespace_config()
277+
(config, show) = get_cmd_module
278+
db = Db()
279+
runner = CliRunner()
280+
result = runner.invoke(config.config.commands["feature"].commands["state"], ["bgp", "disabled"], obj=db)
281+
print(result.exit_code)
282+
assert result.exit_code == 0
283+
result = runner.invoke(show.cli.commands["feature"].commands["status"], ["bgp"], obj=db)
284+
print(result.output)
285+
assert result.exit_code == 0
286+
assert result.output == show_feature_bgp_disabled_status_output
287+
result = runner.invoke(config.config.commands["feature"].commands["state"], ["bgp", "enabled"], obj=db)
288+
print(result.exit_code)
289+
print(result.output)
290+
assert result.exit_code == 0
291+
result = runner.invoke(show.cli.commands["feature"].commands["status"], ["bgp"], obj=db)
292+
print(result.output)
293+
assert result.exit_code == 0
294+
assert result.output == show_feature_bgp_status_output
295+
296+
def test_config_bgp_feature_consistent_autorestart(self, get_cmd_module):
297+
from .mock_tables import dbconnector
298+
from .mock_tables import mock_multi_asic
299+
reload(mock_multi_asic)
300+
dbconnector.load_namespace_config()
301+
(config, show) = get_cmd_module
302+
db = Db()
303+
runner = CliRunner()
304+
result = runner.invoke(config.config.commands["feature"].commands["autorestart"], ["bgp", "disabled"], obj=db)
305+
print(result.exit_code)
306+
assert result.exit_code == 0
307+
result = runner.invoke(show.cli.commands["feature"].commands["autorestart"], ["bgp"], obj=db)
308+
print(result.output)
309+
print(result.exit_code)
310+
assert result.exit_code == 0
311+
assert result.output == show_feature_bgp_disabled_autorestart_output
312+
result = runner.invoke(config.config.commands["feature"].commands["autorestart"], ["bgp", "enabled"], obj=db)
313+
print(result.exit_code)
314+
assert result.exit_code == 0
315+
result = runner.invoke(show.cli.commands["feature"].commands["autorestart"], ["bgp"], obj=db)
316+
print(result.output)
317+
print(result.exit_code)
318+
assert result.exit_code == 0
319+
assert result.output == show_feature_bgp_autorestart_output
320+
321+
322+
@classmethod
323+
def teardown_class(cls):
324+
print("TEARDOWN")
325+
from .mock_tables import mock_single_asic
326+
reload(mock_single_asic)

tests/ip_show_routes_multi_asic_test.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import os
2+
from importlib import reload
23

34
import pytest
45

@@ -16,6 +17,7 @@ def setup_class(cls):
1617
os.environ["UTILITIES_UNIT_TESTING"] = "2"
1718
os.environ["UTILITIES_UNIT_TESTING_TOPOLOGY"] = "multi_asic"
1819
from .mock_tables import mock_multi_asic_3_asics
20+
reload(mock_multi_asic_3_asics)
1921
from .mock_tables import dbconnector
2022
dbconnector.load_namespace_config()
2123

@@ -224,7 +226,5 @@ def teardown_class(cls):
224226
os.environ["PATH"] = os.pathsep.join(os.environ["PATH"].split(os.pathsep)[:-1])
225227
os.environ["UTILITIES_UNIT_TESTING"] = "0"
226228
os.environ["UTILITIES_UNIT_TESTING_TOPOLOGY"] = ""
227-
import imp
228-
from sonic_py_common import multi_asic
229-
imp.reload(multi_asic)
230-
import mock_tables.dbconnector
229+
from .mock_tables import mock_single_asic
230+
reload(mock_single_asic)

tests/mock_tables/asic0/config_db.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,5 +162,10 @@
162162
},
163163
"PEER_SWITCH|sonic" : {
164164
"address_ipv4": "10.2.2.2"
165+
},
166+
"FEATURE|bgp": {
167+
"state": "enabled",
168+
"auto_restart": "enabled",
169+
"high_mem_alert": "disabled"
165170
}
166171
}

tests/mock_tables/asic1/config_db.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,5 +131,10 @@
131131
},
132132
"PEER_SWITCH|sonic" : {
133133
"address_ipv4": "10.2.2.2"
134+
},
135+
"FEATURE|bgp": {
136+
"state": "enabled",
137+
"auto_restart": "enabled",
138+
"high_mem_alert": "disabled"
134139
}
135140
}

tests/mock_tables/asic2/config_db.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,5 +119,10 @@
119119
"PFC_WD|GLOBAL": {
120120
"BIG_RED_SWITCH": "enable",
121121
"POLL_INTERVAL": "199"
122+
},
123+
"FEATURE|bgp": {
124+
"state": "disabled",
125+
"auto_restart": "disabled",
126+
"high_mem_alert": "disabled"
122127
}
123128
}

0 commit comments

Comments
 (0)