From d69218d8b341aef008cf3aa4de9719ac4a1da41a Mon Sep 17 00:00:00 2001 From: Anders Linn Date: Tue, 22 Apr 2025 20:33:05 +0000 Subject: [PATCH] Issue #22407: ConfigReload fails when RADIUS statistics is enabled RADIUS statistics adds a config entry which is not valid in YANG. The option adds the True/False boolean values instead of the 'true'/'false' booleans that YANG defines, which causes failures when trying to reload/replace the config. --- config/aaa.py | 4 ++-- tests/radius_test.py | 52 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 2 deletions(-) diff --git a/config/aaa.py b/config/aaa.py index fdb784dc4a..b9959da1df 100644 --- a/config/aaa.py +++ b/config/aaa.py @@ -479,9 +479,9 @@ def statistics(option): del_table_key('RADIUS', 'global', 'statistics') else: if option == 'enable': - add_table_kv('RADIUS', 'global', 'statistics', True) + add_table_kv('RADIUS', 'global', 'statistics', 'true') elif option == 'disable': - add_table_kv('RADIUS', 'global', 'statistics', False) + add_table_kv('RADIUS', 'global', 'statistics', 'false') radius.add_command(statistics) diff --git a/tests/radius_test.py b/tests/radius_test.py index 928e629616..eff06cdce4 100644 --- a/tests/radius_test.py +++ b/tests/radius_test.py @@ -207,6 +207,58 @@ def test_config_radius_authtype(self, get_cmd_module): assert result.exit_code == 0 assert result.output == show_radius_default_output + def test_config_radius_statistics(self, get_cmd_module): + (config, show) = get_cmd_module + runner = CliRunner() + db = Db() + db.cfgdb.delete_table("RADIUS") + + result = runner.invoke(config.config.commands["radius"], + ["statistics", "enable"]) + print(result.exit_code) + print(result.output) + assert result.exit_code == 0 + assert result.output == config_radius_empty_output + + db.cfgdb.mod_entry("RADIUS", "global", {'statistics': 'true'}) + + result = runner.invoke(show.cli.commands["radius"], [], obj=db) + print(result.exit_code) + print(result.output) + assert result.exit_code == 0 + assert "RADIUS global statistics true" in result.output + + result = runner.invoke(config.config.commands["radius"], + ["statistics", "disable"]) + print(result.exit_code) + print(result.output) + assert result.exit_code == 0 + assert result.output == config_radius_empty_output + + db.cfgdb.mod_entry("RADIUS", "global", {'statistics': 'false'}) + + result = runner.invoke(show.cli.commands["radius"], [], obj=db) + print(result.exit_code) + print(result.output) + assert result.exit_code == 0 + assert "RADIUS global statistics false" in result.output + + result = runner.invoke(config.config.commands["radius"], + ["statistics", "default"]) + print(result.exit_code) + print(result.output) + assert result.exit_code == 0 + assert result.output == config_radius_empty_output + + db.cfgdb.mod_entry("RADIUS", "global", {'statistics': 'default'}) + + result = runner.invoke(show.cli.commands["radius"], [], obj=db) + print(result.exit_code) + print(result.output) + assert result.exit_code == 0 + assert "RADIUS global statistics true" not in result.output + assert "RADIUS global statistics false" not in result.output + @patch("validated_config_db_connector.device_info.is_yang_config_validation_enabled", mock.Mock(return_value=True)) @patch("config.validated_config_db_connector.ValidatedConfigDBConnector.validated_set_entry", mock.Mock(side_effect=ValueError)) def test_config_radius_server_invalidkey_yang_validation(self):