Skip to content

[show/tests] Add support for "show run isis" #1

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Apr 21, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 58 additions & 0 deletions show/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 <ns>'
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)
Expand Down
8 changes: 6 additions & 2 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
57 changes: 57 additions & 0 deletions tests/isis_frr_input/isis_frr_test_vector.py
Original file line number Diff line number Diff line change
Expand Up @@ -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': {
Expand Down Expand Up @@ -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
},
}
21 changes: 21 additions & 0 deletions tests/isis_frr_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)