From e22980f768631c9cdfe5014b0d7b73970d558404 Mon Sep 17 00:00:00 2001 From: Blueve <672454911@qq.com> Date: Wed, 9 Dec 2020 09:29:18 +0800 Subject: [PATCH] [config/console][consutil] Support enable/disable console switch (#1275) * [config/console][consutil] Support enable/disable console switch * Changed the key to aligned with feature table style Signed-off-by: Jing Kan jika@microsoft.com --- config/console.py | 32 +++++++++++++++++++++++ consutil/lib.py | 4 +++ consutil/main.py | 9 ++++++- tests/console_test.py | 60 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 104 insertions(+), 1 deletion(-) diff --git a/config/console.py b/config/console.py index 0a3cfbe5c8d2..b28aeda67231 100644 --- a/config/console.py +++ b/config/console.py @@ -9,6 +9,38 @@ def console(): """Console-related configuration tasks""" pass +# +# 'console enable' group ('config console enable') +# +@console.command('enable') +@clicommon.pass_db +def enable_console_switch(db): + """Enable console switch""" + config_db = db.cfgdb + + table = "CONSOLE_SWITCH" + dataKey1 = 'console_mgmt' + dataKey2 = 'enabled' + + data = { dataKey2 : "yes" } + config_db.mod_entry(table, dataKey1, data) + +# +# 'console disable' group ('config console disable') +# +@console.command('disable') +@clicommon.pass_db +def disable_console_switch(db): + """Disable console switch""" + config_db = db.cfgdb + + table = "CONSOLE_SWITCH" + dataKey1 = 'console_mgmt' + dataKey2 = 'enabled' + + data = { dataKey2 : "no" } + config_db.mod_entry(table, dataKey1, data) + # # 'console add' group ('config console add ...') # diff --git a/consutil/lib.py b/consutil/lib.py index 4ba64770145b..0172ac5644c5 100644 --- a/consutil/lib.py +++ b/consutil/lib.py @@ -22,6 +22,8 @@ ERR_BUSY = 5 CONSOLE_PORT_TABLE = "CONSOLE_PORT" +CONSOLE_SWITCH_TABLE = "CONSOLE_SWITCH" + LINE_KEY = "LINE" CUR_STATE_KEY = "CUR_STATE" @@ -29,6 +31,8 @@ BAUD_KEY = "baud_rate" DEVICE_KEY = "remote_device" FLOW_KEY = "flow_control" +FEATURE_KEY = "console_mgmt" +FEATURE_ENABLED_KEY = "enabled" # STATE_DB Keys STATE_KEY = "state" diff --git a/consutil/main.py b/consutil/main.py index 535ec413c278..b4ee3fa4fe8a 100644 --- a/consutil/main.py +++ b/consutil/main.py @@ -17,8 +17,15 @@ raise ImportError("%s - required module not found" % str(e)) @click.group() -def consutil(): +@clicommon.pass_db +def consutil(db): """consutil - Command-line utility for interacting with switches via console device""" + config_db = db.cfgdb + data = config_db.get_entry(CONSOLE_SWITCH_TABLE, FEATURE_KEY) + if FEATURE_ENABLED_KEY not in data or data[FEATURE_ENABLED_KEY] == "no": + click.echo("Console switch feature is disabled") + sys.exit(ERR_DISABLE) + SysInfoProvider.init_device_prefix() # 'show' subcommand diff --git a/tests/console_test.py b/tests/console_test.py index 6152c0d0dbe4..c38b7ebb568a 100644 --- a/tests/console_test.py +++ b/tests/console_test.py @@ -20,6 +20,24 @@ class TestConfigConsoleCommands(object): def setup_class(cls): print("SETUP") + def test_enable_console_switch(self): + runner = CliRunner() + db = Db() + + result = runner.invoke(config.config.commands["console"].commands["enable"]) + print(result.exit_code) + print(sys.stderr, result.output) + assert result.exit_code == 0 + + def test_disable_console_switch(self): + runner = CliRunner() + db = Db() + + result = runner.invoke(config.config.commands["console"].commands["disable"]) + print(result.exit_code) + print(sys.stderr, result.output) + assert result.exit_code == 0 + def test_console_add_exists(self): runner = CliRunner() db = Db() @@ -465,6 +483,48 @@ def test_sys_info_provider_get_active_console_process_info_nonexists(self): proc = SysInfoProvider.get_active_console_process_info("2") assert proc is None +class TestConsutil(object): + @classmethod + def setup_class(cls): + print("SETUP") + + @mock.patch('consutil.lib.SysInfoProvider.init_device_prefix', mock.MagicMock(return_value=None)) + @mock.patch('consutil.main.show', mock.MagicMock(return_value=None)) + def test_consutil_feature_disabled_null_config(self): + runner = CliRunner() + db = Db() + + result = runner.invoke(consutil.consutil, ['show'], obj=db) + print(result.exit_code) + print(sys.stderr, result.output) + assert result.exit_code == 1 + assert result.output == "Console switch feature is disabled\n" + + @mock.patch('consutil.lib.SysInfoProvider.init_device_prefix', mock.MagicMock(return_value=None)) + @mock.patch('consutil.main.show', mock.MagicMock(return_value=None)) + def test_consutil_feature_disabled_config(self): + runner = CliRunner() + db = Db() + db.cfgdb.set_entry("CONSOLE_SWITCH", "console_mgmt", { "enabled" : "no" }) + + result = runner.invoke(consutil.consutil, ['show'], obj=db) + print(result.exit_code) + print(sys.stderr, result.output) + assert result.exit_code == 1 + assert result.output == "Console switch feature is disabled\n" + + @mock.patch('consutil.lib.SysInfoProvider.init_device_prefix', mock.MagicMock(return_value=None)) + @mock.patch('consutil.main.show', mock.MagicMock(return_value=None)) + def test_consutil_feature_enabled(self): + runner = CliRunner() + db = Db() + db.cfgdb.set_entry("CONSOLE_SWITCH", "console_mgmt", { "enabled" : "yes" }) + + result = runner.invoke(consutil.consutil, ['show'], obj=db) + print(result.exit_code) + print(sys.stderr, result.output) + assert result.exit_code == 0 + class TestConsutilShow(object): @classmethod def setup_class(cls):