From 4e9b5616f94259798307788ad4fca56afbe56e55 Mon Sep 17 00:00:00 2001 From: Isabella de Leon Date: Tue, 4 Apr 2023 14:57:27 -0700 Subject: [PATCH] [show/tests] Add support for "show run isis" Signed-off-by: ideleon@microsoft.com --- show/main.py | 58 ++++++++++++++++++++ tests/conftest.py | 8 ++- tests/isis_frr_input/isis_frr_test_vector.py | 57 +++++++++++++++++++ tests/isis_frr_test.py | 21 +++++++ 4 files changed, 142 insertions(+), 2 deletions(-) diff --git a/show/main.py b/show/main.py index eaa17e16ee..e96490c375 100755 --- a/show/main.py +++ b/show/main.py @@ -1481,6 +1481,64 @@ def bgp(namespace, verbose): print(output) +# 'isis' subcommand ("show runningconfiguration isis") +@runningconfiguration.command() +@click.option('--verbose', is_flag=True, help="Enable verbose output") +@click.option('--config_db', is_flag=True, help="Enable config DB output") +@click.option('--namespace', '-n', 'namespace', required=False, default=None, type=str, show_default=False, + help='Option needed for multi-asic only: provide namespace name', + callback=multi_asic_util.multi_asic_namespace_validation_callback) +def isis(namespace, config_db, verbose): + """ + Show ISIS running configuration + Note: + multi-asic can run 'show run isis' and show from all asics, or 'show run isis -n ' + single-asic only run 'show run isis', '-n' is not available + """ + + if multi_asic.is_multi_asic(): + if namespace and namespace not in multi_asic.get_namespace_list(): + ctx = click.get_current_context() + ctx.fail("invalid value for -n/--namespace option. provide namespace from list {}".format(multi_asic.get_namespace_list())) + if not multi_asic.is_multi_asic() and namespace: + ctx = click.get_current_context() + ctx.fail("-n/--namespace is not available for single asic") + + if (config_db): + full_isis_conf = {} + + cmd = "sonic-cfggen -d --var-json ISIS_GLOBAL" + global_output = run_command(cmd, return_cmd=True) + + cmd = "sonic-cfggen -d --var-json ISIS_LEVEL" + level_output = run_command(cmd, return_cmd=True) + + cmd = "sonic-cfggen -d --var-json ISIS_INTERFACE" + interface_output = run_command(cmd, return_cmd=True) + + full_isis_conf["ISIS_GLOBAL"] = json.loads(global_output) + full_isis_conf["ISIS_LEVEL"] = json.loads(level_output) + full_isis_conf["ISIS_INTERFACE"] = json.loads(interface_output) + + click.echo(json.dumps(full_isis_conf, indent=4)) + else: + output = "" + cmd = "show running-config isis" + import utilities_common.bgp_util as bgp_util + if multi_asic.is_multi_asic(): + if not namespace: + ns_list = multi_asic.get_namespace_list() + for ns in ns_list: + output += "\n------------Showing running config isis on {}------------\n".format(ns) + output += bgp_util.run_bgp_show_command(cmd, ns) + else: + output += "\n------------Showing running config isis on {}------------\n".format(namespace) + output += bgp_util.run_bgp_show_command(cmd, namespace) + else: + output += bgp_util.run_bgp_show_command(cmd) + click.echo(output.rstrip('\n')) + + # 'interfaces' subcommand ("show runningconfiguration interfaces") @runningconfiguration.command() @click.argument('interfacename', required=False) diff --git a/tests/conftest.py b/tests/conftest.py index f84d111117..c33ece1241 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -22,7 +22,8 @@ mock_show_isis_neighbors, mock_show_isis_database, mock_show_isis_hostname, - mock_show_isis_interface + mock_show_isis_interface, + mock_show_run_isis ) from . import config_int_ip_common import utilities_common.constants as constants @@ -395,7 +396,10 @@ def setup_single_isis_instance(request): elif request.param.startswith('isis_interface') or \ request.param.startswith('isis_interface'): bgp_util.run_bgp_command = mock.MagicMock( - return_value=mock_show_isis_interface(request)) + return_value=mock_show_isis_interface(request)) + elif request.param.startswith('show_run_isis'): + bgp_util.run_bgp_command = mock.MagicMock( + return_value=mock_show_run_isis(request)) yield bgp_util.run_bgp_command = _old_run_bgp_command diff --git a/tests/isis_frr_input/isis_frr_test_vector.py b/tests/isis_frr_input/isis_frr_test_vector.py index 24009b1379..88ef020540 100644 --- a/tests/isis_frr_input/isis_frr_test_vector.py +++ b/tests/isis_frr_input/isis_frr_test_vector.py @@ -452,6 +452,53 @@ def mock_show_isis_interface(request): else: return "" +show_run_isis_output = \ +"""Building configuration... + +Current configuration: +! +frr version 8.2.2 +frr defaults traditional +hostname vlab-01 +log syslog informational +log facility local4 +no service integrated-vtysh-config +! +password zebra +enable password zebra +! +interface PortChannel101 + ip router isis 1 + ipv6 router isis 1 + isis network point-to-point +exit +! +router isis 1 + is-type level-2-only + net 49.0001.1720.1700.0002.00 + lsp-mtu 1383 + lsp-timers level-1 gen-interval 30 refresh-interval 900 max-lifetime 1200 + lsp-timers level-2 gen-interval 30 refresh-interval 305 max-lifetime 900 + log-adjacency-changes +exit +! +end +""" + +show_run_isis_invalid_help_output = \ +"""Usage: isis [OPTIONS] +Try "isis --help" for help. + +Error: Got unexpected extra argument (?) +""" + +def mock_show_run_isis(request): + if request.param == 'show_run_isis_output': + return show_run_isis_output + elif request.param == 'show_run_isis_invalid_help_output': + return show_run_isis_invalid_help_output + else: + return "" testData = { 'isis_neighbors': { @@ -554,4 +601,14 @@ def mock_show_isis_interface(request): 'rc': 2, 'rc_output': isis_interface_unknown_ifname_output }, + 'show_run_isis': { + 'args': [], + 'rc': 0, + 'rc_output': show_run_isis_output + }, + 'show_run_isis_invalid_help': { + 'args': ['?'], + 'rc': 2, + 'rc_output': show_run_isis_invalid_help_output + }, } diff --git a/tests/isis_frr_test.py b/tests/isis_frr_test.py index 946cdc2580..3fe6e27633 100644 --- a/tests/isis_frr_test.py +++ b/tests/isis_frr_test.py @@ -125,3 +125,24 @@ def test_isis_interface(self, show = setup_isis_commands exec_cmd = show.cli.commands["isis"].commands["interface"] executor(test_vector, show, exec_cmd) + + +class TestShowRunIsis(object): + + @classmethod + def setup_class(cls): + print("SETUP") + + @pytest.mark.parametrize('setup_single_isis_instance, test_vector', + [ + ('show_run_isis_output', 'show_run_isis'), + ('show_run_isis_invalid_help_output', 'show_run_isis_invalid_help') + ], + indirect=['setup_single_isis_instance']) + def test_show_run_isis(self, + setup_isis_commands, + setup_single_isis_instance, + test_vector): + show = setup_isis_commands + exec_cmd = show.cli.commands["runningconfiguration"].commands["isis"] + executor(test_vector, show, exec_cmd)