Skip to content

Commit a8272f6

Browse files
authored
Add BFD checks to bgp_neighbor_details validation plugin (#3534)
1 parent fdc92eb commit a8272f6

3 files changed

Lines changed: 165 additions & 1 deletion

File tree

netsim/validate/bgp/eos.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,40 @@ def valid_bgp_neighbor(
8383

8484
return f'Neighbor {n_addr} ({n_id}) is in state {data[n_addr].peerState}'
8585

86+
def show_bgp_neighbor_details(ngb: list, n_id: str, af: str='ipv4', **kwargs: typing.Any) -> str:
87+
n_addr = _common.get_bgp_neighbor_id(ngb,n_id,af)
88+
return f'bgp neighbors {n_addr} | json'
89+
90+
def valid_bgp_neighbor_details(
91+
ngb: list,
92+
n_id: str,
93+
af: str = 'ipv4',
94+
bfd: typing.Optional[bool] = None,
95+
**kwargs: typing.Any) -> str:
96+
97+
vrf = 'default'
98+
_result = global_vars.get_result_dict('_result')
99+
n_addr = _common.get_bgp_neighbor_id(ngb,n_id,af)
100+
101+
data = check_vrf_data(_result,vrf,'peerList','BGP peers')
102+
103+
found = next((item for item in data if item.peerAddress == n_addr),None)
104+
if not found:
105+
raise Exception(f'The router has no BGP neighbor with {af} address {n_addr} ({n_id})')
106+
107+
result = f'All specified BGP neighbor parameters have the expected values'
108+
109+
if bfd is not None:
110+
bfd_state = 3 if bfd else 2
111+
bfd_s_txt = 'Up' if bfd else 'Down'
112+
if 'bfdState' not in found:
113+
raise Exception(f'We are not running BFD with neighbor {n_addr} ({n_id})')
114+
if found.bfdState != bfd_state:
115+
raise Exception(f'The neighbor {n_addr} ({n_id}) is in BFD state {found.bfdState}' +\
116+
f' (expected {bfd_state} - {bfd_s_txt})')
117+
118+
return result
119+
86120
"""
87121
BGP prefix checks, starting with 'get a BGP prefix from JSON results'
88122
"""

netsim/validate/bgp/frr.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,9 @@ def show_bgp_neighbor_details(ngb: list, n_id: str, af: str = 'ipv4', **kwargs:
100100
def valid_bgp_neighbor_details(
101101
ngb: list,
102102
n_id: str,
103-
af: str = 'ipv4',**kwargs: typing.Any) -> str:
103+
af: str = 'ipv4',
104+
bfd: typing.Optional[bool] = None,
105+
**kwargs: typing.Any) -> str:
104106
_result = global_vars.get_result_dict('_result')
105107

106108
n_addr = _common.get_bgp_neighbor_id(ngb,n_id,af)
@@ -112,6 +114,14 @@ def valid_bgp_neighbor_details(
112114
if data[k] != v:
113115
raise Exception(f'{k} expected value {v} actual {data[k]}')
114116

117+
if bfd is not None:
118+
if 'peerBfdInfo' not in data:
119+
raise Exception(f'We are not running BFD with neighbor {n_addr} ({n_id})')
120+
else:
121+
expected = 'Up' if bfd else 'Down'
122+
if data.peerBfdInfo.status != expected:
123+
raise Exception(f'BGP BFD expected value {expected} actual {data.peerBfdInfo.status}')
124+
115125
return f'All specified BGP neighbor parameters have the expected values'
116126

117127
"""
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
message: |
2+
Check the 'bgp_neighbor_details' validation plugin. The VRF part of the test
3+
is not implemented yet as the bgp_neighbor_details plugin is not yet VRF-aware
4+
5+
defaults.sources.extra: [ ../../integration/wait_times.yml ]
6+
plugin: [ bgp.session ]
7+
8+
module: [ bgp, bfd, vrf ]
9+
groups:
10+
probes:
11+
members: [ r1, r2, r3, r4, vr1, vr2, vr3 ]
12+
module: [ bgp ]
13+
device: frr
14+
probes_bfd:
15+
members: [ r1, r2, vr1, vr2 ]
16+
module: [ bgp, bfd ]
17+
18+
vrfs:
19+
tenant:
20+
links:
21+
- interfaces: [ dut_eos, dut_frr, vr1, vr3 ]
22+
prefix.ipv4: 172.16.2.0/24
23+
- interfaces: [ dut_eos, dut_frr, vr2, vr3 ]
24+
prefix.ipv6: 2001:db8:0:2::/64
25+
26+
# Node device type for DUT devices set via default groups
27+
#
28+
nodes:
29+
dut_eos.bgp.as: 65001
30+
dut_frr.bgp.as: 65002
31+
r1.bgp.as: 65101
32+
r2.bgp.as: 65102
33+
r3.bgp.as: 65103
34+
r4.bgp.as: 65104
35+
36+
vr1.bgp.as: 65201
37+
vr2.bgp.as: 65202
38+
vr3:
39+
module: [ bgp ] # VR3 is not running BFD
40+
bgp.as: 65203
41+
42+
links:
43+
- dut_eos.bgp.bfd: True
44+
dut_frr.bgp.bfd: True
45+
r1.bgp.bfd: True
46+
r2:
47+
r3:
48+
prefix:
49+
ipv4: 172.16.1.0/24
50+
ipv6: 2001:db8:0:1::/64
51+
- interfaces: [ dut_eos, dut_frr, r4 ] # No BFD on this link
52+
53+
validate:
54+
# Check BGP sessions that are expected to be up (global + VRF)
55+
#
56+
bgp_r1_ipv4:
57+
nodes: [ dut_eos, dut_frr ]
58+
wait: ebgp_session
59+
plugin: bgp_neighbor(node.bgp.neighbors,'r1')
60+
bgp_r1_ipv6:
61+
nodes: [ dut_eos, dut_frr ]
62+
wait: ebgp_session
63+
plugin: bgp_neighbor(node.bgp.neighbors,'r1',af='ipv6')
64+
bgp_r2_ipv4:
65+
nodes: [ dut_eos, dut_frr ]
66+
wait: ebgp_session
67+
plugin: bgp_neighbor(node.bgp.neighbors,'r2')
68+
bgp_r2_ipv6:
69+
nodes: [ dut_eos, dut_frr ]
70+
wait: ebgp_session
71+
plugin: bgp_neighbor(node.bgp.neighbors,'r2',af='ipv6')
72+
bgp_r3_ipv4:
73+
nodes: [ dut_eos, dut_frr ]
74+
wait: ebgp_session
75+
plugin: bgp_neighbor(node.bgp.neighbors,'r3')
76+
bgp_r3_ipv6:
77+
nodes: [ dut_eos, dut_frr ]
78+
wait: ebgp_session
79+
plugin: bgp_neighbor(node.bgp.neighbors,'r3',af='ipv6')
80+
bgp_r4_ipv4:
81+
nodes: [ dut_eos, dut_frr ]
82+
wait: ebgp_session
83+
plugin: bgp_neighbor(node.bgp.neighbors,'r4')
84+
85+
det_r1_none:
86+
nodes: [ dut_eos, dut_frr ]
87+
plugin: bgp_neighbor_details(node.bgp.neighbors,'r1',af='ipv4')
88+
det_r2_none:
89+
nodes: [ dut_eos, dut_frr ]
90+
plugin: bgp_neighbor_details(node.bgp.neighbors,'r2',af='ipv6')
91+
92+
# Check BFD detection
93+
bfd_r1:
94+
description: BFD is enabled on R1
95+
nodes: [ dut_eos, dut_frr ]
96+
plugin: bgp_neighbor_details(node.bgp.neighbors,'r1',af='ipv4',bfd=True)
97+
bfd_r2:
98+
description: BFD for BGP is not configured on R2
99+
nodes: [ dut_eos, dut_frr ]
100+
plugin: bgp_neighbor_details(node.bgp.neighbors,'r2',af='ipv6',bfd=False)
101+
bfd_r3:
102+
description: R3 does not run BFD
103+
nodes: [ dut_eos, dut_frr ]
104+
plugin: bgp_neighbor_details(node.bgp.neighbors,'r3',af='ipv4',bfd=False)
105+
106+
fail_bfd_r1:
107+
description: R1 is running BFD
108+
nodes: [ dut_eos, dut_frr ]
109+
plugin: bgp_neighbor_details(node.bgp.neighbors,'r1',af='ipv4',bfd=False)
110+
_expect_fail: True
111+
fail_bfd_r2:
112+
description: R2 is not running BFD
113+
nodes: [ dut_eos, dut_frr ]
114+
plugin: bgp_neighbor_details(node.bgp.neighbors,'r2',af='ipv6',bfd=True)
115+
_expect_fail: True
116+
fail_bfd_r4:
117+
description: BFD for BGP is not used with R4
118+
nodes: [ dut_eos, dut_frr ]
119+
plugin: bgp_neighbor_details(node.bgp.neighbors,'r4',af='ipv4',bfd=False)
120+
_expect_fail: True

0 commit comments

Comments
 (0)