diff options
Diffstat (limited to 'tests/topotests/isis_lfa_topo1')
47 files changed, 4567 insertions, 0 deletions
diff --git a/tests/topotests/isis_lfa_topo1/__init__.py b/tests/topotests/isis_lfa_topo1/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/topotests/isis_lfa_topo1/__init__.py diff --git a/tests/topotests/isis_lfa_topo1/rt1/bfdd.conf b/tests/topotests/isis_lfa_topo1/rt1/bfdd.conf new file mode 100644 index 0000000..ef67eae --- /dev/null +++ b/tests/topotests/isis_lfa_topo1/rt1/bfdd.conf @@ -0,0 +1,4 @@ +hostname rt1 +! +bfd +! diff --git a/tests/topotests/isis_lfa_topo1/rt1/isisd.conf b/tests/topotests/isis_lfa_topo1/rt1/isisd.conf new file mode 100644 index 0000000..fc81df0 --- /dev/null +++ b/tests/topotests/isis_lfa_topo1/rt1/isisd.conf @@ -0,0 +1,57 @@ +password 1 +hostname rt1 +log file isisd.log +! +! debug isis events +! debug isis route-events +! debug isis spf-events +! debug isis lsp-gen +! +interface lo + ipv6 router isis 1 + isis passive +! +interface eth-rt2 + ipv6 router isis 1 + isis network point-to-point + isis hello-interval 1 + isis hello-multiplier 10 + isis fast-reroute lfa +! +interface eth-rt3 + ipv6 router isis 1 + isis network point-to-point + isis hello-interval 1 + isis hello-multiplier 10 + isis fast-reroute lfa +! +interface eth-rt4 + ipv6 router isis 1 + isis network point-to-point + isis hello-interval 1 + isis hello-multiplier 10 + isis fast-reroute lfa +! +interface eth-rt5 + ipv6 router isis 1 + isis metric 20 + isis network point-to-point + isis hello-interval 1 + isis hello-multiplier 10 + isis fast-reroute lfa +! +interface eth-rt6 + ipv6 router isis 1 + isis network point-to-point + isis hello-interval 1 + isis hello-multiplier 10 + isis fast-reroute lfa +! +router isis 1 + net 49.0000.0000.0000.0001.00 + is-type level-1 + lsp-gen-interval 2 + topology ipv6-unicast + !fast-reroute lfa tiebreaker node-protecting index 10 + !fast-reroute lfa tiebreaker downstream index 20 + !fast-reroute lfa tiebreaker lowest-backup-metric index 30 diff --git a/tests/topotests/isis_lfa_topo1/rt1/step1/show_ipv6_route.ref b/tests/topotests/isis_lfa_topo1/rt1/step1/show_ipv6_route.ref new file mode 100644 index 0000000..10c61d5 --- /dev/null +++ b/tests/topotests/isis_lfa_topo1/rt1/step1/show_ipv6_route.ref @@ -0,0 +1,236 @@ +{ + "2001:db8:1000::2\/128":[ + { + "prefix":"2001:db8:1000::2\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt2", + "active":true, + "backupIndex":[ + 0, + 1, + 2 + ] + } + ], + "backupNexthops":[ + { + "afi":"ipv6", + "interfaceName":"eth-rt3", + "active":true + }, + { + "afi":"ipv6", + "interfaceName":"eth-rt5", + "active":true + }, + { + "afi":"ipv6", + "interfaceName":"eth-rt6", + "active":true + } + ] + } + ], + "2001:db8:1000::3\/128":[ + { + "prefix":"2001:db8:1000::3\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt3", + "active":true, + "backupIndex":[ + 0, + 1 + ] + } + ], + "backupNexthops":[ + { + "afi":"ipv6", + "interfaceName":"eth-rt2", + "active":true + }, + { + "afi":"ipv6", + "interfaceName":"eth-rt5", + "active":true + } + ] + } + ], + "2001:db8:1000::4\/128":[ + { + "prefix":"2001:db8:1000::4\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt4", + "active":true, + "backupIndex":[ + 0 + ] + } + ], + "backupNexthops":[ + { + "afi":"ipv6", + "interfaceName":"eth-rt5", + "active":true + } + ] + } + ], + "2001:db8:1000::5\/128":[ + { + "prefix":"2001:db8:1000::5\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":30, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt5", + "active":true, + "backupIndex":[ + 0, + 1, + 2, + 3 + ] + } + ], + "backupNexthops":[ + { + "afi":"ipv6", + "interfaceName":"eth-rt2", + "active":true + }, + { + "afi":"ipv6", + "interfaceName":"eth-rt3", + "active":true + }, + { + "afi":"ipv6", + "interfaceName":"eth-rt4", + "active":true + }, + { + "afi":"ipv6", + "interfaceName":"eth-rt6", + "active":true + } + ] + } + ], + "2001:db8:1000::6\/128":[ + { + "prefix":"2001:db8:1000::6\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt6", + "active":true, + "backupIndex":[ + 0, + 1 + ] + } + ], + "backupNexthops":[ + { + "afi":"ipv6", + "interfaceName":"eth-rt2", + "active":true + }, + { + "afi":"ipv6", + "interfaceName":"eth-rt5", + "active":true + } + ] + } + ], + "2001:db8:1000::7\/128":[ + { + "prefix":"2001:db8:1000::7\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":25, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt2", + "active":true, + "backupIndex":[ + 0, + 1, + 2, + 3 + ] + } + ], + "backupNexthops":[ + { + "afi":"ipv6", + "interfaceName":"eth-rt3", + "active":true + }, + { + "afi":"ipv6", + "interfaceName":"eth-rt4", + "active":true + }, + { + "afi":"ipv6", + "interfaceName":"eth-rt5", + "active":true + }, + { + "afi":"ipv6", + "interfaceName":"eth-rt6", + "active":true + } + ] + } + ] +} diff --git a/tests/topotests/isis_lfa_topo1/rt1/step1/show_yang_interface_isis_adjacencies.ref b/tests/topotests/isis_lfa_topo1/rt1/step1/show_yang_interface_isis_adjacencies.ref new file mode 100644 index 0000000..92dd7b5 --- /dev/null +++ b/tests/topotests/isis_lfa_topo1/rt1/step1/show_yang_interface_isis_adjacencies.ref @@ -0,0 +1,101 @@ +{ + "frr-interface:lib": { + "interface": [ + { + "name": "eth-rt2", + "vrf": "default", + "state": { + "frr-isisd:isis": { + "adjacencies": { + "adjacency": [ + { + "neighbor-sys-type": "level-1", + "neighbor-sysid": "0000.0000.0002", + "hold-timer": 10, + "neighbor-priority": 0, + "state": "up" + } + ] + } + } + } + }, + { + "name": "eth-rt3", + "vrf": "default", + "state": { + "frr-isisd:isis": { + "adjacencies": { + "adjacency": [ + { + "neighbor-sys-type": "level-1", + "neighbor-sysid": "0000.0000.0003", + "hold-timer": 10, + "neighbor-priority": 0, + "state": "up" + } + ] + } + } + } + }, + { + "name": "eth-rt4", + "vrf": "default", + "state": { + "frr-isisd:isis": { + "adjacencies": { + "adjacency": [ + { + "neighbor-sys-type": "level-1", + "neighbor-sysid": "0000.0000.0004", + "hold-timer": 10, + "neighbor-priority": 0, + "state": "up" + } + ] + } + } + } + }, + { + "name": "eth-rt5", + "vrf": "default", + "state": { + "frr-isisd:isis": { + "adjacencies": { + "adjacency": [ + { + "neighbor-sys-type": "level-1", + "neighbor-sysid": "0000.0000.0005", + "hold-timer": 10, + "neighbor-priority": 0, + "state": "up" + } + ] + } + } + } + }, + { + "name": "eth-rt6", + "vrf": "default", + "state": { + "frr-isisd:isis": { + "adjacencies": { + "adjacency": [ + { + "neighbor-sys-type": "level-1", + "neighbor-sysid": "0000.0000.0006", + "hold-timer": 10, + "neighbor-priority": 0, + "state": "up" + } + ] + } + } + } + } + ] + } +} diff --git a/tests/topotests/isis_lfa_topo1/rt1/step10/show_ipv6_route.ref.diff b/tests/topotests/isis_lfa_topo1/rt1/step10/show_ipv6_route.ref.diff new file mode 100644 index 0000000..d626cdc --- /dev/null +++ b/tests/topotests/isis_lfa_topo1/rt1/step10/show_ipv6_route.ref.diff @@ -0,0 +1,46 @@ +--- a/rt1/step9/show_ipv6_route.ref ++++ b/rt1/step10/show_ipv6_route.ref +@@ -16,7 +16,8 @@ + "active":true, + "backupIndex":[ + 0, +- 1 ++ 1, ++ 2 + ] + } + ], +@@ -30,6 +31,11 @@ + "afi":"ipv6", + "interfaceName":"eth-rt5", + "active":true ++ }, ++ { ++ "afi":"ipv6", ++ "interfaceName":"eth-rt6", ++ "active":true + } + ] + } +@@ -198,7 +204,8 @@ + "backupIndex":[ + 0, + 1, +- 2 ++ 2, ++ 3 + ] + } + ], +@@ -217,6 +224,11 @@ + "afi":"ipv6", + "interfaceName":"eth-rt5", + "active":true ++ }, ++ { ++ "afi":"ipv6", ++ "interfaceName":"eth-rt6", ++ "active":true + } + ] + } diff --git a/tests/topotests/isis_lfa_topo1/rt1/step11/show_ipv6_route.ref.diff b/tests/topotests/isis_lfa_topo1/rt1/step11/show_ipv6_route.ref.diff new file mode 100644 index 0000000..f7f99c2 --- /dev/null +++ b/tests/topotests/isis_lfa_topo1/rt1/step11/show_ipv6_route.ref.diff @@ -0,0 +1,23 @@ +--- a/rt1/step10/show_ipv6_route.ref ++++ b/rt1/step11/show_ipv6_route.ref +@@ -204,19 +204,13 @@ + "backupIndex":[ + 0, + 1, +- 2, +- 3 ++ 2 + ] + } + ], + "backupNexthops":[ + { + "afi":"ipv6", +- "interfaceName":"eth-rt3", +- "active":true +- }, +- { +- "afi":"ipv6", + "interfaceName":"eth-rt4", + "active":true + }, diff --git a/tests/topotests/isis_lfa_topo1/rt1/step12/show_ipv6_route.ref.diff b/tests/topotests/isis_lfa_topo1/rt1/step12/show_ipv6_route.ref.diff new file mode 100644 index 0000000..3b767f1 --- /dev/null +++ b/tests/topotests/isis_lfa_topo1/rt1/step12/show_ipv6_route.ref.diff @@ -0,0 +1,107 @@ +--- a/rt1/step11/show_ipv6_route.ref ++++ b/rt1/step12/show_ipv6_route.ref +@@ -15,9 +15,7 @@ + "interfaceName":"eth-rt2", + "active":true, + "backupIndex":[ +- 0, +- 1, +- 2 ++ 0 + ] + } + ], +@@ -26,16 +24,6 @@ + "afi":"ipv6", + "interfaceName":"eth-rt3", + "active":true +- }, +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt5", +- "active":true +- }, +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt6", +- "active":true + } + ] + } +@@ -56,8 +44,7 @@ + "interfaceName":"eth-rt3", + "active":true, + "backupIndex":[ +- 0, +- 1 ++ 0 + ] + } + ], +@@ -66,11 +53,6 @@ + "afi":"ipv6", + "interfaceName":"eth-rt2", + "active":true +- }, +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt5", +- "active":true + } + ] + } +@@ -120,10 +102,7 @@ + "interfaceName":"eth-rt5", + "active":true, + "backupIndex":[ +- 0, +- 1, +- 2, +- 3 ++ 0 + ] + } + ], +@@ -132,21 +111,6 @@ + "afi":"ipv6", + "interfaceName":"eth-rt2", + "active":true +- }, +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt3", +- "active":true +- }, +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt4", +- "active":true +- }, +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt6", +- "active":true + } + ] + } +@@ -203,19 +167,13 @@ + "active":true, + "backupIndex":[ + 0, +- 1, +- 2 ++ 1 + ] + } + ], + "backupNexthops":[ + { + "afi":"ipv6", +- "interfaceName":"eth-rt4", +- "active":true +- }, +- { +- "afi":"ipv6", + "interfaceName":"eth-rt5", + "active":true + }, diff --git a/tests/topotests/isis_lfa_topo1/rt1/step13/show_ipv6_route.ref.diff b/tests/topotests/isis_lfa_topo1/rt1/step13/show_ipv6_route.ref.diff new file mode 100644 index 0000000..504af5a --- /dev/null +++ b/tests/topotests/isis_lfa_topo1/rt1/step13/show_ipv6_route.ref.diff @@ -0,0 +1,45 @@ +--- a/rt1/step12/show_ipv6_route.ref ++++ b/rt1/step13/show_ipv6_route.ref +@@ -131,8 +131,7 @@ + "interfaceName":"eth-rt6", + "active":true, + "backupIndex":[ +- 0, +- 1 ++ 0 + ] + } + ], +@@ -141,11 +140,6 @@ + "afi":"ipv6", + "interfaceName":"eth-rt2", + "active":true +- }, +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt5", +- "active":true + } + ] + } +@@ -166,19 +160,13 @@ + "interfaceName":"eth-rt2", + "active":true, + "backupIndex":[ +- 0, +- 1 ++ 0 + ] + } + ], + "backupNexthops":[ + { + "afi":"ipv6", +- "interfaceName":"eth-rt5", +- "active":true +- }, +- { +- "afi":"ipv6", + "interfaceName":"eth-rt6", + "active":true + } diff --git a/tests/topotests/isis_lfa_topo1/rt1/step14/show_ipv6_route.ref.diff b/tests/topotests/isis_lfa_topo1/rt1/step14/show_ipv6_route.ref.diff new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/topotests/isis_lfa_topo1/rt1/step14/show_ipv6_route.ref.diff diff --git a/tests/topotests/isis_lfa_topo1/rt1/step15/show_ipv6_route.ref.diff b/tests/topotests/isis_lfa_topo1/rt1/step15/show_ipv6_route.ref.diff new file mode 100644 index 0000000..a00d2d3 --- /dev/null +++ b/tests/topotests/isis_lfa_topo1/rt1/step15/show_ipv6_route.ref.diff @@ -0,0 +1,50 @@ +--- a/rt1/step14/show_ipv6_route.ref ++++ b/rt1/step15/show_ipv6_route.ref +@@ -6,22 +6,12 @@ + "selected":true, + "destSelected":true, + "distance":115, +- "metric":20, ++ "metric":25, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", +- "interfaceName":"eth-rt2", +- "active":true, +- "backupIndex":[ +- 0 +- ] +- } +- ], +- "backupNexthops":[ +- { +- "afi":"ipv6", + "interfaceName":"eth-rt3", + "active":true + } +@@ -151,22 +141,12 @@ + "selected":true, + "destSelected":true, + "distance":115, +- "metric":25, ++ "metric":30, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", +- "interfaceName":"eth-rt2", +- "active":true, +- "backupIndex":[ +- 0 +- ] +- } +- ], +- "backupNexthops":[ +- { +- "afi":"ipv6", + "interfaceName":"eth-rt6", + "active":true + } diff --git a/tests/topotests/isis_lfa_topo1/rt1/step16/show_ipv6_route.ref.diff b/tests/topotests/isis_lfa_topo1/rt1/step16/show_ipv6_route.ref.diff new file mode 100644 index 0000000..5e48511 --- /dev/null +++ b/tests/topotests/isis_lfa_topo1/rt1/step16/show_ipv6_route.ref.diff @@ -0,0 +1,53 @@ +--- a/rt1/step15/show_ipv6_route.ref ++++ b/rt1/step16/show_ipv6_route.ref +@@ -32,16 +32,6 @@ + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt3", +- "active":true, +- "backupIndex":[ +- 0 +- ] +- } +- ], +- "backupNexthops":[ +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt2", + "active":true + } + ] +@@ -90,16 +80,6 @@ + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt5", +- "active":true, +- "backupIndex":[ +- 0 +- ] +- } +- ], +- "backupNexthops":[ +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt2", + "active":true + } + ] +@@ -119,16 +99,6 @@ + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt6", +- "active":true, +- "backupIndex":[ +- 0 +- ] +- } +- ], +- "backupNexthops":[ +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt2", + "active":true + } + ] diff --git a/tests/topotests/isis_lfa_topo1/rt1/step2/show_ipv6_route.ref.diff b/tests/topotests/isis_lfa_topo1/rt1/step2/show_ipv6_route.ref.diff new file mode 100644 index 0000000..efc56d9 --- /dev/null +++ b/tests/topotests/isis_lfa_topo1/rt1/step2/show_ipv6_route.ref.diff @@ -0,0 +1,164 @@ +--- a/rt1/step1/show_ipv6_route.ref ++++ b/rt1/step2/show_ipv6_route.ref +@@ -13,28 +13,6 @@ + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt2", +- "active":true, +- "backupIndex":[ +- 0, +- 1, +- 2 +- ] +- } +- ], +- "backupNexthops":[ +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt3", +- "active":true +- }, +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt5", +- "active":true +- }, +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt6", + "active":true + } + ] +@@ -54,22 +32,6 @@ + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt3", +- "active":true, +- "backupIndex":[ +- 0, +- 1 +- ] +- } +- ], +- "backupNexthops":[ +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt2", +- "active":true +- }, +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt5", + "active":true + } + ] +@@ -89,16 +51,6 @@ + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt4", +- "active":true, +- "backupIndex":[ +- 0 +- ] +- } +- ], +- "backupNexthops":[ +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt5", + "active":true + } + ] +@@ -118,34 +70,6 @@ + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt5", +- "active":true, +- "backupIndex":[ +- 0, +- 1, +- 2, +- 3 +- ] +- } +- ], +- "backupNexthops":[ +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt2", +- "active":true +- }, +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt3", +- "active":true +- }, +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt4", +- "active":true +- }, +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt6", + "active":true + } + ] +@@ -165,22 +89,6 @@ + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt6", +- "active":true, +- "backupIndex":[ +- 0, +- 1 +- ] +- } +- ], +- "backupNexthops":[ +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt2", +- "active":true +- }, +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt5", + "active":true + } + ] +@@ -200,34 +108,6 @@ + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt2", +- "active":true, +- "backupIndex":[ +- 0, +- 1, +- 2, +- 3 +- ] +- } +- ], +- "backupNexthops":[ +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt3", +- "active":true +- }, +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt4", +- "active":true +- }, +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt5", +- "active":true +- }, +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt6", + "active":true + } + ] diff --git a/tests/topotests/isis_lfa_topo1/rt1/step3/show_ipv6_route.ref.diff b/tests/topotests/isis_lfa_topo1/rt1/step3/show_ipv6_route.ref.diff new file mode 100644 index 0000000..cafbe49 --- /dev/null +++ b/tests/topotests/isis_lfa_topo1/rt1/step3/show_ipv6_route.ref.diff @@ -0,0 +1,164 @@ +--- a/rt1/step2/show_ipv6_route.ref ++++ b/rt1/step3/show_ipv6_route.ref +@@ -13,6 +13,28 @@ + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt2", ++ "active":true, ++ "backupIndex":[ ++ 0, ++ 1, ++ 2 ++ ] ++ } ++ ], ++ "backupNexthops":[ ++ { ++ "afi":"ipv6", ++ "interfaceName":"eth-rt3", ++ "active":true ++ }, ++ { ++ "afi":"ipv6", ++ "interfaceName":"eth-rt5", ++ "active":true ++ }, ++ { ++ "afi":"ipv6", ++ "interfaceName":"eth-rt6", + "active":true + } + ] +@@ -32,6 +54,22 @@ + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt3", ++ "active":true, ++ "backupIndex":[ ++ 0, ++ 1 ++ ] ++ } ++ ], ++ "backupNexthops":[ ++ { ++ "afi":"ipv6", ++ "interfaceName":"eth-rt2", ++ "active":true ++ }, ++ { ++ "afi":"ipv6", ++ "interfaceName":"eth-rt5", + "active":true + } + ] +@@ -51,6 +89,16 @@ + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt4", ++ "active":true, ++ "backupIndex":[ ++ 0 ++ ] ++ } ++ ], ++ "backupNexthops":[ ++ { ++ "afi":"ipv6", ++ "interfaceName":"eth-rt5", + "active":true + } + ] +@@ -70,6 +118,34 @@ + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt5", ++ "active":true, ++ "backupIndex":[ ++ 0, ++ 1, ++ 2, ++ 3 ++ ] ++ } ++ ], ++ "backupNexthops":[ ++ { ++ "afi":"ipv6", ++ "interfaceName":"eth-rt2", ++ "active":true ++ }, ++ { ++ "afi":"ipv6", ++ "interfaceName":"eth-rt3", ++ "active":true ++ }, ++ { ++ "afi":"ipv6", ++ "interfaceName":"eth-rt4", ++ "active":true ++ }, ++ { ++ "afi":"ipv6", ++ "interfaceName":"eth-rt6", + "active":true + } + ] +@@ -89,6 +165,22 @@ + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt6", ++ "active":true, ++ "backupIndex":[ ++ 0, ++ 1 ++ ] ++ } ++ ], ++ "backupNexthops":[ ++ { ++ "afi":"ipv6", ++ "interfaceName":"eth-rt2", ++ "active":true ++ }, ++ { ++ "afi":"ipv6", ++ "interfaceName":"eth-rt5", + "active":true + } + ] +@@ -108,6 +200,34 @@ + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt2", ++ "active":true, ++ "backupIndex":[ ++ 0, ++ 1, ++ 2, ++ 3 ++ ] ++ } ++ ], ++ "backupNexthops":[ ++ { ++ "afi":"ipv6", ++ "interfaceName":"eth-rt3", ++ "active":true ++ }, ++ { ++ "afi":"ipv6", ++ "interfaceName":"eth-rt4", ++ "active":true ++ }, ++ { ++ "afi":"ipv6", ++ "interfaceName":"eth-rt5", ++ "active":true ++ }, ++ { ++ "afi":"ipv6", ++ "interfaceName":"eth-rt6", + "active":true + } + ] diff --git a/tests/topotests/isis_lfa_topo1/rt1/step4/show_ipv6_route.ref.diff b/tests/topotests/isis_lfa_topo1/rt1/step4/show_ipv6_route.ref.diff new file mode 100644 index 0000000..47d8334 --- /dev/null +++ b/tests/topotests/isis_lfa_topo1/rt1/step4/show_ipv6_route.ref.diff @@ -0,0 +1,142 @@ +--- a/rt1/step3/show_ipv6_route.ref ++++ b/rt1/step4/show_ipv6_route.ref +@@ -15,9 +15,7 @@ + "interfaceName":"eth-rt2", + "active":true, + "backupIndex":[ +- 0, +- 1, +- 2 ++ 0 + ] + } + ], +@@ -26,16 +24,6 @@ + "afi":"ipv6", + "interfaceName":"eth-rt3", + "active":true +- }, +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt5", +- "active":true +- }, +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt6", +- "active":true + } + ] + } +@@ -56,8 +44,7 @@ + "interfaceName":"eth-rt3", + "active":true, + "backupIndex":[ +- 0, +- 1 ++ 0 + ] + } + ], +@@ -66,11 +53,6 @@ + "afi":"ipv6", + "interfaceName":"eth-rt2", + "active":true +- }, +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt5", +- "active":true + } + ] + } +@@ -120,10 +102,7 @@ + "interfaceName":"eth-rt5", + "active":true, + "backupIndex":[ +- 0, +- 1, +- 2, +- 3 ++ 0 + ] + } + ], +@@ -132,21 +111,6 @@ + "afi":"ipv6", + "interfaceName":"eth-rt2", + "active":true +- }, +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt3", +- "active":true +- }, +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt4", +- "active":true +- }, +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt6", +- "active":true + } + ] + } +@@ -167,8 +131,7 @@ + "interfaceName":"eth-rt6", + "active":true, + "backupIndex":[ +- 0, +- 1 ++ 0 + ] + } + ], +@@ -177,11 +140,6 @@ + "afi":"ipv6", + "interfaceName":"eth-rt2", + "active":true +- }, +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt5", +- "active":true + } + ] + } +@@ -202,10 +160,7 @@ + "interfaceName":"eth-rt2", + "active":true, + "backupIndex":[ +- 0, +- 1, +- 2, +- 3 ++ 0 + ] + } + ], +@@ -214,21 +169,6 @@ + "afi":"ipv6", + "interfaceName":"eth-rt3", + "active":true +- }, +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt4", +- "active":true +- }, +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt5", +- "active":true +- }, +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt6", +- "active":true + } + ] + } diff --git a/tests/topotests/isis_lfa_topo1/rt1/step5/show_ipv6_route.ref.diff b/tests/topotests/isis_lfa_topo1/rt1/step5/show_ipv6_route.ref.diff new file mode 100644 index 0000000..b6a342d --- /dev/null +++ b/tests/topotests/isis_lfa_topo1/rt1/step5/show_ipv6_route.ref.diff @@ -0,0 +1,142 @@ +--- a/rt1/step4/show_ipv6_route.ref ++++ b/rt1/step5/show_ipv6_route.ref +@@ -15,7 +15,9 @@ + "interfaceName":"eth-rt2", + "active":true, + "backupIndex":[ +- 0 ++ 0, ++ 1, ++ 2 + ] + } + ], +@@ -24,6 +26,16 @@ + "afi":"ipv6", + "interfaceName":"eth-rt3", + "active":true ++ }, ++ { ++ "afi":"ipv6", ++ "interfaceName":"eth-rt5", ++ "active":true ++ }, ++ { ++ "afi":"ipv6", ++ "interfaceName":"eth-rt6", ++ "active":true + } + ] + } +@@ -44,7 +56,8 @@ + "interfaceName":"eth-rt3", + "active":true, + "backupIndex":[ +- 0 ++ 0, ++ 1 + ] + } + ], +@@ -53,6 +66,11 @@ + "afi":"ipv6", + "interfaceName":"eth-rt2", + "active":true ++ }, ++ { ++ "afi":"ipv6", ++ "interfaceName":"eth-rt5", ++ "active":true + } + ] + } +@@ -102,7 +120,10 @@ + "interfaceName":"eth-rt5", + "active":true, + "backupIndex":[ +- 0 ++ 0, ++ 1, ++ 2, ++ 3 + ] + } + ], +@@ -111,6 +132,21 @@ + "afi":"ipv6", + "interfaceName":"eth-rt2", + "active":true ++ }, ++ { ++ "afi":"ipv6", ++ "interfaceName":"eth-rt3", ++ "active":true ++ }, ++ { ++ "afi":"ipv6", ++ "interfaceName":"eth-rt4", ++ "active":true ++ }, ++ { ++ "afi":"ipv6", ++ "interfaceName":"eth-rt6", ++ "active":true + } + ] + } +@@ -131,7 +167,8 @@ + "interfaceName":"eth-rt6", + "active":true, + "backupIndex":[ +- 0 ++ 0, ++ 1 + ] + } + ], +@@ -140,6 +177,11 @@ + "afi":"ipv6", + "interfaceName":"eth-rt2", + "active":true ++ }, ++ { ++ "afi":"ipv6", ++ "interfaceName":"eth-rt5", ++ "active":true + } + ] + } +@@ -160,7 +202,10 @@ + "interfaceName":"eth-rt2", + "active":true, + "backupIndex":[ +- 0 ++ 0, ++ 1, ++ 2, ++ 3 + ] + } + ], +@@ -169,6 +214,21 @@ + "afi":"ipv6", + "interfaceName":"eth-rt3", + "active":true ++ }, ++ { ++ "afi":"ipv6", ++ "interfaceName":"eth-rt4", ++ "active":true ++ }, ++ { ++ "afi":"ipv6", ++ "interfaceName":"eth-rt5", ++ "active":true ++ }, ++ { ++ "afi":"ipv6", ++ "interfaceName":"eth-rt6", ++ "active":true + } + ] + } diff --git a/tests/topotests/isis_lfa_topo1/rt1/step6/show_ipv6_route.ref.diff b/tests/topotests/isis_lfa_topo1/rt1/step6/show_ipv6_route.ref.diff new file mode 100644 index 0000000..fafa299 --- /dev/null +++ b/tests/topotests/isis_lfa_topo1/rt1/step6/show_ipv6_route.ref.diff @@ -0,0 +1,164 @@ +--- a/rt1/step5/show_ipv6_route.ref ++++ b/rt1/step6/show_ipv6_route.ref +@@ -13,28 +13,6 @@ + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt2", +- "active":true, +- "backupIndex":[ +- 0, +- 1, +- 2 +- ] +- } +- ], +- "backupNexthops":[ +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt3", +- "active":true +- }, +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt5", +- "active":true +- }, +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt6", + "active":true + } + ] +@@ -54,22 +32,6 @@ + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt3", +- "active":true, +- "backupIndex":[ +- 0, +- 1 +- ] +- } +- ], +- "backupNexthops":[ +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt2", +- "active":true +- }, +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt5", + "active":true + } + ] +@@ -89,16 +51,6 @@ + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt4", +- "active":true, +- "backupIndex":[ +- 0 +- ] +- } +- ], +- "backupNexthops":[ +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt5", + "active":true + } + ] +@@ -118,34 +70,6 @@ + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt5", +- "active":true, +- "backupIndex":[ +- 0, +- 1, +- 2, +- 3 +- ] +- } +- ], +- "backupNexthops":[ +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt2", +- "active":true +- }, +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt3", +- "active":true +- }, +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt4", +- "active":true +- }, +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt6", + "active":true + } + ] +@@ -165,22 +89,6 @@ + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt6", +- "active":true, +- "backupIndex":[ +- 0, +- 1 +- ] +- } +- ], +- "backupNexthops":[ +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt2", +- "active":true +- }, +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt5", + "active":true + } + ] +@@ -200,34 +108,6 @@ + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt2", +- "active":true, +- "backupIndex":[ +- 0, +- 1, +- 2, +- 3 +- ] +- } +- ], +- "backupNexthops":[ +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt3", +- "active":true +- }, +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt4", +- "active":true +- }, +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt5", +- "active":true +- }, +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt6", + "active":true + } + ] diff --git a/tests/topotests/isis_lfa_topo1/rt1/step7/show_ipv6_route.ref.diff b/tests/topotests/isis_lfa_topo1/rt1/step7/show_ipv6_route.ref.diff new file mode 100644 index 0000000..1803e2c --- /dev/null +++ b/tests/topotests/isis_lfa_topo1/rt1/step7/show_ipv6_route.ref.diff @@ -0,0 +1,37 @@ +--- a/rt1/step6/show_ipv6_route.ref ++++ b/rt1/step7/show_ipv6_route.ref +@@ -108,6 +108,34 @@ + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt2", ++ "active":true, ++ "backupIndex":[ ++ 0, ++ 1, ++ 2, ++ 3 ++ ] ++ } ++ ], ++ "backupNexthops":[ ++ { ++ "afi":"ipv6", ++ "interfaceName":"eth-rt3", ++ "active":true ++ }, ++ { ++ "afi":"ipv6", ++ "interfaceName":"eth-rt4", ++ "active":true ++ }, ++ { ++ "afi":"ipv6", ++ "interfaceName":"eth-rt5", ++ "active":true ++ }, ++ { ++ "afi":"ipv6", ++ "interfaceName":"eth-rt6", + "active":true + } + ] diff --git a/tests/topotests/isis_lfa_topo1/rt1/step8/show_ipv6_route.ref.diff b/tests/topotests/isis_lfa_topo1/rt1/step8/show_ipv6_route.ref.diff new file mode 100644 index 0000000..306f725 --- /dev/null +++ b/tests/topotests/isis_lfa_topo1/rt1/step8/show_ipv6_route.ref.diff @@ -0,0 +1,129 @@ +--- a/rt1/step7/show_ipv6_route.ref ++++ b/rt1/step8/show_ipv6_route.ref +@@ -13,6 +13,28 @@ + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt2", ++ "active":true, ++ "backupIndex":[ ++ 0, ++ 1, ++ 2 ++ ] ++ } ++ ], ++ "backupNexthops":[ ++ { ++ "afi":"ipv6", ++ "interfaceName":"eth-rt3", ++ "active":true ++ }, ++ { ++ "afi":"ipv6", ++ "interfaceName":"eth-rt5", ++ "active":true ++ }, ++ { ++ "afi":"ipv6", ++ "interfaceName":"eth-rt6", + "active":true + } + ] +@@ -32,6 +54,22 @@ + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt3", ++ "active":true, ++ "backupIndex":[ ++ 0, ++ 1 ++ ] ++ } ++ ], ++ "backupNexthops":[ ++ { ++ "afi":"ipv6", ++ "interfaceName":"eth-rt2", ++ "active":true ++ }, ++ { ++ "afi":"ipv6", ++ "interfaceName":"eth-rt5", + "active":true + } + ] +@@ -51,6 +89,16 @@ + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt4", ++ "active":true, ++ "backupIndex":[ ++ 0 ++ ] ++ } ++ ], ++ "backupNexthops":[ ++ { ++ "afi":"ipv6", ++ "interfaceName":"eth-rt5", + "active":true + } + ] +@@ -70,6 +118,34 @@ + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt5", ++ "active":true, ++ "backupIndex":[ ++ 0, ++ 1, ++ 2, ++ 3 ++ ] ++ } ++ ], ++ "backupNexthops":[ ++ { ++ "afi":"ipv6", ++ "interfaceName":"eth-rt2", ++ "active":true ++ }, ++ { ++ "afi":"ipv6", ++ "interfaceName":"eth-rt3", ++ "active":true ++ }, ++ { ++ "afi":"ipv6", ++ "interfaceName":"eth-rt4", ++ "active":true ++ }, ++ { ++ "afi":"ipv6", ++ "interfaceName":"eth-rt6", + "active":true + } + ] +@@ -89,6 +165,22 @@ + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt6", ++ "active":true, ++ "backupIndex":[ ++ 0, ++ 1 ++ ] ++ } ++ ], ++ "backupNexthops":[ ++ { ++ "afi":"ipv6", ++ "interfaceName":"eth-rt2", ++ "active":true ++ }, ++ { ++ "afi":"ipv6", ++ "interfaceName":"eth-rt5", + "active":true + } + ] diff --git a/tests/topotests/isis_lfa_topo1/rt1/step9/show_ipv6_route.ref.diff b/tests/topotests/isis_lfa_topo1/rt1/step9/show_ipv6_route.ref.diff new file mode 100644 index 0000000..3ffab46 --- /dev/null +++ b/tests/topotests/isis_lfa_topo1/rt1/step9/show_ipv6_route.ref.diff @@ -0,0 +1,46 @@ +--- a/rt1/step8/show_ipv6_route.ref ++++ b/rt1/step9/show_ipv6_route.ref +@@ -16,8 +16,7 @@ + "active":true, + "backupIndex":[ + 0, +- 1, +- 2 ++ 1 + ] + } + ], +@@ -31,11 +30,6 @@ + "afi":"ipv6", + "interfaceName":"eth-rt5", + "active":true +- }, +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt6", +- "active":true + } + ] + } +@@ -204,8 +198,7 @@ + "backupIndex":[ + 0, + 1, +- 2, +- 3 ++ 2 + ] + } + ], +@@ -224,11 +217,6 @@ + "afi":"ipv6", + "interfaceName":"eth-rt5", + "active":true +- }, +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt6", +- "active":true + } + ] + } diff --git a/tests/topotests/isis_lfa_topo1/rt1/zebra.conf b/tests/topotests/isis_lfa_topo1/rt1/zebra.conf new file mode 100644 index 0000000..4ce1444 --- /dev/null +++ b/tests/topotests/isis_lfa_topo1/rt1/zebra.conf @@ -0,0 +1,16 @@ +log file zebra.log +! +hostname rt1 +! +! debug zebra kernel +! debug zebra packet +! debug zebra mpls +! +interface lo + ip address 1.1.1.1/32 + ipv6 address 2001:db8:1000::1/128 +! +ip forwarding +! +line vty +! diff --git a/tests/topotests/isis_lfa_topo1/rt2/bfdd.conf b/tests/topotests/isis_lfa_topo1/rt2/bfdd.conf new file mode 100644 index 0000000..25fa0d8 --- /dev/null +++ b/tests/topotests/isis_lfa_topo1/rt2/bfdd.conf @@ -0,0 +1,4 @@ +hostname rt2 +! +bfd +! diff --git a/tests/topotests/isis_lfa_topo1/rt2/isisd.conf b/tests/topotests/isis_lfa_topo1/rt2/isisd.conf new file mode 100644 index 0000000..6981692 --- /dev/null +++ b/tests/topotests/isis_lfa_topo1/rt2/isisd.conf @@ -0,0 +1,42 @@ +password 1 +hostname rt2 +log file isisd.log +! +! debug isis events +! debug isis route-events +! debug isis spf-events +! debug isis lsp-gen +! +interface lo + ipv6 router isis 1 + isis passive +! +interface eth-rt1 + ipv6 router isis 1 + isis network point-to-point + isis hello-interval 1 + isis hello-multiplier 10 + isis fast-reroute lfa +! +interface eth-rt3 + ipv6 router isis 1 + isis metric 5 + isis network point-to-point + isis hello-interval 1 + isis hello-multiplier 10 + isis fast-reroute lfa +! +interface eth-rt7 + ipv6 router isis 1 + isis metric 5 + isis network point-to-point + isis hello-interval 1 + isis hello-multiplier 10 + isis fast-reroute lfa +! +router isis 1 + net 49.0000.0000.0000.0002.00 + is-type level-1 + lsp-gen-interval 2 + topology ipv6-unicast +! diff --git a/tests/topotests/isis_lfa_topo1/rt2/step1/show_ipv6_route.ref b/tests/topotests/isis_lfa_topo1/rt2/step1/show_ipv6_route.ref new file mode 100644 index 0000000..036bfe1 --- /dev/null +++ b/tests/topotests/isis_lfa_topo1/rt2/step1/show_ipv6_route.ref @@ -0,0 +1,162 @@ +{ + "2001:db8:1000::1\/128":[ + { + "prefix":"2001:db8:1000::1\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt1", + "active":true, + "backupIndex":[ + 0 + ] + } + ], + "backupNexthops":[ + { + "afi":"ipv6", + "interfaceName":"eth-rt3", + "active":true + } + ] + } + ], + "2001:db8:1000::3\/128":[ + { + "prefix":"2001:db8:1000::3\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":15, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt3", + "active":true, + "backupIndex":[ + 0 + ] + } + ], + "backupNexthops":[ + { + "afi":"ipv6", + "interfaceName":"eth-rt1", + "active":true + } + ] + } + ], + "2001:db8:1000::4\/128":[ + { + "prefix":"2001:db8:1000::4\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":30, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt1", + "active":true + }, + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt7", + "active":true + } + ] + } + ], + "2001:db8:1000::5\/128":[ + { + "prefix":"2001:db8:1000::5\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":25, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt7", + "active":true, + "backupIndex":[ + 0 + ] + } + ], + "backupNexthops":[ + { + "afi":"ipv6", + "interfaceName":"eth-rt1", + "active":true + } + ] + } + ], + "2001:db8:1000::6\/128":[ + { + "prefix":"2001:db8:1000::6\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":25, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt7", + "active":true, + "backupIndex":[ + 0 + ] + } + ], + "backupNexthops":[ + { + "afi":"ipv6", + "interfaceName":"eth-rt1", + "active":true + } + ] + } + ], + "2001:db8:1000::7\/128":[ + { + "prefix":"2001:db8:1000::7\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":15, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt7", + "active":true + } + ] + } + ] +} diff --git a/tests/topotests/isis_lfa_topo1/rt2/step1/show_yang_interface_isis_adjacencies.ref b/tests/topotests/isis_lfa_topo1/rt2/step1/show_yang_interface_isis_adjacencies.ref new file mode 100644 index 0000000..236a41d --- /dev/null +++ b/tests/topotests/isis_lfa_topo1/rt2/step1/show_yang_interface_isis_adjacencies.ref @@ -0,0 +1,63 @@ +{ + "frr-interface:lib": { + "interface": [ + { + "name": "eth-rt1", + "vrf": "default", + "state": { + "frr-isisd:isis": { + "adjacencies": { + "adjacency": [ + { + "neighbor-sys-type": "level-1", + "neighbor-sysid": "0000.0000.0001", + "hold-timer": 10, + "neighbor-priority": 0, + "state": "up" + } + ] + } + } + } + }, + { + "name": "eth-rt3", + "vrf": "default", + "state": { + "frr-isisd:isis": { + "adjacencies": { + "adjacency": [ + { + "neighbor-sys-type": "level-1", + "neighbor-sysid": "0000.0000.0003", + "hold-timer": 10, + "neighbor-priority": 0, + "state": "up" + } + ] + } + } + } + }, + { + "name": "eth-rt7", + "vrf": "default", + "state": { + "frr-isisd:isis": { + "adjacencies": { + "adjacency": [ + { + "neighbor-sys-type": "level-1", + "neighbor-sysid": "0000.0000.0007", + "hold-timer": 10, + "neighbor-priority": 0, + "state": "up" + } + ] + } + } + } + } + ] + } +} diff --git a/tests/topotests/isis_lfa_topo1/rt2/zebra.conf b/tests/topotests/isis_lfa_topo1/rt2/zebra.conf new file mode 100644 index 0000000..3372ec5 --- /dev/null +++ b/tests/topotests/isis_lfa_topo1/rt2/zebra.conf @@ -0,0 +1,16 @@ +log file zebra.log +! +hostname rt2 +! +! debug zebra kernel +! debug zebra packet +! debug zebra mpls +! +interface lo + ip address 2.2.2.2/32 + ipv6 address 2001:db8:1000::2/128 +! +ip forwarding +! +line vty +! diff --git a/tests/topotests/isis_lfa_topo1/rt3/isisd.conf b/tests/topotests/isis_lfa_topo1/rt3/isisd.conf new file mode 100644 index 0000000..e3ddb09 --- /dev/null +++ b/tests/topotests/isis_lfa_topo1/rt3/isisd.conf @@ -0,0 +1,41 @@ +password 1 +hostname rt3 +log file isisd.log +! +! debug isis events +! debug isis route-events +! debug isis spf-events +! debug isis lsp-gen +! +interface lo + ipv6 router isis 1 + isis passive +! +interface eth-rt1 + ipv6 router isis 1 + isis network point-to-point + isis hello-interval 1 + isis hello-multiplier 10 + isis fast-reroute lfa +! +interface eth-rt2 + ipv6 router isis 1 + isis metric 5 + isis network point-to-point + isis hello-interval 1 + isis hello-multiplier 10 + isis fast-reroute lfa +! +interface eth-rt7 + ipv6 router isis 1 + isis network point-to-point + isis hello-interval 1 + isis hello-multiplier 10 + isis fast-reroute lfa +! +router isis 1 + net 49.0000.0000.0000.0003.00 + is-type level-1 + lsp-gen-interval 2 + topology ipv6-unicast +! diff --git a/tests/topotests/isis_lfa_topo1/rt3/step1/show_ipv6_route.ref b/tests/topotests/isis_lfa_topo1/rt3/step1/show_ipv6_route.ref new file mode 100644 index 0000000..a1aab40 --- /dev/null +++ b/tests/topotests/isis_lfa_topo1/rt3/step1/show_ipv6_route.ref @@ -0,0 +1,188 @@ +{ + "2001:db8:1000::1\/128":[ + { + "prefix":"2001:db8:1000::1\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt1", + "active":true, + "backupIndex":[ + 0, + 1 + ] + } + ], + "backupNexthops":[ + { + "afi":"ipv6", + "interfaceName":"eth-rt2", + "active":true + }, + { + "afi":"ipv6", + "interfaceName":"eth-rt7", + "active":true + } + ] + } + ], + "2001:db8:1000::2\/128":[ + { + "prefix":"2001:db8:1000::2\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":15, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt2", + "active":true, + "backupIndex":[ + 0, + 1 + ] + } + ], + "backupNexthops":[ + { + "afi":"ipv6", + "interfaceName":"eth-rt1", + "active":true + }, + { + "afi":"ipv6", + "interfaceName":"eth-rt7", + "active":true + } + ] + } + ], + "2001:db8:1000::4\/128":[ + { + "prefix":"2001:db8:1000::4\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":30, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt1", + "active":true, + "backupIndex":[ + 0, + 1 + ] + } + ], + "backupNexthops":[ + { + "afi":"ipv6", + "interfaceName":"eth-rt2", + "active":true + }, + { + "afi":"ipv6", + "interfaceName":"eth-rt7", + "active":true + } + ] + } + ], + "2001:db8:1000::5\/128":[ + { + "prefix":"2001:db8:1000::5\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":30, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt2", + "active":true + }, + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt7", + "active":true + } + ] + } + ], + "2001:db8:1000::6\/128":[ + { + "prefix":"2001:db8:1000::6\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":30, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt2", + "active":true + }, + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt1", + "active":true + }, + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt7", + "active":true + } + ] + } + ], + "2001:db8:1000::7\/128":[ + { + "prefix":"2001:db8:1000::7\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt2", + "active":true + }, + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt7", + "active":true + } + ] + } + ] +} diff --git a/tests/topotests/isis_lfa_topo1/rt3/step1/show_yang_interface_isis_adjacencies.ref b/tests/topotests/isis_lfa_topo1/rt3/step1/show_yang_interface_isis_adjacencies.ref new file mode 100644 index 0000000..290ebb9 --- /dev/null +++ b/tests/topotests/isis_lfa_topo1/rt3/step1/show_yang_interface_isis_adjacencies.ref @@ -0,0 +1,63 @@ +{ + "frr-interface:lib": { + "interface": [ + { + "name": "eth-rt1", + "vrf": "default", + "state": { + "frr-isisd:isis": { + "adjacencies": { + "adjacency": [ + { + "neighbor-sys-type": "level-1", + "neighbor-sysid": "0000.0000.0001", + "hold-timer": 10, + "neighbor-priority": 0, + "state": "up" + } + ] + } + } + } + }, + { + "name": "eth-rt2", + "vrf": "default", + "state": { + "frr-isisd:isis": { + "adjacencies": { + "adjacency": [ + { + "neighbor-sys-type": "level-1", + "neighbor-sysid": "0000.0000.0002", + "hold-timer": 10, + "neighbor-priority": 0, + "state": "up" + } + ] + } + } + } + }, + { + "name": "eth-rt7", + "vrf": "default", + "state": { + "frr-isisd:isis": { + "adjacencies": { + "adjacency": [ + { + "neighbor-sys-type": "level-1", + "neighbor-sysid": "0000.0000.0007", + "hold-timer": 10, + "neighbor-priority": 0, + "state": "up" + } + ] + } + } + } + } + ] + } +} diff --git a/tests/topotests/isis_lfa_topo1/rt3/zebra.conf b/tests/topotests/isis_lfa_topo1/rt3/zebra.conf new file mode 100644 index 0000000..231b02b --- /dev/null +++ b/tests/topotests/isis_lfa_topo1/rt3/zebra.conf @@ -0,0 +1,16 @@ +log file zebra.log +! +hostname rt3 +! +! debug zebra kernel +! debug zebra packet +! debug zebra mpls +! +interface lo + ip address 3.3.3.3/32 + ipv6 address 2001:db8:1000::3/128 +! +ip forwarding +! +line vty +! diff --git a/tests/topotests/isis_lfa_topo1/rt4/isisd.conf b/tests/topotests/isis_lfa_topo1/rt4/isisd.conf new file mode 100644 index 0000000..4db5c8e --- /dev/null +++ b/tests/topotests/isis_lfa_topo1/rt4/isisd.conf @@ -0,0 +1,34 @@ +password 1 +hostname rt4 +log file isisd.log +! +! debug isis events +! debug isis route-events +! debug isis spf-events +! debug isis lsp-gen +! +interface lo + ipv6 router isis 1 + isis passive +! +interface eth-rt1 + ipv6 router isis 1 + isis network point-to-point + isis hello-interval 1 + isis hello-multiplier 10 + isis fast-reroute lfa +! +interface eth-rt7 + ipv6 router isis 1 + isis metric 15 + isis network point-to-point + isis hello-interval 1 + isis hello-multiplier 10 + isis fast-reroute lfa +! +router isis 1 + net 49.0000.0000.0000.0004.00 + is-type level-1 + lsp-gen-interval 2 + topology ipv6-unicast +! diff --git a/tests/topotests/isis_lfa_topo1/rt4/step1/show_ipv6_route.ref b/tests/topotests/isis_lfa_topo1/rt4/step1/show_ipv6_route.ref new file mode 100644 index 0000000..6878e2f --- /dev/null +++ b/tests/topotests/isis_lfa_topo1/rt4/step1/show_ipv6_route.ref @@ -0,0 +1,172 @@ +{ + "2001:db8:1000::1\/128":[ + { + "prefix":"2001:db8:1000::1\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt1", + "active":true, + "backupIndex":[ + 0 + ] + } + ], + "backupNexthops":[ + { + "afi":"ipv6", + "interfaceName":"eth-rt7", + "active":true + } + ] + } + ], + "2001:db8:1000::2\/128":[ + { + "prefix":"2001:db8:1000::2\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":30, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt7", + "active":true + }, + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt1", + "active":true + } + ] + } + ], + "2001:db8:1000::3\/128":[ + { + "prefix":"2001:db8:1000::3\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":30, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt1", + "active":true, + "backupIndex":[ + 0 + ] + } + ], + "backupNexthops":[ + { + "afi":"ipv6", + "interfaceName":"eth-rt7", + "active":true + } + ] + } + ], + "2001:db8:1000::5\/128":[ + { + "prefix":"2001:db8:1000::5\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":35, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt7", + "active":true, + "backupIndex":[ + 0 + ] + } + ], + "backupNexthops":[ + { + "afi":"ipv6", + "interfaceName":"eth-rt1", + "active":true + } + ] + } + ], + "2001:db8:1000::6\/128":[ + { + "prefix":"2001:db8:1000::6\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":30, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt1", + "active":true, + "backupIndex":[ + 0 + ] + } + ], + "backupNexthops":[ + { + "afi":"ipv6", + "interfaceName":"eth-rt7", + "active":true + } + ] + } + ], + "2001:db8:1000::7\/128":[ + { + "prefix":"2001:db8:1000::7\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":25, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt7", + "active":true, + "backupIndex":[ + 0 + ] + } + ], + "backupNexthops":[ + { + "afi":"ipv6", + "interfaceName":"eth-rt1", + "active":true + } + ] + } + ] +} diff --git a/tests/topotests/isis_lfa_topo1/rt4/step1/show_yang_interface_isis_adjacencies.ref b/tests/topotests/isis_lfa_topo1/rt4/step1/show_yang_interface_isis_adjacencies.ref new file mode 100644 index 0000000..1f99ad1 --- /dev/null +++ b/tests/topotests/isis_lfa_topo1/rt4/step1/show_yang_interface_isis_adjacencies.ref @@ -0,0 +1,44 @@ +{ + "frr-interface:lib": { + "interface": [ + { + "name": "eth-rt1", + "vrf": "default", + "state": { + "frr-isisd:isis": { + "adjacencies": { + "adjacency": [ + { + "neighbor-sys-type": "level-1", + "neighbor-sysid": "0000.0000.0001", + "hold-timer": 10, + "neighbor-priority": 0, + "state": "up" + } + ] + } + } + } + }, + { + "name": "eth-rt7", + "vrf": "default", + "state": { + "frr-isisd:isis": { + "adjacencies": { + "adjacency": [ + { + "neighbor-sys-type": "level-1", + "neighbor-sysid": "0000.0000.0007", + "hold-timer": 10, + "neighbor-priority": 0, + "state": "up" + } + ] + } + } + } + } + ] + } +} diff --git a/tests/topotests/isis_lfa_topo1/rt4/zebra.conf b/tests/topotests/isis_lfa_topo1/rt4/zebra.conf new file mode 100644 index 0000000..2d62924 --- /dev/null +++ b/tests/topotests/isis_lfa_topo1/rt4/zebra.conf @@ -0,0 +1,16 @@ +log file zebra.log +! +hostname rt4 +! +! debug zebra kernel +! debug zebra packet +! debug zebra mpls +! +interface lo + ip address 4.4.4.4/32 + ipv6 address 2001:db8:1000::4/128 +! +ip forwarding +! +line vty +! diff --git a/tests/topotests/isis_lfa_topo1/rt5/isisd.conf b/tests/topotests/isis_lfa_topo1/rt5/isisd.conf new file mode 100644 index 0000000..1206a4e --- /dev/null +++ b/tests/topotests/isis_lfa_topo1/rt5/isisd.conf @@ -0,0 +1,34 @@ +password 1 +hostname rt5 +log file isisd.log +! +! debug isis events +! debug isis route-events +! debug isis spf-events +! debug isis lsp-gen +! +interface lo + ipv6 router isis 1 + isis passive +! +interface eth-rt1 + ipv6 router isis 1 + isis metric 20 + isis network point-to-point + isis hello-interval 1 + isis hello-multiplier 10 + isis fast-reroute lfa +! +interface eth-rt7 + ipv6 router isis 1 + isis network point-to-point + isis hello-interval 1 + isis hello-multiplier 10 + isis fast-reroute lfa +! +router isis 1 + net 49.0000.0000.0000.0005.00 + is-type level-1 + lsp-gen-interval 2 + topology ipv6-unicast +! diff --git a/tests/topotests/isis_lfa_topo1/rt5/step1/show_ipv6_route.ref b/tests/topotests/isis_lfa_topo1/rt5/step1/show_ipv6_route.ref new file mode 100644 index 0000000..f8181c7 --- /dev/null +++ b/tests/topotests/isis_lfa_topo1/rt5/step1/show_ipv6_route.ref @@ -0,0 +1,176 @@ +{ + "2001:db8:1000::1\/128":[ + { + "prefix":"2001:db8:1000::1\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":30, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt1", + "active":true, + "backupIndex":[ + 0 + ] + } + ], + "backupNexthops":[ + { + "afi":"ipv6", + "interfaceName":"eth-rt7", + "active":true + } + ] + } + ], + "2001:db8:1000::2\/128":[ + { + "prefix":"2001:db8:1000::2\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":25, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt7", + "active":true, + "backupIndex":[ + 0 + ] + } + ], + "backupNexthops":[ + { + "afi":"ipv6", + "interfaceName":"eth-rt1", + "active":true + } + ] + } + ], + "2001:db8:1000::3\/128":[ + { + "prefix":"2001:db8:1000::3\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":30, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt7", + "active":true, + "backupIndex":[ + 0 + ] + } + ], + "backupNexthops":[ + { + "afi":"ipv6", + "interfaceName":"eth-rt1", + "active":true + } + ] + } + ], + "2001:db8:1000::4\/128":[ + { + "prefix":"2001:db8:1000::4\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":35, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt7", + "active":true, + "backupIndex":[ + 0 + ] + } + ], + "backupNexthops":[ + { + "afi":"ipv6", + "interfaceName":"eth-rt1", + "active":true + } + ] + } + ], + "2001:db8:1000::6\/128":[ + { + "prefix":"2001:db8:1000::6\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":30, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt7", + "active":true, + "backupIndex":[ + 0 + ] + } + ], + "backupNexthops":[ + { + "afi":"ipv6", + "interfaceName":"eth-rt1", + "active":true + } + ] + } + ], + "2001:db8:1000::7\/128":[ + { + "prefix":"2001:db8:1000::7\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt7", + "active":true, + "backupIndex":[ + 0 + ] + } + ], + "backupNexthops":[ + { + "afi":"ipv6", + "interfaceName":"eth-rt1", + "active":true + } + ] + } + ] +} diff --git a/tests/topotests/isis_lfa_topo1/rt5/step1/show_yang_interface_isis_adjacencies.ref b/tests/topotests/isis_lfa_topo1/rt5/step1/show_yang_interface_isis_adjacencies.ref new file mode 100644 index 0000000..1f99ad1 --- /dev/null +++ b/tests/topotests/isis_lfa_topo1/rt5/step1/show_yang_interface_isis_adjacencies.ref @@ -0,0 +1,44 @@ +{ + "frr-interface:lib": { + "interface": [ + { + "name": "eth-rt1", + "vrf": "default", + "state": { + "frr-isisd:isis": { + "adjacencies": { + "adjacency": [ + { + "neighbor-sys-type": "level-1", + "neighbor-sysid": "0000.0000.0001", + "hold-timer": 10, + "neighbor-priority": 0, + "state": "up" + } + ] + } + } + } + }, + { + "name": "eth-rt7", + "vrf": "default", + "state": { + "frr-isisd:isis": { + "adjacencies": { + "adjacency": [ + { + "neighbor-sys-type": "level-1", + "neighbor-sysid": "0000.0000.0007", + "hold-timer": 10, + "neighbor-priority": 0, + "state": "up" + } + ] + } + } + } + } + ] + } +} diff --git a/tests/topotests/isis_lfa_topo1/rt5/zebra.conf b/tests/topotests/isis_lfa_topo1/rt5/zebra.conf new file mode 100644 index 0000000..efb7bf6 --- /dev/null +++ b/tests/topotests/isis_lfa_topo1/rt5/zebra.conf @@ -0,0 +1,16 @@ +log file zebra.log +! +hostname rt5 +! +! debug zebra kernel +! debug zebra packet +! debug zebra mpls +! +interface lo + ip address 5.5.5.5/32 + ipv6 address 2001:db8:1000::5/128 +! +ip forwarding +! +line vty +! diff --git a/tests/topotests/isis_lfa_topo1/rt6/isisd.conf b/tests/topotests/isis_lfa_topo1/rt6/isisd.conf new file mode 100644 index 0000000..2ba9e49 --- /dev/null +++ b/tests/topotests/isis_lfa_topo1/rt6/isisd.conf @@ -0,0 +1,33 @@ +password 1 +hostname rt6 +log file isisd.log +! +! debug isis events +! debug isis route-events +! debug isis spf-events +! debug isis lsp-gen +! +interface lo + ipv6 router isis 1 + isis passive +! +interface eth-rt1 + ipv6 router isis 1 + isis network point-to-point + isis hello-interval 1 + isis hello-multiplier 10 + isis fast-reroute lfa +! +interface eth-rt7 + ipv6 router isis 1 + isis network point-to-point + isis hello-interval 1 + isis hello-multiplier 10 + isis fast-reroute lfa +! +router isis 1 + net 49.0000.0000.0000.0006.00 + is-type level-1 + lsp-gen-interval 2 + topology ipv6-unicast +! diff --git a/tests/topotests/isis_lfa_topo1/rt6/step1/show_ipv6_route.ref b/tests/topotests/isis_lfa_topo1/rt6/step1/show_ipv6_route.ref new file mode 100644 index 0000000..e5f3c77 --- /dev/null +++ b/tests/topotests/isis_lfa_topo1/rt6/step1/show_ipv6_route.ref @@ -0,0 +1,172 @@ +{ + "2001:db8:1000::1\/128":[ + { + "prefix":"2001:db8:1000::1\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt1", + "active":true, + "backupIndex":[ + 0 + ] + } + ], + "backupNexthops":[ + { + "afi":"ipv6", + "interfaceName":"eth-rt7", + "active":true + } + ] + } + ], + "2001:db8:1000::2\/128":[ + { + "prefix":"2001:db8:1000::2\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":25, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt7", + "active":true, + "backupIndex":[ + 0 + ] + } + ], + "backupNexthops":[ + { + "afi":"ipv6", + "interfaceName":"eth-rt1", + "active":true + } + ] + } + ], + "2001:db8:1000::3\/128":[ + { + "prefix":"2001:db8:1000::3\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":30, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt1", + "active":true + }, + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt7", + "active":true + } + ] + } + ], + "2001:db8:1000::4\/128":[ + { + "prefix":"2001:db8:1000::4\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":30, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt1", + "active":true, + "backupIndex":[ + 0 + ] + } + ], + "backupNexthops":[ + { + "afi":"ipv6", + "interfaceName":"eth-rt7", + "active":true + } + ] + } + ], + "2001:db8:1000::5\/128":[ + { + "prefix":"2001:db8:1000::5\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":30, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt7", + "active":true, + "backupIndex":[ + 0 + ] + } + ], + "backupNexthops":[ + { + "afi":"ipv6", + "interfaceName":"eth-rt1", + "active":true + } + ] + } + ], + "2001:db8:1000::7\/128":[ + { + "prefix":"2001:db8:1000::7\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt7", + "active":true, + "backupIndex":[ + 0 + ] + } + ], + "backupNexthops":[ + { + "afi":"ipv6", + "interfaceName":"eth-rt1", + "active":true + } + ] + } + ] +} diff --git a/tests/topotests/isis_lfa_topo1/rt6/step1/show_yang_interface_isis_adjacencies.ref b/tests/topotests/isis_lfa_topo1/rt6/step1/show_yang_interface_isis_adjacencies.ref new file mode 100644 index 0000000..1f99ad1 --- /dev/null +++ b/tests/topotests/isis_lfa_topo1/rt6/step1/show_yang_interface_isis_adjacencies.ref @@ -0,0 +1,44 @@ +{ + "frr-interface:lib": { + "interface": [ + { + "name": "eth-rt1", + "vrf": "default", + "state": { + "frr-isisd:isis": { + "adjacencies": { + "adjacency": [ + { + "neighbor-sys-type": "level-1", + "neighbor-sysid": "0000.0000.0001", + "hold-timer": 10, + "neighbor-priority": 0, + "state": "up" + } + ] + } + } + } + }, + { + "name": "eth-rt7", + "vrf": "default", + "state": { + "frr-isisd:isis": { + "adjacencies": { + "adjacency": [ + { + "neighbor-sys-type": "level-1", + "neighbor-sysid": "0000.0000.0007", + "hold-timer": 10, + "neighbor-priority": 0, + "state": "up" + } + ] + } + } + } + } + ] + } +} diff --git a/tests/topotests/isis_lfa_topo1/rt6/zebra.conf b/tests/topotests/isis_lfa_topo1/rt6/zebra.conf new file mode 100644 index 0000000..31650bd --- /dev/null +++ b/tests/topotests/isis_lfa_topo1/rt6/zebra.conf @@ -0,0 +1,16 @@ +log file zebra.log +! +hostname rt6 +! +! debug zebra kernel +! debug zebra packet +! debug zebra mpls +! +interface lo + ip address 6.6.6.6/32 + ipv6 address 2001:db8:1000::6/128 +! +ip forwarding +! +line vty +! diff --git a/tests/topotests/isis_lfa_topo1/rt7/isisd.conf b/tests/topotests/isis_lfa_topo1/rt7/isisd.conf new file mode 100644 index 0000000..060be2b --- /dev/null +++ b/tests/topotests/isis_lfa_topo1/rt7/isisd.conf @@ -0,0 +1,56 @@ +password 1 +hostname rt6 +log file isisd.log +! +! debug isis events +! debug isis route-events +! debug isis spf-events +! debug isis lsp-gen +! +interface lo + ipv6 router isis 1 + isis passive +! +interface eth-rt2 + ipv6 router isis 1 + isis metric 5 + isis network point-to-point + isis hello-interval 1 + isis hello-multiplier 10 + isis fast-reroute lfa +! +interface eth-rt3 + ipv6 router isis 1 + isis network point-to-point + isis hello-interval 1 + isis hello-multiplier 10 + isis fast-reroute lfa +! +interface eth-rt4 + ipv6 router isis 1 + isis metric 15 + isis network point-to-point + isis hello-interval 1 + isis hello-multiplier 10 + isis fast-reroute lfa +! +interface eth-rt5 + ipv6 router isis 1 + isis network point-to-point + isis hello-interval 1 + isis hello-multiplier 10 + isis fast-reroute lfa +! +interface eth-rt6 + ipv6 router isis 1 + isis network point-to-point + isis hello-interval 1 + isis hello-multiplier 10 + isis fast-reroute lfa +! +router isis 1 + net 49.0000.0000.0000.0007.00 + is-type level-1 + lsp-gen-interval 2 + topology ipv6-unicast +! diff --git a/tests/topotests/isis_lfa_topo1/rt7/step1/show_ipv6_route.ref b/tests/topotests/isis_lfa_topo1/rt7/step1/show_ipv6_route.ref new file mode 100644 index 0000000..0dff15e --- /dev/null +++ b/tests/topotests/isis_lfa_topo1/rt7/step1/show_ipv6_route.ref @@ -0,0 +1,186 @@ +{ + "2001:db8:1000::1\/128":[ + { + "prefix":"2001:db8:1000::1\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":25, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt2", + "active":true, + "backupIndex":[ + 0, + 1, + 2, + 3 + ] + } + ], + "backupNexthops":[ + { + "afi":"ipv6", + "interfaceName":"eth-rt3", + "active":true + }, + { + "afi":"ipv6", + "interfaceName":"eth-rt4", + "active":true + }, + { + "afi":"ipv6", + "interfaceName":"eth-rt5", + "active":true + }, + { + "afi":"ipv6", + "interfaceName":"eth-rt6", + "active":true + } + ] + } + ], + "2001:db8:1000::2\/128":[ + { + "prefix":"2001:db8:1000::2\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":15, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt2", + "active":true, + "backupIndex":[ + 0 + ] + } + ], + "backupNexthops":[ + { + "afi":"ipv6", + "interfaceName":"eth-rt3", + "active":true + } + ] + } + ], + "2001:db8:1000::3\/128":[ + { + "prefix":"2001:db8:1000::3\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt3", + "active":true + }, + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt2", + "active":true + } + ] + } + ], + "2001:db8:1000::4\/128":[ + { + "prefix":"2001:db8:1000::4\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":25, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt4", + "active":true, + "backupIndex":[ + 0, + 1 + ] + } + ], + "backupNexthops":[ + { + "afi":"ipv6", + "interfaceName":"eth-rt3", + "active":true + }, + { + "afi":"ipv6", + "interfaceName":"eth-rt6", + "active":true + } + ] + } + ], + "2001:db8:1000::5\/128":[ + { + "prefix":"2001:db8:1000::5\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt5", + "active":true + } + ] + } + ], + "2001:db8:1000::6\/128":[ + { + "prefix":"2001:db8:1000::6\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt6", + "active":true, + "backupIndex":[ + 0 + ] + } + ], + "backupNexthops":[ + { + "afi":"ipv6", + "interfaceName":"eth-rt4", + "active":true + } + ] + } + ] +} diff --git a/tests/topotests/isis_lfa_topo1/rt7/step1/show_yang_interface_isis_adjacencies.ref b/tests/topotests/isis_lfa_topo1/rt7/step1/show_yang_interface_isis_adjacencies.ref new file mode 100644 index 0000000..92dd7b5 --- /dev/null +++ b/tests/topotests/isis_lfa_topo1/rt7/step1/show_yang_interface_isis_adjacencies.ref @@ -0,0 +1,101 @@ +{ + "frr-interface:lib": { + "interface": [ + { + "name": "eth-rt2", + "vrf": "default", + "state": { + "frr-isisd:isis": { + "adjacencies": { + "adjacency": [ + { + "neighbor-sys-type": "level-1", + "neighbor-sysid": "0000.0000.0002", + "hold-timer": 10, + "neighbor-priority": 0, + "state": "up" + } + ] + } + } + } + }, + { + "name": "eth-rt3", + "vrf": "default", + "state": { + "frr-isisd:isis": { + "adjacencies": { + "adjacency": [ + { + "neighbor-sys-type": "level-1", + "neighbor-sysid": "0000.0000.0003", + "hold-timer": 10, + "neighbor-priority": 0, + "state": "up" + } + ] + } + } + } + }, + { + "name": "eth-rt4", + "vrf": "default", + "state": { + "frr-isisd:isis": { + "adjacencies": { + "adjacency": [ + { + "neighbor-sys-type": "level-1", + "neighbor-sysid": "0000.0000.0004", + "hold-timer": 10, + "neighbor-priority": 0, + "state": "up" + } + ] + } + } + } + }, + { + "name": "eth-rt5", + "vrf": "default", + "state": { + "frr-isisd:isis": { + "adjacencies": { + "adjacency": [ + { + "neighbor-sys-type": "level-1", + "neighbor-sysid": "0000.0000.0005", + "hold-timer": 10, + "neighbor-priority": 0, + "state": "up" + } + ] + } + } + } + }, + { + "name": "eth-rt6", + "vrf": "default", + "state": { + "frr-isisd:isis": { + "adjacencies": { + "adjacency": [ + { + "neighbor-sys-type": "level-1", + "neighbor-sysid": "0000.0000.0006", + "hold-timer": 10, + "neighbor-priority": 0, + "state": "up" + } + ] + } + } + } + } + ] + } +} diff --git a/tests/topotests/isis_lfa_topo1/rt7/zebra.conf b/tests/topotests/isis_lfa_topo1/rt7/zebra.conf new file mode 100644 index 0000000..4271cce --- /dev/null +++ b/tests/topotests/isis_lfa_topo1/rt7/zebra.conf @@ -0,0 +1,16 @@ +log file zebra.log +! +hostname rt7 +! +! debug zebra kernel +! debug zebra packet +! debug zebra mpls +! +interface lo + ip address 7.7.7.7/32 + ipv6 address 2001:db8:1000::7/128 +! +ip forwarding +! +line vty +! diff --git a/tests/topotests/isis_lfa_topo1/test_isis_lfa_topo1.py b/tests/topotests/isis_lfa_topo1/test_isis_lfa_topo1.py new file mode 100755 index 0000000..44b3dd0 --- /dev/null +++ b/tests/topotests/isis_lfa_topo1/test_isis_lfa_topo1.py @@ -0,0 +1,1086 @@ +#!/usr/bin/env python +# SPDX-License-Identifier: ISC + +# +# test_isis_tilfa_topo1.py +# Part of NetDEF Topology Tests +# +# Copyright (c) 2020 by +# Network Device Education Foundation, Inc. ("NetDEF") +# + +""" +test_isis_lfa_topo1.py: + + +---------+ + | | + +--------------------------------+ RT1 +-------------------------------+ + | +-------------+ +-------------+ | + | | | | | | + | | +----+----+ | | + | | | |20 | + | | | | | + | | | | | + +----+----+ +----+----+ +----+----+ +----+----+ +----+----+ + | | | | | | | | | | + | RT2 | 5 | RT3 | | RT4 | | RT5 | | RT6 | + | +--------+ | | | | | | | + | | | | | | | | | | + +----+----+ +----+----+ +----+----+ +----+----+ +----+----+ + | | | | | + | | |15 | | + |5 | | | | + | | +----+----+ | | + | | | | | | + | +-------------+ RT7 +-------------+ | + +--------------------------------+ +-------------------------------+ + | | + +---------+ +""" + +import os +import sys +import pytest +import json +import time +import tempfile +from functools import partial + +# Save the Current Working Directory to find configuration files. +CWD = os.path.dirname(os.path.realpath(__file__)) +sys.path.append(os.path.join(CWD, "../")) + +# pylint: disable=C0413 +# Import topogen and topotest helpers +from lib import topotest +from lib.topogen import Topogen, TopoRouter, get_topogen +from lib.topolog import logger + +# Required to instantiate the topology builder class. + +pytestmark = [pytest.mark.isisd] + +# Global multi-dimensional dictionary containing all expected outputs +outputs = {} + + +def build_topo(tgen): + "Build function" + + # + # Define FRR Routers + # + for router in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6", "rt7"]: + tgen.add_router(router) + + # + # Define connections + # + switch = tgen.add_switch("s1") + switch.add_link(tgen.gears["rt1"], nodeif="eth-rt2") + switch.add_link(tgen.gears["rt2"], nodeif="eth-rt1") + switch = tgen.add_switch("s2") + switch.add_link(tgen.gears["rt2"], nodeif="eth-rt3") + switch.add_link(tgen.gears["rt3"], nodeif="eth-rt2") + switch = tgen.add_switch("s3") + switch.add_link(tgen.gears["rt1"], nodeif="eth-rt3") + switch.add_link(tgen.gears["rt3"], nodeif="eth-rt1") + switch = tgen.add_switch("s4") + switch.add_link(tgen.gears["rt1"], nodeif="eth-rt4") + switch.add_link(tgen.gears["rt4"], nodeif="eth-rt1") + switch = tgen.add_switch("s5") + switch.add_link(tgen.gears["rt1"], nodeif="eth-rt5") + switch.add_link(tgen.gears["rt5"], nodeif="eth-rt1") + switch = tgen.add_switch("s6") + switch.add_link(tgen.gears["rt1"], nodeif="eth-rt6") + switch.add_link(tgen.gears["rt6"], nodeif="eth-rt1") + switch = tgen.add_switch("s7") + switch.add_link(tgen.gears["rt2"], nodeif="eth-rt7") + switch.add_link(tgen.gears["rt7"], nodeif="eth-rt2") + switch = tgen.add_switch("s8") + switch.add_link(tgen.gears["rt3"], nodeif="eth-rt7") + switch.add_link(tgen.gears["rt7"], nodeif="eth-rt3") + switch = tgen.add_switch("s9") + switch.add_link(tgen.gears["rt4"], nodeif="eth-rt7") + switch.add_link(tgen.gears["rt7"], nodeif="eth-rt4") + switch = tgen.add_switch("s10") + switch.add_link(tgen.gears["rt5"], nodeif="eth-rt7") + switch.add_link(tgen.gears["rt7"], nodeif="eth-rt5") + switch = tgen.add_switch("s11") + switch.add_link(tgen.gears["rt6"], nodeif="eth-rt7") + switch.add_link(tgen.gears["rt7"], nodeif="eth-rt6") + + # + # Populate multi-dimensional dictionary containing all expected outputs + # + files = ["show_ipv6_route.ref", "show_yang_interface_isis_adjacencies.ref"] + for rname in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6", "rt7"]: + outputs[rname] = {} + for step in range(1, 16 + 1): + outputs[rname][step] = {} + for file in files: + if step == 1: + # Get snapshots relative to the expected initial network convergence + filename = "{}/{}/step{}/{}".format(CWD, rname, step, file) + outputs[rname][step][file] = open(filename).read() + else: + if rname != "rt1": + continue + if file == "show_yang_interface_isis_adjacencies.ref": + continue + + # Get diff relative to the previous step + filename = "{}/{}/step{}/{}.diff".format(CWD, rname, step, file) + + # Create temporary files in order to apply the diff + f_in = tempfile.NamedTemporaryFile(mode="w") + f_in.write(outputs[rname][step - 1][file]) + f_in.flush() + f_out = tempfile.NamedTemporaryFile(mode="r") + os.system( + "patch -s -o %s %s %s" % (f_out.name, f_in.name, filename) + ) + + # Store the updated snapshot and remove the temporary files + outputs[rname][step][file] = open(f_out.name).read() + f_in.close() + f_out.close() + + +def setup_module(mod): + "Sets up the pytest environment" + tgen = Topogen(build_topo, mod.__name__) + tgen.start_topology() + + router_list = tgen.routers() + + # For all registered routers, load the zebra configuration file + for rname, router in router_list.items(): + router.load_config( + TopoRouter.RD_ZEBRA, os.path.join(CWD, "{}/zebra.conf".format(rname)) + ) + router.load_config( + TopoRouter.RD_ISIS, os.path.join(CWD, "{}/isisd.conf".format(rname)) + ) + router.load_config( + TopoRouter.RD_BFD, os.path.join(CWD, "/dev/null".format(rname)) + ) + + tgen.start_router() + + +def teardown_module(mod): + "Teardown the pytest environment" + tgen = get_topogen() + + # This function tears down the whole topology. + tgen.stop_topology() + + +def router_compare_json_output(rname, command, reference, wait=0.5, count=120): + "Compare router JSON output" + + logger.info('Comparing router "%s" "%s" output', rname, command) + + tgen = get_topogen() + expected = json.loads(reference) + + # Run test function until we get an result. Wait at most 60 seconds. + test_func = partial(topotest.router_json_cmp, tgen.gears[rname], command, expected) + _, diff = topotest.run_and_expect(test_func, None, count=count, wait=wait) + assertmsg = '"{}" JSON output mismatches the expected result'.format(rname) + assert diff is None, assertmsg + + +# +# Step 1 +# +# Test initial network convergence +# +def test_isis_adjacencies_step1(): + logger.info("Test (step 1): check IS-IS adjacencies") + tgen = get_topogen() + + # Skip if previous fatal error condition is raised + if tgen.routers_have_failure(): + pytest.skip(tgen.errors) + + for rname in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6", "rt7"]: + router_compare_json_output( + rname, + "show yang operational-data /frr-interface:lib isisd", + outputs[rname][1]["show_yang_interface_isis_adjacencies.ref"], + ) + + +def test_rib_ipv6_step1(): + logger.info("Test (step 1): verify IPv6 RIB") + tgen = get_topogen() + + # Skip if previous fatal error condition is raised + if tgen.routers_have_failure(): + pytest.skip(tgen.errors) + + for rname in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6", "rt7"]: + router_compare_json_output( + rname, "show ipv6 route isis json", outputs[rname][1]["show_ipv6_route.ref"] + ) + + +# +# Step 2 +# +# Action(s): +# -Disable LFA protection on all interfaces +# +# Expected changes: +# -rt1 should uninstall all backup nexthops from all routes +# +def test_rib_ipv6_step2(): + logger.info("Test (step 2): verify IPv6 RIB") + tgen = get_topogen() + + # Skip if previous fatal error condition is raised + if tgen.routers_have_failure(): + pytest.skip(tgen.errors) + + logger.info("Disabling LFA protection on all rt1 interfaces") + tgen.net["rt1"].cmd( + 'vtysh -c "conf t" -c "interface eth-rt2" -c "no isis fast-reroute lfa"' + ) + tgen.net["rt1"].cmd( + 'vtysh -c "conf t" -c "interface eth-rt3" -c "no isis fast-reroute lfa"' + ) + tgen.net["rt1"].cmd( + 'vtysh -c "conf t" -c "interface eth-rt4" -c "no isis fast-reroute lfa"' + ) + tgen.net["rt1"].cmd( + 'vtysh -c "conf t" -c "interface eth-rt5" -c "no isis fast-reroute lfa"' + ) + tgen.net["rt1"].cmd( + 'vtysh -c "conf t" -c "interface eth-rt6" -c "no isis fast-reroute lfa"' + ) + + for rname in ["rt1"]: + router_compare_json_output( + rname, "show ipv6 route isis json", outputs[rname][2]["show_ipv6_route.ref"] + ) + + +# +# Step 3 +# +# Action(s): +# -Re-enable LFA protection on all interfaces +# +# Expected changes: +# -Revert changes from the previous step +# +def test_rib_ipv6_step3(): + logger.info("Test (step 3): verify IPv6 RIB") + tgen = get_topogen() + + # Skip if previous fatal error condition is raised + if tgen.routers_have_failure(): + pytest.skip(tgen.errors) + + logger.info("Re-enabling LFA protection on all rt1 interfaces") + tgen.net["rt1"].cmd( + 'vtysh -c "conf t" -c "interface eth-rt2" -c "isis fast-reroute lfa"' + ) + tgen.net["rt1"].cmd( + 'vtysh -c "conf t" -c "interface eth-rt3" -c "isis fast-reroute lfa"' + ) + tgen.net["rt1"].cmd( + 'vtysh -c "conf t" -c "interface eth-rt4" -c "isis fast-reroute lfa"' + ) + tgen.net["rt1"].cmd( + 'vtysh -c "conf t" -c "interface eth-rt5" -c "isis fast-reroute lfa"' + ) + tgen.net["rt1"].cmd( + 'vtysh -c "conf t" -c "interface eth-rt6" -c "isis fast-reroute lfa"' + ) + + for rname in ["rt1"]: + router_compare_json_output( + rname, "show ipv6 route isis json", outputs[rname][3]["show_ipv6_route.ref"] + ) + + +# +# Step 4 +# +# Action(s): +# -Disable LFA load-sharing +# +# Expected changes: +# -rt1 should use at most one backup nexthop for each route +# +def test_rib_ipv6_step4(): + logger.info("Test (step 4): verify IPv6 RIB") + tgen = get_topogen() + + # Skip if previous fatal error condition is raised + if tgen.routers_have_failure(): + pytest.skip(tgen.errors) + + logger.info("Disabling LFA load-sharing on rt1") + tgen.net["rt1"].cmd( + 'vtysh -c "conf t" -c "router isis 1" -c "fast-reroute load-sharing disable"' + ) + + for rname in ["rt1"]: + router_compare_json_output( + rname, "show ipv6 route isis json", outputs[rname][4]["show_ipv6_route.ref"] + ) + + +# +# Step 5 +# +# Action(s): +# -Re-enable LFA load-sharing +# +# Expected changes: +# -Revert changes from the previous step +# +def test_rib_ipv6_step5(): + logger.info("Test (step 5): verify IPv6 RIB") + tgen = get_topogen() + + # Skip if previous fatal error condition is raised + if tgen.routers_have_failure(): + pytest.skip(tgen.errors) + + logger.info("Re-enabling LFA load-sharing on rt1") + tgen.net["rt1"].cmd( + 'vtysh -c "conf t" -c "router isis 1" -c "no fast-reroute load-sharing disable"' + ) + + for rname in ["rt1"]: + router_compare_json_output( + rname, "show ipv6 route isis json", outputs[rname][5]["show_ipv6_route.ref"] + ) + + +# +# Step 6 +# +# Action(s): +# -Limit backup computation to critical priority prefixes only +# +# Expected changes: +# -rt1 should uninstall all backup nexthops from all routes +# +def test_rib_ipv6_step6(): + logger.info("Test (step 6): verify IPv6 RIB") + tgen = get_topogen() + + # Skip if previous fatal error condition is raised + if tgen.routers_have_failure(): + pytest.skip(tgen.errors) + + logger.info("Limiting backup computation to critical priority prefixes only") + tgen.net["rt1"].cmd( + 'vtysh -c "conf t" -c "router isis 1" -c "fast-reroute priority-limit critical"' + ) + + for rname in ["rt1"]: + router_compare_json_output( + rname, "show ipv6 route isis json", outputs[rname][6]["show_ipv6_route.ref"] + ) + + +# +# Step 7 +# +# Action(s): +# -Configure a prefix priority list to classify rt7's loopback as a +# critical-priority prefix +# +# Expected changes: +# -rt1 should install backup nexthops for rt7's loopback route. +# +def test_rib_ipv6_step7(): + logger.info("Test (step 7): verify IPv6 RIB") + tgen = get_topogen() + + # Skip if previous fatal error condition is raised + if tgen.routers_have_failure(): + pytest.skip(tgen.errors) + + logger.info("Configuring a prefix priority list") + tgen.net["rt1"].cmd( + 'vtysh -c "conf t" -c "router isis 1" -c "spf prefix-priority critical CRITICAL_DESTINATIONS"' + ) + tgen.net["rt1"].cmd( + 'vtysh -c "conf t" -c "ipv6 access-list CRITICAL_DESTINATIONS seq 5 permit 2001:db8:1000::7/128"' + ) + + for rname in ["rt1"]: + router_compare_json_output( + rname, "show ipv6 route isis json", outputs[rname][7]["show_ipv6_route.ref"] + ) + + +# +# Step 8 +# +# Action(s): +# -Revert previous changes related to prefix priorities +# +# Expected changes: +# -Revert changes from the previous two steps +# +def test_rib_ipv6_step8(): + logger.info("Test (step 8): verify IPv6 RIB") + tgen = get_topogen() + + # Skip if previous fatal error condition is raised + if tgen.routers_have_failure(): + pytest.skip(tgen.errors) + + logger.info("Reverting previous changes related to prefix priorities") + tgen.net["rt1"].cmd( + 'vtysh -c "conf t" -c "no ipv6 access-list CRITICAL_DESTINATIONS seq 5 permit 2001:db8:1000::7/128"' + ) + tgen.net["rt1"].cmd( + 'vtysh -c "conf t" -c "router isis 1" -c "no fast-reroute priority-limit critical"' + ) + tgen.net["rt1"].cmd( + 'vtysh -c "conf t" -c "router isis 1" -c "no spf prefix-priority critical CRITICAL_DESTINATIONS"' + ) + + for rname in ["rt1"]: + router_compare_json_output( + rname, "show ipv6 route isis json", outputs[rname][8]["show_ipv6_route.ref"] + ) + + +# +# Step 9 +# +# Action(s): +# -Exclude eth-rt6 from LFA computation for eth-rt2's failure +# +# Expected changes: +# -Uninstall the eth-rt2 protecting backup nexthops that go through eth-rt6 +# +def test_rib_ipv6_step9(): + logger.info("Test (step 9): verify IPv6 RIB") + tgen = get_topogen() + + # Skip if previous fatal error condition is raised + if tgen.routers_have_failure(): + pytest.skip(tgen.errors) + + logger.info("Excluding eth-rt6 from LFA computation for eth-rt2's failure") + tgen.net["rt1"].cmd( + 'vtysh -c "conf t" -c "interface eth-rt2" -c "isis fast-reroute lfa exclude interface eth-rt6"' + ) + + for rname in ["rt1"]: + router_compare_json_output( + rname, "show ipv6 route isis json", outputs[rname][9]["show_ipv6_route.ref"] + ) + + +# +# Step 10 +# +# Action(s): +# -Remove exclusion of eth-rt6 from LFA computation for eth-rt2's failure +# +# Expected changes: +# -Revert changes from the previous step +# +def test_rib_ipv6_step10(): + logger.info("Test (step 10): verify IPv6 RIB") + tgen = get_topogen() + + # Skip if previous fatal error condition is raised + if tgen.routers_have_failure(): + pytest.skip(tgen.errors) + + logger.info( + "Removing exclusion of eth-rt6 from LFA computation for eth-rt2's failure" + ) + tgen.net["rt1"].cmd( + 'vtysh -c "conf t" -c "interface eth-rt2" -c "no isis fast-reroute lfa exclude interface eth-rt6"' + ) + + for rname in ["rt1"]: + router_compare_json_output( + rname, + "show ipv6 route isis json", + outputs[rname][10]["show_ipv6_route.ref"], + ) + + +# +# Step 11 +# +# Action(s): +# -Add LFA tiebreaker: prefer node protecting backup path +# +# Expected changes: +# -rt1 should prefer backup nexthops that provide node protection +# +def test_rib_ipv6_step11(): + logger.info("Test (step 11): verify IPv6 RIB") + tgen = get_topogen() + + # Skip if previous fatal error condition is raised + if tgen.routers_have_failure(): + pytest.skip(tgen.errors) + + logger.info("Adding LFA tiebreaker: prefer node protecting backup path") + tgen.net["rt1"].cmd( + 'vtysh -c "conf t" -c "router isis 1" -c "fast-reroute lfa tiebreaker node-protecting index 10"' + ) + + for rname in ["rt1"]: + router_compare_json_output( + rname, + "show ipv6 route isis json", + outputs[rname][11]["show_ipv6_route.ref"], + ) + + +# +# Step 12 +# +# Action(s): +# -Add LFA tiebreaker: prefer backup path via downstream node +# +# Expected changes: +# -rt1 should prefer backup nexthops that satisfy the downstream condition +# +def test_rib_ipv6_step12(): + logger.info("Test (step 12): verify IPv6 RIB") + tgen = get_topogen() + + # Skip if previous fatal error condition is raised + if tgen.routers_have_failure(): + pytest.skip(tgen.errors) + + logger.info("Adding LFA tiebreaker: prefer backup path via downstream node") + tgen.net["rt1"].cmd( + 'vtysh -c "conf t" -c "router isis 1" -c "fast-reroute lfa tiebreaker downstream index 20"' + ) + + for rname in ["rt1"]: + router_compare_json_output( + rname, + "show ipv6 route isis json", + outputs[rname][12]["show_ipv6_route.ref"], + ) + + +# +# Step 13 +# +# Action(s): +# -Add LFA tiebreaker: prefer backup path with lowest total metric +# +# Expected changes: +# -rt1 should prefer backup nexthops that have the best metric +# +def test_rib_ipv6_step13(): + logger.info("Test (step 13): verify IPv6 RIB") + tgen = get_topogen() + + # Skip if previous fatal error condition is raised + if tgen.routers_have_failure(): + pytest.skip(tgen.errors) + + logger.info("Adding LFA tiebreaker: prefer backup path with lowest total metric") + tgen.net["rt1"].cmd( + 'vtysh -c "conf t" -c "router isis 1" -c "fast-reroute lfa tiebreaker lowest-backup-metric index 30"' + ) + + for rname in ["rt1"]: + router_compare_json_output( + rname, + "show ipv6 route isis json", + outputs[rname][13]["show_ipv6_route.ref"], + ) + + +# +# Step 14 +# +# Action(s): +# - Setting spf-delay-ietf init-delay of 15s +# +# Expected changes: +# - No routing table change +# - At the end of test, SPF reacts to a failure in 15s +# +def test_rib_ipv6_step14(): + logger.info("Test (step 14): verify IPv6 RIB") + tgen = get_topogen() + + # Skip if previous fatal error condition is raised + if tgen.routers_have_failure(): + pytest.skip(tgen.errors) + + logger.info("Setting spf-delay-ietf init-delay of 15s") + tgen.net["rt1"].cmd( + 'vtysh -c "conf t" -c "router isis 1" -c "spf-delay-ietf init-delay 15000 short-delay 0 long-delay 0 holddown 0 time-to-learn 0"' + ) + + for rname in ["rt1"]: + router_compare_json_output( + rname, + "show ipv6 route isis json", + outputs[rname][14]["show_ipv6_route.ref"], + ) + + +# +# Step 15 +# +# Action(s): +# - shut the eth-rt2 interface on rt1 +# +# Expected changes: +# - Route switchover of routes via eth-rt2 +# +def test_rib_ipv6_step15(): + logger.info("Test (step 15): verify IPv6 RIB") + tgen = get_topogen() + + # Skip if previous fatal error condition is raised + if tgen.routers_have_failure(): + pytest.skip(tgen.errors) + + logger.info("Shut the interface to rt2 from the switch side and check fast-reroute") + tgen.net.cmd_raises("ip link set %s down" % tgen.net["s1"].intfs[0]) + + for rname in ["rt1"]: + router_compare_json_output( + rname, + "show ipv6 route isis json", + outputs[rname][15]["show_ipv6_route.ref"], + count=10, + wait=0.5, + ) + + +# +# Step 16 +# +# Action(s): wait for the convergence and SPF computation on rt1 +# +# Expected changes: +# - convergence of IPv6 RIB +# +def test_rib_ipv6_step16(): + logger.info("Test (step 16): verify IPv6 RIB") + tgen = get_topogen() + + # Skip if previous fatal error condition is raised + if tgen.routers_have_failure(): + pytest.skip(tgen.errors) + + logger.info("Check SPF convergence") + + for rname in ["rt1"]: + router_compare_json_output( + rname, + "show ipv6 route isis json", + outputs[rname][16]["show_ipv6_route.ref"], + ) + + +# +# Step 17 +# +# Action(s): +# - Unshut the interface to rt2 from the switch sid +# +# Expected changes: +# - The routing table converges +# +def test_rib_ipv6_step17(): + logger.info("Test (step 17): verify IPv6 RIB") + tgen = get_topogen() + + # Skip if previous fatal error condition is raised + if tgen.routers_have_failure(): + pytest.skip(tgen.errors) + + rname = "rt1" + + logger.info("Unsetting spf-delay-ietf init-delay of 15s") + tgen.net[rname].cmd('vtysh -c "conf t" -c "router isis 1" -c "no spf-delay-ietf"') + + logger.info( + "Unshut the interface to rt2 from the switch side and check fast-reroute" + ) + tgen.net.cmd_raises("ip link set %s up" % tgen.net["s1"].intfs[0]) + + logger.info("Setting spf-delay-ietf init-delay of 15s") + tgen.net[rname].cmd( + 'vtysh -c "conf t" -c "router isis 1" -c "spf-delay-ietf init-delay 15000 short-delay 0 long-delay 0 holddown 0 time-to-learn 0"' + ) + + router_compare_json_output( + rname, + "show ipv6 route isis json", + outputs[rname][14]["show_ipv6_route.ref"], + ) + + +# +# Step 18 +# +# Action(s): +# - drop traffic between rt1 and rt2 by shutting down the bridge between +# the routers. Interfaces on rt1 and rt2 stay up. +# +# +# Expected changes: +# - Route switchover of routes via eth-rt2 +# +def test_rib_ipv6_step18(): + def _rt2_neigh_down(router): + output = json.loads(router.vtysh_cmd("show isis neighbor rt2 json")) + + """ + Previous output was: + { + "areas":[ + { + "area":"1", + "circuits":[ + { + "circuit":0, + "adj":"rt2", + "interface":{ + "name":"eth-rt2", + "state":"Up", + "adj-flaps":1, + "last-ago":"21s", + "circuit-type":"L1", + "speaks":"IPv6", + "topologies":{ + "topo-0":"ipv6-unicast" + }, + "snpa":"2020.2020.2020", + "area-address":{ + "isonet":"49.0000" + }, + "ipv6-link-local":{ + "ipv6":"fe80::ac19:a8ff:fee5:f48f" + }, + "adj-sid":{ + } + }, + "level":1, + "expires-in":"2s" + }, + { + "circuit":0 + }, + { + "circuit":0 + }, + { + "circuit":0 + }, + { + "circuit":0 + }, + { + "circuit":0 + } + ] + } + ] + """ + + expected = { + "areas": [ + { + "area": "1", + "circuits": [ + {"circuit": 0}, + {"circuit": 0}, + {"circuit": 0}, + {"circuit": 0}, + {"circuit": 0}, + {"circuit": 0}, + ], + } + ] + } + + return topotest.json_cmp(output, expected, exact=True) + + logger.info("Test (step 18): verify IPv6 RIB") + tgen = get_topogen() + + # Skip if previous fatal error condition is raised + if tgen.routers_have_failure(): + pytest.skip(tgen.errors) + + logger.info("Drop traffic between rt1 and rt2") + tgen.net.cmd_raises("ip link set s1 down") + + rname = "rt1" + router = tgen.gears[rname] + test_func = partial(_rt2_neigh_down, router) + success, result = topotest.run_and_expect(test_func, None, count=200, wait=0.05) + assert result is None, 'rt2 neighbor is still present on "{}"'.format(router) + + router_compare_json_output( + rname, + "show ipv6 route isis json", + outputs[rname][15]["show_ipv6_route.ref"], + count=10, + wait=0.5, + ) + + +# +# Step 19 +# +# Action(s): wait for the convergence and SPF computation on rt1 +# +# Expected changes: +# - convergence of IPv6 RIB +# +def test_rib_ipv6_step19(): + logger.info("Test (step 19): verify IPv6 RIB") + tgen = get_topogen() + + # Skip if previous fatal error condition is raised + if tgen.routers_have_failure(): + pytest.skip(tgen.errors) + + logger.info("Check SPF convergence") + + for rname in ["rt1"]: + router_compare_json_output( + rname, + "show ipv6 route isis json", + outputs[rname][16]["show_ipv6_route.ref"], + ) + + +# +# Step 20 +# +# Action(s): +# - Unshut the switch from rt1 to rt2 +# +# Expected changes: +# - The routing table goes back to the nominal state +# +def test_rib_ipv6_step20(): + logger.info("Test (step 20): verify IPv6 RIB") + tgen = get_topogen() + + # Skip if previous fatal error condition is raised + if tgen.routers_have_failure(): + pytest.skip(tgen.errors) + + rname = "rt1" + + logger.info("Unsetting spf-delay-ietf init-delay of 15s") + tgen.net[rname].cmd('vtysh -c "conf t" -c "router isis 1" -c "no spf-delay-ietf"') + + logger.info( + "Unshut the interface to rt2 from the switch side and check fast-reroute" + ) + tgen.net.cmd_raises("ip link set s1 up") + + logger.info("Setting spf-delay-ietf init-delay of 15s") + tgen.net[rname].cmd( + 'vtysh -c "conf t" -c "router isis 1" -c "spf-delay-ietf init-delay 15000 short-delay 0 long-delay 0 holddown 0 time-to-learn 0"' + ) + + router_compare_json_output( + rname, + "show ipv6 route isis json", + outputs[rname][14]["show_ipv6_route.ref"], + ) + + +# +# Step 21 +# +# Action(s): +# - clear the rt2 ISIS neighbor on rt1 +# +# Expected changes: +# - Route switchover of routes via eth-rt2 +# +def test_rib_ipv6_step21(): + logger.info("Test (step 21): verify IPv6 RIB") + tgen = get_topogen() + + # Skip if previous fatal error condition is raised + if tgen.routers_have_failure(): + pytest.skip(tgen.errors) + + rname = "rt1" + + logger.info("Clear the rt2 ISIS neighbor on rt1 and check fast-reroute") + tgen.gears[rname].vtysh_cmd("clear isis neighbor rt2") + + router_compare_json_output( + rname, + "show ipv6 route isis json", + outputs[rname][15]["show_ipv6_route.ref"], + count=10, + wait=0.5, + ) + + +# +# Step 22 +# +# Action(s): wait for the convergence and SPF computation on rt1 +# +# Expected changes: +# - convergence of IPv6 RIB +# +def test_rib_ipv6_step22(): + logger.info("Test (step 22): verify IPv6 RIB") + tgen = get_topogen() + + # Skip if previous fatal error condition is raised + if tgen.routers_have_failure(): + pytest.skip(tgen.errors) + + logger.info("Check SPF convergence") + + for rname in ["rt1"]: + router_compare_json_output( + rname, + "show ipv6 route isis json", + outputs[rname][16]["show_ipv6_route.ref"], + ) + + +# +# Step 23 +# +# Action(s): +# - Setting BFD +# +# Expected changes: +# - No routing table change +# - BFD comes up +# +def test_rib_ipv6_step23(): + logger.info("Test (step 23): verify IPv6 RIB") + tgen = get_topogen() + + # Skip if previous fatal error condition is raised + if tgen.routers_have_failure(): + pytest.skip(tgen.errors) + + logger.info("Setup BFD on rt1 and rt2") + for rname in ["rt1", "rt2"]: + conf_file = os.path.join(CWD, "{}/bfdd.conf".format(rname)) + tgen.net[rname].cmd("vtysh -f {}".format(conf_file)) + + logger.info("Set ISIS BFD") + tgen.net["rt1"].cmd('vtysh -c "conf t" -c "int eth-rt2" -c "isis bfd"') + tgen.net["rt2"].cmd('vtysh -c "conf t" -c "int eth-rt1" -c "isis bfd"') + + rname = "rt1" + expect = '[{"multihop":false,"interface":"eth-rt2","status":"up"}]' + router_compare_json_output(rname, "show bfd peers json", expect) + + router_compare_json_output( + rname, + "show ipv6 route isis json", + outputs[rname][14]["show_ipv6_route.ref"], + ) + + +# +# Step 24 +# +# Action(s): +# - drop traffic between rt1 and rt2 by shutting down the bridge between +# the routers. Interfaces on rt1 and rt2 stay up. +# +# Expected changes: +# - BFD comes down before IS-IS +# - Route switchover of routes via eth-rt2 +# +def test_rib_ipv6_step24(): + def _bfd_down(router): + output = json.loads(router.vtysh_cmd("show bfd peers json")) + expected = [] + return topotest.json_cmp(output, expected, exact=True) + + logger.info("Test (step 24): verify IPv6 RIB") + tgen = get_topogen() + + # Skip if previous fatal error condition is raised + if tgen.routers_have_failure(): + pytest.skip(tgen.errors) + + logger.info("Shut the interface to rt2 from the switch side and check fast-reroute") + tgen.net.cmd_raises("ip link set s1 down") + + rname = "rt1" + router = tgen.gears[rname] + test_func = partial(_bfd_down, router) + success, result = topotest.run_and_expect(test_func, None, count=30, wait=0.3) + assert result is None, 'BFD session is still up on "{}"'.format(router) + + router_compare_json_output( + rname, + "show ipv6 route isis json", + outputs[rname][15]["show_ipv6_route.ref"], + count=10, + ) + + +# +# Step 25 +# +# Action(s): wait for the convergence and SPF computation on rt1 +# +# Expected changes: +# - convergence of IPv6 RIB +# +def test_rib_ipv6_step25(): + logger.info("Test (step 25): verify IPv6 RIB") + tgen = get_topogen() + + # Skip if previous fatal error condition is raised + if tgen.routers_have_failure(): + pytest.skip(tgen.errors) + + logger.info("Check SPF convergence") + + for rname in ["rt1"]: + router_compare_json_output( + rname, + "show ipv6 route isis json", + outputs[rname][16]["show_ipv6_route.ref"], + ) + + +# Memory leak test template +def test_memory_leak(): + "Run the memory leak test and report results." + tgen = get_topogen() + if not tgen.is_memleak_enabled(): + pytest.skip("Memory leak test/report is disabled") + + tgen.report_memory_leaks() + + +if __name__ == "__main__": + args = ["-s"] + sys.argv[1:] + sys.exit(pytest.main(args)) |