Add testcase for BGP unnumbered automatic peering and related data. Signed-off-by: Matteo Perin <matteo.perin@canonical.com> --- .../cf-bgp-unnumbered-autopeering/README.md | 132 ++++++++++++++++++ .../bird_m1.conf | 43 ++++++ .../bird_m2.conf | 43 ++++++ .../cf-bgp-unnumbered-autopeering | 1 + netlab/cf-bgp-unnumbered-autopeering/config | 10 ++ .../data-v2/nd_peers-m1 | 7 + .../data-v2/nd_peers-m1-down-m2 | 7 + .../data-v2/nd_peers-m1-up-m1 | 7 + .../data-v2/nd_peers-m1-up-m2 | 7 + .../data-v2/nd_peers-m2 | 7 + .../data-v2/nd_peers-m2-down-m1 | 7 + .../data-v2/nd_peers-m2-up-m1 | 7 + .../data-v2/nd_peers-m2-up-m2 | 7 + .../data-v2/proto-m1 | 121 ++++++++++++++++ .../data-v2/proto-m1-down-m2 | 121 ++++++++++++++++ .../data-v2/proto-m1-up-m1 | 121 ++++++++++++++++ .../data-v2/proto-m1-up-m2 | 121 ++++++++++++++++ .../data-v2/proto-m2 | 121 ++++++++++++++++ .../data-v2/proto-m2-down-m1 | 121 ++++++++++++++++ .../data-v2/proto-m2-up-m1 | 121 ++++++++++++++++ .../data-v2/proto-m2-up-m2 | 121 ++++++++++++++++ .../test-cf-bgp-unnumbered-autopeering.py | 101 ++++++++++++++ netlab/tests/get_stdout_bird | 1 + netlab/tests/get_stdout_protocols | 3 +- netlab/tests/strip_output | 10 ++ 25 files changed, 1367 insertions(+), 1 deletion(-) create mode 100644 netlab/cf-bgp-unnumbered-autopeering/README.md create mode 100644 netlab/cf-bgp-unnumbered-autopeering/bird_m1.conf create mode 100644 netlab/cf-bgp-unnumbered-autopeering/bird_m2.conf create mode 120000 netlab/cf-bgp-unnumbered-autopeering/cf-bgp-unnumbered-autopeering create mode 100644 netlab/cf-bgp-unnumbered-autopeering/config create mode 100644 netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m1 create mode 100644 netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m1-down-m2 create mode 100644 netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m1-up-m1 create mode 100644 netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m1-up-m2 create mode 100644 netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m2 create mode 100644 netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m2-down-m1 create mode 100644 netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m2-up-m1 create mode 100644 netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m2-up-m2 create mode 100644 netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m1 create mode 100644 netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m1-down-m2 create mode 100644 netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m1-up-m1 create mode 100644 netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m1-up-m2 create mode 100644 netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m2 create mode 100644 netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m2-down-m1 create mode 100644 netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m2-up-m1 create mode 100644 netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m2-up-m2 create mode 100644 netlab/cf-bgp-unnumbered-autopeering/test-cf-bgp-unnumbered-autopeering.py diff --git a/netlab/cf-bgp-unnumbered-autopeering/README.md b/netlab/cf-bgp-unnumbered-autopeering/README.md new file mode 100644 index 00000000..c43c282e --- /dev/null +++ b/netlab/cf-bgp-unnumbered-autopeering/README.md @@ -0,0 +1,132 @@ +<!--cf-bgp-unnumbered-autopeering--> +##### Introduction +This test case verifies the BGP unnumbered auto peering feature where BGP peer +processes are dynamically spawned based on router discovery via the RADV protocol. + +The test case uses a simple two-node topology where both nodes run: +- RADV protocol for neighbor discovery +- BGP protocol with dynamic peer instantiation + +When neighbors are discovered through router advertisement, BGP sessions should +be automatically established using link-local IPv6 addresses (fe80::/12). + +<br> + +##### Topology + +--- + +``` + AS1 AS2 + m1 -------------- m2 + (ve1) (ve2) +``` + +The nodes are connected via a virtual ethernet pair (`ve1` on m1, `ve2` on m2). + +<br> + +##### Configuration + +--- + +Both nodes have similar configurations with the following key features: + +1. **Device Protocol**: Tracks interface states +2. **Peer Table** (`nd_peers`): Stores discovered neighbors +3. **RADV Protocol** (`radv1`): + - Performs router discovery on the interconnecting interface + - Populates the peer table with discovered neighbors + - Configured with max RA interval of 20s +4. **BGP Protocol** (`bgp1`): + - Dynamically creates BGP peer instances with name pattern `bgp_peer_XXX` + - Accepts neighbors from the fe80::/12 range (link-local addresses) + - **m1**: `peers persist no` - Dynamic BGP protocols are removed when peers disappear + - **m2**: `peers persist yes` - Dynamic BGP protocols remain even when peers go down + - Imports peer information from the `nd_peers` table + - AS1 (m1): AS 65001 + - AS2 (m2): AS 65002 + +<br> + +##### Test suite + +--- + +The test suite verifies the following in multiple phases: + +**Phase 1: Initial Setup and Convergence** +1. **Peer table**: Checks that the `nd_peers` table contains discovered neighbors +2. **BGP protocols**: Verifies that dynamic BGP peer processes are spawned and established + +**Phase 2: m2 Down Testing (m1 has peers persist no)** +3. **Stop m2**: Node m2 is stopped to simulate a peer failure +4. **BGP protocols after m2 down**: Verifies that dynamic BGP protocols are **removed** from m1 + (due to `peers persist no` configuration) +5. **Peer table after m2 down**: Checks that the peer is removed from m1's `nd_peers` table + +**Phase 3: m2 Recovery Testing** +6. **Continue m2**: Node m2 is brought back up +7. **BGP protocols after m2 up**: Verifies that dynamic BGP protocols are re-spawned on both nodes +8. **Peer table after m2 up**: Checks that peers are rediscovered and added back to the `nd_peers` table + +**Phase 4: m1 Down Testing (m2 has peers persist yes)** +9. **Stop m1**: Node m1 is stopped to test `peers persist yes` on m2 +10. **BGP protocols after m1 down**: Verifies that dynamic BGP protocols **remain** on m2 + (albeit in a down state, due to `peers persist yes` configuration) +11. **Peer table after m1 down**: Checks the peer table state on m2 + +**Phase 5: m1 Recovery Testing** +12. **Continue m1**: Node m1 is brought back up +13. **BGP protocols after m1 up**: Verifies that BGP sessions re-establish on both nodes +14. **Peer table after m1 up**: Checks that peer table is updated after m1 recovery + +In save mode, the test suite captures: +- `nd_peers_m1`, `nd_peers_m2` - peer tables with discovered neighbors (initial) +- `proto_m1`, `proto_m2` - protocol states (initial) +- `proto-m2-down_m1` - protocol states on m1 after m2 is stopped +- `nd_peers-m2-down_m1` - peer table on m1 after m2 is stopped +- `proto-m2-up_m1`, `proto-m2-up_m2` - protocol states after m2 recovers +- `nd_peers-m2-up_m1`, `nd_peers-m2-up_m2` - peer tables after m2 recovers +- `proto-m1-down_m2` - protocol states on m2 after m1 is stopped (should show protocols in down state) +- `nd_peers-m1-down_m2` - peer table on m2 after m1 is stopped +- `proto-m1-up_m1`, `proto-m1-up_m2` - protocol states after m1 recovers +- `nd_peers-m1-up_m1`, `nd_peers-m1-up_m2` - peer tables after m1 recovers + +<br> + +##### Expected Behavior + +--- + +**Normal Operation:** +1. Both nodes start with RADV enabled on their respective interfaces +2. Router advertisements are exchanged between m1 and m2 +3. Neighbors are discovered and added to the `nd_peers` table +4. BGP dynamically spawns peer instances (e.g., `bgp_peer_001`) based on discovered peers +5. BGP sessions establish using link-local IPv6 addresses + +**m2 Down Scenario (m1 has peers persist no):** +1. When m2 is stopped, router advertisements stop +2. The peer entry for m2 is removed from m1's `nd_peers` table +3. Due to `peers persist no`, the dynamic BGP protocol on m1 is **removed** +4. No stale BGP sessions remain on m1 + +**m2 Recovery Scenario:** +1. When m2 is brought back up, router advertisements resume +2. Neighbors are rediscovered through RADV +3. Peers are added back to the `nd_peers` table +4. Dynamic BGP protocols are re-spawned automatically +5. BGP sessions re-establish + +**m1 Down Scenario (m2 has peers persist yes):** +1. When m1 is stopped, router advertisements stop +2. The peer entry may be removed from m2's `nd_peers` table +3. Due to `peers persist yes`, the dynamic BGP protocol on m2 **remains** (in down state) +4. The BGP session persists, ready to reconnect when m1 returns + +**m1 Recovery Scenario:** +1. When m1 is brought back up, router advertisements resume +2. Neighbors are rediscovered through RADV +3. The existing dynamic BGP protocol on m2 detects the peer is back +4. BGP sessions re-establish automatically without needing to spawn new protocols diff --git a/netlab/cf-bgp-unnumbered-autopeering/bird_m1.conf b/netlab/cf-bgp-unnumbered-autopeering/bird_m1.conf new file mode 100644 index 00000000..2443228b --- /dev/null +++ b/netlab/cf-bgp-unnumbered-autopeering/bird_m1.conf @@ -0,0 +1,43 @@ +log syslog all; +log "bird.log" all; +debug protocols all; + +router id 1; + +protocol device { +} + +peer table nd_peers; + +protocol radv radv1 { + peer { + table nd_peers; + }; + + interface "ve1" { + max ra interval 20; + min ra interval 10; + + router discovery yes; + }; +} + +protocol bgp bgp1 { + dynamic name "bgp_peer"; + dynamic name digits 3; + local as 65001; + neighbor range fe80::/12 external; + + peers persist no; + + peers { + table nd_peers; + import all; + export all; + }; + + ipv6 { + import all; + export all; + }; +} diff --git a/netlab/cf-bgp-unnumbered-autopeering/bird_m2.conf b/netlab/cf-bgp-unnumbered-autopeering/bird_m2.conf new file mode 100644 index 00000000..25e4104c --- /dev/null +++ b/netlab/cf-bgp-unnumbered-autopeering/bird_m2.conf @@ -0,0 +1,43 @@ +log syslog all; +log "bird.log" all; +debug protocols all; + +router id 2; + +protocol device { +} + +peer table nd_peers; + +protocol radv radv1 { + peer { + table nd_peers; + }; + + interface "ve2" { + max ra interval 20; + min ra interval 10; + + router discovery yes; + }; +} + +protocol bgp bgp1 { + dynamic name "bgp_peer"; + dynamic name digits 3; + local as 65002; + neighbor range fe80::/12 external; + + peers persist yes; + + peers { + table nd_peers; + import all; + export all; + }; + + ipv6 { + import all; + export all; + }; +} diff --git a/netlab/cf-bgp-unnumbered-autopeering/cf-bgp-unnumbered-autopeering b/netlab/cf-bgp-unnumbered-autopeering/cf-bgp-unnumbered-autopeering new file mode 120000 index 00000000..2233a804 --- /dev/null +++ b/netlab/cf-bgp-unnumbered-autopeering/cf-bgp-unnumbered-autopeering @@ -0,0 +1 @@ +cf-bgp-unnumbered-autopeering \ No newline at end of file diff --git a/netlab/cf-bgp-unnumbered-autopeering/config b/netlab/cf-bgp-unnumbered-autopeering/config new file mode 100644 index 00000000..d8d4dff0 --- /dev/null +++ b/netlab/cf-bgp-unnumbered-autopeering/config @@ -0,0 +1,10 @@ +NETLAB_NODES="m1 m2" + +netlab_init + +if_dummy m1 ve0 10.1.1 2001:db8:1:1 +if_dummy m2 ve0 10.2.1 2001:db8:2:1 + +if_veth m1 ve1 m2 ve2 10.1.10 2001:db8:1:10 + +netlab_start diff --git a/netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m1 b/netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m1 new file mode 100644 index 00000000..346a1f3b --- /dev/null +++ b/netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m1 @@ -0,0 +1,7 @@ +BIRD <removed> ready. +Table nd_peers: +fe80::88c6:96ff:feb5:9492 from iface 3 [radv1 <removed>] * (0) + preference: 0 + source: device + radv_expires_at: <removed> + Internal route handling values: <removed> diff --git a/netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m1-down-m2 b/netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m1-down-m2 new file mode 100644 index 00000000..ecba0af3 --- /dev/null +++ b/netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m1-down-m2 @@ -0,0 +1,7 @@ +BIRD <removed> ready. +Table nd_peers: +fe80::c8f0:65ff:febc:62b4 from iface 3 [radv1 <removed>] * (0) + preference: 0 + source: device + radv_expires_at: <removed> + Internal route handling values: <removed> diff --git a/netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m1-up-m1 b/netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m1-up-m1 new file mode 100644 index 00000000..346a1f3b --- /dev/null +++ b/netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m1-up-m1 @@ -0,0 +1,7 @@ +BIRD <removed> ready. +Table nd_peers: +fe80::88c6:96ff:feb5:9492 from iface 3 [radv1 <removed>] * (0) + preference: 0 + source: device + radv_expires_at: <removed> + Internal route handling values: <removed> diff --git a/netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m1-up-m2 b/netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m1-up-m2 new file mode 100644 index 00000000..ecba0af3 --- /dev/null +++ b/netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m1-up-m2 @@ -0,0 +1,7 @@ +BIRD <removed> ready. +Table nd_peers: +fe80::c8f0:65ff:febc:62b4 from iface 3 [radv1 <removed>] * (0) + preference: 0 + source: device + radv_expires_at: <removed> + Internal route handling values: <removed> diff --git a/netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m2 b/netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m2 new file mode 100644 index 00000000..ecba0af3 --- /dev/null +++ b/netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m2 @@ -0,0 +1,7 @@ +BIRD <removed> ready. +Table nd_peers: +fe80::c8f0:65ff:febc:62b4 from iface 3 [radv1 <removed>] * (0) + preference: 0 + source: device + radv_expires_at: <removed> + Internal route handling values: <removed> diff --git a/netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m2-down-m1 b/netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m2-down-m1 new file mode 100644 index 00000000..346a1f3b --- /dev/null +++ b/netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m2-down-m1 @@ -0,0 +1,7 @@ +BIRD <removed> ready. +Table nd_peers: +fe80::88c6:96ff:feb5:9492 from iface 3 [radv1 <removed>] * (0) + preference: 0 + source: device + radv_expires_at: <removed> + Internal route handling values: <removed> diff --git a/netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m2-up-m1 b/netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m2-up-m1 new file mode 100644 index 00000000..346a1f3b --- /dev/null +++ b/netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m2-up-m1 @@ -0,0 +1,7 @@ +BIRD <removed> ready. +Table nd_peers: +fe80::88c6:96ff:feb5:9492 from iface 3 [radv1 <removed>] * (0) + preference: 0 + source: device + radv_expires_at: <removed> + Internal route handling values: <removed> diff --git a/netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m2-up-m2 b/netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m2-up-m2 new file mode 100644 index 00000000..ecba0af3 --- /dev/null +++ b/netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m2-up-m2 @@ -0,0 +1,7 @@ +BIRD <removed> ready. +Table nd_peers: +fe80::c8f0:65ff:febc:62b4 from iface 3 [radv1 <removed>] * (0) + preference: 0 + source: device + radv_expires_at: <removed> + Internal route handling values: <removed> diff --git a/netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m1 b/netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m1 new file mode 100644 index 00000000..d018ee0f --- /dev/null +++ b/netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m1 @@ -0,0 +1,121 @@ +BIRD <removed> ready. +Name Proto Table State Since Info +device1 Device --- up <removed> + Created: <removed> + +radv1 RAdv master6 up <removed> + Created: <removed> + Channel ipv6 + State: UP + Import state: UP + Export state: READY + Table: master6 + Preference: 0 + Input filter: ACCEPT + Output filter: REJECT + Routes: 0 imported, 0 exported, 0 preferred + Route change stats: received rejected filtered ignored RX limit limit accepted + Import updates: <removed> + Import withdraws: <removed> + Export updates: <removed> + Export withdraws: <removed> + Channel peer + State: UP + Import state: UP + Export state: READY + Table: nd_peers + Preference: 0 + Input filter: ACCEPT + Output filter: REJECT + Routes: 1 imported, 0 exported, 1 preferred + Route change stats: received rejected filtered ignored RX limit limit accepted + Import updates: <removed> + Import withdraws: <removed> + Export updates: <removed> + Export withdraws: <removed> + +bgp1 BGP --- start <removed> Passive + Created: <removed> + BGP state: Passive + Neighbor range: fe80::/12 + Neighbor AS: 0 + Local AS: 65001 + Channel peers + State: DOWN + Import state: DOWN + Export state: DOWN + Table: nd_peers + Preference: 100 + Input filter: ACCEPT + Output filter: ACCEPT + Channel ipv6 + State: DOWN + Import state: DOWN + Export state: DOWN + Table: master6 + Preference: 100 + Input filter: ACCEPT + Output filter: ACCEPT + Channel peers + State: UP + Import state: UP + Export state: READY + Table: nd_peers + Preference: 100 + Input filter: ACCEPT + Output filter: ACCEPT + Routes: 0 imported, 1 exported, 0 preferred + Route change stats: received rejected filtered ignored RX limit limit accepted + Import updates: <removed> + Import withdraws: <removed> + Export updates: <removed> + Export withdraws: <removed> + BGP Next hop: :: + Pending 0 attribute sets with total 0 prefixes to send + +bgp_peer<XXX> BGP --- up <removed> Established + Created: <removed> + BGP state: Established + Neighbor address: fe80::88c6:96ff:feb5:9492%ve1 + Neighbor AS: 65002 + Local AS: 65001 + Neighbor ID: 0.0.0.2 + Local capabilities + Multiprotocol + AF announced: ipv6 + Route refresh + Graceful restart + 4-octet AS numbers + Enhanced refresh + Long-lived graceful restart + Neighbor capabilities + Multiprotocol + AF announced: ipv6 + Route refresh + Graceful restart + 4-octet AS numbers + Enhanced refresh + Long-lived graceful restart + Session: external AS4 + Source address: fe80::c8f0:65ff:febc:62b4 + Hold timer: <removed>/240 + Keepalive timer: <removed>/80 + TX pending: 0 bytes + Send hold timer: <removed>/480 + Channel ipv6 + State: UP + Import state: UP + Export state: READY + Table: master6 + Preference: 100 + Input filter: ACCEPT + Output filter: ACCEPT + Routes: 0 imported, 0 exported, 0 preferred + Route change stats: received rejected filtered ignored RX limit limit accepted + Import updates: <removed> + Import withdraws: <removed> + Export updates: <removed> + Export withdraws: <removed> + BGP Next hop: :: fe80::c8f0:65ff:febc:62b4 + Pending 0 attribute sets with total 0 prefixes to send + diff --git a/netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m1-down-m2 b/netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m1-down-m2 new file mode 100644 index 00000000..b7c7f675 --- /dev/null +++ b/netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m1-down-m2 @@ -0,0 +1,121 @@ +BIRD <removed> ready. +Name Proto Table State Since Info +device1 Device --- up <removed> + Created: <removed> + +radv1 RAdv master6 up <removed> + Created: <removed> + Channel ipv6 + State: UP + Import state: UP + Export state: READY + Table: master6 + Preference: 0 + Input filter: ACCEPT + Output filter: REJECT + Routes: 0 imported, 0 exported, 0 preferred + Route change stats: received rejected filtered ignored RX limit limit accepted + Import updates: <removed> + Import withdraws: <removed> + Export updates: <removed> + Export withdraws: <removed> + Channel peer + State: UP + Import state: UP + Export state: READY + Table: nd_peers + Preference: 0 + Input filter: ACCEPT + Output filter: REJECT + Routes: 1 imported, 0 exported, 1 preferred + Route change stats: received rejected filtered ignored RX limit limit accepted + Import updates: <removed> + Import withdraws: <removed> + Export updates: <removed> + Export withdraws: <removed> + +bgp1 BGP --- start <removed> Passive + Created: <removed> + BGP state: Passive + Neighbor range: fe80::/12 + Neighbor AS: 0 + Local AS: 65002 + Channel peers + State: DOWN + Import state: DOWN + Export state: DOWN + Table: nd_peers + Preference: 100 + Input filter: ACCEPT + Output filter: ACCEPT + Channel ipv6 + State: DOWN + Import state: DOWN + Export state: DOWN + Table: master6 + Preference: 100 + Input filter: ACCEPT + Output filter: ACCEPT + Channel peers + State: UP + Import state: UP + Export state: READY + Table: nd_peers + Preference: 100 + Input filter: ACCEPT + Output filter: ACCEPT + Routes: 0 imported, 1 exported, 0 preferred + Route change stats: received rejected filtered ignored RX limit limit accepted + Import updates: <removed> + Import withdraws: <removed> + Export updates: <removed> + Export withdraws: <removed> + BGP Next hop: :: + Pending 0 attribute sets with total 0 prefixes to send + +bgp_peer<XXX> BGP --- up <removed> Established + Created: <removed> + BGP state: Established + Neighbor address: fe80::c8f0:65ff:febc:62b4%ve2 + Neighbor AS: 65001 + Local AS: 65002 + Neighbor ID: 0.0.0.1 + Local capabilities + Multiprotocol + AF announced: ipv6 + Route refresh + Graceful restart + 4-octet AS numbers + Enhanced refresh + Long-lived graceful restart + Neighbor capabilities + Multiprotocol + AF announced: ipv6 + Route refresh + Graceful restart + 4-octet AS numbers + Enhanced refresh + Long-lived graceful restart + Session: external AS4 + Source address: fe80::88c6:96ff:feb5:9492 + Hold timer: <removed>/240 + Keepalive timer: <removed>/80 + TX pending: 0 bytes + Send hold timer: <removed>/480 + Channel ipv6 + State: UP + Import state: UP + Export state: READY + Table: master6 + Preference: 100 + Input filter: ACCEPT + Output filter: ACCEPT + Routes: 0 imported, 0 exported, 0 preferred + Route change stats: received rejected filtered ignored RX limit limit accepted + Import updates: <removed> + Import withdraws: <removed> + Export updates: <removed> + Export withdraws: <removed> + BGP Next hop: :: fe80::88c6:96ff:feb5:9492 + Pending 0 attribute sets with total 0 prefixes to send + diff --git a/netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m1-up-m1 b/netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m1-up-m1 new file mode 100644 index 00000000..d018ee0f --- /dev/null +++ b/netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m1-up-m1 @@ -0,0 +1,121 @@ +BIRD <removed> ready. +Name Proto Table State Since Info +device1 Device --- up <removed> + Created: <removed> + +radv1 RAdv master6 up <removed> + Created: <removed> + Channel ipv6 + State: UP + Import state: UP + Export state: READY + Table: master6 + Preference: 0 + Input filter: ACCEPT + Output filter: REJECT + Routes: 0 imported, 0 exported, 0 preferred + Route change stats: received rejected filtered ignored RX limit limit accepted + Import updates: <removed> + Import withdraws: <removed> + Export updates: <removed> + Export withdraws: <removed> + Channel peer + State: UP + Import state: UP + Export state: READY + Table: nd_peers + Preference: 0 + Input filter: ACCEPT + Output filter: REJECT + Routes: 1 imported, 0 exported, 1 preferred + Route change stats: received rejected filtered ignored RX limit limit accepted + Import updates: <removed> + Import withdraws: <removed> + Export updates: <removed> + Export withdraws: <removed> + +bgp1 BGP --- start <removed> Passive + Created: <removed> + BGP state: Passive + Neighbor range: fe80::/12 + Neighbor AS: 0 + Local AS: 65001 + Channel peers + State: DOWN + Import state: DOWN + Export state: DOWN + Table: nd_peers + Preference: 100 + Input filter: ACCEPT + Output filter: ACCEPT + Channel ipv6 + State: DOWN + Import state: DOWN + Export state: DOWN + Table: master6 + Preference: 100 + Input filter: ACCEPT + Output filter: ACCEPT + Channel peers + State: UP + Import state: UP + Export state: READY + Table: nd_peers + Preference: 100 + Input filter: ACCEPT + Output filter: ACCEPT + Routes: 0 imported, 1 exported, 0 preferred + Route change stats: received rejected filtered ignored RX limit limit accepted + Import updates: <removed> + Import withdraws: <removed> + Export updates: <removed> + Export withdraws: <removed> + BGP Next hop: :: + Pending 0 attribute sets with total 0 prefixes to send + +bgp_peer<XXX> BGP --- up <removed> Established + Created: <removed> + BGP state: Established + Neighbor address: fe80::88c6:96ff:feb5:9492%ve1 + Neighbor AS: 65002 + Local AS: 65001 + Neighbor ID: 0.0.0.2 + Local capabilities + Multiprotocol + AF announced: ipv6 + Route refresh + Graceful restart + 4-octet AS numbers + Enhanced refresh + Long-lived graceful restart + Neighbor capabilities + Multiprotocol + AF announced: ipv6 + Route refresh + Graceful restart + 4-octet AS numbers + Enhanced refresh + Long-lived graceful restart + Session: external AS4 + Source address: fe80::c8f0:65ff:febc:62b4 + Hold timer: <removed>/240 + Keepalive timer: <removed>/80 + TX pending: 0 bytes + Send hold timer: <removed>/480 + Channel ipv6 + State: UP + Import state: UP + Export state: READY + Table: master6 + Preference: 100 + Input filter: ACCEPT + Output filter: ACCEPT + Routes: 0 imported, 0 exported, 0 preferred + Route change stats: received rejected filtered ignored RX limit limit accepted + Import updates: <removed> + Import withdraws: <removed> + Export updates: <removed> + Export withdraws: <removed> + BGP Next hop: :: fe80::c8f0:65ff:febc:62b4 + Pending 0 attribute sets with total 0 prefixes to send + diff --git a/netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m1-up-m2 b/netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m1-up-m2 new file mode 100644 index 00000000..b7c7f675 --- /dev/null +++ b/netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m1-up-m2 @@ -0,0 +1,121 @@ +BIRD <removed> ready. +Name Proto Table State Since Info +device1 Device --- up <removed> + Created: <removed> + +radv1 RAdv master6 up <removed> + Created: <removed> + Channel ipv6 + State: UP + Import state: UP + Export state: READY + Table: master6 + Preference: 0 + Input filter: ACCEPT + Output filter: REJECT + Routes: 0 imported, 0 exported, 0 preferred + Route change stats: received rejected filtered ignored RX limit limit accepted + Import updates: <removed> + Import withdraws: <removed> + Export updates: <removed> + Export withdraws: <removed> + Channel peer + State: UP + Import state: UP + Export state: READY + Table: nd_peers + Preference: 0 + Input filter: ACCEPT + Output filter: REJECT + Routes: 1 imported, 0 exported, 1 preferred + Route change stats: received rejected filtered ignored RX limit limit accepted + Import updates: <removed> + Import withdraws: <removed> + Export updates: <removed> + Export withdraws: <removed> + +bgp1 BGP --- start <removed> Passive + Created: <removed> + BGP state: Passive + Neighbor range: fe80::/12 + Neighbor AS: 0 + Local AS: 65002 + Channel peers + State: DOWN + Import state: DOWN + Export state: DOWN + Table: nd_peers + Preference: 100 + Input filter: ACCEPT + Output filter: ACCEPT + Channel ipv6 + State: DOWN + Import state: DOWN + Export state: DOWN + Table: master6 + Preference: 100 + Input filter: ACCEPT + Output filter: ACCEPT + Channel peers + State: UP + Import state: UP + Export state: READY + Table: nd_peers + Preference: 100 + Input filter: ACCEPT + Output filter: ACCEPT + Routes: 0 imported, 1 exported, 0 preferred + Route change stats: received rejected filtered ignored RX limit limit accepted + Import updates: <removed> + Import withdraws: <removed> + Export updates: <removed> + Export withdraws: <removed> + BGP Next hop: :: + Pending 0 attribute sets with total 0 prefixes to send + +bgp_peer<XXX> BGP --- up <removed> Established + Created: <removed> + BGP state: Established + Neighbor address: fe80::c8f0:65ff:febc:62b4%ve2 + Neighbor AS: 65001 + Local AS: 65002 + Neighbor ID: 0.0.0.1 + Local capabilities + Multiprotocol + AF announced: ipv6 + Route refresh + Graceful restart + 4-octet AS numbers + Enhanced refresh + Long-lived graceful restart + Neighbor capabilities + Multiprotocol + AF announced: ipv6 + Route refresh + Graceful restart + 4-octet AS numbers + Enhanced refresh + Long-lived graceful restart + Session: external AS4 + Source address: fe80::88c6:96ff:feb5:9492 + Hold timer: <removed>/240 + Keepalive timer: <removed>/80 + TX pending: 0 bytes + Send hold timer: <removed>/480 + Channel ipv6 + State: UP + Import state: UP + Export state: READY + Table: master6 + Preference: 100 + Input filter: ACCEPT + Output filter: ACCEPT + Routes: 0 imported, 0 exported, 0 preferred + Route change stats: received rejected filtered ignored RX limit limit accepted + Import updates: <removed> + Import withdraws: <removed> + Export updates: <removed> + Export withdraws: <removed> + BGP Next hop: :: fe80::88c6:96ff:feb5:9492 + Pending 0 attribute sets with total 0 prefixes to send + diff --git a/netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m2 b/netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m2 new file mode 100644 index 00000000..b7c7f675 --- /dev/null +++ b/netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m2 @@ -0,0 +1,121 @@ +BIRD <removed> ready. +Name Proto Table State Since Info +device1 Device --- up <removed> + Created: <removed> + +radv1 RAdv master6 up <removed> + Created: <removed> + Channel ipv6 + State: UP + Import state: UP + Export state: READY + Table: master6 + Preference: 0 + Input filter: ACCEPT + Output filter: REJECT + Routes: 0 imported, 0 exported, 0 preferred + Route change stats: received rejected filtered ignored RX limit limit accepted + Import updates: <removed> + Import withdraws: <removed> + Export updates: <removed> + Export withdraws: <removed> + Channel peer + State: UP + Import state: UP + Export state: READY + Table: nd_peers + Preference: 0 + Input filter: ACCEPT + Output filter: REJECT + Routes: 1 imported, 0 exported, 1 preferred + Route change stats: received rejected filtered ignored RX limit limit accepted + Import updates: <removed> + Import withdraws: <removed> + Export updates: <removed> + Export withdraws: <removed> + +bgp1 BGP --- start <removed> Passive + Created: <removed> + BGP state: Passive + Neighbor range: fe80::/12 + Neighbor AS: 0 + Local AS: 65002 + Channel peers + State: DOWN + Import state: DOWN + Export state: DOWN + Table: nd_peers + Preference: 100 + Input filter: ACCEPT + Output filter: ACCEPT + Channel ipv6 + State: DOWN + Import state: DOWN + Export state: DOWN + Table: master6 + Preference: 100 + Input filter: ACCEPT + Output filter: ACCEPT + Channel peers + State: UP + Import state: UP + Export state: READY + Table: nd_peers + Preference: 100 + Input filter: ACCEPT + Output filter: ACCEPT + Routes: 0 imported, 1 exported, 0 preferred + Route change stats: received rejected filtered ignored RX limit limit accepted + Import updates: <removed> + Import withdraws: <removed> + Export updates: <removed> + Export withdraws: <removed> + BGP Next hop: :: + Pending 0 attribute sets with total 0 prefixes to send + +bgp_peer<XXX> BGP --- up <removed> Established + Created: <removed> + BGP state: Established + Neighbor address: fe80::c8f0:65ff:febc:62b4%ve2 + Neighbor AS: 65001 + Local AS: 65002 + Neighbor ID: 0.0.0.1 + Local capabilities + Multiprotocol + AF announced: ipv6 + Route refresh + Graceful restart + 4-octet AS numbers + Enhanced refresh + Long-lived graceful restart + Neighbor capabilities + Multiprotocol + AF announced: ipv6 + Route refresh + Graceful restart + 4-octet AS numbers + Enhanced refresh + Long-lived graceful restart + Session: external AS4 + Source address: fe80::88c6:96ff:feb5:9492 + Hold timer: <removed>/240 + Keepalive timer: <removed>/80 + TX pending: 0 bytes + Send hold timer: <removed>/480 + Channel ipv6 + State: UP + Import state: UP + Export state: READY + Table: master6 + Preference: 100 + Input filter: ACCEPT + Output filter: ACCEPT + Routes: 0 imported, 0 exported, 0 preferred + Route change stats: received rejected filtered ignored RX limit limit accepted + Import updates: <removed> + Import withdraws: <removed> + Export updates: <removed> + Export withdraws: <removed> + BGP Next hop: :: fe80::88c6:96ff:feb5:9492 + Pending 0 attribute sets with total 0 prefixes to send + diff --git a/netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m2-down-m1 b/netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m2-down-m1 new file mode 100644 index 00000000..d018ee0f --- /dev/null +++ b/netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m2-down-m1 @@ -0,0 +1,121 @@ +BIRD <removed> ready. +Name Proto Table State Since Info +device1 Device --- up <removed> + Created: <removed> + +radv1 RAdv master6 up <removed> + Created: <removed> + Channel ipv6 + State: UP + Import state: UP + Export state: READY + Table: master6 + Preference: 0 + Input filter: ACCEPT + Output filter: REJECT + Routes: 0 imported, 0 exported, 0 preferred + Route change stats: received rejected filtered ignored RX limit limit accepted + Import updates: <removed> + Import withdraws: <removed> + Export updates: <removed> + Export withdraws: <removed> + Channel peer + State: UP + Import state: UP + Export state: READY + Table: nd_peers + Preference: 0 + Input filter: ACCEPT + Output filter: REJECT + Routes: 1 imported, 0 exported, 1 preferred + Route change stats: received rejected filtered ignored RX limit limit accepted + Import updates: <removed> + Import withdraws: <removed> + Export updates: <removed> + Export withdraws: <removed> + +bgp1 BGP --- start <removed> Passive + Created: <removed> + BGP state: Passive + Neighbor range: fe80::/12 + Neighbor AS: 0 + Local AS: 65001 + Channel peers + State: DOWN + Import state: DOWN + Export state: DOWN + Table: nd_peers + Preference: 100 + Input filter: ACCEPT + Output filter: ACCEPT + Channel ipv6 + State: DOWN + Import state: DOWN + Export state: DOWN + Table: master6 + Preference: 100 + Input filter: ACCEPT + Output filter: ACCEPT + Channel peers + State: UP + Import state: UP + Export state: READY + Table: nd_peers + Preference: 100 + Input filter: ACCEPT + Output filter: ACCEPT + Routes: 0 imported, 1 exported, 0 preferred + Route change stats: received rejected filtered ignored RX limit limit accepted + Import updates: <removed> + Import withdraws: <removed> + Export updates: <removed> + Export withdraws: <removed> + BGP Next hop: :: + Pending 0 attribute sets with total 0 prefixes to send + +bgp_peer<XXX> BGP --- up <removed> Established + Created: <removed> + BGP state: Established + Neighbor address: fe80::88c6:96ff:feb5:9492%ve1 + Neighbor AS: 65002 + Local AS: 65001 + Neighbor ID: 0.0.0.2 + Local capabilities + Multiprotocol + AF announced: ipv6 + Route refresh + Graceful restart + 4-octet AS numbers + Enhanced refresh + Long-lived graceful restart + Neighbor capabilities + Multiprotocol + AF announced: ipv6 + Route refresh + Graceful restart + 4-octet AS numbers + Enhanced refresh + Long-lived graceful restart + Session: external AS4 + Source address: fe80::c8f0:65ff:febc:62b4 + Hold timer: <removed>/240 + Keepalive timer: <removed>/80 + TX pending: 0 bytes + Send hold timer: <removed>/480 + Channel ipv6 + State: UP + Import state: UP + Export state: READY + Table: master6 + Preference: 100 + Input filter: ACCEPT + Output filter: ACCEPT + Routes: 0 imported, 0 exported, 0 preferred + Route change stats: received rejected filtered ignored RX limit limit accepted + Import updates: <removed> + Import withdraws: <removed> + Export updates: <removed> + Export withdraws: <removed> + BGP Next hop: :: fe80::c8f0:65ff:febc:62b4 + Pending 0 attribute sets with total 0 prefixes to send + diff --git a/netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m2-up-m1 b/netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m2-up-m1 new file mode 100644 index 00000000..d018ee0f --- /dev/null +++ b/netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m2-up-m1 @@ -0,0 +1,121 @@ +BIRD <removed> ready. +Name Proto Table State Since Info +device1 Device --- up <removed> + Created: <removed> + +radv1 RAdv master6 up <removed> + Created: <removed> + Channel ipv6 + State: UP + Import state: UP + Export state: READY + Table: master6 + Preference: 0 + Input filter: ACCEPT + Output filter: REJECT + Routes: 0 imported, 0 exported, 0 preferred + Route change stats: received rejected filtered ignored RX limit limit accepted + Import updates: <removed> + Import withdraws: <removed> + Export updates: <removed> + Export withdraws: <removed> + Channel peer + State: UP + Import state: UP + Export state: READY + Table: nd_peers + Preference: 0 + Input filter: ACCEPT + Output filter: REJECT + Routes: 1 imported, 0 exported, 1 preferred + Route change stats: received rejected filtered ignored RX limit limit accepted + Import updates: <removed> + Import withdraws: <removed> + Export updates: <removed> + Export withdraws: <removed> + +bgp1 BGP --- start <removed> Passive + Created: <removed> + BGP state: Passive + Neighbor range: fe80::/12 + Neighbor AS: 0 + Local AS: 65001 + Channel peers + State: DOWN + Import state: DOWN + Export state: DOWN + Table: nd_peers + Preference: 100 + Input filter: ACCEPT + Output filter: ACCEPT + Channel ipv6 + State: DOWN + Import state: DOWN + Export state: DOWN + Table: master6 + Preference: 100 + Input filter: ACCEPT + Output filter: ACCEPT + Channel peers + State: UP + Import state: UP + Export state: READY + Table: nd_peers + Preference: 100 + Input filter: ACCEPT + Output filter: ACCEPT + Routes: 0 imported, 1 exported, 0 preferred + Route change stats: received rejected filtered ignored RX limit limit accepted + Import updates: <removed> + Import withdraws: <removed> + Export updates: <removed> + Export withdraws: <removed> + BGP Next hop: :: + Pending 0 attribute sets with total 0 prefixes to send + +bgp_peer<XXX> BGP --- up <removed> Established + Created: <removed> + BGP state: Established + Neighbor address: fe80::88c6:96ff:feb5:9492%ve1 + Neighbor AS: 65002 + Local AS: 65001 + Neighbor ID: 0.0.0.2 + Local capabilities + Multiprotocol + AF announced: ipv6 + Route refresh + Graceful restart + 4-octet AS numbers + Enhanced refresh + Long-lived graceful restart + Neighbor capabilities + Multiprotocol + AF announced: ipv6 + Route refresh + Graceful restart + 4-octet AS numbers + Enhanced refresh + Long-lived graceful restart + Session: external AS4 + Source address: fe80::c8f0:65ff:febc:62b4 + Hold timer: <removed>/240 + Keepalive timer: <removed>/80 + TX pending: 0 bytes + Send hold timer: <removed>/480 + Channel ipv6 + State: UP + Import state: UP + Export state: READY + Table: master6 + Preference: 100 + Input filter: ACCEPT + Output filter: ACCEPT + Routes: 0 imported, 0 exported, 0 preferred + Route change stats: received rejected filtered ignored RX limit limit accepted + Import updates: <removed> + Import withdraws: <removed> + Export updates: <removed> + Export withdraws: <removed> + BGP Next hop: :: fe80::c8f0:65ff:febc:62b4 + Pending 0 attribute sets with total 0 prefixes to send + diff --git a/netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m2-up-m2 b/netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m2-up-m2 new file mode 100644 index 00000000..b7c7f675 --- /dev/null +++ b/netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m2-up-m2 @@ -0,0 +1,121 @@ +BIRD <removed> ready. +Name Proto Table State Since Info +device1 Device --- up <removed> + Created: <removed> + +radv1 RAdv master6 up <removed> + Created: <removed> + Channel ipv6 + State: UP + Import state: UP + Export state: READY + Table: master6 + Preference: 0 + Input filter: ACCEPT + Output filter: REJECT + Routes: 0 imported, 0 exported, 0 preferred + Route change stats: received rejected filtered ignored RX limit limit accepted + Import updates: <removed> + Import withdraws: <removed> + Export updates: <removed> + Export withdraws: <removed> + Channel peer + State: UP + Import state: UP + Export state: READY + Table: nd_peers + Preference: 0 + Input filter: ACCEPT + Output filter: REJECT + Routes: 1 imported, 0 exported, 1 preferred + Route change stats: received rejected filtered ignored RX limit limit accepted + Import updates: <removed> + Import withdraws: <removed> + Export updates: <removed> + Export withdraws: <removed> + +bgp1 BGP --- start <removed> Passive + Created: <removed> + BGP state: Passive + Neighbor range: fe80::/12 + Neighbor AS: 0 + Local AS: 65002 + Channel peers + State: DOWN + Import state: DOWN + Export state: DOWN + Table: nd_peers + Preference: 100 + Input filter: ACCEPT + Output filter: ACCEPT + Channel ipv6 + State: DOWN + Import state: DOWN + Export state: DOWN + Table: master6 + Preference: 100 + Input filter: ACCEPT + Output filter: ACCEPT + Channel peers + State: UP + Import state: UP + Export state: READY + Table: nd_peers + Preference: 100 + Input filter: ACCEPT + Output filter: ACCEPT + Routes: 0 imported, 1 exported, 0 preferred + Route change stats: received rejected filtered ignored RX limit limit accepted + Import updates: <removed> + Import withdraws: <removed> + Export updates: <removed> + Export withdraws: <removed> + BGP Next hop: :: + Pending 0 attribute sets with total 0 prefixes to send + +bgp_peer<XXX> BGP --- up <removed> Established + Created: <removed> + BGP state: Established + Neighbor address: fe80::c8f0:65ff:febc:62b4%ve2 + Neighbor AS: 65001 + Local AS: 65002 + Neighbor ID: 0.0.0.1 + Local capabilities + Multiprotocol + AF announced: ipv6 + Route refresh + Graceful restart + 4-octet AS numbers + Enhanced refresh + Long-lived graceful restart + Neighbor capabilities + Multiprotocol + AF announced: ipv6 + Route refresh + Graceful restart + 4-octet AS numbers + Enhanced refresh + Long-lived graceful restart + Session: external AS4 + Source address: fe80::88c6:96ff:feb5:9492 + Hold timer: <removed>/240 + Keepalive timer: <removed>/80 + TX pending: 0 bytes + Send hold timer: <removed>/480 + Channel ipv6 + State: UP + Import state: UP + Export state: READY + Table: master6 + Preference: 100 + Input filter: ACCEPT + Output filter: ACCEPT + Routes: 0 imported, 0 exported, 0 preferred + Route change stats: received rejected filtered ignored RX limit limit accepted + Import updates: <removed> + Import withdraws: <removed> + Export updates: <removed> + Export withdraws: <removed> + BGP Next hop: :: fe80::88c6:96ff:feb5:9492 + Pending 0 attribute sets with total 0 prefixes to send + diff --git a/netlab/cf-bgp-unnumbered-autopeering/test-cf-bgp-unnumbered-autopeering.py b/netlab/cf-bgp-unnumbered-autopeering/test-cf-bgp-unnumbered-autopeering.py new file mode 100644 index 00000000..278308a0 --- /dev/null +++ b/netlab/cf-bgp-unnumbered-autopeering/test-cf-bgp-unnumbered-autopeering.py @@ -0,0 +1,101 @@ +import pytest + +import tests.kernel as tk +import tests.config as cf + +LIMIT = 100 +EXPECTED_DEVICES = ( + "m1", + "m2", +) + + +def test_wait(): + """Wait until the time (limit) runs out""" + tk.wait(LIMIT) + +@pytest.mark.parametrize("exp_devs", EXPECTED_DEVICES) +def test_nd_peers_table(exp_devs: str): + """Check the peer table nd_peers for discovered neighbors""" + tk.test_bird_routes("nd_peers", exp_devs, "nd_peers") + +@pytest.mark.parametrize("exp_devs", EXPECTED_DEVICES) +def test_bgp_protocols(exp_devs: str): + """Check that dynamic BGP protocols are spawned and established""" + tk.test_protocols(key="proto", dev=exp_devs, opts="all") + +@pytest.mark.skipif(False, reason="") +def test_stop_m2(): + """Stop the m2 node to test peers persist behavior""" + tk.kill_node("m2", "STOP") + +def test_wait_after_stop(): + """Wait for BGP sessions to detect peer is down""" + tk.wait(10) + +@pytest.mark.parametrize("exp_devs", ("m1",)) +def test_bgp_protocols_after_m2_down(exp_devs: str): + """Check that dynamic BGP protocols are removed when peer is down (peers persist no)""" + tk.test_protocols(key="proto-m2-down", dev=exp_devs, opts="all") + +@pytest.mark.parametrize("exp_devs", ("m1",)) +def test_nd_peers_table_after_m2_down(exp_devs: str): + """Check the peer table after m2 is down""" + tk.test_bird_routes("nd_peers-m2-down", exp_devs, "nd_peers") + +@pytest.mark.skipif(False, reason="") +def test_cont_m2(): + """Continue the m2 node""" + tk.kill_node("m2", "CONT") + +def test_wait_after_cont(): + """Wait for BGP sessions to re-establish""" + tk.wait(LIMIT) + +@pytest.mark.parametrize("exp_devs", EXPECTED_DEVICES) +def test_bgp_protocols_after_m2_up(exp_devs: str): + """Check that dynamic BGP protocols are re-spawned after m2 comes back""" + tk.test_protocols(key="proto-m2-up", dev=exp_devs, opts="all") + +@pytest.mark.parametrize("exp_devs", EXPECTED_DEVICES) +def test_nd_peers_table_after_m2_up(exp_devs: str): + """Check the peer table after m2 comes back up""" + tk.test_bird_routes("nd_peers-m2-up", exp_devs, "nd_peers") + +@pytest.mark.skipif(False, reason="") +def test_stop_m1(): + """Stop the m1 node to test peers persist yes on m2""" + tk.kill_node("m1", "STOP") + +def test_wait_after_m1_stop(): + """Wait for BGP sessions to detect m1 is down""" + tk.wait(10) + +@pytest.mark.parametrize("exp_devs", ("m2",)) +def test_bgp_protocols_after_m1_down(exp_devs: str): + """Check that dynamic BGP protocols remain (in down state) on m2 (peers persist yes)""" + tk.test_protocols(key="proto-m1-down", dev=exp_devs, opts="all") + +@pytest.mark.parametrize("exp_devs", ("m2",)) +def test_nd_peers_table_after_m1_down(exp_devs: str): + """Check the peer table on m2 after m1 is down""" + tk.test_bird_routes("nd_peers-m1-down", exp_devs, "nd_peers") + +@pytest.mark.skipif(False, reason="") +def test_cont_m1(): + """Continue the m1 node""" + tk.kill_node("m1", "CONT") + +def test_wait_after_m1_cont(): + """Wait for BGP sessions to re-establish""" + tk.wait(LIMIT) + +@pytest.mark.parametrize("exp_devs", EXPECTED_DEVICES) +def test_bgp_protocols_after_m1_up(exp_devs: str): + """Check that BGP sessions are re-established after m1 comes back""" + tk.test_protocols(key="proto-m1-up", dev=exp_devs, opts="all") + +@pytest.mark.parametrize("exp_devs", EXPECTED_DEVICES) +def test_nd_peers_table_after_m1_up(exp_devs: str): + """Check the peer table after m1 comes back up""" + tk.test_bird_routes("nd_peers-m1-up", exp_devs, "nd_peers") diff --git a/netlab/tests/get_stdout_bird b/netlab/tests/get_stdout_bird index c9f8bbc3..3d5d5bf7 100755 --- a/netlab/tests/get_stdout_bird +++ b/netlab/tests/get_stdout_bird @@ -6,4 +6,5 @@ cd $1 && ./birdc -l show route $2 $3 \ | strip_timestamp \ | strip_internal_route_handling_values \ | strip_mpls \ + | strip_radv_expires \ | ../tests/sort_show_route diff --git a/netlab/tests/get_stdout_protocols b/netlab/tests/get_stdout_protocols index 17cbce1e..d778de4e 100755 --- a/netlab/tests/get_stdout_protocols +++ b/netlab/tests/get_stdout_protocols @@ -6,4 +6,5 @@ cd $1 && ./birdc -l show proto "$2" \ | strip_imexport_stats \ | strip_version \ | strip_timestamp \ - | strip_timer + | strip_timer \ + | strip_dynamic_bgp_names diff --git a/netlab/tests/strip_output b/netlab/tests/strip_output index 195dc9f2..9dae4ef9 100755 --- a/netlab/tests/strip_output +++ b/netlab/tests/strip_output @@ -75,3 +75,13 @@ strip_ecmp_pref() { # workaround for change in Linux kernel behavior sed -E 's/(::\/?[0-9]* proto.*) pref medium/\1/' } + +strip_radv_expires() { + # remove the radv_expires_at timestamp value + sed -E 's/(radv_expires_at: )[0-9]+/\1<removed>/' +} + +strip_dynamic_bgp_names() { + # normalize dynamic BGP protocol names (bgp_peer001, bgp_peer002, etc. -> bgp_peer_XXX) + sed -E 's/(bgp_peer)[0-9]{3}/\1<XXX>/g' +} -- 2.43.0