@@ -91,6 +91,10 @@ def setup_pe_router(tgen, pe_name, tunnel_local_ip, svi_ip, intf):
91
91
pe .run ("ip link add name bridge type bridge stp_state 0" )
92
92
pe .run ("ip link set dev bridge type bridge vlan_filtering 1" )
93
93
pe .run ("bridge vlan add vid 1 dev bridge self" )
94
+ if pe_name == "PE1" :
95
+ pe .run ("ip link set dev bridge address 44:00:00:ff:ff:01" )
96
+ if pe_name == "PE2" :
97
+ pe .run ("ip link set dev bridge address 44:20:00:ff:ff:01" )
94
98
pe .run ("ip link set dev bridge up" )
95
99
96
100
# setup svi
@@ -113,14 +117,26 @@ def setup_pe_router(tgen, pe_name, tunnel_local_ip, svi_ip, intf):
113
117
pe .run ("bridge vlan add dev vxlan0 vid 1 tunnel_info id 101" )
114
118
pe .run ("ip link set up dev vxlan0" )
115
119
120
+ # VRF creation
121
+ pe .run ("ip link add vrf-purple type vrf table 1003" )
122
+ pe .run ("ip link set dev vrf-purple up" )
123
+ if pe_name == "PE1" :
124
+ pe .run ("ip link add vrf-blue type vrf table 1002" )
125
+ pe .run ("ip link set dev vrf-blue up" )
126
+ pe .run ("ip addr add 27.2.0.85/32 dev vrf-blue" )
127
+ pe .run ("ip addr add 27.3.0.85/32 dev vrf-purple" )
128
+ if pe_name == "PE2" :
129
+ pe .run ("ip link add vrf-blue type vrf table 2400" )
130
+ pe .run ("ip link set dev vrf-blue up" )
131
+
116
132
# setup PE interface
117
133
pe .run ("ip link set dev {0}-{1} master bridge" .format (pe_name , intf ))
118
134
pe .run ("bridge vlan del vid 1 dev {0}-{1}" .format (pe_name , intf ))
119
135
pe .run ("bridge vlan del vid 1 untagged pvid dev {0}-{1}" .format (pe_name , intf ))
120
136
pe .run ("bridge vlan add vid 1 dev {0}-{1}" .format (pe_name , intf ))
121
137
pe .run ("bridge vlan add vid 1 pvid untagged dev {0}-{1}" .format (pe_name , intf ))
122
138
123
- # l3vni 100
139
+ # L3VNI 100
124
140
pe .run ("ip link add vrf-red type vrf table 1400" )
125
141
pe .run ("ip link add link bridge name vlan100 type vlan id 100 protocol 802.1q" )
126
142
pe .run ("ip link set dev vlan100 master vrf-blue" )
@@ -129,9 +145,16 @@ def setup_pe_router(tgen, pe_name, tunnel_local_ip, svi_ip, intf):
129
145
pe .run ("bridge vlan add dev vxlan0 vid 100" )
130
146
pe .run ("bridge vlan add dev vxlan0 vid 100 tunnel_info id 100" )
131
147
148
+ # L3VNI 4000
149
+ pe .run ("ip link add link bridge name vlan400 type vlan id 400 protocol 802.1q" )
150
+ pe .run ("ip link set dev vlan400 master vrf-purple" )
151
+ pe .run ("ip link set dev vlan400 up" )
152
+ pe .run ("bridge vlan add vid 400 dev bridge self" )
153
+ pe .run ("bridge vlan add dev vxlan0 vid 400" )
154
+ pe .run ("bridge vlan add dev vxlan0 vid 400 tunnel_info id 4000" )
155
+
132
156
# add a vrf for testing DVNI
133
157
if pe_name == "PE2" :
134
- pe .run ("ip link add vrf-blue type vrf table 2400" )
135
158
pe .run ("ip link add link bridge name vlan300 type vlan id 300 protocol 802.1q" )
136
159
pe .run ("ip link set dev vlan300 master vrf-blue" )
137
160
pe .run ("ip link set dev vlan300 up" )
@@ -199,6 +222,14 @@ def show_vni_json_elide_ifindex(pe, vni, expected):
199
222
return topotest .json_cmp (output_json , expected )
200
223
201
224
225
+ def show_bgp_l2vpn_evpn_route_type_prefix_json (pe , expected ):
226
+ output_json = pe .vtysh_cmd (
227
+ "show bgp l2vpn evpn route type prefix json" , isjson = True
228
+ )
229
+
230
+ return topotest .json_cmp (output_json , expected )
231
+
232
+
202
233
def check_vni_macs_present (tgen , router , vni , maclist ):
203
234
result = router .vtysh_cmd ("show evpn mac vni {} json" .format (vni ), isjson = True )
204
235
for rname , ifname in maclist :
@@ -331,6 +362,7 @@ def mac_test_local_remote(local, remote):
331
362
remote_output_json = json .loads (remote_output )
332
363
local_output_vni_json = json .loads (local_output_vni )
333
364
365
+ # breakpoint()
334
366
for vni in local_output_json :
335
367
if vni not in remote_output_json :
336
368
continue
@@ -542,6 +574,42 @@ def test_dvni():
542
574
# tgen.mininet_cli()
543
575
544
576
577
+ def test_pe_advertise_aggr_evpn_route ():
578
+ "BGP advertise aggregated Type-5 prefix route"
579
+
580
+ tgen = get_topogen ()
581
+ # Don't run this test if we have any failure.
582
+ if tgen .routers_have_failure ():
583
+ pytest .skip (tgen .errors )
584
+
585
+ logger .info ("Checking BGP EVPN route contains non-aggregate prefixes" )
586
+ pe1 = tgen .gears ["PE1" ]
587
+ json_file = "{}/{}/bgp.evpn.route.prefix.before.json" .format (CWD , pe1 .name )
588
+ expected = json .loads (open (json_file ).read ())
589
+
590
+ test_func = partial (show_bgp_l2vpn_evpn_route_type_prefix_json , pe1 , expected )
591
+ _ , result = topotest .run_and_expect (test_func , None , count = 45 , wait = 1 )
592
+ assertmsg = '"{}" JSON output mismatches' .format (pe1 .name )
593
+ assert result is None , assertmsg
594
+
595
+ logger .info ("Configure BGP aggregate-address summary-only under ipv4-unicast" )
596
+ pe1 .cmd (
597
+ 'vtysh -c "config t" -c "router bgp 65000 vrf vrf-purple" '
598
+ + ' -c "address-family ipv4 unicast" '
599
+ + ' -c "aggregate-address 10.27.0.0/16 summary-only" '
600
+ )
601
+
602
+ logger .info ("Checking BGP EVPN route contains aggregated prefix" )
603
+ pe1 = tgen .gears ["PE1" ]
604
+ json_file = "{}/{}/bgp.evpn.route.prefix.after.json" .format (CWD , pe1 .name )
605
+ expected = json .loads (open (json_file ).read ())
606
+
607
+ test_func = partial (show_bgp_l2vpn_evpn_route_type_prefix_json , pe1 , expected )
608
+ _ , result = topotest .run_and_expect (test_func , None , count = 45 , wait = 1 )
609
+ assertmsg = '"{}" JSON output mismatches' .format (pe1 .name )
610
+ assert result is None , assertmsg
611
+
612
+
545
613
def test_memory_leak ():
546
614
"Run the memory leak test and report results."
547
615
tgen = get_topogen ()
0 commit comments