mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-05 15:10:38 +00:00
tests: OSPF6 point-to-multipoint topotest
* Check if FRR is running * Check if OSPFv3 converges * Check OSPFv3 Routing Tables * Check Linux Kernel Routing Table Signed-off-by: Adriano Marto Reis <adrianomarto@gmail.com>
This commit is contained in:
parent
25dc0c1290
commit
a5677ca1e0
137
tests/topotests/ospf6_point_to_multipoint/README.md
Normal file
137
tests/topotests/ospf6_point_to_multipoint/README.md
Normal file
@ -0,0 +1,137 @@
|
||||
# OSPFv3 (IPv6) Topology Test (point-to-multipoint)
|
||||
|
||||
## Topology
|
||||
-----\
|
||||
SW1 - Stub Net 1 SW2 - Stub Net 2 \
|
||||
fc00:1:1:1::/64 fc00:2:2:2::/64 \
|
||||
\___________________/ \___________________/ |
|
||||
| | |
|
||||
| | |
|
||||
| ::1 | ::2 |
|
||||
+---------+---------+ +---------+---------+ |
|
||||
| R1 | | R2 | |
|
||||
| FRRouting | | FRRouting | |
|
||||
| Rtr-ID: 10.0.0.1 | | Rtr-ID: 10.0.0.2 | |
|
||||
+---------+---------+ +---------+---------+ |
|
||||
| ::1 | ::2 \
|
||||
\______ ___________/ OSPFv3
|
||||
\ / Area 0.0.0.0
|
||||
\ / /
|
||||
~~~~~~~~~~~~~~~~~~ |
|
||||
~~ SW5 ~~ |
|
||||
~~ Switch ~~ |
|
||||
~~ fc00:A:A:A::/64 ~~ |
|
||||
~~~~~~~~~~~~~~~~~~ |
|
||||
| /---- |
|
||||
| ::3 | SW3 - Stub Net 3 |
|
||||
+---------+---------+ /-+ fc00:3:3:3::/64 |
|
||||
| R3 | / | /
|
||||
| FRRouting +--/ \---- /
|
||||
| Rtr-ID: 10.0.0.3 | ::3 ___________/
|
||||
+---------+---------+ \
|
||||
| ::3 \
|
||||
| \
|
||||
~~~~~~~~~~~~~~~~~~ |
|
||||
~~ SW6 ~~ |
|
||||
~~ Switch ~~ |
|
||||
~~ fc00:B:B:B::/64 ~~ \
|
||||
~~~~~~~~~~~~~~~~~~ OSPFv3
|
||||
| Area 0.0.0.1
|
||||
| ::4 /
|
||||
+---------+---------+ /---- |
|
||||
| R4 | | SW4 - Stub Net 4 |
|
||||
| FRRouting +------+ fc00:4:4:4::/64 |
|
||||
| Rtr-ID: 10.0.0.4 | ::4 | /
|
||||
+-------------------+ \---- /
|
||||
-----/
|
||||
|
||||
## FRR Configuration
|
||||
|
||||
Full config as used is in r1 / r2 / r3 / r4 / r5 subdirectories
|
||||
|
||||
Simplified `R1` config (R1 is similar)
|
||||
|
||||
hostname r1
|
||||
!
|
||||
interface r1-stubnet
|
||||
ipv6 address fc00:1:1:1::1/64
|
||||
ipv6 ospf6 passive
|
||||
ipv6 ospf6 area 0.0.0.0
|
||||
!
|
||||
interface r1-sw5
|
||||
ipv6 address fc00:a:a:a::1/64
|
||||
ipv6 ospf6 network point-to-multipoint
|
||||
ipv6 ospf6 area 0.0.0.0
|
||||
!
|
||||
router ospf6
|
||||
router-id 10.0.0.1
|
||||
log-adjacency-changes detail
|
||||
redistribute static
|
||||
!
|
||||
ipv6 route fc00:1111:1111:1111::/64 fc00:1:1:1::1234
|
||||
|
||||
Simplified `R3` config
|
||||
|
||||
hostname r3
|
||||
!
|
||||
interface r3-stubnet
|
||||
ipv6 address fc00:3:3:3::3/64
|
||||
ipv6 ospf6 passive
|
||||
ipv6 ospf6 area 0.0.0.0
|
||||
!
|
||||
interface r3-sw5
|
||||
ipv6 address fc00:a:a:a::3/64
|
||||
ipv6 ospf6 network point-to-multipoint
|
||||
ipv6 ospf6 area 0.0.0.0
|
||||
ipv6 ospf6 p2p-p2mp connected-prefixes include
|
||||
!
|
||||
interface r3-sw6
|
||||
ipv6 address fc00:b:b:b::3/64
|
||||
ipv6 ospf6 network point-to-multipoint
|
||||
ipv6 ospf6 area 0.0.0.1
|
||||
ipv6 ospf6 p2p-p2mp connected-prefixes include
|
||||
!
|
||||
router ospf6
|
||||
router-id 10.0.0.3
|
||||
log-adjacency-changes detail
|
||||
redistribute static
|
||||
!
|
||||
ipv6 route fc00:3333:3333:3333::/64 fc00:3:3:3::1234
|
||||
|
||||
## Tests executed
|
||||
|
||||
### Check if FRR is running
|
||||
|
||||
Test is executed by running
|
||||
|
||||
vtysh -c "show logging" | grep "Logging configuration for"
|
||||
|
||||
on each FRR router. This should return the logging information for all daemons registered
|
||||
to Zebra and the list of running daemons is compared to the daemons started for this test (`zebra` and `ospf6d`)
|
||||
|
||||
### Check if OSPFv3 to converge
|
||||
|
||||
OSPFv3 is expected to converge on each view within 60s total time. Convergence is verified by executing (on each node)
|
||||
|
||||
vtysh -c "show ipv6 ospf neigh"
|
||||
|
||||
and checking for "Full" neighbor status in the output. An additional 15 seconds after the full converge is waited for
|
||||
routes to populate before the following routing table checks are executed
|
||||
|
||||
### Check OSPFv3 Routing Tables
|
||||
|
||||
Routing table is verified by running
|
||||
|
||||
vtysh -c "show ipv6 route"
|
||||
|
||||
on each node and comparing the result to the stored example config (see `show_ipv6_route.ref` in r1 / r2 / r3 / r4 directories).
|
||||
Link-Local addresses are masked out before the compare.
|
||||
|
||||
### Check Linux Kernel Routing Table
|
||||
|
||||
Linux Kernel IPv6 Routing table is verified on each FRR node with
|
||||
|
||||
ip -6 route
|
||||
|
||||
Tables are compared with reference routing table (see `ip_6_address.ref` in r1 / r2 / r3 / r4 directories).
|
||||
Link-Local addresses are translated after getting collected on each node with interface name to make them consistent
|
@ -0,0 +1,14 @@
|
||||
fc00:1111:1111:1111::/64 nhid XXXX via fc00:1:1:1::1234 dev r1-stubnet proto XXXX metric 20 pref medium
|
||||
fc00:1:1:1::/64 dev r1-stubnet proto XXXX metric 256 pref medium
|
||||
fc00:2222:2222:2222::/64 nhid XXXX via fe80::__(r2-sw5)__ dev r1-sw5 proto XXXX metric 20 pref medium
|
||||
fc00:2:2:2::/64 nhid XXXX via fe80::__(r2-sw5)__ dev r1-sw5 proto XXXX metric 20 pref medium
|
||||
fc00:3333:3333:3333::/64 nhid XXXX via fe80::__(r3-sw5)__ dev r1-sw5 proto XXXX metric 20 pref medium
|
||||
fc00:3:3:3::/64 nhid XXXX via fe80::__(r3-sw5)__ dev r1-sw5 proto XXXX metric 20 pref medium
|
||||
fc00:4444:4444:4444::/64 nhid XXXX via fe80::__(r3-sw5)__ dev r1-sw5 proto XXXX metric 20 pref medium
|
||||
fc00:4:4:4::/64 nhid XXXX via fe80::__(r3-sw5)__ dev r1-sw5 proto XXXX metric 20 pref medium
|
||||
fc00:a:a:a::/64 dev r1-sw5 proto XXXX metric 256 pref medium
|
||||
fc00:a:a:a::2 nhid XXXX via fe80::__(r2-sw5)__ dev r1-sw5 proto XXXX metric 20 pref medium
|
||||
fc00:a:a:a::3 nhid XXXX via fe80::__(r3-sw5)__ dev r1-sw5 proto XXXX metric 20 pref medium
|
||||
fc00:b:b:b::/64 nhid XXXX via fe80::__(r3-sw5)__ dev r1-sw5 proto XXXX metric 20 pref medium
|
||||
fc00:b:b:b::3 nhid XXXX via fe80::__(r3-sw5)__ dev r1-sw5 proto XXXX metric 20 pref medium
|
||||
fc00:b:b:b::4 nhid XXXX via fe80::__(r3-sw5)__ dev r1-sw5 proto XXXX metric 20 pref medium
|
@ -0,0 +1,14 @@
|
||||
fc00:1111:1111:1111::/64 via fc00:1:1:1::1234 dev r1-stubnet proto XXXX metric 20 pref medium
|
||||
fc00:1:1:1::/64 dev r1-stubnet proto XXXX metric 256 pref medium
|
||||
fc00:2222:2222:2222::/64 via fe80::__(r2-sw5)__ dev r1-sw5 proto XXXX metric 20 pref medium
|
||||
fc00:2:2:2::/64 via fe80::__(r2-sw5)__ dev r1-sw5 proto XXXX metric 20 pref medium
|
||||
fc00:3333:3333:3333::/64 via fe80::__(r3-sw5)__ dev r1-sw5 proto XXXX metric 20 pref medium
|
||||
fc00:3:3:3::/64 via fe80::__(r3-sw5)__ dev r1-sw5 proto XXXX metric 20 pref medium
|
||||
fc00:4444:4444:4444::/64 via fe80::__(r3-sw5)__ dev r1-sw5 proto XXXX metric 20 pref medium
|
||||
fc00:4:4:4::/64 via fe80::__(r3-sw5)__ dev r1-sw5 proto XXXX metric 20 pref medium
|
||||
fc00:a:a:a::/64 dev r1-sw5 proto XXXX metric 256 pref medium
|
||||
fc00:a:a:a::2 via fe80::__(r2-sw5)__ dev r1-sw5 proto XXXX metric 20 pref medium
|
||||
fc00:a:a:a::3 via fe80::__(r3-sw5)__ dev r1-sw5 proto XXXX metric 20 pref medium
|
||||
fc00:b:b:b::/64 via fe80::__(r3-sw5)__ dev r1-sw5 proto XXXX metric 20 pref medium
|
||||
fc00:b:b:b::3 via fe80::__(r3-sw5)__ dev r1-sw5 proto XXXX metric 20 pref medium
|
||||
fc00:b:b:b::4 via fe80::__(r3-sw5)__ dev r1-sw5 proto XXXX metric 20 pref medium
|
30
tests/topotests/ospf6_point_to_multipoint/r1/ospf6d.conf
Normal file
30
tests/topotests/ospf6_point_to_multipoint/r1/ospf6d.conf
Normal file
@ -0,0 +1,30 @@
|
||||
hostname r1
|
||||
log file ospf6d.log
|
||||
!
|
||||
! debug ospf6 message all
|
||||
! debug ospf6 lsa unknown
|
||||
! debug ospf6 zebra
|
||||
! debug ospf6 interface
|
||||
! debug ospf6 neighbor
|
||||
! debug ospf6 route table
|
||||
! debug ospf6 flooding
|
||||
!
|
||||
interface r1-sw5
|
||||
ipv6 ospf6 network point-to-multipoint
|
||||
ipv6 ospf6 area 0.0.0.0
|
||||
ipv6 ospf6 hello-interval 2
|
||||
ipv6 ospf6 dead-interval 10
|
||||
ipv6 ospf6 p2p-p2mp connected-prefixes include
|
||||
!
|
||||
interface r1-stubnet
|
||||
ipv6 ospf6 passive
|
||||
ipv6 ospf6 area 0.0.0.0
|
||||
!
|
||||
router ospf6
|
||||
ospf6 router-id 10.0.0.1
|
||||
log-adjacency-changes detail
|
||||
redistribute static
|
||||
!
|
||||
line vty
|
||||
exec-timeout 0 0
|
||||
!
|
@ -0,0 +1,13 @@
|
||||
O fc00:1:1:1::/64 [110/10] is directly connected, r1-stubnet, weight 1, XX:XX:XX
|
||||
O>* fc00:2:2:2::/64 [110/20] via fe80::XXXX:XXXX:XXXX:XXXX, r1-sw5, weight 1, XX:XX:XX
|
||||
O>* fc00:3:3:3::/64 [110/20] via fe80::XXXX:XXXX:XXXX:XXXX, r1-sw5, weight 1, XX:XX:XX
|
||||
O>* fc00:4:4:4::/64 [110/30] via fe80::XXXX:XXXX:XXXX:XXXX, r1-sw5, weight 1, XX:XX:XX
|
||||
O fc00:a:a:a::/64 [110/10] is directly connected, r1-sw5, weight 1, XX:XX:XX
|
||||
O>* fc00:a:a:a::2/128 [110/10] via fe80::XXXX:XXXX:XXXX:XXXX, r1-sw5, weight 1, XX:XX:XX
|
||||
O>* fc00:a:a:a::3/128 [110/10] via fe80::XXXX:XXXX:XXXX:XXXX, r1-sw5, weight 1, XX:XX:XX
|
||||
O>* fc00:b:b:b::/64 [110/20] via fe80::XXXX:XXXX:XXXX:XXXX, r1-sw5, weight 1, XX:XX:XX
|
||||
O>* fc00:b:b:b::3/128 [110/10] via fe80::XXXX:XXXX:XXXX:XXXX, r1-sw5, weight 1, XX:XX:XX
|
||||
O>* fc00:b:b:b::4/128 [110/20] via fe80::XXXX:XXXX:XXXX:XXXX, r1-sw5, weight 1, XX:XX:XX
|
||||
O>* fc00:2222:2222:2222::/64 [110/20] via fe80::XXXX:XXXX:XXXX:XXXX, r1-sw5, weight 1, XX:XX:XX
|
||||
O>* fc00:3333:3333:3333::/64 [110/20] via fe80::XXXX:XXXX:XXXX:XXXX, r1-sw5, weight 1, XX:XX:XX
|
||||
O>* fc00:4444:4444:4444::/64 [110/20] via fe80::XXXX:XXXX:XXXX:XXXX, r1-sw5, weight 1, XX:XX:XX
|
20
tests/topotests/ospf6_point_to_multipoint/r1/zebra.conf
Normal file
20
tests/topotests/ospf6_point_to_multipoint/r1/zebra.conf
Normal file
@ -0,0 +1,20 @@
|
||||
!
|
||||
hostname r1
|
||||
log file zebra.log
|
||||
!
|
||||
! debug zebra events
|
||||
! debug zebra rib
|
||||
!
|
||||
interface r1-stubnet
|
||||
ipv6 address fc00:1:1:1::1/64
|
||||
!
|
||||
interface r1-sw5
|
||||
ipv6 address fc00:a:a:a::1/64
|
||||
!
|
||||
interface lo
|
||||
!
|
||||
ipv6 route fc00:1111:1111:1111::/64 fc00:1:1:1::1234
|
||||
!
|
||||
!
|
||||
line vty
|
||||
!
|
@ -0,0 +1,14 @@
|
||||
fc00:1111:1111:1111::/64 nhid XXXX via fe80::__(r1-sw5)__ dev r2-sw5 proto XXXX metric 20 pref medium
|
||||
fc00:1:1:1::/64 nhid XXXX via fe80::__(r1-sw5)__ dev r2-sw5 proto XXXX metric 20 pref medium
|
||||
fc00:2222:2222:2222::/64 nhid XXXX via fc00:2:2:2::1234 dev r2-stubnet proto XXXX metric 20 pref medium
|
||||
fc00:2:2:2::/64 dev r2-stubnet proto XXXX metric 256 pref medium
|
||||
fc00:3333:3333:3333::/64 nhid XXXX via fe80::__(r3-sw5)__ dev r2-sw5 proto XXXX metric 20 pref medium
|
||||
fc00:3:3:3::/64 nhid XXXX via fe80::__(r3-sw5)__ dev r2-sw5 proto XXXX metric 20 pref medium
|
||||
fc00:4444:4444:4444::/64 nhid XXXX via fe80::__(r3-sw5)__ dev r2-sw5 proto XXXX metric 20 pref medium
|
||||
fc00:4:4:4::/64 nhid XXXX via fe80::__(r3-sw5)__ dev r2-sw5 proto XXXX metric 20 pref medium
|
||||
fc00:a:a:a::/64 dev r2-sw5 proto XXXX metric 256 pref medium
|
||||
fc00:a:a:a::1 nhid XXXX via fe80::__(r1-sw5)__ dev r2-sw5 proto XXXX metric 20 pref medium
|
||||
fc00:a:a:a::3 nhid XXXX via fe80::__(r3-sw5)__ dev r2-sw5 proto XXXX metric 20 pref medium
|
||||
fc00:b:b:b::/64 nhid XXXX via fe80::__(r3-sw5)__ dev r2-sw5 proto XXXX metric 20 pref medium
|
||||
fc00:b:b:b::3 nhid XXXX via fe80::__(r3-sw5)__ dev r2-sw5 proto XXXX metric 20 pref medium
|
||||
fc00:b:b:b::4 nhid XXXX via fe80::__(r3-sw5)__ dev r2-sw5 proto XXXX metric 20 pref medium
|
@ -0,0 +1,14 @@
|
||||
fc00:1111:1111:1111::/64 via fe80::__(r1-sw5)__ dev r2-sw5 proto XXXX metric 20 pref medium
|
||||
fc00:1:1:1::/64 via fe80::__(r1-sw5)__ dev r2-sw5 proto XXXX metric 20 pref medium
|
||||
fc00:2222:2222:2222::/64 via fc00:2:2:2::1234 dev r2-stubnet proto XXXX metric 20 pref medium
|
||||
fc00:2:2:2::/64 dev r2-stubnet proto XXXX metric 256 pref medium
|
||||
fc00:3333:3333:3333::/64 via fe80::__(r3-sw5)__ dev r2-sw5 proto XXXX metric 20 pref medium
|
||||
fc00:3:3:3::/64 via fe80::__(r3-sw5)__ dev r2-sw5 proto XXXX metric 20 pref medium
|
||||
fc00:4444:4444:4444::/64 via fe80::__(r3-sw5)__ dev r2-sw5 proto XXXX metric 20 pref medium
|
||||
fc00:4:4:4::/64 via fe80::__(r3-sw5)__ dev r2-sw5 proto XXXX metric 20 pref medium
|
||||
fc00:a:a:a::/64 dev r2-sw5 proto XXXX metric 256 pref medium
|
||||
fc00:a:a:a::1 via fe80::__(r1-sw5)__ dev r2-sw5 proto XXXX metric 20 pref medium
|
||||
fc00:a:a:a::3 via fe80::__(r3-sw5)__ dev r2-sw5 proto XXXX metric 20 pref medium
|
||||
fc00:b:b:b::/64 via fe80::__(r3-sw5)__ dev r2-sw5 proto XXXX metric 20 pref medium
|
||||
fc00:b:b:b::3 via fe80::__(r3-sw5)__ dev r2-sw5 proto XXXX metric 20 pref medium
|
||||
fc00:b:b:b::4 via fe80::__(r3-sw5)__ dev r2-sw5 proto XXXX metric 20 pref medium
|
30
tests/topotests/ospf6_point_to_multipoint/r2/ospf6d.conf
Normal file
30
tests/topotests/ospf6_point_to_multipoint/r2/ospf6d.conf
Normal file
@ -0,0 +1,30 @@
|
||||
hostname r2
|
||||
log file ospf6d.log
|
||||
!
|
||||
! debug ospf6 message all
|
||||
! debug ospf6 lsa unknown
|
||||
! debug ospf6 zebra
|
||||
! debug ospf6 interface
|
||||
! debug ospf6 neighbor
|
||||
! debug ospf6 route table
|
||||
! debug ospf6 flooding
|
||||
!
|
||||
interface r2-sw5
|
||||
ipv6 ospf6 network point-to-multipoint
|
||||
ipv6 ospf6 area 0.0.0.0
|
||||
ipv6 ospf6 hello-interval 2
|
||||
ipv6 ospf6 dead-interval 10
|
||||
ipv6 ospf6 p2p-p2mp connected-prefixes include
|
||||
!
|
||||
interface r2-stubnet
|
||||
ipv6 ospf6 passive
|
||||
ipv6 ospf6 area 0.0.0.0
|
||||
!
|
||||
router ospf6
|
||||
ospf6 router-id 10.0.0.2
|
||||
log-adjacency-changes detail
|
||||
redistribute static
|
||||
!
|
||||
line vty
|
||||
exec-timeout 0 0
|
||||
!
|
@ -0,0 +1,13 @@
|
||||
O>* fc00:1:1:1::/64 [110/20] via fe80::XXXX:XXXX:XXXX:XXXX, r2-sw5, weight 1, XX:XX:XX
|
||||
O fc00:2:2:2::/64 [110/10] is directly connected, r2-stubnet, weight 1, XX:XX:XX
|
||||
O>* fc00:3:3:3::/64 [110/20] via fe80::XXXX:XXXX:XXXX:XXXX, r2-sw5, weight 1, XX:XX:XX
|
||||
O>* fc00:4:4:4::/64 [110/30] via fe80::XXXX:XXXX:XXXX:XXXX, r2-sw5, weight 1, XX:XX:XX
|
||||
O fc00:a:a:a::/64 [110/10] is directly connected, r2-sw5, weight 1, XX:XX:XX
|
||||
O>* fc00:a:a:a::1/128 [110/10] via fe80::XXXX:XXXX:XXXX:XXXX, r2-sw5, weight 1, XX:XX:XX
|
||||
O>* fc00:a:a:a::3/128 [110/10] via fe80::XXXX:XXXX:XXXX:XXXX, r2-sw5, weight 1, XX:XX:XX
|
||||
O>* fc00:b:b:b::/64 [110/20] via fe80::XXXX:XXXX:XXXX:XXXX, r2-sw5, weight 1, XX:XX:XX
|
||||
O>* fc00:b:b:b::3/128 [110/10] via fe80::XXXX:XXXX:XXXX:XXXX, r2-sw5, weight 1, XX:XX:XX
|
||||
O>* fc00:b:b:b::4/128 [110/20] via fe80::XXXX:XXXX:XXXX:XXXX, r2-sw5, weight 1, XX:XX:XX
|
||||
O>* fc00:1111:1111:1111::/64 [110/20] via fe80::XXXX:XXXX:XXXX:XXXX, r2-sw5, weight 1, XX:XX:XX
|
||||
O>* fc00:3333:3333:3333::/64 [110/20] via fe80::XXXX:XXXX:XXXX:XXXX, r2-sw5, weight 1, XX:XX:XX
|
||||
O>* fc00:4444:4444:4444::/64 [110/20] via fe80::XXXX:XXXX:XXXX:XXXX, r2-sw5, weight 1, XX:XX:XX
|
20
tests/topotests/ospf6_point_to_multipoint/r2/zebra.conf
Normal file
20
tests/topotests/ospf6_point_to_multipoint/r2/zebra.conf
Normal file
@ -0,0 +1,20 @@
|
||||
!
|
||||
hostname r2
|
||||
log file zebra.log
|
||||
!
|
||||
! debug zebra events
|
||||
! debug zebra rib
|
||||
!
|
||||
interface r2-stubnet
|
||||
ipv6 address fc00:2:2:2::2/64
|
||||
!
|
||||
interface r2-sw5
|
||||
ipv6 address fc00:a:a:a::2/64
|
||||
!
|
||||
interface lo
|
||||
!
|
||||
ipv6 route fc00:2222:2222:2222::/64 fc00:2:2:2::1234
|
||||
!
|
||||
!
|
||||
line vty
|
||||
!
|
@ -0,0 +1,13 @@
|
||||
fc00:1111:1111:1111::/64 nhid XXXX via fe80::__(r1-sw5)__ dev r3-sw5 proto XXXX metric 20 pref medium
|
||||
fc00:1:1:1::/64 nhid XXXX via fe80::__(r1-sw5)__ dev r3-sw5 proto XXXX metric 20 pref medium
|
||||
fc00:2222:2222:2222::/64 nhid XXXX via fe80::__(r2-sw5)__ dev r3-sw5 proto XXXX metric 20 pref medium
|
||||
fc00:2:2:2::/64 nhid XXXX via fe80::__(r2-sw5)__ dev r3-sw5 proto XXXX metric 20 pref medium
|
||||
fc00:3333:3333:3333::/64 nhid XXXX via fc00:3:3:3::1234 dev r3-stubnet proto XXXX metric 20 pref medium
|
||||
fc00:3:3:3::/64 dev r3-stubnet proto XXXX metric 256 pref medium
|
||||
fc00:4444:4444:4444::/64 nhid XXXX via fe80::__(r4-sw6)__ dev r3-sw6 proto XXXX metric 20 pref medium
|
||||
fc00:4:4:4::/64 nhid XXXX via fe80::__(r4-sw6)__ dev r3-sw6 proto XXXX metric 20 pref medium
|
||||
fc00:a:a:a::/64 dev r3-sw5 proto XXXX metric 256 pref medium
|
||||
fc00:a:a:a::1 nhid XXXX via fe80::__(r1-sw5)__ dev r3-sw5 proto XXXX metric 20 pref medium
|
||||
fc00:a:a:a::2 nhid XXXX via fe80::__(r2-sw5)__ dev r3-sw5 proto XXXX metric 20 pref medium
|
||||
fc00:b:b:b::/64 dev r3-sw6 proto XXXX metric 256 pref medium
|
||||
fc00:b:b:b::4 nhid XXXX via fe80::__(r4-sw6)__ dev r3-sw6 proto XXXX metric 20 pref medium
|
@ -0,0 +1,13 @@
|
||||
fc00:1111:1111:1111::/64 via fe80::__(r1-sw5)__ dev r3-sw5 proto XXXX metric 20 pref medium
|
||||
fc00:1:1:1::/64 via fe80::__(r1-sw5)__ dev r3-sw5 proto XXXX metric 20 pref medium
|
||||
fc00:2222:2222:2222::/64 via fe80::__(r2-sw5)__ dev r3-sw5 proto XXXX metric 20 pref medium
|
||||
fc00:2:2:2::/64 via fe80::__(r2-sw5)__ dev r3-sw5 proto XXXX metric 20 pref medium
|
||||
fc00:3333:3333:3333::/64 via fc00:3:3:3::1234 dev r3-stubnet proto XXXX metric 20 pref medium
|
||||
fc00:3:3:3::/64 dev r3-stubnet proto XXXX metric 256 pref medium
|
||||
fc00:4444:4444:4444::/64 via fe80::__(r4-sw6)__ dev r3-sw6 proto XXXX metric 20 pref medium
|
||||
fc00:4:4:4::/64 via fe80::__(r4-sw6)__ dev r3-sw6 proto XXXX metric 20 pref medium
|
||||
fc00:a:a:a::/64 dev r3-sw5 proto XXXX metric 256 pref medium
|
||||
fc00:a:a:a::1 via fe80::__(r1-sw5)__ dev r3-sw5 proto XXXX metric 20 pref medium
|
||||
fc00:a:a:a::2 via fe80::__(r2-sw5)__ dev r3-sw5 proto XXXX metric 20 pref medium
|
||||
fc00:b:b:b::/64 dev r3-sw6 proto XXXX metric 256 pref medium
|
||||
fc00:b:b:b::4 via fe80::__(r4-sw6)__ dev r3-sw6 proto XXXX metric 20 pref medium
|
37
tests/topotests/ospf6_point_to_multipoint/r3/ospf6d.conf
Normal file
37
tests/topotests/ospf6_point_to_multipoint/r3/ospf6d.conf
Normal file
@ -0,0 +1,37 @@
|
||||
hostname r3
|
||||
log file ospf6d.log
|
||||
!
|
||||
! debug ospf6 message all
|
||||
! debug ospf6 lsa unknown
|
||||
! debug ospf6 zebra
|
||||
! debug ospf6 interface
|
||||
! debug ospf6 neighbor
|
||||
! debug ospf6 route table
|
||||
! debug ospf6 flooding
|
||||
!
|
||||
interface r3-sw5
|
||||
ipv6 ospf6 network point-to-multipoint
|
||||
ipv6 ospf6 area 0.0.0.0
|
||||
ipv6 ospf6 hello-interval 2
|
||||
ipv6 ospf6 dead-interval 10
|
||||
ipv6 ospf6 p2p-p2mp connected-prefixes include
|
||||
!
|
||||
interface r3-sw6
|
||||
ipv6 ospf6 network point-to-multipoint
|
||||
ipv6 ospf6 area 0.0.0.1
|
||||
ipv6 ospf6 hello-interval 2
|
||||
ipv6 ospf6 dead-interval 10
|
||||
ipv6 ospf6 p2p-p2mp connected-prefixes include
|
||||
!
|
||||
interface r3-stubnet
|
||||
ipv6 ospf6 passive
|
||||
ipv6 ospf6 area 0.0.0.0
|
||||
!
|
||||
router ospf6
|
||||
ospf6 router-id 10.0.0.3
|
||||
log-adjacency-changes detail
|
||||
redistribute static
|
||||
!
|
||||
line vty
|
||||
exec-timeout 0 0
|
||||
!
|
@ -0,0 +1,12 @@
|
||||
O>* fc00:1:1:1::/64 [110/20] via fe80::XXXX:XXXX:XXXX:XXXX, r3-sw5, weight 1, XX:XX:XX
|
||||
O>* fc00:2:2:2::/64 [110/20] via fe80::XXXX:XXXX:XXXX:XXXX, r3-sw5, weight 1, XX:XX:XX
|
||||
O fc00:3:3:3::/64 [110/10] is directly connected, r3-stubnet, weight 1, XX:XX:XX
|
||||
O>* fc00:4:4:4::/64 [110/20] via fe80::XXXX:XXXX:XXXX:XXXX, r3-sw6, weight 1, XX:XX:XX
|
||||
O fc00:a:a:a::/64 [110/10] is directly connected, r3-sw5, weight 1, XX:XX:XX
|
||||
O>* fc00:a:a:a::1/128 [110/10] via fe80::XXXX:XXXX:XXXX:XXXX, r3-sw5, weight 1, XX:XX:XX
|
||||
O>* fc00:a:a:a::2/128 [110/10] via fe80::XXXX:XXXX:XXXX:XXXX, r3-sw5, weight 1, XX:XX:XX
|
||||
O fc00:b:b:b::/64 [110/10] is directly connected, r3-sw6, weight 1, XX:XX:XX
|
||||
O>* fc00:b:b:b::4/128 [110/10] via fe80::XXXX:XXXX:XXXX:XXXX, r3-sw6, weight 1, XX:XX:XX
|
||||
O>* fc00:1111:1111:1111::/64 [110/20] via fe80::XXXX:XXXX:XXXX:XXXX, r3-sw5, weight 1, XX:XX:XX
|
||||
O>* fc00:2222:2222:2222::/64 [110/20] via fe80::XXXX:XXXX:XXXX:XXXX, r3-sw5, weight 1, XX:XX:XX
|
||||
O>* fc00:4444:4444:4444::/64 [110/20] via fe80::XXXX:XXXX:XXXX:XXXX, r3-sw6, weight 1, XX:XX:XX
|
23
tests/topotests/ospf6_point_to_multipoint/r3/zebra.conf
Normal file
23
tests/topotests/ospf6_point_to_multipoint/r3/zebra.conf
Normal file
@ -0,0 +1,23 @@
|
||||
!
|
||||
hostname r3
|
||||
log file zebra.log
|
||||
!
|
||||
! debug zebra events
|
||||
! debug zebra rib
|
||||
!
|
||||
interface r3-stubnet
|
||||
ipv6 address fc00:3:3:3::3/64
|
||||
!
|
||||
interface r3-sw5
|
||||
ipv6 address fc00:a:a:a::3/64
|
||||
!
|
||||
interface r3-sw6
|
||||
ipv6 address fc00:b:b:b::3/64
|
||||
!
|
||||
interface lo
|
||||
!
|
||||
ipv6 route fc00:3333:3333:3333::/64 fc00:3:3:3::1234
|
||||
!
|
||||
!
|
||||
line vty
|
||||
!
|
@ -0,0 +1,14 @@
|
||||
fc00:1111:1111:1111::/64 nhid XXXX via fe80::__(r3-sw6)__ dev r4-sw6 proto XXXX metric 20 pref medium
|
||||
fc00:1:1:1::/64 nhid XXXX via fe80::__(r3-sw6)__ dev r4-sw6 proto XXXX metric 20 pref medium
|
||||
fc00:2222:2222:2222::/64 nhid XXXX via fe80::__(r3-sw6)__ dev r4-sw6 proto XXXX metric 20 pref medium
|
||||
fc00:2:2:2::/64 nhid XXXX via fe80::__(r3-sw6)__ dev r4-sw6 proto XXXX metric 20 pref medium
|
||||
fc00:3333:3333:3333::/64 nhid XXXX via fe80::__(r3-sw6)__ dev r4-sw6 proto XXXX metric 20 pref medium
|
||||
fc00:3:3:3::/64 nhid XXXX via fe80::__(r3-sw6)__ dev r4-sw6 proto XXXX metric 20 pref medium
|
||||
fc00:4444:4444:4444::/64 nhid XXXX via fc00:4:4:4::1234 dev r4-stubnet proto XXXX metric 20 pref medium
|
||||
fc00:4:4:4::/64 dev r4-stubnet proto XXXX metric 256 pref medium
|
||||
fc00:a:a:a::/64 nhid XXXX via fe80::__(r3-sw6)__ dev r4-sw6 proto XXXX metric 20 pref medium
|
||||
fc00:a:a:a::1 nhid XXXX via fe80::__(r3-sw6)__ dev r4-sw6 proto XXXX metric 20 pref medium
|
||||
fc00:a:a:a::2 nhid XXXX via fe80::__(r3-sw6)__ dev r4-sw6 proto XXXX metric 20 pref medium
|
||||
fc00:a:a:a::3 nhid XXXX via fe80::__(r3-sw6)__ dev r4-sw6 proto XXXX metric 20 pref medium
|
||||
fc00:b:b:b::/64 dev r4-sw6 proto XXXX metric 256 pref medium
|
||||
fc00:b:b:b::3 nhid XXXX via fe80::__(r3-sw6)__ dev r4-sw6 proto XXXX metric 20 pref medium
|
@ -0,0 +1,14 @@
|
||||
fc00:1111:1111:1111::/64 via fe80::__(r3-sw6)__ dev r4-sw6 proto XXXX metric 20 pref medium
|
||||
fc00:1:1:1::/64 via fe80::__(r3-sw6)__ dev r4-sw6 proto XXXX metric 20 pref medium
|
||||
fc00:2222:2222:2222::/64 via fe80::__(r3-sw6)__ dev r4-sw6 proto XXXX metric 20 pref medium
|
||||
fc00:2:2:2::/64 via fe80::__(r3-sw6)__ dev r4-sw6 proto XXXX metric 20 pref medium
|
||||
fc00:3333:3333:3333::/64 via fe80::__(r3-sw6)__ dev r4-sw6 proto XXXX metric 20 pref medium
|
||||
fc00:3:3:3::/64 via fe80::__(r3-sw6)__ dev r4-sw6 proto XXXX metric 20 pref medium
|
||||
fc00:4444:4444:4444::/64 via fc00:4:4:4::1234 dev r4-stubnet proto XXXX metric 20 pref medium
|
||||
fc00:4:4:4::/64 dev r4-stubnet proto XXXX metric 256 pref medium
|
||||
fc00:a:a:a::/64 via fe80::__(r3-sw6)__ dev r4-sw6 proto XXXX metric 20 pref medium
|
||||
fc00:a:a:a::1 via fe80::__(r3-sw6)__ dev r4-sw6 proto XXXX metric 20 pref medium
|
||||
fc00:a:a:a::2 via fe80::__(r3-sw6)__ dev r4-sw6 proto XXXX metric 20 pref medium
|
||||
fc00:a:a:a::3 via fe80::__(r3-sw6)__ dev r4-sw6 proto XXXX metric 20 pref medium
|
||||
fc00:b:b:b::/64 dev r4-sw6 proto XXXX metric 256 pref medium
|
||||
fc00:b:b:b::3 via fe80::__(r3-sw6)__ dev r4-sw6 proto XXXX metric 20 pref medium
|
30
tests/topotests/ospf6_point_to_multipoint/r4/ospf6d.conf
Normal file
30
tests/topotests/ospf6_point_to_multipoint/r4/ospf6d.conf
Normal file
@ -0,0 +1,30 @@
|
||||
hostname r4
|
||||
log file ospf6d.log
|
||||
!
|
||||
! debug ospf6 message all
|
||||
! debug ospf6 lsa unknown
|
||||
! debug ospf6 zebra
|
||||
! debug ospf6 interface
|
||||
! debug ospf6 neighbor
|
||||
! debug ospf6 route table
|
||||
! debug ospf6 flooding
|
||||
!
|
||||
interface r4-sw6
|
||||
ipv6 ospf6 network point-to-multipoint
|
||||
ipv6 ospf6 area 0.0.0.1
|
||||
ipv6 ospf6 hello-interval 2
|
||||
ipv6 ospf6 dead-interval 10
|
||||
ipv6 ospf6 p2p-p2mp connected-prefixes include
|
||||
!
|
||||
interface r4-stubnet
|
||||
ipv6 ospf6 passive
|
||||
ipv6 ospf6 area 0.0.0.1
|
||||
!
|
||||
router ospf6
|
||||
ospf6 router-id 10.0.0.4
|
||||
log-adjacency-changes detail
|
||||
redistribute static
|
||||
!
|
||||
line vty
|
||||
exec-timeout 0 0
|
||||
!
|
@ -0,0 +1,13 @@
|
||||
O>* fc00:1:1:1::/64 [110/30] via fe80::XXXX:XXXX:XXXX:XXXX, r4-sw6, weight 1, XX:XX:XX
|
||||
O>* fc00:2:2:2::/64 [110/30] via fe80::XXXX:XXXX:XXXX:XXXX, r4-sw6, weight 1, XX:XX:XX
|
||||
O>* fc00:3:3:3::/64 [110/20] via fe80::XXXX:XXXX:XXXX:XXXX, r4-sw6, weight 1, XX:XX:XX
|
||||
O fc00:4:4:4::/64 [110/10] is directly connected, r4-stubnet, weight 1, XX:XX:XX
|
||||
O>* fc00:a:a:a::/64 [110/20] via fe80::XXXX:XXXX:XXXX:XXXX, r4-sw6, weight 1, XX:XX:XX
|
||||
O>* fc00:a:a:a::1/128 [110/20] via fe80::XXXX:XXXX:XXXX:XXXX, r4-sw6, weight 1, XX:XX:XX
|
||||
O>* fc00:a:a:a::2/128 [110/20] via fe80::XXXX:XXXX:XXXX:XXXX, r4-sw6, weight 1, XX:XX:XX
|
||||
O>* fc00:a:a:a::3/128 [110/10] via fe80::XXXX:XXXX:XXXX:XXXX, r4-sw6, weight 1, XX:XX:XX
|
||||
O fc00:b:b:b::/64 [110/10] is directly connected, r4-sw6, weight 1, XX:XX:XX
|
||||
O>* fc00:b:b:b::3/128 [110/10] via fe80::XXXX:XXXX:XXXX:XXXX, r4-sw6, weight 1, XX:XX:XX
|
||||
O>* fc00:1111:1111:1111::/64 [110/20] via fe80::XXXX:XXXX:XXXX:XXXX, r4-sw6, weight 1, XX:XX:XX
|
||||
O>* fc00:2222:2222:2222::/64 [110/20] via fe80::XXXX:XXXX:XXXX:XXXX, r4-sw6, weight 1, XX:XX:XX
|
||||
O>* fc00:3333:3333:3333::/64 [110/20] via fe80::XXXX:XXXX:XXXX:XXXX, r4-sw6, weight 1, XX:XX:XX
|
20
tests/topotests/ospf6_point_to_multipoint/r4/zebra.conf
Normal file
20
tests/topotests/ospf6_point_to_multipoint/r4/zebra.conf
Normal file
@ -0,0 +1,20 @@
|
||||
!
|
||||
hostname r4
|
||||
log file zebra.log
|
||||
!
|
||||
! debug zebra events
|
||||
! debug zebra rib
|
||||
!
|
||||
interface r4-stubnet
|
||||
ipv6 address fc00:4:4:4::4/64
|
||||
!
|
||||
interface r4-sw6
|
||||
ipv6 address fc00:b:b:b::4/64
|
||||
!
|
||||
interface lo
|
||||
!
|
||||
ipv6 route fc00:4444:4444:4444::/64 fc00:4:4:4::1234
|
||||
!
|
||||
!
|
||||
line vty
|
||||
!
|
@ -0,0 +1,392 @@
|
||||
#!/usr/bin/env python
|
||||
# SPDX-License-Identifier: ISC
|
||||
|
||||
#
|
||||
# test_ospf6_point_to_multipoint.py
|
||||
# Part of NetDEF Topology Tests
|
||||
#
|
||||
# Copyright (c) 2023 by
|
||||
# Network Device Education Foundation, Inc. ("NetDEF")
|
||||
#
|
||||
|
||||
r"""
|
||||
test_ospf6_point_to_multipoint.py:
|
||||
|
||||
-----\
|
||||
SW1 - Stub Net 1 SW2 - Stub Net 2 \
|
||||
fc00:1:1:1::/64 fc00:2:2:2::/64 \
|
||||
\___________________/ \___________________/ |
|
||||
| | |
|
||||
| | |
|
||||
| ::1 | ::2 |
|
||||
+---------+---------+ +---------+---------+ |
|
||||
| R1 | | R2 | |
|
||||
| FRRouting | | FRRouting | |
|
||||
| Rtr-ID: 10.0.0.1 | | Rtr-ID: 10.0.0.2 | |
|
||||
+---------+---------+ +---------+---------+ |
|
||||
| ::1 | ::2 \
|
||||
\______ ___________/ OSPFv3
|
||||
\ / Area 0.0.0.0
|
||||
\ / /
|
||||
~~~~~~~~~~~~~~~~~~ |
|
||||
~~ SW5 ~~ |
|
||||
~~ Switch ~~ |
|
||||
~~ fc00:A:A:A::/64 ~~ |
|
||||
~~~~~~~~~~~~~~~~~~ |
|
||||
| /---- |
|
||||
| ::3 | SW3 - Stub Net 3 |
|
||||
+---------+---------+ /-+ fc00:3:3:3::/64 |
|
||||
| R3 | / | /
|
||||
| FRRouting +--/ \---- /
|
||||
| Rtr-ID: 10.0.0.3 | ::3 ___________/
|
||||
+---------+---------+ \
|
||||
| ::3 \
|
||||
| \
|
||||
~~~~~~~~~~~~~~~~~~ |
|
||||
~~ SW6 ~~ |
|
||||
~~ Switch ~~ |
|
||||
~~ fc00:B:B:B::/64 ~~ \
|
||||
~~~~~~~~~~~~~~~~~~ OSPFv3
|
||||
| Area 0.0.0.1
|
||||
| ::4 /
|
||||
+---------+---------+ /---- |
|
||||
| R4 | | SW4 - Stub Net 4 |
|
||||
| FRRouting +------+ fc00:4:4:4::/64 |
|
||||
| Rtr-ID: 10.0.0.4 | ::4 | /
|
||||
+-------------------+ \---- /
|
||||
-----/
|
||||
"""
|
||||
|
||||
import os
|
||||
import re
|
||||
import sys
|
||||
import pytest
|
||||
|
||||
from functools import partial
|
||||
|
||||
|
||||
# Save the Current Working Directory to find configuration files later.
|
||||
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
|
||||
|
||||
|
||||
pytestmark = [pytest.mark.ospfd]
|
||||
|
||||
|
||||
def build_topo(tgen):
|
||||
# Create 4 routers
|
||||
for routern in range(1, 5):
|
||||
tgen.add_router("r{}".format(routern))
|
||||
|
||||
#
|
||||
# Wire up the switches and routers
|
||||
# Note that we specify the link names so we match the config files
|
||||
#
|
||||
|
||||
# Create a empty network for router 1
|
||||
switch = tgen.add_switch("s1")
|
||||
switch.add_link(tgen.gears["r1"], nodeif="r1-stubnet")
|
||||
|
||||
# Create a empty network for router 2
|
||||
switch = tgen.add_switch("s2")
|
||||
switch.add_link(tgen.gears["r2"], nodeif="r2-stubnet")
|
||||
|
||||
# Create a empty network for router 3
|
||||
switch = tgen.add_switch("s3")
|
||||
switch.add_link(tgen.gears["r3"], nodeif="r3-stubnet")
|
||||
|
||||
# Create a empty network for router 4
|
||||
switch = tgen.add_switch("s4")
|
||||
switch.add_link(tgen.gears["r4"], nodeif="r4-stubnet")
|
||||
|
||||
# Interconnect routers 1, 2, and 3
|
||||
switch = tgen.add_switch("s5")
|
||||
switch.add_link(tgen.gears["r1"], nodeif="r1-sw5")
|
||||
switch.add_link(tgen.gears["r2"], nodeif="r2-sw5")
|
||||
switch.add_link(tgen.gears["r3"], nodeif="r3-sw5")
|
||||
|
||||
# Interconnect routers 3 and 4
|
||||
switch = tgen.add_switch("s6")
|
||||
switch.add_link(tgen.gears["r3"], nodeif="r3-sw6")
|
||||
switch.add_link(tgen.gears["r4"], nodeif="r4-sw6")
|
||||
|
||||
|
||||
#####################################################
|
||||
##
|
||||
## Tests starting
|
||||
##
|
||||
#####################################################
|
||||
|
||||
|
||||
def setup_module(mod):
|
||||
"Sets up the pytest environment"
|
||||
|
||||
tgen = Topogen(build_topo, mod.__name__)
|
||||
tgen.start_topology()
|
||||
|
||||
logger.info("** %s: Setup Topology" % mod.__name__)
|
||||
logger.info("******************************************")
|
||||
|
||||
# For debugging after starting net, but before starting FRR,
|
||||
# uncomment the next line
|
||||
# tgen.mininet_cli()
|
||||
|
||||
router_list = tgen.routers()
|
||||
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_OSPF6, os.path.join(CWD, "{}/ospf6d.conf".format(rname))
|
||||
)
|
||||
|
||||
# Initialize all routers.
|
||||
tgen.start_router()
|
||||
|
||||
# For debugging after starting FRR daemons, uncomment the next line
|
||||
# tgen.mininet_cli()
|
||||
|
||||
|
||||
def teardown_module(mod):
|
||||
"Teardown the pytest environment"
|
||||
tgen = get_topogen()
|
||||
tgen.stop_topology()
|
||||
|
||||
|
||||
def test_wait_protocol_convergence():
|
||||
"Wait for OSPFv3 to converge"
|
||||
tgen = get_topogen()
|
||||
if tgen.routers_have_failure():
|
||||
pytest.skip(tgen.errors)
|
||||
|
||||
logger.info("waiting for protocols to converge")
|
||||
|
||||
def expect_neighbor_full(router, neighbor):
|
||||
"Wait until OSPFv3 convergence."
|
||||
logger.info("waiting OSPFv3 router '{}'".format(router))
|
||||
test_func = partial(
|
||||
topotest.router_json_cmp,
|
||||
tgen.gears[router],
|
||||
"show ipv6 ospf6 neighbor json",
|
||||
{"neighbors": [{"neighborId": neighbor, "state": "Full"}]},
|
||||
)
|
||||
_, result = topotest.run_and_expect(test_func, None, count=130, wait=1)
|
||||
assertmsg = '"{}" convergence failure'.format(router)
|
||||
assert result is None, assertmsg
|
||||
|
||||
expect_neighbor_full("r1", "10.0.0.2")
|
||||
expect_neighbor_full("r1", "10.0.0.3")
|
||||
|
||||
expect_neighbor_full("r2", "10.0.0.1")
|
||||
expect_neighbor_full("r2", "10.0.0.3")
|
||||
|
||||
expect_neighbor_full("r3", "10.0.0.1")
|
||||
expect_neighbor_full("r3", "10.0.0.2")
|
||||
expect_neighbor_full("r3", "10.0.0.4")
|
||||
|
||||
expect_neighbor_full("r4", "10.0.0.3")
|
||||
|
||||
|
||||
def compare_show_ipv6(rname, expected):
|
||||
"""
|
||||
Calls 'show ipv6 route' for router `rname` and compare the obtained
|
||||
result with the expected output.
|
||||
"""
|
||||
tgen = get_topogen()
|
||||
|
||||
# Use the vtysh output, with some masking to make comparison easy
|
||||
current = topotest.ip6_route_zebra(tgen.gears[rname])
|
||||
|
||||
# Use just the 'O'spf lines of the output
|
||||
linearr = []
|
||||
for line in current.splitlines():
|
||||
if re.match("^O", line):
|
||||
linearr.append(line)
|
||||
|
||||
current = "\n".join(linearr)
|
||||
|
||||
return topotest.difflines(
|
||||
topotest.normalize_text(current),
|
||||
topotest.normalize_text(expected),
|
||||
title1="Current output",
|
||||
title2="Expected output",
|
||||
)
|
||||
|
||||
|
||||
def test_ospfv3_routingTable():
|
||||
|
||||
tgen = get_topogen()
|
||||
if tgen.routers_have_failure():
|
||||
pytest.skip("skipped because of router(s) failure")
|
||||
|
||||
# For debugging, uncomment the next line
|
||||
# tgen.mininet_cli()
|
||||
|
||||
# Verify OSPFv3 Routing Table
|
||||
for router, rnode in tgen.routers().items():
|
||||
logger.info('Waiting for router "%s" convergence', router)
|
||||
|
||||
# Load expected results from the command
|
||||
reffile = os.path.join(CWD, "{}/show_ipv6_route.ref".format(router))
|
||||
expected = open(reffile).read()
|
||||
|
||||
# Run test function until we get an result. Wait at most 60 seconds.
|
||||
test_func = partial(compare_show_ipv6, router, expected)
|
||||
result, diff = topotest.run_and_expect(test_func, "", count=120, wait=0.5)
|
||||
assert result, "OSPFv3 did not converge on {}:\n{}".format(router, diff)
|
||||
|
||||
|
||||
def test_linux_ipv6_kernel_routingTable():
|
||||
|
||||
tgen = get_topogen()
|
||||
|
||||
if tgen.routers_have_failure():
|
||||
pytest.skip("skipped because of router(s) failure")
|
||||
|
||||
# Verify Linux Kernel Routing Table
|
||||
logger.info("Verifying Linux IPv6 Kernel Routing Table")
|
||||
|
||||
failures = 0
|
||||
|
||||
# Get a list of all current link-local addresses first as they change for
|
||||
# each run and we need to translate them
|
||||
linklocals = []
|
||||
for i in range(1, 5):
|
||||
linklocals += tgen.net["r{}".format(i)].get_ipv6_linklocal()
|
||||
|
||||
# Now compare the routing tables (after substituting link-local addresses)
|
||||
|
||||
for i in range(1, 5):
|
||||
# Actual output from router
|
||||
actual = tgen.gears["r{}".format(i)].run("ip -6 route").rstrip()
|
||||
if "nhid" in actual:
|
||||
refTableFile = os.path.join(CWD, "r{}/ip_6_address.nhg.ref".format(i))
|
||||
else:
|
||||
refTableFile = os.path.join(CWD, "r{}/ip_6_address.ref".format(i))
|
||||
|
||||
if os.path.isfile(refTableFile):
|
||||
expected = open(refTableFile).read().rstrip()
|
||||
# Fix newlines (make them all the same)
|
||||
expected = ("\n".join(expected.splitlines())).splitlines(1)
|
||||
|
||||
# Mask out Link-Local mac addresses
|
||||
for ll in linklocals:
|
||||
actual = actual.replace(ll[1], "fe80::__(%s)__" % ll[0])
|
||||
# Mask out protocol name or number
|
||||
actual = re.sub(r"[ ]+proto [0-9a-z]+ +", " proto XXXX ", actual)
|
||||
actual = re.sub(r"[ ]+nhid [0-9]+ +", " nhid XXXX ", actual)
|
||||
# Remove ff00::/8 routes (seen on some kernels - not from FRR)
|
||||
actual = re.sub(r"ff00::/8.*", "", actual)
|
||||
|
||||
# Strip empty lines
|
||||
actual = actual.lstrip()
|
||||
actual = actual.rstrip()
|
||||
actual = re.sub(r" +", " ", actual)
|
||||
|
||||
filtered_lines = []
|
||||
for line in sorted(actual.splitlines()):
|
||||
if line.startswith("fe80::/64 ") or line.startswith(
|
||||
"unreachable fe80::/64 "
|
||||
):
|
||||
continue
|
||||
filtered_lines.append(line)
|
||||
actual = "\n".join(filtered_lines).splitlines(1)
|
||||
|
||||
# Print Actual table
|
||||
# logger.info("Router r%s table" % i)
|
||||
# for line in actual:
|
||||
# logger.info(line.rstrip())
|
||||
|
||||
# Generate Diff
|
||||
diff = topotest.get_textdiff(
|
||||
actual,
|
||||
expected,
|
||||
title1="actual OSPFv3 IPv6 routing table",
|
||||
title2="expected OSPFv3 IPv6 routing table",
|
||||
)
|
||||
|
||||
# Empty string if it matches, otherwise diff contains unified diff
|
||||
if diff:
|
||||
sys.stderr.write(
|
||||
"r%s failed Linux IPv6 Kernel Routing Table Check:\n%s\n"
|
||||
% (i, diff)
|
||||
)
|
||||
failures += 1
|
||||
else:
|
||||
logger.info("r%s ok" % i)
|
||||
|
||||
assert failures == 0, (
|
||||
"Linux Kernel IPv6 Routing Table verification failed for router r%s:\n%s"
|
||||
% (i, diff)
|
||||
)
|
||||
else:
|
||||
logger.error("r{} failed - no nhid ref file: {}".format(i, refTableFile))
|
||||
|
||||
assert False, (
|
||||
"Linux Kernel IPv6 Routing Table verification failed for router r%s\n"
|
||||
% (i)
|
||||
)
|
||||
|
||||
|
||||
def test_shutdown_check_stderr():
|
||||
|
||||
tgen = get_topogen()
|
||||
|
||||
if tgen.routers_have_failure():
|
||||
pytest.skip("skipped because of router(s) failure")
|
||||
|
||||
if os.environ.get("TOPOTESTS_CHECK_STDERR") is None:
|
||||
logger.info(
|
||||
"SKIPPED final check on StdErr output: Disabled (TOPOTESTS_CHECK_STDERR undefined)\n"
|
||||
)
|
||||
pytest.skip("Skipping test for Stderr output")
|
||||
|
||||
net = tgen.net
|
||||
|
||||
logger.info("\n\n** Verifying unexpected STDERR output from daemons")
|
||||
logger.info("******************************************")
|
||||
|
||||
for i in range(1, 5):
|
||||
net["r%s" % i].stopRouter()
|
||||
log = net["r%s" % i].getStdErr("ospf6d")
|
||||
if log:
|
||||
logger.info("\nRouter r%s OSPF6d StdErr Log:\n%s" % (i, log))
|
||||
log = net["r%s" % i].getStdErr("zebra")
|
||||
if log:
|
||||
logger.info("\nRouter r%s Zebra StdErr Log:\n%s" % (i, log))
|
||||
|
||||
|
||||
def test_shutdown_check_memleak():
|
||||
"Run the memory leak test and report results."
|
||||
|
||||
if os.environ.get("TOPOTESTS_CHECK_MEMLEAK") is None:
|
||||
logger.info(
|
||||
"SKIPPED final check on Memory leaks: Disabled (TOPOTESTS_CHECK_MEMLEAK undefined)"
|
||||
)
|
||||
pytest.skip("Skipping test for memory leaks")
|
||||
|
||||
tgen = get_topogen()
|
||||
|
||||
net = tgen.net
|
||||
|
||||
for i in range(1, 5):
|
||||
net["r%s" % i].stopRouter()
|
||||
net["r%s" % i].report_memory_leaks(
|
||||
os.environ.get("TOPOTESTS_CHECK_MEMLEAK"), os.path.basename(__file__)
|
||||
)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
# To suppress tracebacks, either use the following pytest call or
|
||||
# add "--tb=no" to cli
|
||||
# retval = pytest.main(["-s", "--tb=no"])
|
||||
|
||||
retval = pytest.main(["-s"])
|
||||
sys.exit(retval)
|
Loading…
Reference in New Issue
Block a user