diff --git a/dump/main.py b/dump/main.py index 89cbb60321..04499c33fb 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 @@ -61,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..9333ab7cfe 100644 --- a/tests/dump_tests/dump_state_test.py +++ b/tests/dump_tests/dump_state_test.py @@ -337,3 +337,45 @@ 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() + 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() + 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() + 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() +