From 88ffb16721d6f867f71100bb14564120a456e07b Mon Sep 17 00:00:00 2001 From: jingwenxie Date: Mon, 1 May 2023 10:49:04 +0800 Subject: [PATCH] [config]config reload should generate sysinfo if missing (#2778) What I did Missing platform and mac in CONFIG_DB will result in container failure. We should make the config reload generate those info if missing. How I did it Add missing sys info if config_db.json doesn't contain it. How to verify it Unit test --- config/main.py | 13 ++++++++++ tests/config_test.py | 61 +++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 73 insertions(+), 1 deletion(-) diff --git a/config/main.py b/config/main.py index b2c9198b01..624241d175 100644 --- a/config/main.py +++ b/config/main.py @@ -1536,6 +1536,19 @@ def reload(db, filename, yes, load_sysinfo, no_service_restart, force, file_form click.echo("The config file {} doesn't exist".format(file)) continue + if file_format == 'config_db': + file_input = read_json_file(file) + + platform = file_input.get("DEVICE_METADATA", {}).\ + get("localhost", {}).get("platform") + mac = file_input.get("DEVICE_METADATA", {}).\ + get("localhost", {}).get("mac") + + if not platform or not mac: + log.log_warning("Input file does't have platform or mac. platform: {}, mac: {}" + .format(None if platform is None else platform, None if mac is None else mac)) + load_sysinfo = True + if load_sysinfo: try: command = [SONIC_CFGGEN_PATH, "-j", file, '-v', "DEVICE_METADATA.localhost.hwsku"] diff --git a/tests/config_test.py b/tests/config_test.py index 1efbc3e4f5..859d5a8255 100644 --- a/tests/config_test.py +++ b/tests/config_test.py @@ -398,9 +398,66 @@ def setup_class(cls): print("SETUP") import config.main importlib.reload(config.main) - open(cls.dummy_cfg_file, 'w').close() + + def add_sysinfo_to_cfg_file(self): + with open(self.dummy_cfg_file, 'w') as f: + device_metadata = { + "DEVICE_METADATA": { + "localhost": { + "platform": "some_platform", + "mac": "02:42:f0:7f:01:05" + } + } + } + f.write(json.dumps(device_metadata)) + + def test_reload_config_invalid_input(self, get_cmd_module, setup_single_broadcom_asic): + open(self.dummy_cfg_file, 'w').close() + with mock.patch( + "utilities_common.cli.run_command", + mock.MagicMock(side_effect=mock_run_command_side_effect) + ) as mock_run_command: + (config, show) = get_cmd_module + runner = CliRunner() + + result = runner.invoke( + config.config.commands["reload"], + [self.dummy_cfg_file, '-y', '-f']) + + print(result.exit_code) + print(result.output) + traceback.print_tb(result.exc_info[2]) + assert result.exit_code != 0 + + def test_reload_config_no_sysinfo(self, get_cmd_module, setup_single_broadcom_asic): + with open(self.dummy_cfg_file, 'w') as f: + device_metadata = { + "DEVICE_METADATA": { + "localhost": { + "hwsku": "some_hwsku" + } + } + } + f.write(json.dumps(device_metadata)) + + with mock.patch( + "utilities_common.cli.run_command", + mock.MagicMock(side_effect=mock_run_command_side_effect) + ) as mock_run_command: + (config, show) = get_cmd_module + runner = CliRunner() + + result = runner.invoke( + config.config.commands["reload"], + [self.dummy_cfg_file, '-y', '-f']) + + print(result.exit_code) + print(result.output) + traceback.print_tb(result.exc_info[2]) + assert result.exit_code == 0 def test_reload_config(self, get_cmd_module, setup_single_broadcom_asic): + self.add_sysinfo_to_cfg_file() with mock.patch( "utilities_common.cli.run_command", mock.MagicMock(side_effect=mock_run_command_side_effect) @@ -420,6 +477,7 @@ def test_reload_config(self, get_cmd_module, setup_single_broadcom_asic): == RELOAD_CONFIG_DB_OUTPUT def test_config_reload_disabled_service(self, get_cmd_module, setup_single_broadcom_asic): + self.add_sysinfo_to_cfg_file() with mock.patch( "utilities_common.cli.run_command", mock.MagicMock(side_effect=mock_run_command_side_effect_disabled_timer) @@ -439,6 +497,7 @@ def test_config_reload_disabled_service(self, get_cmd_module, setup_single_broad assert "\n".join([l.rstrip() for l in result.output.split('\n')]) == reload_config_with_disabled_service_output def test_reload_config_masic(self, get_cmd_module, setup_multi_broadcom_masic): + self.add_sysinfo_to_cfg_file() with mock.patch( "utilities_common.cli.run_command", mock.MagicMock(side_effect=mock_run_command_side_effect)