diff --git a/setup.py b/setup.py index 08ae72959d67..3d9fa8029733 100644 --- a/setup.py +++ b/setup.py @@ -58,6 +58,7 @@ 'mock_tables/*.json', 'mock_tables/asic0/*.json', 'mock_tables/asic1/*.json', + 'mock_tables/asic2/*.json', 'filter_fdb_input/*', 'pfcwd_input/*', 'wm_input/*'] diff --git a/show/bgp_common.py b/show/bgp_common.py index 788bda1d443a..7ff859e06735 100644 --- a/show/bgp_common.py +++ b/show/bgp_common.py @@ -330,6 +330,7 @@ def show_routes(args, namespace, display, verbose, ipver): device = multi_asic_util.MultiAsic(display, namespace) arg_strg = "" found_json = 0 + found_tables = 0 ns_l = [] print_ns_str = False filter_by_ip = False @@ -356,14 +357,22 @@ def show_routes(args, namespace, display, verbose, ipver): arg_strg += str(arg) + " " if str(arg) == "json": found_json = 1 + elif str(arg) == "tables": + found_tables = 1 else: try: filter_by_ip = ipaddress.ip_network(arg) except ValueError: # Not ip address just ignore it pass - if not found_json: - arg_strg += "json" + # Due to options such as "summary" and "tables" are not yet supported in multi-asic platform + # we will let FRR handle all the processing instead of handling it here for non multi-asic platform + if multi_asic.is_multi_asic(): + if found_tables: + print("% Unknown command: show {} route {}".format(ipver, arg_strg)) + return + if not found_json: + arg_strg += "json" combined_route = {} for ns in ns_l: # Need to add "ns" to form bgpX so it is sent to the correct bgpX docker to handle the request @@ -373,6 +382,8 @@ def show_routes(args, namespace, display, verbose, ipver): output = bgp_util.run_bgp_command(cmd, ns) else: output = bgp_util.run_bgp_command(cmd) + print("{}".format(output)) + return # in case no output or something went wrong with user specified cmd argument(s) error it out # error from FRR always start with character "%" @@ -394,6 +405,9 @@ def show_routes(args, namespace, display, verbose, ipver): else: combined_route = route_info + if not combined_route: + return + if not found_json: #print out the header if this is not a json request if not filter_by_ip: diff --git a/tests/conftest.py b/tests/conftest.py index 5d546ad32d53..5f28a2d8ba74 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -8,7 +8,7 @@ from swsssdk import ConfigDBConnector from .mock_tables import dbconnector - +from . import show_ip_route_common test_path = os.path.dirname(os.path.abspath(__file__)) modules_path = os.path.dirname(test_path) @@ -85,21 +85,6 @@ def setup_single_bgp_instance(request): elif request.param == 'v6': bgp_mocked_json = os.path.join( test_path, 'mock_tables', 'ipv6_bgp_summary.json') - elif request.param == 'ip_route': - bgp_mocked_json = os.path.join( - test_path, 'mock_tables', 'ip_route.json') - elif request.param == 'ip_specific_route': - bgp_mocked_json = os.path.join( - test_path, 'mock_tables', 'ip_specific_route.json') - elif request.param == 'ip_special_route': - bgp_mocked_json = os.path.join( - test_path, 'mock_tables', 'ip_special_route.json') - elif request.param == 'ipv6_route': - bgp_mocked_json = os.path.join( - test_path, 'mock_tables', 'ipv6_route.json') - elif request.param == 'ipv6_specific_route': - bgp_mocked_json = os.path.join( - test_path, 'mock_tables', 'ipv6_specific_route.json') else: bgp_mocked_json = os.path.join( test_path, 'mock_tables', 'dummy.json') @@ -111,12 +96,28 @@ def mock_run_bgp_command(vtysh_cmd, bgp_namespace): return mock_frr_data return "" - def mock_run_bgp_ipv6_err_command(vtysh_cmd, bgp_namespace): - return "% Unknown command: show ipv6 route garbage" + def mock_run_show_ip_route_commands(request): + if request.param == 'ipv6_route_err': + return show_ip_route_common.show_ipv6_route_err_expected_output + elif request.param == 'ip_route': + return show_ip_route_common.show_ip_route_expected_output + elif request.param == 'ip_specific_route': + return show_ip_route_common.show_specific_ip_route_expected_output + elif request.param == 'ip_special_route': + return show_ip_route_common.show_special_ip_route_expected_output + elif request.param == 'ipv6_route': + return show_ip_route_common.show_ipv6_route_expected_output + elif request.param == 'ipv6_specific_route': + return show_ip_route_common.show_ipv6_route_single_json_expected_output + else: + return "" + - if request.param == 'ipv6_route_err': + if any ([request.param == 'ipv6_route_err', request.param == 'ip_route',\ + request.param == 'ip_specific_route', request.param == 'ip_special_route',\ + request.param == 'ipv6_route', request.param == 'ipv6_specific_route']): bgp_util.run_bgp_command = mock.MagicMock( - return_value=mock_run_bgp_ipv6_err_command("", "")) + return_value=mock_run_show_ip_route_commands(request)) else: bgp_util.run_bgp_command = mock.MagicMock( return_value=mock_run_bgp_command("", "")) @@ -134,6 +135,12 @@ def setup_multi_asic_bgp_instance(request): m_asic_json_file = 'ipv6_specific_route.json' elif request.param == 'ipv6_route': m_asic_json_file = 'ipv6_route.json' + elif request.param == 'ip_special_route': + m_asic_json_file = 'ip_special_route.json' + elif request.param == 'ip_empty_route': + m_asic_json_file = 'ip_empty_route.json' + elif request.param == 'ip_specific_route_on_1_asic': + m_asic_json_file = 'ip_special_route_asic0_only.json' else: bgp_mocked_json = os.path.join( test_path, 'mock_tables', 'dummy.json') diff --git a/tests/ip_show_routes_multi_asic_test.py b/tests/ip_show_routes_multi_asic_test.py index 12a4671f1e6b..c889a6543082 100644 --- a/tests/ip_show_routes_multi_asic_test.py +++ b/tests/ip_show_routes_multi_asic_test.py @@ -2,304 +2,12 @@ import pytest +from . import show_ip_route_common from click.testing import CliRunner test_path = os.path.dirname(os.path.abspath(__file__)) modules_path = os.path.dirname(test_path) scripts_path = os.path.join(modules_path, "scripts") -show_ip_route_multi_asic_display_all_expected_output = """\ -Codes: K - kernel route, C - connected, S - static, R - RIP, - O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP, - T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP, - F - PBR, f - OpenFabric, - > - selected route, * - FIB route, q - queued route, r - rejected route - -asic0: -K *0.0.0.0/0 [210/0] via 240.127.1.1, eth0, 2d22h00m -B>*0.0.0.0/0 [20/0] via 10.0.0.5, PortChannel0005, 2d22h00m - * via 10.0.0.1, PortChannel0002, 2d22h00m -S 0.0.0.0/0 [200/0] via 10.3.146.1, inactive 2d22h00m -C>*8.0.0.0/32 is directly connected, Loopback4096, 2d22h00m -C>*10.0.0.0/31 is directly connected, PortChannel4001, 2d22h00m -C>*10.0.0.4/31 is directly connected, PortChannel0005, 2d22h00m -C>*10.1.0.32/32 is directly connected, Loopback0, 2d22h00m -B>*100.1.0.3/32 [20/0] via 10.0.0.5, PortChannel0005, 2d22h00m -B>*192.168.0.0/32 [20/0] via 10.0.0.5, PortChannel0005, 2d22h00m - * via 10.0.0.1, PortChannel0002, 2d22h00m -B>*192.168.0.1/32 [20/0] via 10.0.0.5, PortChannel0005, 2d22h00m - * via 10.0.0.1, PortChannel0002, 2d22h00m -B>*192.168.0.32/32 [20/0] via 10.0.0.5, PortChannel0005, 2d22h00m - * via 10.0.0.1, PortChannel0002, 2d22h00m -B>*192.168.0.96/32 [20/0] via 10.0.0.5, Ethernet-BP4, 2d22h00m - * via 10.0.0.1, Ethernet-BP0, 2d22h00m -B>*192.168.0.97/32 [20/0] via 10.0.0.5, PortChannel0005, 2d22h00m - * via 10.0.0.1, PortChannel0002, 2d22h00m -B>*192.168.0.192/32 [20/0] via 10.0.0.5, Ethernet-BP4, 2d22h00m - * via 10.0.0.1, PortChannel4001, 2d22h00m -B>*192.168.0.193/32 [20/0] via 10.0.0.5, PortChannel0005, 2d22h00m - * via 10.0.0.1, PortChannel0002, 2d22h00m -B>*192.168.0.208/32 [20/0] via 10.0.0.5, PortChannel0005, 2d22h00m - * via 10.0.0.1, PortChannel0002, 2d22h00m -B>*192.168.0.209/32 [20/0] via 10.0.0.5, PortChannel0005, 2d22h00m - * via 10.0.0.1, PortChannel0002, 2d22h00m -B>*192.168.0.224/32 [20/0] via 10.0.0.5, PortChannel0005, 2d22h00m - * via 10.0.0.1, PortChannel0002, 2d22h00m -B>*192.168.0.225/32 [20/0] via 10.0.0.5, PortChannel0005, 2d22h00m - * via 10.0.0.1, PortChannel0002, 2d22h00m -B>*192.168.0.240/32 [20/0] via 10.0.0.5, PortChannel0005, 2d22h00m - * via 10.0.0.1, PortChannel0002, 2d22h00m -B>*192.168.0.241/32 [20/0] via 10.0.0.5, PortChannel0005, 2d22h00m - * via 10.0.0.1, PortChannel0002, 2d22h00m -asic1: -K *0.0.0.0/0 [210/0] via 240.127.1.1, eth0, 2d22h01m -B>*0.0.0.0/0 [20/0] via 10.0.0.8, PortChannel0008, 2d22h01m - * via 10.0.0.7, PortChannel0007, 2d22h01m -S 0.0.0.0/0 [200/0] via 10.3.146.1, inactive 2d22h01m -C>*8.0.0.1/32 is directly connected, Loopback4096, 2d22h01m -C>*10.0.0.0/31 is directly connected, PortChannel4009, 2d22h01m -C>*10.0.0.4/31 is directly connected, PortChannel0008, 2d22h01m -C>*10.1.0.32/32 is directly connected, Loopback0, 2d22h01m -B>*100.1.0.3/32 [20/0] via 10.0.0.8, PortChannel0008, 2d22h01m -B>*192.168.0.0/32 [20/0] via 10.0.0.8, PortChannel0008, 2d22h01m - * via 10.0.0.7, PortChannel0007, 2d22h01m -B>*192.168.0.1/32 [20/0] via 10.0.0.8, PortChannel0008, 2d22h01m - * via 10.0.0.7, PortChannel0007, 2d22h01m -B>*192.168.0.32/32 [20/0] via 10.0.0.8, PortChannel0008, 2d22h01m - * via 10.0.0.7, PortChannel0007, 2d22h01m -B>*192.168.0.96/32 [20/0] via 10.0.0.8, Ethernet-BP260, 2d22h01m - * via 10.0.0.7, Ethernet-BP256, 2d22h01m -B>*192.168.0.97/32 [20/0] via 10.0.0.8, PortChannel0008, 2d22h01m - * via 10.0.0.7, PortChannel0007, 2d22h01m -B>*192.168.0.192/32 [20/0] via 10.0.0.8, Ethernet-BP260, 2d22h01m - * via 10.0.0.7, PortChannel4009, 2d22h01m -B>*192.168.0.193/32 [20/0] via 10.0.0.8, PortChannel0008, 2d22h01m - * via 10.0.0.7, PortChannel0007, 2d22h01m -B>*192.168.0.208/32 [20/0] via 10.0.0.8, PortChannel0008, 2d22h01m - * via 10.0.0.7, PortChannel0007, 2d22h01m -B>*192.168.0.209/32 [20/0] via 10.0.0.8, PortChannel0008, 2d22h01m - * via 10.0.0.7, PortChannel0007, 2d22h01m -B>*192.168.0.224/32 [20/0] via 10.0.0.8, PortChannel0008, 2d22h01m - * via 10.0.0.7, PortChannel0007, 2d22h01m -B>*192.168.0.225/32 [20/0] via 10.0.0.8, PortChannel0008, 2d22h01m - * via 10.0.0.7, PortChannel0007, 2d22h01m -B>*192.168.0.240/32 [20/0] via 10.0.0.8, Ethernet-BP260, 2d22h01m - * via 10.0.0.7, PortChannel4009, 2d22h01m -B>*192.168.0.241/32 [20/0] via 10.0.0.8, PortChannel0008, 2d22h01m - * via 10.0.0.7, PortChannel0007, 2d22h01m -asic2: -K *0.0.0.0/0 [210/0] via 240.127.1.1, eth0, 2d22h02m -B>*0.0.0.0/0 [20/0] via 10.0.0.16, PortChannel1016, 2d22h02m - * via 10.0.0.15, PortChannel1015, 2d22h02m -S 0.0.0.0/0 [200/0] via 10.3.146.1, inactive 2d22h02m -C>*8.0.0.2/32 is directly connected, Loopback4096, 2d22h02m -C>*10.0.0.0/31 is directly connected, PortChannel4001, 2d22h02m -C>*10.0.0.4/31 is directly connected, PortChannel1016, 2d22h02m -C>*10.1.0.32/32 is directly connected, Loopback0, 2d22h02m -B>*100.1.0.3/32 [20/0] via 10.0.0.16, PortChannel1016, 2d22h02m -B>*192.168.0.0/32 [20/0] via 10.0.0.16, PortChannel1016, 2d22h02m - * via 10.0.0.15, PortChannel1015, 2d22h02m -B>*192.168.0.1/32 [20/0] via 10.0.0.16, PortChannel1016, 2d22h02m - * via 10.0.0.15, PortChannel1015, 2d22h02m -B>*192.168.0.32/32 [20/0] via 10.0.0.16, PortChannel1016, 2d22h02m - * via 10.0.0.15, PortChannel1015, 2d22h02m -B>*192.168.0.96/32 [20/0] via 10.0.0.16, Ethernet-BP24, 2d22h02m - * via 10.0.0.15, Ethernet-BP20, 2d22h02m -B>*192.168.0.97/32 [20/0] via 10.0.0.16, PortChannel1016, 2d22h02m - * via 10.0.0.15, PortChannel1015, 2d22h02m -B>*192.168.0.192/32 [20/0] via 10.0.0.16, Ethernet-BP24, 2d22h02m - * via 10.0.0.15, PortChannel4001, 2d22h02m -B>*192.168.0.193/32 [20/0] via 10.0.0.16, PortChannel1016, 2d22h02m - * via 10.0.0.15, PortChannel1015, 2d22h02m -B>*192.168.0.208/32 [20/0] via 10.0.0.16, PortChannel1016, 2d22h02m - * via 10.0.0.15, PortChannel1015, 2d22h02m -B>*192.168.0.209/32 [20/0] via 10.0.0.16, PortChannel1016, 2d22h02m - * via 10.0.0.15, PortChannel1015, 2d22h02m -B>*192.168.0.224/32 [20/0] via 10.0.0.16, PortChannel1016, 2d22h02m - * via 10.0.0.15, PortChannel1015, 2d22h02m -B>*192.168.0.225/32 [20/0] via 10.0.0.16, PortChannel1016, 2d22h02m - * via 10.0.0.15, PortChannel1015, 2d22h02m -B>*192.168.0.240/32 [20/0] via 10.0.0.16, PortChannel1016, 2d22h02m - * via 10.0.0.15, PortChannel1015, 2d22h02m -B>*192.168.0.241/32 [20/0] via 10.0.0.16, PortChannel1016, 2d22h02m - * via 10.0.0.15, PortChannel1015, 2d22h02m -""" - -show_ip_route_multi_asic_display_all_front_expected_output = """\ -Codes: K - kernel route, C - connected, S - static, R - RIP, - O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP, - T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP, - F - PBR, f - OpenFabric, - > - selected route, * - FIB route, q - queued route, r - rejected route - -K *0.0.0.0/0 [210/0] via 240.127.1.1, eth0, 2d22h00m -B>*0.0.0.0/0 [20/0] via 10.0.0.5, PortChannel0005, 2d22h00m - * via 10.0.0.1, PortChannel0002, 2d22h00m - * via 10.0.0.15, PortChannel1015, 2d22h00m - * via 10.0.0.16, PortChannel1016, 2d22h00m -S 0.0.0.0/0 [200/0] via 10.3.146.1, inactive 2d22h00m -C>*8.0.0.0/32 is directly connected, Loopback4096, 2d22h00m -C>*8.0.0.2/32 is directly connected, Loopback4096, 2d22h02m -C>*10.0.0.4/31 is directly connected, PortChannel0005, 2d22h00m -C>*10.0.0.4/31 is directly connected, PortChannel1016, 2d22h02m -C>*10.1.0.32/32 is directly connected, Loopback0, 2d22h00m -B>*100.1.0.3/32 [20/0] via 10.0.0.5, PortChannel0005, 2d22h00m - * via 10.0.0.16, PortChannel1016, 2d22h00m -B>*192.168.0.0/32 [20/0] via 10.0.0.5, PortChannel0005, 2d22h00m - * via 10.0.0.1, PortChannel0002, 2d22h00m - * via 10.0.0.15, PortChannel1015, 2d22h00m - * via 10.0.0.16, PortChannel1016, 2d22h00m -B>*192.168.0.1/32 [20/0] via 10.0.0.5, PortChannel0005, 2d22h00m - * via 10.0.0.1, PortChannel0002, 2d22h00m - * via 10.0.0.15, PortChannel1015, 2d22h00m - * via 10.0.0.16, PortChannel1016, 2d22h00m -B>*192.168.0.32/32 [20/0] via 10.0.0.5, PortChannel0005, 2d22h00m - * via 10.0.0.1, PortChannel0002, 2d22h00m - * via 10.0.0.15, PortChannel1015, 2d22h00m - * via 10.0.0.16, PortChannel1016, 2d22h00m -B>*192.168.0.97/32 [20/0] via 10.0.0.5, PortChannel0005, 2d22h00m - * via 10.0.0.1, PortChannel0002, 2d22h00m - * via 10.0.0.15, PortChannel1015, 2d22h00m - * via 10.0.0.16, PortChannel1016, 2d22h00m -B>*192.168.0.193/32 [20/0] via 10.0.0.5, PortChannel0005, 2d22h00m - * via 10.0.0.1, PortChannel0002, 2d22h00m - * via 10.0.0.15, PortChannel1015, 2d22h00m - * via 10.0.0.16, PortChannel1016, 2d22h00m -B>*192.168.0.208/32 [20/0] via 10.0.0.5, PortChannel0005, 2d22h00m - * via 10.0.0.1, PortChannel0002, 2d22h00m - * via 10.0.0.15, PortChannel1015, 2d22h00m - * via 10.0.0.16, PortChannel1016, 2d22h00m -B>*192.168.0.209/32 [20/0] via 10.0.0.5, PortChannel0005, 2d22h00m - * via 10.0.0.1, PortChannel0002, 2d22h00m - * via 10.0.0.15, PortChannel1015, 2d22h00m - * via 10.0.0.16, PortChannel1016, 2d22h00m -B>*192.168.0.224/32 [20/0] via 10.0.0.5, PortChannel0005, 2d22h00m - * via 10.0.0.1, PortChannel0002, 2d22h00m - * via 10.0.0.15, PortChannel1015, 2d22h00m - * via 10.0.0.16, PortChannel1016, 2d22h00m -B>*192.168.0.225/32 [20/0] via 10.0.0.5, PortChannel0005, 2d22h00m - * via 10.0.0.1, PortChannel0002, 2d22h00m - * via 10.0.0.15, PortChannel1015, 2d22h00m - * via 10.0.0.16, PortChannel1016, 2d22h00m -B>*192.168.0.240/32 [20/0] via 10.0.0.5, PortChannel0005, 2d22h00m - * via 10.0.0.1, PortChannel0002, 2d22h00m - * via 10.0.0.15, PortChannel1015, 2d22h00m - * via 10.0.0.16, PortChannel1016, 2d22h00m -B>*192.168.0.241/32 [20/0] via 10.0.0.5, PortChannel0005, 2d22h00m - * via 10.0.0.1, PortChannel0002, 2d22h00m - * via 10.0.0.15, PortChannel1015, 2d22h00m - * via 10.0.0.16, PortChannel1016, 2d22h00m -""" - -show_ipv6_route_multi_asic_all_namesapce_output = """\ -Codes: K - kernel route, C - connected, S - static, R - RIP, - O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP, - T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP, - F - PBR, f - OpenFabric, - > - selected route, * - FIB route, q - queued route, r - rejected route - -K *::/0 [210/0] via fd00::1, eth0, 2d22h00m -B>*::/0 [20/0] via fc00::6, PortChannel0005, 2d22h00m - * via fc00::2, PortChannel0002, 2d22h00m - * via fc00::2, PortChannel1015, 2d22h00m - * via fc00::6, PortChannel1016, 2d22h00m -B>*2064:100::1/128 [20/0] via fc00::2, PortChannel0002, 2d22h00m - * via fc00::2, PortChannel1015, 2d22h00m -B>*2064:100::3/128 [20/0] via fc00::6, PortChannel0005, 2d22h00m - * via fc00::6, PortChannel1016, 2d22h00m -B>*20c0:a800:0:1::/64 [20/0] via fc00::6, PortChannel0005, 2d22h00m - * via fc00::2, PortChannel0002, 2d22h00m - * via fc00::2, PortChannel1015, 2d22h00m - * via fc00::6, PortChannel1016, 2d22h00m -B>*20c0:a800:0:10::/64 [20/0] via fc00::6, PortChannel0005, 2d22h00m - * via fc00::2, PortChannel0002, 2d22h00m - * via fc00::2, PortChannel1015, 2d22h00m - * via fc00::6, PortChannel1016, 2d22h00m -B>*20c0:a800:0:11::/64 [20/0] via fc00::6, PortChannel0002, 2d22h00m - * via fc00::6, PortChannel1015, 2d22h00m -B>*20c0:a800:0:20::/64 [20/0] via fc00::2, PortChannel0002, 2d22h00m - * via fc00::2, PortChannel1015, 2d22h00m -B>*20c0:a800:0:21::/64 [20/0] via fc00::2, PortChannel0002, 2d22h00m - * via fc00::2, PortChannel1015, 2d22h00m -C>*2603:10e2:400::/128 is directly connected, Loopback4096, 2d22h00m -C>*2603:10e2:400::2/128 is directly connected, Loopback4096, 2d22h02m -C>*fc00::4/126 is directly connected, PortChannel0005, 2d22h00m -C>*fc00::4/126 is directly connected, PortChannel1016, 2d22h02m -C>*fc00:1::32/128 is directly connected, Loopback0, 2d22h00m -C>*fd00::/80 is directly connected, eth0, 2d22h00m -C>*fe80::/64 is directly connected, eth0, 2d22h00m -C *fe80::/64 is directly connected, Loopback0, 2d22h00m -C *fe80::/64 is directly connected, Loopback4096, 2d22h00m -C *fe80::/64 is directly connected, Ethernet16, 2d22h00m -C *fe80::/64 is directly connected, Ethernet20, 2d22h00m -C *fe80::/64 is directly connected, PortChannel0005, 2d22h00m -C *fe80::/64 is directly connected, PortChannel1016, 2d22h02m -C *fe80::/64 is directly connected, Ethernet24, 2d22h02m -""" - -show_ipv6_route_multi_asic_single_namesapce_output = """\ -Codes: K - kernel route, C - connected, S - static, R - RIP, - O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP, - T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP, - F - PBR, f - OpenFabric, - > - selected route, * - FIB route, q - queued route, r - rejected route - -K *::/0 [210/0] via fd00::1, eth0, 2d22h02m -B>*::/0 [20/0] via fc00::6, PortChannel1016, 2d22h02m - * via fc00::2, PortChannel1015, 2d22h02m -B>*2064:100::1/128 [20/0] via fc00::2, PortChannel1015, 2d22h02m -B>*2064:100::3/128 [20/0] via fc00::6, PortChannel1016, 2d22h02m -B>*20c0:a800:0:1::/64 [20/0] via fc00::6, PortChannel1016, 2d22h02m - * via fc00::2, PortChannel1015, 2d22h02m -B>*20c0:a800:0:10::/64 [20/0] via fc00::6, PortChannel1016, 2d22h02m - * via fc00::2, PortChannel1015, 2d22h02m -B>*20c0:a800:0:11::/64 [20/0] via fc00::6, PortChannel1015, 2d22h02m -B>*20c0:a800:0:20::/64 [20/0] via fc00::2, PortChannel1015, 2d22h02m -B>*20c0:a800:0:21::/64 [20/0] via fc00::2, PortChannel1015, 2d22h02m -C>*2603:10e2:400::2/128 is directly connected, Loopback4096, 2d22h02m -C>*fc00::4/126 is directly connected, PortChannel1016, 2d22h02m -C>*fc00:1::32/128 is directly connected, Loopback0, 2d22h02m -C>*fd00::/80 is directly connected, eth0, 2d22h02m -C>*fe80::/64 is directly connected, eth0, 2d22h02m -C *fe80::/64 is directly connected, Loopback0, 2d22h02m -C *fe80::/64 is directly connected, Loopback4096, 2d22h02m -C *fe80::/64 is directly connected, Ethernet24, 2d22h02m -C *fe80::/64 is directly connected, Ethernet20, 2d22h02m -C *fe80::/64 is directly connected, PortChannel1016, 2d22h02m -""" - -show_ip_route_multi_asic_invalid_namesapce_err_output = """\ -namespace 'asic7' is not valid. valid name spaces are: -['asic0', 'asic1', 'asic2'] -""" - -show_ip_route_multi_asic_invalid_display_err_output = """\ -dislay option 'everything' is not a valid option. -""" - -show_ip_route_multi_asic_specific_route_output = """\ -Routing entry for 10.0.0.4/31 - Known via "connected", distance 0, metric 0, best - Last update 2d22h00m ago - * directly connected, PortChannel0005 - - -Routing entry for 10.0.0.4/31 - Known via "connected", distance 0, metric 0, best - Last update 2d22h02m ago - * directly connected, PortChannel1016 - - -""" - -show_ipv6_route_multi_asic_specific_route_output = """\ -Routing entry for 2603:10e2:400::/128 - Known via "connected", distance 0, metric 0, best - Last update 2d22h00m ago - * directly connected, Loopback4096 - - -""" - class TestMultiAiscShowIpRouteDisplayAllCommands(object): @classmethod def setup_class(cls): @@ -323,7 +31,7 @@ def test_show_multi_asic_ip_route_front_end( show.cli.commands["ip"].commands["route"], ["-dfrontend"]) print("{}".format(result.output)) assert result.exit_code == 0 - assert result.output == show_ip_route_multi_asic_display_all_front_expected_output + assert result.output == show_ip_route_common.show_ip_route_multi_asic_display_all_front_expected_output @pytest.mark.parametrize('setup_multi_asic_bgp_instance', ['ip_route'], indirect=['setup_multi_asic_bgp_instance']) @@ -337,7 +45,7 @@ def test_show_multi_asic_ip_route_all( show.cli.commands["ip"].commands["route"], ["-dall"]) print("{}".format(result.output)) assert result.exit_code == 0 - assert result.output == show_ip_route_multi_asic_display_all_expected_output + assert result.output == show_ip_route_common.show_ip_route_multi_asic_display_all_expected_output @pytest.mark.parametrize('setup_multi_asic_bgp_instance', ['ip_specific_route'], indirect=['setup_multi_asic_bgp_instance']) @@ -351,7 +59,21 @@ def test_show_multi_asic_ip_route_specific( show.cli.commands["ip"].commands["route"], ["10.0.0.4"]) print("{}".format(result.output)) assert result.exit_code == 0 - assert result.output == show_ip_route_multi_asic_specific_route_output + assert result.output == show_ip_route_common.show_ip_route_multi_asic_specific_route_output + + @pytest.mark.parametrize('setup_multi_asic_bgp_instance', + ['ip_specific_route_on_1_asic'], indirect=['setup_multi_asic_bgp_instance']) + def test_show_multi_asic_ip_route_specific_on_1_asic( + self, + setup_ip_route_commands, + setup_multi_asic_bgp_instance): + show = setup_ip_route_commands + runner = CliRunner() + result = runner.invoke( + show.cli.commands["ip"].commands["route"], ["192.168.0.1"]) + print("{}".format(result.output)) + assert result.exit_code == 0 + assert result.output == show_ip_route_common.show_specific_ip_route_expected_output @pytest.mark.parametrize('setup_multi_asic_bgp_instance', ['ipv6_specific_route'], indirect=['setup_multi_asic_bgp_instance']) @@ -365,7 +87,38 @@ def test_show_multi_asic_ipv6_route_specific( show.cli.commands["ipv6"].commands["route"], ["2603:10e2:400::"]) print("{}".format(result.output)) assert result.exit_code == 0 - assert result.output == show_ipv6_route_multi_asic_specific_route_output + assert result.output == show_ip_route_common.show_ipv6_route_multi_asic_specific_route_output + + @pytest.mark.parametrize('setup_multi_asic_bgp_instance', + ['ip_route'], indirect=['setup_multi_asic_bgp_instance']) + def test_show_multi_asic_ip_route_tables_option_err( + self, + setup_ip_route_commands, + setup_multi_asic_bgp_instance): + show = setup_ip_route_commands + runner = CliRunner() + result = runner.invoke( + show.cli.commands["ip"].commands["route"], ["tables"]) + print("{}".format(result.output)) + assert result.exit_code == 0 + assert result.output == show_ip_route_common.show_ip_route_multi_asic_invalid_tables_cmd_err_output + + # note that we purposely use the single bgp instance setup to cause trigger a param error bad + # just bail out while executing in multi-asic show ipv6 route handling. + # This is to test out the error parm handling code path + @pytest.mark.parametrize('setup_single_bgp_instance', + ['ipv6_route_err'], indirect=['setup_single_bgp_instance']) + def test_show_imulti_asic_ipv6_route_err( + self, + setup_ip_route_commands, + setup_single_bgp_instance): + show = setup_ip_route_commands + runner = CliRunner() + result = runner.invoke( + show.cli.commands["ipv6"].commands["route"], ["garbage"]) + print("{}".format(result.output)) + assert result.exit_code == 0 + assert result.output == show_ip_route_common.show_ipv6_route_err_expected_output + "\n" @pytest.mark.parametrize('setup_multi_asic_bgp_instance', ['ip_route'], indirect=['setup_multi_asic_bgp_instance']) @@ -379,7 +132,7 @@ def test_show_multi_asic_ip_route_namespace_option_err( show.cli.commands["ip"].commands["route"], ["-nasic7"]) print("{}".format(result.output)) assert result.exit_code == 0 - assert result.output == show_ip_route_multi_asic_invalid_namesapce_err_output + assert result.output == show_ip_route_common.show_ip_route_multi_asic_invalid_namesapce_err_output @pytest.mark.parametrize('setup_multi_asic_bgp_instance', ['ip_route'], indirect=['setup_multi_asic_bgp_instance']) @@ -393,7 +146,7 @@ def test_show_multi_asic_ip_route_display_option_err( show.cli.commands["ip"].commands["route"], ["-deverything"]) print("{}".format(result.output)) assert result.exit_code == 0 - assert result.output == show_ip_route_multi_asic_invalid_display_err_output + assert result.output == show_ip_route_common.show_ip_route_multi_asic_invalid_display_err_output @pytest.mark.parametrize('setup_multi_asic_bgp_instance', ['ipv6_route'], indirect=['setup_multi_asic_bgp_instance']) @@ -407,7 +160,7 @@ def test_show_multi_asic_ipv6_route_all_namespace( show.cli.commands["ipv6"].commands["route"], ["-dfrontend"]) print("{}".format(result.output)) assert result.exit_code == 0 - assert result.output == show_ipv6_route_multi_asic_all_namesapce_output + assert result.output == show_ip_route_common.show_ipv6_route_multi_asic_all_namesapce_output @pytest.mark.parametrize('setup_multi_asic_bgp_instance', ['ipv6_route'], indirect=['setup_multi_asic_bgp_instance']) @@ -421,7 +174,49 @@ def test_show_multi_asic_ipv6_route_single_namespace( show.cli.commands["ipv6"].commands["route"], ["-nasic2"]) print("{}".format(result.output)) assert result.exit_code == 0 - assert result.output == show_ipv6_route_multi_asic_single_namesapce_output + assert result.output == show_ip_route_common.show_ipv6_route_multi_asic_single_namesapce_output + + @pytest.mark.parametrize('setup_multi_asic_bgp_instance', + ['ipv6_specific_route'], indirect=['setup_multi_asic_bgp_instance']) + def test_show_multi_asic_ipv6_route_specific_route_json( + self, + setup_ip_route_commands, + setup_multi_asic_bgp_instance): + show = setup_ip_route_commands + runner = CliRunner() + result = runner.invoke( + show.cli.commands["ipv6"].commands["route"], ["json"]) + print("{}".format(result.output)) + assert result.exit_code == 0 + assert result.output == show_ip_route_common.show_ipv6_route_multi_asic_json_output + + @pytest.mark.parametrize('setup_multi_asic_bgp_instance', + ['ip_special_route'], indirect=['setup_multi_asic_bgp_instance']) + def test_show_multi_asic_ip_route_special_route( + self, + setup_ip_route_commands, + setup_multi_asic_bgp_instance): + show = setup_ip_route_commands + runner = CliRunner() + result = runner.invoke( + show.cli.commands["ip"].commands["route"], ["-nasic0"]) + print("{}".format(result.output)) + assert result.exit_code == 0 + assert result.output == show_ip_route_common.show_special_ip_route_expected_output + + @pytest.mark.parametrize('setup_multi_asic_bgp_instance', + ['ip_empty_route'], indirect=['setup_multi_asic_bgp_instance']) + def test_show_multi_asic_ip_route_empty_route( + self, + setup_ip_route_commands, + setup_multi_asic_bgp_instance): + show = setup_ip_route_commands + runner = CliRunner() + result = runner.invoke( + show.cli.commands["ip"].commands["route"], ["-dfrontend"]) + print("{}".format(result.output)) + assert result.exit_code == 0 + assert result.output == "" @classmethod def teardown_class(cls): diff --git a/tests/ip_show_routes_test.py b/tests/ip_show_routes_test.py index f7e7c4851e25..820827d5501a 100644 --- a/tests/ip_show_routes_test.py +++ b/tests/ip_show_routes_test.py @@ -1,322 +1,13 @@ import os - import pytest +from . import show_ip_route_common from click.testing import CliRunner + test_path = os.path.dirname(os.path.abspath(__file__)) modules_path = os.path.dirname(test_path) scripts_path = os.path.join(modules_path, "scripts") -show_ip_route_expected_output = """\ -Codes: K - kernel route, C - connected, S - static, R - RIP, - O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP, - T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP, - F - PBR, f - OpenFabric, - > - selected route, * - FIB route, q - queued route, r - rejected route - -S 0.0.0.0/0 [200/0] via 10.3.146.1, inactive 1d11h20m -B>*0.0.0.0/0 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m - * via 10.0.0.5, PortChannel0005, 1d11h20m -K *0.0.0.0/0 [210/0] via 240.127.1.1, eth0, 1d11h20m -C>*8.0.0.0/32 is directly connected, Loopback4096, 1d11h21m -C>*10.0.0.0/31 is directly connected, PortChannel0002, 1d11h20m -C>*10.0.0.4/31 is directly connected, PortChannel0005, 1d11h20m -C>*10.1.0.32/32 is directly connected, Loopback0, 1d11h21m -B>*100.1.0.3/32 [20/0] via 10.0.0.5, PortChannel0005, 1d11h20m -B>*192.168.0.0/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m - * via 10.0.0.5, PortChannel0005, 1d11h20m -B>*192.168.0.1/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m - * via 10.0.0.5, PortChannel0005, 1d11h20m -B>*192.168.0.16/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m - * via 10.0.0.5, PortChannel0005, 1d11h20m -B>*192.168.0.17/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m - * via 10.0.0.5, PortChannel0005, 1d11h20m -B>*192.168.0.32/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m - * via 10.0.0.5, PortChannel0005, 1d11h20m -B>*192.168.0.33/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m - * via 10.0.0.5, PortChannel0005, 1d11h20m -B>*192.168.0.48/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m - * via 10.0.0.5, PortChannel0005, 1d11h20m -B>*192.168.0.49/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m - * via 10.0.0.5, PortChannel0005, 1d11h20m -B>*192.168.0.64/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m - * via 10.0.0.5, PortChannel0005, 1d11h20m -B>*192.168.0.65/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m - * via 10.0.0.5, PortChannel0005, 1d11h20m -B>*192.168.0.80/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m - * via 10.0.0.5, PortChannel0005, 1d11h20m -B>*192.168.0.81/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m - * via 10.0.0.5, PortChannel0005, 1d11h20m -B>*192.168.0.96/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m - * via 10.0.0.5, PortChannel0005, 1d11h20m -B>*192.168.0.97/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m - * via 10.0.0.5, PortChannel0005, 1d11h20m -B>*192.168.0.112/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m - * via 10.0.0.5, PortChannel0005, 1d11h20m -B>*192.168.0.113/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m - * via 10.0.0.5, PortChannel0005, 1d11h20m -B>*192.168.0.128/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m - * via 10.0.0.5, PortChannel0005, 1d11h20m -B>*192.168.0.129/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m - * via 10.0.0.5, PortChannel0005, 1d11h20m -B>*192.168.0.144/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m - * via 10.0.0.5, PortChannel0005, 1d11h20m -B>*192.168.0.145/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m - * via 10.0.0.5, PortChannel0005, 1d11h20m -B>*192.168.0.160/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m - * via 10.0.0.5, PortChannel0005, 1d11h20m -B>*192.168.0.161/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m - * via 10.0.0.5, PortChannel0005, 1d11h20m -B>*192.168.0.176/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m - * via 10.0.0.5, PortChannel0005, 1d11h20m -B>*192.168.0.177/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m - * via 10.0.0.5, PortChannel0005, 1d11h20m -B>*192.168.0.192/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m - * via 10.0.0.5, PortChannel0005, 1d11h20m -B>*192.168.0.193/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m - * via 10.0.0.5, PortChannel0005, 1d11h20m -B>*192.168.0.208/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m - * via 10.0.0.5, PortChannel0005, 1d11h20m -B>*192.168.0.209/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m - * via 10.0.0.5, PortChannel0005, 1d11h20m -B>*192.168.0.224/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m - * via 10.0.0.5, PortChannel0005, 1d11h20m -B>*192.168.0.225/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m - * via 10.0.0.5, PortChannel0005, 1d11h20m -B>*192.168.0.240/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m - * via 10.0.0.5, PortChannel0005, 1d11h20m -B>*192.168.0.241/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m - * via 10.0.0.5, PortChannel0005, 1d11h20m -""" - - -show_specific_ip_route_expected_output = """\ -Routing entry for 192.168.0.1/32 - Known via "bgp", distance 20, metric 0, best - Last update 1d11h20m ago - * 10.0.0.1, via PortChannel0002 - * 10.0.0.5, via PortChannel0005 - -""" - -show_special_ip_route_expected_output = """\ -Codes: K - kernel route, C - connected, S - static, R - RIP, - O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP, - T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP, - F - PBR, f - OpenFabric, - > - selected route, * - FIB route, q - queued route, r - rejected route - -C>*10.3.0.4/31 (blackhole)(vrf 2, PortChannel1014, inactive (recursive) 2d22h02m -C>*10.5.0.4/31 (ICMP unreachable) inactive 2d22h02m -C>*10.5.0.8/31 (ICMP admin-prohibited) inactive onlink, src 10.2.3.4 2d22h02m -C> 10.6.0.8/31 inactive 2d22h02m -C>q10.6.5.0/31 inactive 2d22h02m -C>r10.6.5.3/31 inactive 2d22h02m -C>*10.7.0.8/31 (ICMP admin-prohibited) inactive onlink, src 10.2.3.4, label IPv4 Explicit Null/OAM Alert/Extension/1212 2d22h02m -""" - - -show_ipv6_route_err_expected_output = """\ -% Unknown command: show ipv6 route garbage -""" - -show_ipv6_route_single_json_expected_output = """\ -{ - "20c0:a8c7:0:81::/64": [ - { - "destSelected": true, - "distance": 20, - "installed": true, - "internalFlags": 8, - "internalNextHopActiveNum": 2, - "internalNextHopNum": 2, - "internalStatus": 16, - "metric": 0, - "nexthops": [ - { - "active": true, - "afi": "ipv6", - "fib": true, - "flags": 3, - "interfaceIndex": 928, - "interfaceName": "PortChannel0011", - "ip": "fc00::e" - }, - { - "active": true, - "afi": "ipv6", - "fib": true, - "flags": 3, - "interfaceIndex": 927, - "interfaceName": "PortChannel0008", - "ip": "fc00::a" - } - ], - "prefix": "20c0:a8c7:0:81::/64", - "protocol": "bgp", - "selected": true, - "table": 254, - "uptime": "2d13h40m" - } - ] -} -""" - -show_ipv6_route_expected_output = """\ -Codes: K - kernel route, C - connected, S - static, R - RIP, - O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP, - T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP, - F - PBR, f - OpenFabric, - > - selected route, * - FIB route, q - queued route, r - rejected route - -B>*::/0 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -K *::/0 [210/0] via fd00::1, eth0, 1d11h34m -B>*2064:100::1/128 [20/0] via fc00::2, PortChannel0002, 1d11h34m -B>*2064:100::3/128 [20/0] via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a800::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a800:0:1::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a800:0:10::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a800:0:11::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a800:0:20::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a800:0:21::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a800:0:30::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a800:0:31::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a800:0:40::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a800:0:41::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a800:0:50::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a800:0:51::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a800:0:60::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a800:0:61::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a800:0:70::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a800:0:71::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a800:0:80::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a800:0:81::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a800:0:90::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a800:0:91::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a800:0:a0::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a800:0:a1::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a800:0:b0::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a800:0:b1::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a800:0:c0::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a800:0:c1::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a800:0:d0::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a800:0:d1::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a800:0:e0::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a800:0:e1::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a800:0:f0::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a800:0:f1::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a801::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a801:0:1::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a801:0:10::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a801:0:11::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a801:0:20::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a801:0:21::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a801:0:30::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a801:0:31::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a801:0:40::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a801:0:41::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a801:0:50::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a801:0:51::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a801:0:60::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a801:0:61::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a801:0:70::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a801:0:71::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a801:0:80::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a801:0:81::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a801:0:90::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a801:0:91::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a801:0:a0::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a801:0:a1::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a801:0:b0::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a801:0:b1::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a801:0:c0::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a801:0:c1::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a801:0:d0::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a801:0:d1::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a801:0:e0::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a801:0:e1::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a801:0:f0::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -B>*20c0:a801:0:f1::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m - * via fc00::6, PortChannel0005, 1d11h34m -C>*2603:10e2:400::/128 is directly connected, Loopback4096, 1d11h34m -C>*fc00::/126 is directly connected, PortChannel0002, 1d11h34m -C>*fc00::4/126 is directly connected, PortChannel0005, 1d11h34m -C>*fc00:1::32/128 is directly connected, Loopback0, 1d11h34m -C>*fd00::/80 is directly connected, eth0, 1d11h34m -C *fe80::/64 is directly connected, PortChannel0002, 1d11h34m -C *fe80::/64 is directly connected, PortChannel0005, 1d11h34m -C *fe80::/64 is directly connected, Ethernet20, 1d11h34m -C *fe80::/64 is directly connected, Ethernet16, 1d11h34m -C *fe80::/64 is directly connected, Ethernet4, 1d11h34m -C *fe80::/64 is directly connected, Ethernet0, 1d11h34m -C *fe80::/64 is directly connected, Loopback4096, 1d11h34m -C *fe80::/64 is directly connected, Loopback0, 1d11h34m -C>*fe80::/64 is directly connected, eth0, 1d11h34m -""" class TestShowIpRouteCommands(object): @classmethod @@ -327,7 +18,6 @@ def setup_class(cls): os.environ["UTILITIES_UNIT_TESTING"] = "0" os.environ["UTILITIES_UNIT_TESTING_TOPOLOGY"] = "" import mock_tables.dbconnector - @pytest.mark.parametrize('setup_single_bgp_instance', ['ip_route'], indirect=['setup_single_bgp_instance']) def test_show_ip_route( @@ -340,7 +30,7 @@ def test_show_ip_route( show.cli.commands["ip"].commands["route"], []) print("{}".format(result.output)) assert result.exit_code == 0 - assert result.output == show_ip_route_expected_output + assert result.output == show_ip_route_common.show_ip_route_expected_output + "\n" @pytest.mark.parametrize('setup_single_bgp_instance', ['ip_specific_route'], indirect=['setup_single_bgp_instance']) @@ -354,7 +44,7 @@ def test_show_specific_ip_route( show.cli.commands["ip"].commands["route"], ["192.168.0.1"]) print("{}".format(result.output)) assert result.exit_code == 0 - assert result.output == show_specific_ip_route_expected_output + assert result.output == show_ip_route_common.show_specific_ip_route_expected_output + "\n" @pytest.mark.parametrize('setup_single_bgp_instance', ['ip_special_route'], indirect=['setup_single_bgp_instance']) @@ -368,7 +58,7 @@ def test_show_special_ip_route( show.cli.commands["ip"].commands["route"], []) print("{}".format(result.output)) assert result.exit_code == 0 - assert result.output == show_special_ip_route_expected_output + assert result.output == show_ip_route_common.show_special_ip_route_expected_output + "\n" @pytest.mark.parametrize('setup_single_bgp_instance', ['ipv6_specific_route'], indirect=['setup_single_bgp_instance']) @@ -382,7 +72,7 @@ def test_show_specific_ipv6_route_json( show.cli.commands["ip"].commands["route"], ["20c0:a8c7:0:81::", "json"]) print("{}".format(result.output)) assert result.exit_code == 0 - assert result.output == show_ipv6_route_single_json_expected_output + assert result.output == show_ip_route_common.show_ipv6_route_single_json_expected_output + "\n" @pytest.mark.parametrize('setup_single_bgp_instance', ['ipv6_route'], indirect=['setup_single_bgp_instance']) @@ -396,7 +86,7 @@ def test_show_ipv6_route( show.cli.commands["ipv6"].commands["route"], []) print("{}".format(result.output)) assert result.exit_code == 0 - assert result.output == show_ipv6_route_expected_output + assert result.output == show_ip_route_common.show_ipv6_route_expected_output + "\n" @pytest.mark.parametrize('setup_single_bgp_instance', ['ipv6_route_err'], indirect=['setup_single_bgp_instance']) @@ -410,4 +100,4 @@ def test_show_ipv6_route_err( show.cli.commands["ipv6"].commands["route"], ["garbage"]) print("{}".format(result.output)) assert result.exit_code == 0 - assert result.output == show_ipv6_route_err_expected_output + assert result.output == show_ip_route_common.show_ipv6_route_err_expected_output + "\n" diff --git a/tests/mock_tables/asic0/ip_empty_route.json b/tests/mock_tables/asic0/ip_empty_route.json new file mode 100644 index 000000000000..0967ef424bce --- /dev/null +++ b/tests/mock_tables/asic0/ip_empty_route.json @@ -0,0 +1 @@ +{} diff --git a/tests/mock_tables/asic0/ip_special_route.json b/tests/mock_tables/asic0/ip_special_route.json new file mode 100644 index 000000000000..514623c57f10 --- /dev/null +++ b/tests/mock_tables/asic0/ip_special_route.json @@ -0,0 +1,197 @@ +{ + "10.3.0.4/31": [ + { + "destSelected": true, + "distance": 0, + "installed": true, + "internalFlags": 8, + "internalNextHopActiveNum": 1, + "internalNextHopNum": 1, + "internalStatus": 16, + "metric": 0, + "nexthops": [ + { + "vrf": 2, + "recursive": true, + "blackhole": true, + "unreachable": true, + "fib": true, + "flags": 3, + "interfaceIndex": 726, + "interfaceName": "PortChannel1014" + } + ], + "prefix": "10.3.0.4/31", + "protocol": "connected", + "selected": true, + "table": 254, + "uptime": "2d22h02m" + } + ], + "10.5.0.4/31": [ + { + "destSelected": true, + "distance": 0, + "installed": true, + "internalFlags": 8, + "internalNextHopActiveNum": 1, + "internalNextHopNum": 1, + "internalStatus": 16, + "metric": 0, + "nexthops": [ + { + "reject": true, + "unreachable": true, + "fib": true, + "flags": 3, + "interfaceIndex": 728, + "interfaceName": "PortChannel1016" + } + ], + "prefix": "10.5.0.4/31", + "protocol": "connected", + "selected": true, + "table": 254, + "uptime": "2d22h02m" + } + ], + "10.5.0.8/31": [ + { + "destSelected": true, + "distance": 0, + "installed": true, + "internalFlags": 8, + "internalNextHopActiveNum": 1, + "internalNextHopNum": 1, + "internalStatus": 16, + "metric": 0, + "nexthops": [ + { + "admin-prohibited": true, + "unreachable": true, + "onLink": true, + "source": "10.2.3.4", + "fib": true, + "flags": 3, + "interfaceIndex": 727, + "interfaceName": "PortChannel1015" + } + ], + "prefix": "10.5.0.8/31", + "protocol": "connected", + "selected": true, + "table": 254, + "uptime": "2d22h02m" + } + ], + "10.6.0.8/31": [ + { + "destSelected": true, + "distance": 0, + "installed": true, + "internalFlags": 8, + "internalNextHopActiveNum": 1, + "internalNextHopNum": 1, + "internalStatus": 16, + "metric": 0, + "nexthops": [ + { + "admin-prohibited": true, + "fib": true, + "flags": 7, + "interfaceIndex": 737, + "interfaceName": "PortChannel1025" + } + ], + "prefix": "10.6.0.8/31", + "protocol": "connected", + "selected": true, + "table": 254, + "uptime": "2d22h02m" + } + ], + "10.6.5.0/31": [ + { + "destSelected": true, + "distance": 0, + "installed": true, + "internalFlags": 8, + "internalNextHopActiveNum": 1, + "internalNextHopNum": 1, + "internalStatus": 16, + "metric": 0, + "nexthops": [ + { + "admin-prohibited": true, + "fib": true, + "flags": 7, + "interfaceIndex": 737, + "interfaceName": "PortChannel1025" + } + ], + "prefix": "10.6.5.0/31", + "protocol": "connected", + "selected": true, + "queued": true, + "table": 254, + "uptime": "2d22h02m" + } + ], + "10.6.5.3/31": [ + { + "destSelected": true, + "distance": 0, + "installed": true, + "internalFlags": 8, + "internalNextHopActiveNum": 1, + "internalNextHopNum": 1, + "internalStatus": 16, + "metric": 0, + "nexthops": [ + { + "admin-prohibited": true, + "fib": true, + "flags": 7, + "interfaceIndex": 737, + "interfaceName": "PortChannel1025" + } + ], + "prefix": "10.6.5.3/31", + "protocol": "connected", + "selected": true, + "failed": true, + "table": 254, + "uptime": "2d22h02m" + } + ], + "10.7.0.8/31": [ + { + "destSelected": true, + "distance": 0, + "installed": true, + "internalFlags": 8, + "internalNextHopActiveNum": 1, + "internalNextHopNum": 1, + "internalStatus": 16, + "metric": 0, + "nexthops": [ + { + "admin-prohibited": true, + "unreachable": true, + "onLink": true, + "source": "10.2.3.4", + "fib": true, + "flags": 3, + "interfaceIndex": 729, + "interfaceName": "PortChannel1017", + "labels": [0,14,15,1212] + } + ], + "prefix": "10.7.0.8/31", + "protocol": "connected", + "selected": true, + "table": 254, + "uptime": "2d22h02m" + } + ] +} diff --git a/tests/mock_tables/asic0/ip_special_route_asic0_only.json b/tests/mock_tables/asic0/ip_special_route_asic0_only.json new file mode 100644 index 000000000000..957788580ec6 --- /dev/null +++ b/tests/mock_tables/asic0/ip_special_route_asic0_only.json @@ -0,0 +1,39 @@ +{ + "192.168.0.1/32": [ + { + "destSelected": true, + "distance": 20, + "installed": true, + "internalFlags": 8, + "internalNextHopActiveNum": 2, + "internalNextHopNum": 2, + "internalStatus": 16, + "metric": 0, + "nexthops": [ + { + "active": true, + "afi": "ipv4", + "fib": true, + "flags": 3, + "interfaceIndex": 728, + "interfaceName": "PortChannel0005", + "ip": "10.0.0.5" + }, + { + "active": true, + "afi": "ipv4", + "fib": true, + "flags": 3, + "interfaceIndex": 727, + "interfaceName": "PortChannel0002", + "ip": "10.0.0.1" + } + ], + "prefix": "192.168.0.1/32", + "protocol": "bgp", + "selected": true, + "table": 254, + "uptime": "1d11h20m" + } + ] +} diff --git a/tests/mock_tables/asic1/ip_empty_route.json b/tests/mock_tables/asic1/ip_empty_route.json new file mode 100644 index 000000000000..0967ef424bce --- /dev/null +++ b/tests/mock_tables/asic1/ip_empty_route.json @@ -0,0 +1 @@ +{} diff --git a/tests/mock_tables/asic1/ip_special_route_asic0_only.json b/tests/mock_tables/asic1/ip_special_route_asic0_only.json new file mode 100644 index 000000000000..0967ef424bce --- /dev/null +++ b/tests/mock_tables/asic1/ip_special_route_asic0_only.json @@ -0,0 +1 @@ +{} diff --git a/tests/mock_tables/asic2/ip_empty_route.json b/tests/mock_tables/asic2/ip_empty_route.json new file mode 100644 index 000000000000..0967ef424bce --- /dev/null +++ b/tests/mock_tables/asic2/ip_empty_route.json @@ -0,0 +1 @@ +{} diff --git a/tests/mock_tables/asic2/ip_special_route_asic0_only.json b/tests/mock_tables/asic2/ip_special_route_asic0_only.json new file mode 100644 index 000000000000..0967ef424bce --- /dev/null +++ b/tests/mock_tables/asic2/ip_special_route_asic0_only.json @@ -0,0 +1 @@ +{} diff --git a/tests/show_ip_route_common.py b/tests/show_ip_route_common.py new file mode 100644 index 000000000000..d6d82acb9c77 --- /dev/null +++ b/tests/show_ip_route_common.py @@ -0,0 +1,646 @@ +# +# NON-MULTI_ASIC TEST SECTION +# + +show_ip_route_expected_output = """\ +Codes: K - kernel route, C - connected, S - static, R - RIP, + O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP, + T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP, + F - PBR, f - OpenFabric, + > - selected route, * - FIB route, q - queued route, r - rejected route + +S 0.0.0.0/0 [200/0] via 10.3.146.1, inactive 1d11h20m +B>*0.0.0.0/0 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m + * via 10.0.0.5, PortChannel0005, 1d11h20m +K *0.0.0.0/0 [210/0] via 240.127.1.1, eth0, 1d11h20m +C>*8.0.0.0/32 is directly connected, Loopback4096, 1d11h21m +C>*10.0.0.0/31 is directly connected, PortChannel0002, 1d11h20m +C>*10.0.0.4/31 is directly connected, PortChannel0005, 1d11h20m +C>*10.1.0.32/32 is directly connected, Loopback0, 1d11h21m +B>*100.1.0.3/32 [20/0] via 10.0.0.5, PortChannel0005, 1d11h20m +B>*192.168.0.0/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m + * via 10.0.0.5, PortChannel0005, 1d11h20m +B>*192.168.0.1/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m + * via 10.0.0.5, PortChannel0005, 1d11h20m +B>*192.168.0.16/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m + * via 10.0.0.5, PortChannel0005, 1d11h20m +B>*192.168.0.17/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m + * via 10.0.0.5, PortChannel0005, 1d11h20m +B>*192.168.0.32/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m + * via 10.0.0.5, PortChannel0005, 1d11h20m +B>*192.168.0.33/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m + * via 10.0.0.5, PortChannel0005, 1d11h20m +B>*192.168.0.48/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m + * via 10.0.0.5, PortChannel0005, 1d11h20m +B>*192.168.0.49/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m + * via 10.0.0.5, PortChannel0005, 1d11h20m +B>*192.168.0.64/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m + * via 10.0.0.5, PortChannel0005, 1d11h20m +B>*192.168.0.65/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m + * via 10.0.0.5, PortChannel0005, 1d11h20m +B>*192.168.0.80/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m + * via 10.0.0.5, PortChannel0005, 1d11h20m +B>*192.168.0.81/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m + * via 10.0.0.5, PortChannel0005, 1d11h20m +B>*192.168.0.96/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m + * via 10.0.0.5, PortChannel0005, 1d11h20m +B>*192.168.0.97/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m + * via 10.0.0.5, PortChannel0005, 1d11h20m +B>*192.168.0.112/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m + * via 10.0.0.5, PortChannel0005, 1d11h20m +B>*192.168.0.113/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m + * via 10.0.0.5, PortChannel0005, 1d11h20m +B>*192.168.0.128/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m + * via 10.0.0.5, PortChannel0005, 1d11h20m +B>*192.168.0.129/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m + * via 10.0.0.5, PortChannel0005, 1d11h20m +B>*192.168.0.144/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m + * via 10.0.0.5, PortChannel0005, 1d11h20m +B>*192.168.0.145/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m + * via 10.0.0.5, PortChannel0005, 1d11h20m +B>*192.168.0.160/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m + * via 10.0.0.5, PortChannel0005, 1d11h20m +B>*192.168.0.161/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m + * via 10.0.0.5, PortChannel0005, 1d11h20m +B>*192.168.0.176/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m + * via 10.0.0.5, PortChannel0005, 1d11h20m +B>*192.168.0.177/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m + * via 10.0.0.5, PortChannel0005, 1d11h20m +B>*192.168.0.192/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m + * via 10.0.0.5, PortChannel0005, 1d11h20m +B>*192.168.0.193/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m + * via 10.0.0.5, PortChannel0005, 1d11h20m +B>*192.168.0.208/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m + * via 10.0.0.5, PortChannel0005, 1d11h20m +B>*192.168.0.209/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m + * via 10.0.0.5, PortChannel0005, 1d11h20m +B>*192.168.0.224/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m + * via 10.0.0.5, PortChannel0005, 1d11h20m +B>*192.168.0.225/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m + * via 10.0.0.5, PortChannel0005, 1d11h20m +B>*192.168.0.240/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m + * via 10.0.0.5, PortChannel0005, 1d11h20m +B>*192.168.0.241/32 [20/0] via 10.0.0.1, PortChannel0002, 1d11h20m + * via 10.0.0.5, PortChannel0005, 1d11h20m +""" + +show_specific_ip_route_expected_output = """\ +Routing entry for 192.168.0.1/32 + Known via "bgp", distance 20, metric 0, best + Last update 1d11h20m ago + * 10.0.0.1, via PortChannel0002 + * 10.0.0.5, via PortChannel0005 + +""" + +show_special_ip_route_expected_output = """\ +Codes: K - kernel route, C - connected, S - static, R - RIP, + O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP, + T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP, + F - PBR, f - OpenFabric, + > - selected route, * - FIB route, q - queued route, r - rejected route + +C>*10.3.0.4/31 (blackhole)(vrf 2, PortChannel1014, inactive (recursive) 2d22h02m +C>*10.5.0.4/31 (ICMP unreachable) inactive 2d22h02m +C>*10.5.0.8/31 (ICMP admin-prohibited) inactive onlink, src 10.2.3.4 2d22h02m +C> 10.6.0.8/31 inactive 2d22h02m +C>q10.6.5.0/31 inactive 2d22h02m +C>r10.6.5.3/31 inactive 2d22h02m +C>*10.7.0.8/31 (ICMP admin-prohibited) inactive onlink, src 10.2.3.4, label IPv4 Explicit Null/OAM Alert/Extension/1212 2d22h02m +""" + + +show_ipv6_route_err_expected_output = """\ +% Unknown command: show ipv6 route garbage +""" + +show_ipv6_route_single_json_expected_output = """\ +{ + "20c0:a8c7:0:81::/64": [ + { + "destSelected": true, + "distance": 20, + "installed": true, + "internalFlags": 8, + "internalNextHopActiveNum": 2, + "internalNextHopNum": 2, + "internalStatus": 16, + "metric": 0, + "nexthops": [ + { + "active": true, + "afi": "ipv6", + "fib": true, + "flags": 3, + "interfaceIndex": 928, + "interfaceName": "PortChannel0011", + "ip": "fc00::e" + }, + { + "active": true, + "afi": "ipv6", + "fib": true, + "flags": 3, + "interfaceIndex": 927, + "interfaceName": "PortChannel0008", + "ip": "fc00::a" + } + ], + "prefix": "20c0:a8c7:0:81::/64", + "protocol": "bgp", + "selected": true, + "table": 254, + "uptime": "2d13h40m" + } + ] +} +""" + +show_ipv6_route_expected_output = """\ +Codes: K - kernel route, C - connected, S - static, R - RIP, + O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP, + T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP, + F - PBR, f - OpenFabric, + > - selected route, * - FIB route, q - queued route, r - rejected route + +B>*::/0 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +K *::/0 [210/0] via fd00::1, eth0, 1d11h34m +B>*2064:100::1/128 [20/0] via fc00::2, PortChannel0002, 1d11h34m +B>*2064:100::3/128 [20/0] via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a800::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a800:0:1::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a800:0:10::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a800:0:11::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a800:0:20::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a800:0:21::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a800:0:30::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a800:0:31::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a800:0:40::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a800:0:41::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a800:0:50::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a800:0:51::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a800:0:60::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a800:0:61::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a800:0:70::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a800:0:71::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a800:0:80::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a800:0:81::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a800:0:90::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a800:0:91::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a800:0:a0::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a800:0:a1::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a800:0:b0::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a800:0:b1::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a800:0:c0::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a800:0:c1::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a800:0:d0::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a800:0:d1::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a800:0:e0::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a800:0:e1::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a800:0:f0::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a800:0:f1::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a801::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a801:0:1::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a801:0:10::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a801:0:11::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a801:0:20::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a801:0:21::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a801:0:30::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a801:0:31::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a801:0:40::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a801:0:41::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a801:0:50::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a801:0:51::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a801:0:60::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a801:0:61::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a801:0:70::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a801:0:71::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a801:0:80::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a801:0:81::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a801:0:90::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a801:0:91::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a801:0:a0::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a801:0:a1::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a801:0:b0::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a801:0:b1::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a801:0:c0::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a801:0:c1::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a801:0:d0::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a801:0:d1::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a801:0:e0::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a801:0:e1::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a801:0:f0::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +B>*20c0:a801:0:f1::/64 [20/0] via fc00::2, PortChannel0002, 1d11h34m + * via fc00::6, PortChannel0005, 1d11h34m +C>*2603:10e2:400::/128 is directly connected, Loopback4096, 1d11h34m +C>*fc00::/126 is directly connected, PortChannel0002, 1d11h34m +C>*fc00::4/126 is directly connected, PortChannel0005, 1d11h34m +C>*fc00:1::32/128 is directly connected, Loopback0, 1d11h34m +C>*fd00::/80 is directly connected, eth0, 1d11h34m +C *fe80::/64 is directly connected, PortChannel0002, 1d11h34m +C *fe80::/64 is directly connected, PortChannel0005, 1d11h34m +C *fe80::/64 is directly connected, Ethernet20, 1d11h34m +C *fe80::/64 is directly connected, Ethernet16, 1d11h34m +C *fe80::/64 is directly connected, Ethernet4, 1d11h34m +C *fe80::/64 is directly connected, Ethernet0, 1d11h34m +C *fe80::/64 is directly connected, Loopback4096, 1d11h34m +C *fe80::/64 is directly connected, Loopback0, 1d11h34m +C>*fe80::/64 is directly connected, eth0, 1d11h34m +""" + +# +# MULTI ASIC TEST SECTION +# +show_ip_route_multi_asic_display_all_expected_output = """\ +Codes: K - kernel route, C - connected, S - static, R - RIP, + O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP, + T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP, + F - PBR, f - OpenFabric, + > - selected route, * - FIB route, q - queued route, r - rejected route + +asic0: +K *0.0.0.0/0 [210/0] via 240.127.1.1, eth0, 2d22h00m +B>*0.0.0.0/0 [20/0] via 10.0.0.5, PortChannel0005, 2d22h00m + * via 10.0.0.1, PortChannel0002, 2d22h00m +S 0.0.0.0/0 [200/0] via 10.3.146.1, inactive 2d22h00m +C>*8.0.0.0/32 is directly connected, Loopback4096, 2d22h00m +C>*10.0.0.0/31 is directly connected, PortChannel4001, 2d22h00m +C>*10.0.0.4/31 is directly connected, PortChannel0005, 2d22h00m +C>*10.1.0.32/32 is directly connected, Loopback0, 2d22h00m +B>*100.1.0.3/32 [20/0] via 10.0.0.5, PortChannel0005, 2d22h00m +B>*192.168.0.0/32 [20/0] via 10.0.0.5, PortChannel0005, 2d22h00m + * via 10.0.0.1, PortChannel0002, 2d22h00m +B>*192.168.0.1/32 [20/0] via 10.0.0.5, PortChannel0005, 2d22h00m + * via 10.0.0.1, PortChannel0002, 2d22h00m +B>*192.168.0.32/32 [20/0] via 10.0.0.5, PortChannel0005, 2d22h00m + * via 10.0.0.1, PortChannel0002, 2d22h00m +B>*192.168.0.96/32 [20/0] via 10.0.0.5, Ethernet-BP4, 2d22h00m + * via 10.0.0.1, Ethernet-BP0, 2d22h00m +B>*192.168.0.97/32 [20/0] via 10.0.0.5, PortChannel0005, 2d22h00m + * via 10.0.0.1, PortChannel0002, 2d22h00m +B>*192.168.0.192/32 [20/0] via 10.0.0.5, Ethernet-BP4, 2d22h00m + * via 10.0.0.1, PortChannel4001, 2d22h00m +B>*192.168.0.193/32 [20/0] via 10.0.0.5, PortChannel0005, 2d22h00m + * via 10.0.0.1, PortChannel0002, 2d22h00m +B>*192.168.0.208/32 [20/0] via 10.0.0.5, PortChannel0005, 2d22h00m + * via 10.0.0.1, PortChannel0002, 2d22h00m +B>*192.168.0.209/32 [20/0] via 10.0.0.5, PortChannel0005, 2d22h00m + * via 10.0.0.1, PortChannel0002, 2d22h00m +B>*192.168.0.224/32 [20/0] via 10.0.0.5, PortChannel0005, 2d22h00m + * via 10.0.0.1, PortChannel0002, 2d22h00m +B>*192.168.0.225/32 [20/0] via 10.0.0.5, PortChannel0005, 2d22h00m + * via 10.0.0.1, PortChannel0002, 2d22h00m +B>*192.168.0.240/32 [20/0] via 10.0.0.5, PortChannel0005, 2d22h00m + * via 10.0.0.1, PortChannel0002, 2d22h00m +B>*192.168.0.241/32 [20/0] via 10.0.0.5, PortChannel0005, 2d22h00m + * via 10.0.0.1, PortChannel0002, 2d22h00m +asic1: +K *0.0.0.0/0 [210/0] via 240.127.1.1, eth0, 2d22h01m +B>*0.0.0.0/0 [20/0] via 10.0.0.8, PortChannel0008, 2d22h01m + * via 10.0.0.7, PortChannel0007, 2d22h01m +S 0.0.0.0/0 [200/0] via 10.3.146.1, inactive 2d22h01m +C>*8.0.0.1/32 is directly connected, Loopback4096, 2d22h01m +C>*10.0.0.0/31 is directly connected, PortChannel4009, 2d22h01m +C>*10.0.0.4/31 is directly connected, PortChannel0008, 2d22h01m +C>*10.1.0.32/32 is directly connected, Loopback0, 2d22h01m +B>*100.1.0.3/32 [20/0] via 10.0.0.8, PortChannel0008, 2d22h01m +B>*192.168.0.0/32 [20/0] via 10.0.0.8, PortChannel0008, 2d22h01m + * via 10.0.0.7, PortChannel0007, 2d22h01m +B>*192.168.0.1/32 [20/0] via 10.0.0.8, PortChannel0008, 2d22h01m + * via 10.0.0.7, PortChannel0007, 2d22h01m +B>*192.168.0.32/32 [20/0] via 10.0.0.8, PortChannel0008, 2d22h01m + * via 10.0.0.7, PortChannel0007, 2d22h01m +B>*192.168.0.96/32 [20/0] via 10.0.0.8, Ethernet-BP260, 2d22h01m + * via 10.0.0.7, Ethernet-BP256, 2d22h01m +B>*192.168.0.97/32 [20/0] via 10.0.0.8, PortChannel0008, 2d22h01m + * via 10.0.0.7, PortChannel0007, 2d22h01m +B>*192.168.0.192/32 [20/0] via 10.0.0.8, Ethernet-BP260, 2d22h01m + * via 10.0.0.7, PortChannel4009, 2d22h01m +B>*192.168.0.193/32 [20/0] via 10.0.0.8, PortChannel0008, 2d22h01m + * via 10.0.0.7, PortChannel0007, 2d22h01m +B>*192.168.0.208/32 [20/0] via 10.0.0.8, PortChannel0008, 2d22h01m + * via 10.0.0.7, PortChannel0007, 2d22h01m +B>*192.168.0.209/32 [20/0] via 10.0.0.8, PortChannel0008, 2d22h01m + * via 10.0.0.7, PortChannel0007, 2d22h01m +B>*192.168.0.224/32 [20/0] via 10.0.0.8, PortChannel0008, 2d22h01m + * via 10.0.0.7, PortChannel0007, 2d22h01m +B>*192.168.0.225/32 [20/0] via 10.0.0.8, PortChannel0008, 2d22h01m + * via 10.0.0.7, PortChannel0007, 2d22h01m +B>*192.168.0.240/32 [20/0] via 10.0.0.8, Ethernet-BP260, 2d22h01m + * via 10.0.0.7, PortChannel4009, 2d22h01m +B>*192.168.0.241/32 [20/0] via 10.0.0.8, PortChannel0008, 2d22h01m + * via 10.0.0.7, PortChannel0007, 2d22h01m +asic2: +K *0.0.0.0/0 [210/0] via 240.127.1.1, eth0, 2d22h02m +B>*0.0.0.0/0 [20/0] via 10.0.0.16, PortChannel1016, 2d22h02m + * via 10.0.0.15, PortChannel1015, 2d22h02m +S 0.0.0.0/0 [200/0] via 10.3.146.1, inactive 2d22h02m +C>*8.0.0.2/32 is directly connected, Loopback4096, 2d22h02m +C>*10.0.0.0/31 is directly connected, PortChannel4001, 2d22h02m +C>*10.0.0.4/31 is directly connected, PortChannel1016, 2d22h02m +C>*10.1.0.32/32 is directly connected, Loopback0, 2d22h02m +B>*100.1.0.3/32 [20/0] via 10.0.0.16, PortChannel1016, 2d22h02m +B>*192.168.0.0/32 [20/0] via 10.0.0.16, PortChannel1016, 2d22h02m + * via 10.0.0.15, PortChannel1015, 2d22h02m +B>*192.168.0.1/32 [20/0] via 10.0.0.16, PortChannel1016, 2d22h02m + * via 10.0.0.15, PortChannel1015, 2d22h02m +B>*192.168.0.32/32 [20/0] via 10.0.0.16, PortChannel1016, 2d22h02m + * via 10.0.0.15, PortChannel1015, 2d22h02m +B>*192.168.0.96/32 [20/0] via 10.0.0.16, Ethernet-BP24, 2d22h02m + * via 10.0.0.15, Ethernet-BP20, 2d22h02m +B>*192.168.0.97/32 [20/0] via 10.0.0.16, PortChannel1016, 2d22h02m + * via 10.0.0.15, PortChannel1015, 2d22h02m +B>*192.168.0.192/32 [20/0] via 10.0.0.16, Ethernet-BP24, 2d22h02m + * via 10.0.0.15, PortChannel4001, 2d22h02m +B>*192.168.0.193/32 [20/0] via 10.0.0.16, PortChannel1016, 2d22h02m + * via 10.0.0.15, PortChannel1015, 2d22h02m +B>*192.168.0.208/32 [20/0] via 10.0.0.16, PortChannel1016, 2d22h02m + * via 10.0.0.15, PortChannel1015, 2d22h02m +B>*192.168.0.209/32 [20/0] via 10.0.0.16, PortChannel1016, 2d22h02m + * via 10.0.0.15, PortChannel1015, 2d22h02m +B>*192.168.0.224/32 [20/0] via 10.0.0.16, PortChannel1016, 2d22h02m + * via 10.0.0.15, PortChannel1015, 2d22h02m +B>*192.168.0.225/32 [20/0] via 10.0.0.16, PortChannel1016, 2d22h02m + * via 10.0.0.15, PortChannel1015, 2d22h02m +B>*192.168.0.240/32 [20/0] via 10.0.0.16, PortChannel1016, 2d22h02m + * via 10.0.0.15, PortChannel1015, 2d22h02m +B>*192.168.0.241/32 [20/0] via 10.0.0.16, PortChannel1016, 2d22h02m + * via 10.0.0.15, PortChannel1015, 2d22h02m +""" + +show_ip_route_multi_asic_display_all_front_expected_output = """\ +Codes: K - kernel route, C - connected, S - static, R - RIP, + O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP, + T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP, + F - PBR, f - OpenFabric, + > - selected route, * - FIB route, q - queued route, r - rejected route + +K *0.0.0.0/0 [210/0] via 240.127.1.1, eth0, 2d22h00m +B>*0.0.0.0/0 [20/0] via 10.0.0.5, PortChannel0005, 2d22h00m + * via 10.0.0.1, PortChannel0002, 2d22h00m + * via 10.0.0.15, PortChannel1015, 2d22h00m + * via 10.0.0.16, PortChannel1016, 2d22h00m +S 0.0.0.0/0 [200/0] via 10.3.146.1, inactive 2d22h00m +C>*8.0.0.0/32 is directly connected, Loopback4096, 2d22h00m +C>*8.0.0.2/32 is directly connected, Loopback4096, 2d22h02m +C>*10.0.0.4/31 is directly connected, PortChannel0005, 2d22h00m +C>*10.0.0.4/31 is directly connected, PortChannel1016, 2d22h02m +C>*10.1.0.32/32 is directly connected, Loopback0, 2d22h00m +B>*100.1.0.3/32 [20/0] via 10.0.0.5, PortChannel0005, 2d22h00m + * via 10.0.0.16, PortChannel1016, 2d22h00m +B>*192.168.0.0/32 [20/0] via 10.0.0.5, PortChannel0005, 2d22h00m + * via 10.0.0.1, PortChannel0002, 2d22h00m + * via 10.0.0.15, PortChannel1015, 2d22h00m + * via 10.0.0.16, PortChannel1016, 2d22h00m +B>*192.168.0.1/32 [20/0] via 10.0.0.5, PortChannel0005, 2d22h00m + * via 10.0.0.1, PortChannel0002, 2d22h00m + * via 10.0.0.15, PortChannel1015, 2d22h00m + * via 10.0.0.16, PortChannel1016, 2d22h00m +B>*192.168.0.32/32 [20/0] via 10.0.0.5, PortChannel0005, 2d22h00m + * via 10.0.0.1, PortChannel0002, 2d22h00m + * via 10.0.0.15, PortChannel1015, 2d22h00m + * via 10.0.0.16, PortChannel1016, 2d22h00m +B>*192.168.0.97/32 [20/0] via 10.0.0.5, PortChannel0005, 2d22h00m + * via 10.0.0.1, PortChannel0002, 2d22h00m + * via 10.0.0.15, PortChannel1015, 2d22h00m + * via 10.0.0.16, PortChannel1016, 2d22h00m +B>*192.168.0.193/32 [20/0] via 10.0.0.5, PortChannel0005, 2d22h00m + * via 10.0.0.1, PortChannel0002, 2d22h00m + * via 10.0.0.15, PortChannel1015, 2d22h00m + * via 10.0.0.16, PortChannel1016, 2d22h00m +B>*192.168.0.208/32 [20/0] via 10.0.0.5, PortChannel0005, 2d22h00m + * via 10.0.0.1, PortChannel0002, 2d22h00m + * via 10.0.0.15, PortChannel1015, 2d22h00m + * via 10.0.0.16, PortChannel1016, 2d22h00m +B>*192.168.0.209/32 [20/0] via 10.0.0.5, PortChannel0005, 2d22h00m + * via 10.0.0.1, PortChannel0002, 2d22h00m + * via 10.0.0.15, PortChannel1015, 2d22h00m + * via 10.0.0.16, PortChannel1016, 2d22h00m +B>*192.168.0.224/32 [20/0] via 10.0.0.5, PortChannel0005, 2d22h00m + * via 10.0.0.1, PortChannel0002, 2d22h00m + * via 10.0.0.15, PortChannel1015, 2d22h00m + * via 10.0.0.16, PortChannel1016, 2d22h00m +B>*192.168.0.225/32 [20/0] via 10.0.0.5, PortChannel0005, 2d22h00m + * via 10.0.0.1, PortChannel0002, 2d22h00m + * via 10.0.0.15, PortChannel1015, 2d22h00m + * via 10.0.0.16, PortChannel1016, 2d22h00m +B>*192.168.0.240/32 [20/0] via 10.0.0.5, PortChannel0005, 2d22h00m + * via 10.0.0.1, PortChannel0002, 2d22h00m + * via 10.0.0.15, PortChannel1015, 2d22h00m + * via 10.0.0.16, PortChannel1016, 2d22h00m +B>*192.168.0.241/32 [20/0] via 10.0.0.5, PortChannel0005, 2d22h00m + * via 10.0.0.1, PortChannel0002, 2d22h00m + * via 10.0.0.15, PortChannel1015, 2d22h00m + * via 10.0.0.16, PortChannel1016, 2d22h00m +""" + +show_ipv6_route_multi_asic_all_namesapce_output = """\ +Codes: K - kernel route, C - connected, S - static, R - RIP, + O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP, + T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP, + F - PBR, f - OpenFabric, + > - selected route, * - FIB route, q - queued route, r - rejected route + +K *::/0 [210/0] via fd00::1, eth0, 2d22h00m +B>*::/0 [20/0] via fc00::6, PortChannel0005, 2d22h00m + * via fc00::2, PortChannel0002, 2d22h00m + * via fc00::2, PortChannel1015, 2d22h00m + * via fc00::6, PortChannel1016, 2d22h00m +B>*2064:100::1/128 [20/0] via fc00::2, PortChannel0002, 2d22h00m + * via fc00::2, PortChannel1015, 2d22h00m +B>*2064:100::3/128 [20/0] via fc00::6, PortChannel0005, 2d22h00m + * via fc00::6, PortChannel1016, 2d22h00m +B>*20c0:a800:0:1::/64 [20/0] via fc00::6, PortChannel0005, 2d22h00m + * via fc00::2, PortChannel0002, 2d22h00m + * via fc00::2, PortChannel1015, 2d22h00m + * via fc00::6, PortChannel1016, 2d22h00m +B>*20c0:a800:0:10::/64 [20/0] via fc00::6, PortChannel0005, 2d22h00m + * via fc00::2, PortChannel0002, 2d22h00m + * via fc00::2, PortChannel1015, 2d22h00m + * via fc00::6, PortChannel1016, 2d22h00m +B>*20c0:a800:0:11::/64 [20/0] via fc00::6, PortChannel0002, 2d22h00m + * via fc00::6, PortChannel1015, 2d22h00m +B>*20c0:a800:0:20::/64 [20/0] via fc00::2, PortChannel0002, 2d22h00m + * via fc00::2, PortChannel1015, 2d22h00m +B>*20c0:a800:0:21::/64 [20/0] via fc00::2, PortChannel0002, 2d22h00m + * via fc00::2, PortChannel1015, 2d22h00m +C>*2603:10e2:400::/128 is directly connected, Loopback4096, 2d22h00m +C>*2603:10e2:400::2/128 is directly connected, Loopback4096, 2d22h02m +C>*fc00::4/126 is directly connected, PortChannel0005, 2d22h00m +C>*fc00::4/126 is directly connected, PortChannel1016, 2d22h02m +C>*fc00:1::32/128 is directly connected, Loopback0, 2d22h00m +C>*fd00::/80 is directly connected, eth0, 2d22h00m +C>*fe80::/64 is directly connected, eth0, 2d22h00m +C *fe80::/64 is directly connected, Loopback0, 2d22h00m +C *fe80::/64 is directly connected, Loopback4096, 2d22h00m +C *fe80::/64 is directly connected, Ethernet16, 2d22h00m +C *fe80::/64 is directly connected, Ethernet20, 2d22h00m +C *fe80::/64 is directly connected, PortChannel0005, 2d22h00m +C *fe80::/64 is directly connected, PortChannel1016, 2d22h02m +C *fe80::/64 is directly connected, Ethernet24, 2d22h02m +""" + +show_ipv6_route_multi_asic_single_namesapce_output = """\ +Codes: K - kernel route, C - connected, S - static, R - RIP, + O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP, + T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP, + F - PBR, f - OpenFabric, + > - selected route, * - FIB route, q - queued route, r - rejected route + +K *::/0 [210/0] via fd00::1, eth0, 2d22h02m +B>*::/0 [20/0] via fc00::6, PortChannel1016, 2d22h02m + * via fc00::2, PortChannel1015, 2d22h02m +B>*2064:100::1/128 [20/0] via fc00::2, PortChannel1015, 2d22h02m +B>*2064:100::3/128 [20/0] via fc00::6, PortChannel1016, 2d22h02m +B>*20c0:a800:0:1::/64 [20/0] via fc00::6, PortChannel1016, 2d22h02m + * via fc00::2, PortChannel1015, 2d22h02m +B>*20c0:a800:0:10::/64 [20/0] via fc00::6, PortChannel1016, 2d22h02m + * via fc00::2, PortChannel1015, 2d22h02m +B>*20c0:a800:0:11::/64 [20/0] via fc00::6, PortChannel1015, 2d22h02m +B>*20c0:a800:0:20::/64 [20/0] via fc00::2, PortChannel1015, 2d22h02m +B>*20c0:a800:0:21::/64 [20/0] via fc00::2, PortChannel1015, 2d22h02m +C>*2603:10e2:400::2/128 is directly connected, Loopback4096, 2d22h02m +C>*fc00::4/126 is directly connected, PortChannel1016, 2d22h02m +C>*fc00:1::32/128 is directly connected, Loopback0, 2d22h02m +C>*fd00::/80 is directly connected, eth0, 2d22h02m +C>*fe80::/64 is directly connected, eth0, 2d22h02m +C *fe80::/64 is directly connected, Loopback0, 2d22h02m +C *fe80::/64 is directly connected, Loopback4096, 2d22h02m +C *fe80::/64 is directly connected, Ethernet24, 2d22h02m +C *fe80::/64 is directly connected, Ethernet20, 2d22h02m +C *fe80::/64 is directly connected, PortChannel1016, 2d22h02m +""" + +show_ip_route_multi_asic_invalid_namesapce_err_output = """\ +namespace 'asic7' is not valid. valid name spaces are: +['asic0', 'asic1', 'asic2'] +""" + +show_ip_route_multi_asic_invalid_display_err_output = """\ +dislay option 'everything' is not a valid option. +""" + +show_ip_route_multi_asic_invalid_tables_cmd_err_output = """\ +% Unknown command: show ip route tables +""" + +show_ip_route_multi_asic_specific_route_output = """\ +Routing entry for 10.0.0.4/31 + Known via "connected", distance 0, metric 0, best + Last update 2d22h00m ago + * directly connected, PortChannel0005 + + +Routing entry for 10.0.0.4/31 + Known via "connected", distance 0, metric 0, best + Last update 2d22h02m ago + * directly connected, PortChannel1016 + + +""" + +show_ipv6_route_multi_asic_specific_route_output = """\ +Routing entry for 2603:10e2:400::/128 + Known via "connected", distance 0, metric 0, best + Last update 2d22h00m ago + * directly connected, Loopback4096 + + +""" + +show_ipv6_route_multi_asic_json_output = """\ +{ + "2603:10e2:400::/128": [ + { + "destSelected": true, + "distance": 0, + "installed": true, + "internalFlags": 8, + "internalNextHopActiveNum": 1, + "internalNextHopNum": 1, + "internalStatus": 16, + "metric": 0, + "nexthops": [ + { + "active": true, + "directlyConnected": true, + "fib": true, + "flags": 3, + "interfaceIndex": 726, + "interfaceName": "Loopback4096" + } + ], + "prefix": "2603:10e2:400::/128", + "protocol": "connected", + "selected": true, + "table": 254, + "uptime": "2d22h00m" + } + ] +} +""" +