Skip to content

Commit f139f79

Browse files
gpunathilellrameshraghupathy
authored andcommitted
Fix multi asic initialization for dump command (sonic-net#4108)
- What I did To add initializeGlobalConfig for dump command in case of multi asic implementation, This is to prevent the error: root@dut:/home/admin# dump state interface Ethernet0 -n asic0 Traceback (most recent call last): File "/usr/local/bin/dump", line 8, in <module> sys.exit(dump()) ^^^^^^ File "/usr/local/lib/python3.11/dist-packages/click/core.py", line 764, in __call__ return self.main(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/dist-packages/click/core.py", line 717, in main rv = self.invoke(ctx) ^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/dist-packages/click/core.py", line 1137, in invoke return _process_result(sub_ctx.command.invoke(sub_ctx)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/dist-packages/click/core.py", line 956, in invoke return ctx.invoke(self.callback, **ctx.params) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/dist-packages/click/core.py", line 555, in invoke return callback(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/dist-packages/click/decorators.py", line 17, in new_func return f(get_current_context(), *args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/dist-packages/dump/main.py", line 96, in state collected_info = populate_fv(collected_info, module, namespace, ctx.obj.conn_pool, obj.return_pb2_obj()) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/dist-packages/dump/main.py", line 159, in populate_fv conn_pool.get(db_name, namespace) File "/usr/local/lib/python3.11/dist-packages/dump/match_infra.py", line 316, in get self.cache[ns][CONN] = self.initialize_connector(ns) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/dist-packages/dump/match_infra.py", line 298, in initialize_connector return SonicV2Connector(namespace=ns, use_unix_socket_path=True) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/swsscommon/swsscommon.py", line 2138, in __init__ for db_name in self.get_db_list(): ^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/swsscommon/swsscommon.py", line 2075, in get_db_list return _swsscommon.SonicV2Connector_Native_get_db_list(self) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ RuntimeError: :- validateNamespace: Initialize global DB config using API SonicDBConfig::initializeGlobalConfig On multi asic system - How I did it Initialize global config - How to verify it Run unit test Signed-off-by: gpunathilell <[email protected]> Signed-off-by: Ramesh Raghupathy <[email protected]>
1 parent ec3c7fe commit f139f79

2 files changed

Lines changed: 45 additions & 1 deletion

File tree

dump/main.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from sonic_py_common import multi_asic
88
from utilities_common.constants import DEFAULT_NAMESPACE
99
from dump.match_infra import RedisSource, JsonSource, MatchEngine, CONN
10-
from swsscommon.swsscommon import ConfigDBConnector
10+
from swsscommon.swsscommon import ConfigDBConnector, SonicDBConfig
1111
from dump import plugins
1212

1313

@@ -62,6 +62,9 @@ def state(ctx, module, identifier, db, table, key_map, verbose, namespace):
6262
click.echo("Namespace option is not valid. Choose one of {}".format(multi_asic.get_namespace_list()))
6363
ctx.exit()
6464

65+
if multi_asic.is_multi_asic() and not SonicDBConfig.isGlobalInit():
66+
SonicDBConfig.initializeGlobalConfig()
67+
6568
if module not in plugins.dump_modules:
6669
click.echo("No Matching Plugin has been Implemented")
6770
ctx.exit()

tests/dump_tests/dump_state_test.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -337,3 +337,44 @@ def test_invalid_namespace(self, match_engine_masic):
337337
result = runner.invoke(dump.state, ["port", "Ethernet0", "--namespace", "asic3"], obj=match_engine_masic)
338338
assert result.output == "Namespace option is not valid. Choose one of ['asic0', 'asic1']\n", result
339339

340+
341+
class TestMultiAsicInit:
342+
"""Test multi-asic initialization in dump command group"""
343+
344+
@mock.patch('dump.plugins.dump_modules', {})
345+
@mock.patch('dump.main.SonicDBConfig')
346+
@mock.patch('dump.main.multi_asic')
347+
def test_multi_asic_global_config_init(self, mock_multi_asic, mock_sonic_db_config):
348+
"""Test that SonicDBConfig.initializeGlobalConfig() is called when multi-asic and not initialized"""
349+
mock_multi_asic.is_multi_asic.return_value = True
350+
mock_sonic_db_config.isGlobalInit.return_value = False
351+
runner = CliRunner()
352+
runner.invoke(dump.state, ['port', 'Ethernet0'])
353+
mock_multi_asic.is_multi_asic.assert_called()
354+
mock_sonic_db_config.isGlobalInit.assert_called()
355+
mock_sonic_db_config.initializeGlobalConfig.assert_called_once()
356+
357+
@mock.patch('dump.plugins.dump_modules', {})
358+
@mock.patch('dump.main.SonicDBConfig')
359+
@mock.patch('dump.main.multi_asic')
360+
def test_multi_asic_already_initialized(self, mock_multi_asic, mock_sonic_db_config):
361+
"""Test that initializeGlobalConfig() is NOT called when already initialized"""
362+
mock_multi_asic.is_multi_asic.return_value = True
363+
mock_sonic_db_config.isGlobalInit.return_value = True
364+
runner = CliRunner()
365+
runner.invoke(dump.state, ['port', 'Ethernet0'])
366+
mock_multi_asic.is_multi_asic.assert_called()
367+
mock_sonic_db_config.isGlobalInit.assert_called()
368+
mock_sonic_db_config.initializeGlobalConfig.assert_not_called()
369+
370+
@mock.patch('dump.plugins.dump_modules', {})
371+
@mock.patch('dump.main.SonicDBConfig')
372+
@mock.patch('dump.main.multi_asic')
373+
def test_single_asic_no_init(self, mock_multi_asic, mock_sonic_db_config):
374+
"""Test that initializeGlobalConfig() is NOT called on single-asic systems"""
375+
mock_multi_asic.is_multi_asic.return_value = False
376+
runner = CliRunner()
377+
runner.invoke(dump.state, ['port', 'Ethernet0'])
378+
mock_multi_asic.is_multi_asic.assert_called()
379+
mock_sonic_db_config.isGlobalInit.assert_not_called()
380+
mock_sonic_db_config.initializeGlobalConfig.assert_not_called()

0 commit comments

Comments
 (0)