-
Notifications
You must be signed in to change notification settings - Fork 1
/
test_bgp_sender_as_path_loop_detection.py
135 lines (121 loc) Β· 3.84 KB
/
test_bgp_sender_as_path_loop_detection.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
# SPDX-License-Identifier: GPL-2.0-or-later
# Copyright (C) 2022 Nathan Mangar
"""
Test if neighbor <neighbor> sender-as-path-loop-detection
command works as expeced.
"""
__topotests_file__ = (
"bgp_sender_as_path_loop_detection/test_bgp_sender-as-path-loop-detection.py"
)
__topotests_gitrev__ = "4953ca977f3a5de8109ee6353ad07f816ca1774c"
# pylint: disable=invalid-name, missing-class-docstring, missing-function-docstring, line-too-long, consider-using-f-string, wildcard-import, unused-wildcard-import, f-string-without-interpolation, too-few-public-methods
from topotato import *
@topology_fixture()
def topology(topo):
"""
[ r1 ]
|
{ s1 }--[ r3 ]
| |
[ r2 ]--{ s2 }
"""
class Configs(FRRConfigs):
routers = ["r1", "r2", "r3"]
zebra = """
#% extends "boilerplate.conf"
#% block main
#% if router.name == 'r1'
interface lo
ip address {{ routers.r1.lo_ip4[0] }}
!
#% endif
#% for iface in router.ifaces
interface {{ iface.ifname }}
ip address {{ iface.ip4[0] }}
!
#% endfor
ip forwarding
!
#% endblock
"""
bgpd = """
#% block main
#% if router.name == 'r1'
router bgp 65001
no bgp ebgp-requires-policy
neighbor {{ routers.r2.iface_to('s1').ip4[0].ip }} remote-as 65002
neighbor {{ routers.r2.iface_to('s1').ip4[0].ip }} timers 3 10
address-family ipv4 unicast
neighbor {{ routers.r2.iface_to('s1').ip4[0].ip }} route-map prepend out
redistribute connected
!
route-map prepend permit 10
set as-path prepend 65003
!
#% elif router.name == 'r2'
router bgp 65002
no bgp ebgp-requires-policy
neighbor {{ routers.r1.iface_to('s1').ip4[0].ip }} remote-as 65001
neighbor {{ routers.r1.iface_to('s1').ip4[0].ip }} timers 3 10
neighbor {{ routers.r1.iface_to('s1').ip4[0].ip }} solo
neighbor {{ routers.r3.iface_to('s1').ip4[0].ip }} remote-as 65003
neighbor {{ routers.r3.iface_to('s1').ip4[0].ip }} timers 3 10
neighbor {{ routers.r3.iface_to('s1').ip4[0].ip }} solo
neighbor {{ routers.r3.iface_to('s1').ip4[0].ip }} sender-as-path-loop-detection
!
#% elif router.name == 'r3'
router bgp 65003
no bgp ebgp-requires-policy
neighbor {{ routers.r2.iface_to('s2').ip4[0].ip }} remote-as 65002
neighbor {{ routers.r2.iface_to('s2').ip4[0].ip }} timers 3 10
!
#% endif
#% endblock
"""
class BGPSenderAspathLoopDetection(
TestBase, AutoFixture, topo=topology, configs=Configs
):
@topotatofunc
def bgp_converge(self, _, r1, r2):
expected = {
str(r1.iface_to("s1").ip4[0].ip): {
"bgpState": "Established",
"addressFamilyInfo": {"ipv4Unicast": {"acceptedPrefixCounter": 2}},
}
}
yield from AssertVtysh.make(
r2,
"bgpd",
f"show ip bgp neighbor {r1.iface_to('s1').ip4[0].ip} json",
maxwait=5.0,
compare=expected,
)
@topotatofunc
def bgp_has_route_from_r1(self, _, r1, r2):
expected = {
"paths": [
{
"aspath": {
"segments": [{"type": "as-sequence", "list": [65001, 65003]}],
"length": 2,
}
}
]
}
yield from AssertVtysh.make(
r2,
"bgpd",
f"show ip bgp {r1.lo_ip4[0]} json",
maxwait=1.0,
compare=expected,
)
@topotatofunc
def bgp_suppress_route_to_r3(self, _, r2, r3):
expected = {"totalPrefixCounter": 0}
yield from AssertVtysh.make(
r2,
"bgpd",
f"show ip bgp neighbor {r3.iface_to('s1').ip4[0].ip} advertised-routes json",
maxwait=2.0,
compare=expected,
)