From 379b9bd2d4461fc4e1003db2212dee2adb6f218c Mon Sep 17 00:00:00 2001 From: gpunathilell Date: Thu, 30 Oct 2025 15:13:19 +0000 Subject: [PATCH 1/3] Fix multi asic initialization --- dump/main.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/dump/main.py b/dump/main.py index 89cbb60321..b300f0711b 100644 --- a/dump/main.py +++ b/dump/main.py @@ -7,7 +7,7 @@ from sonic_py_common import multi_asic from utilities_common.constants import DEFAULT_NAMESPACE from dump.match_infra import RedisSource, JsonSource, MatchEngine, CONN -from swsscommon.swsscommon import ConfigDBConnector +from swsscommon.swsscommon import ConfigDBConnector, SonicDBConfig from dump import plugins # Autocompletion Helper @@ -31,6 +31,8 @@ def show_modules(ctx, param, value): @click.pass_context def dump(ctx): ctx.obj = MatchEngine() + if multi_asic.is_multi_asic() and not SonicDBConfig.isGlobalInit(): + SonicDBConfig.initializeGlobalConfig() @dump.command() From fa22ea68c393529aed00988ea65c486da194f74d Mon Sep 17 00:00:00 2001 From: gpunathilell Date: Thu, 30 Oct 2025 15:54:08 +0000 Subject: [PATCH 2/3] Add tests --- dump/main.py | 5 ++-- tests/dump_tests/dump_state_test.py | 41 +++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/dump/main.py b/dump/main.py index b300f0711b..04499c33fb 100644 --- a/dump/main.py +++ b/dump/main.py @@ -31,8 +31,6 @@ def show_modules(ctx, param, value): @click.pass_context def dump(ctx): ctx.obj = MatchEngine() - if multi_asic.is_multi_asic() and not SonicDBConfig.isGlobalInit(): - SonicDBConfig.initializeGlobalConfig() @dump.command() @@ -63,6 +61,9 @@ def state(ctx, module, identifier, db, table, key_map, verbose, namespace): click.echo("Namespace option is not valid. Choose one of {}".format(multi_asic.get_namespace_list())) ctx.exit() + if multi_asic.is_multi_asic() and not SonicDBConfig.isGlobalInit(): + SonicDBConfig.initializeGlobalConfig() + if module not in plugins.dump_modules: click.echo("No Matching Plugin has been Implemented") ctx.exit() diff --git a/tests/dump_tests/dump_state_test.py b/tests/dump_tests/dump_state_test.py index 5468d966ee..d06dc7c9e7 100644 --- a/tests/dump_tests/dump_state_test.py +++ b/tests/dump_tests/dump_state_test.py @@ -337,3 +337,44 @@ def test_invalid_namespace(self, match_engine_masic): result = runner.invoke(dump.state, ["port", "Ethernet0", "--namespace", "asic3"], obj=match_engine_masic) assert result.output == "Namespace option is not valid. Choose one of ['asic0', 'asic1']\n", result +class TestMultiAsicInit: + """Test multi-asic initialization in dump command group""" + + @mock.patch('dump.plugins.dump_modules', {}) + @mock.patch('dump.main.SonicDBConfig') + @mock.patch('dump.main.multi_asic') + def test_multi_asic_global_config_init(self, mock_multi_asic, mock_sonic_db_config): + """Test that SonicDBConfig.initializeGlobalConfig() is called when multi-asic and not initialized""" + mock_multi_asic.is_multi_asic.return_value = True + mock_sonic_db_config.isGlobalInit.return_value = False + runner = CliRunner() + result = runner.invoke(dump.state, ['port', 'Ethernet0']) + mock_multi_asic.is_multi_asic.assert_called() + mock_sonic_db_config.isGlobalInit.assert_called() + mock_sonic_db_config.initializeGlobalConfig.assert_called_once() + + @mock.patch('dump.plugins.dump_modules', {}) + @mock.patch('dump.main.SonicDBConfig') + @mock.patch('dump.main.multi_asic') + def test_multi_asic_already_initialized(self, mock_multi_asic, mock_sonic_db_config): + """Test that initializeGlobalConfig() is NOT called when already initialized""" + mock_multi_asic.is_multi_asic.return_value = True + mock_sonic_db_config.isGlobalInit.return_value = True + runner = CliRunner() + result = runner.invoke(dump.state, ['port', 'Ethernet0']) + mock_multi_asic.is_multi_asic.assert_called() + mock_sonic_db_config.isGlobalInit.assert_called() + mock_sonic_db_config.initializeGlobalConfig.assert_not_called() + + @mock.patch('dump.plugins.dump_modules', {}) + @mock.patch('dump.main.SonicDBConfig') + @mock.patch('dump.main.multi_asic') + def test_single_asic_no_init(self, mock_multi_asic, mock_sonic_db_config): + """Test that initializeGlobalConfig() is NOT called on single-asic systems""" + mock_multi_asic.is_multi_asic.return_value = False + runner = CliRunner() + result = runner.invoke(dump.state, ['port', 'Ethernet0']) + mock_multi_asic.is_multi_asic.assert_called() + mock_sonic_db_config.isGlobalInit.assert_not_called() + mock_sonic_db_config.initializeGlobalConfig.assert_not_called() + From 181f875152e7da4164211dec1ce1f505af238bb4 Mon Sep 17 00:00:00 2001 From: gpunathilell Date: Thu, 30 Oct 2025 16:25:58 +0000 Subject: [PATCH 3/3] Fix lint errors --- tests/dump_tests/dump_state_test.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/dump_tests/dump_state_test.py b/tests/dump_tests/dump_state_test.py index d06dc7c9e7..9333ab7cfe 100644 --- a/tests/dump_tests/dump_state_test.py +++ b/tests/dump_tests/dump_state_test.py @@ -337,6 +337,7 @@ def test_invalid_namespace(self, match_engine_masic): result = runner.invoke(dump.state, ["port", "Ethernet0", "--namespace", "asic3"], obj=match_engine_masic) assert result.output == "Namespace option is not valid. Choose one of ['asic0', 'asic1']\n", result + class TestMultiAsicInit: """Test multi-asic initialization in dump command group""" @@ -348,7 +349,7 @@ def test_multi_asic_global_config_init(self, mock_multi_asic, mock_sonic_db_conf mock_multi_asic.is_multi_asic.return_value = True mock_sonic_db_config.isGlobalInit.return_value = False runner = CliRunner() - result = runner.invoke(dump.state, ['port', 'Ethernet0']) + runner.invoke(dump.state, ['port', 'Ethernet0']) mock_multi_asic.is_multi_asic.assert_called() mock_sonic_db_config.isGlobalInit.assert_called() mock_sonic_db_config.initializeGlobalConfig.assert_called_once() @@ -361,7 +362,7 @@ def test_multi_asic_already_initialized(self, mock_multi_asic, mock_sonic_db_con mock_multi_asic.is_multi_asic.return_value = True mock_sonic_db_config.isGlobalInit.return_value = True runner = CliRunner() - result = runner.invoke(dump.state, ['port', 'Ethernet0']) + runner.invoke(dump.state, ['port', 'Ethernet0']) mock_multi_asic.is_multi_asic.assert_called() mock_sonic_db_config.isGlobalInit.assert_called() mock_sonic_db_config.initializeGlobalConfig.assert_not_called() @@ -373,7 +374,7 @@ def test_single_asic_no_init(self, mock_multi_asic, mock_sonic_db_config): """Test that initializeGlobalConfig() is NOT called on single-asic systems""" mock_multi_asic.is_multi_asic.return_value = False runner = CliRunner() - result = runner.invoke(dump.state, ['port', 'Ethernet0']) + runner.invoke(dump.state, ['port', 'Ethernet0']) mock_multi_asic.is_multi_asic.assert_called() mock_sonic_db_config.isGlobalInit.assert_not_called() mock_sonic_db_config.initializeGlobalConfig.assert_not_called()