Merge pull request #14966 from opensourcerouting/fix/bgpd_route-map_default_originate_peer-group

tests: Check if default-originate works combined with peer-groups + route-maps
This commit is contained in:
Russ White 2023-12-12 10:54:34 -05:00 committed by GitHub
commit 39ab18f1fd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 69 additions and 47 deletions

View File

@ -5164,7 +5164,7 @@ void bgp_withdraw(struct peer *peer, const struct prefix *p,
}
void bgp_default_originate(struct peer *peer, afi_t afi, safi_t safi,
int withdraw)
bool withdraw)
{
struct update_subgroup *subgrp;
subgrp = peer_subgroup(peer, afi, safi);

View File

@ -707,7 +707,8 @@ extern void bgp_announce_route(struct peer *peer, afi_t afi, safi_t safi,
bool force);
extern void bgp_stop_announce_route_timer(struct peer_af *paf);
extern void bgp_announce_route_all(struct peer *);
extern void bgp_default_originate(struct peer *, afi_t, safi_t, int);
extern void bgp_default_originate(struct peer *peer, afi_t afi, safi_t safi,
bool withdraw);
extern void bgp_soft_reconfig_table_task_cancel(const struct bgp *bgp,
const struct bgp_table *table,
const struct peer *peer);

View File

@ -1699,14 +1699,14 @@ static int updgrp_policy_update_walkcb(struct update_group *updgrp, void *arg)
*/
UNSET_FLAG(subgrp->sflags,
SUBGRP_STATUS_DEFAULT_ORIGINATE);
subgroup_default_originate(subgrp, 0);
subgroup_default_originate(subgrp, false);
} else {
/*
* This is a explicit withdraw, since the
* routemap is not present in routemap lib. need
* to pass 1 for withdraw arg.
* to pass `true` for withdraw arg.
*/
subgroup_default_originate(subgrp, 1);
subgroup_default_originate(subgrp, true);
}
}
update_subgroup_set_needs_refresh(subgrp, 0);
@ -2102,7 +2102,7 @@ update_group_default_originate_route_map_walkcb(struct update_group *updgrp,
*/
UNSET_FLAG(subgrp->sflags,
SUBGRP_STATUS_DEFAULT_ORIGINATE);
subgroup_default_originate(subgrp, 0);
subgroup_default_originate(subgrp, false);
}
}

View File

@ -428,7 +428,7 @@ extern void subgroup_announce_route(struct update_subgroup *subgrp);
extern void subgroup_announce_all(struct update_subgroup *subgrp);
extern void subgroup_default_originate(struct update_subgroup *subgrp,
int withdraw);
bool withdraw);
extern void group_announce_route(struct bgp *bgp, afi_t afi, safi_t safi,
struct bgp_dest *dest,
struct bgp_path_info *pi);

View File

@ -733,7 +733,7 @@ void subgroup_announce_table(struct update_subgroup *subgrp,
if (safi != SAFI_MPLS_VPN && safi != SAFI_ENCAP && safi != SAFI_EVPN
&& CHECK_FLAG(peer->af_flags[afi][safi],
PEER_FLAG_DEFAULT_ORIGINATE))
subgroup_default_originate(subgrp, 0);
subgroup_default_originate(subgrp, false);
subgrp->pscount = 0;
SET_FLAG(subgrp->sflags, SUBGRP_STATUS_TABLE_REPARSING);
@ -825,7 +825,7 @@ void subgroup_announce_route(struct update_subgroup *subgrp)
}
}
void subgroup_default_originate(struct update_subgroup *subgrp, int withdraw)
void subgroup_default_originate(struct update_subgroup *subgrp, bool withdraw)
{
struct bgp *bgp;
struct attr attr;
@ -940,7 +940,7 @@ void subgroup_default_originate(struct update_subgroup *subgrp, int withdraw)
SUBGRP_STATUS_DEFAULT_ORIGINATE)))
SET_FLAG(subgrp->sflags,
SUBGRP_STATUS_DEFAULT_ORIGINATE);
withdraw = 1;
withdraw = true;
}
}

View File

@ -5655,7 +5655,7 @@ int peer_default_originate_set(struct peer *peer, afi_t afi, safi_t safi,
if (peer_established(peer->connection) &&
peer->afc_nego[afi][safi]) {
update_group_adjust_peer(peer_af_find(peer, afi, safi));
bgp_default_originate(peer, afi, safi, 0);
bgp_default_originate(peer, afi, safi, false);
bgp_announce_route(peer, afi, safi, false);
}
@ -5698,7 +5698,7 @@ int peer_default_originate_set(struct peer *peer, afi_t afi, safi_t safi,
member->afc_nego[afi][safi]) {
update_group_adjust_peer(
peer_af_find(member, afi, safi));
bgp_default_originate(member, afi, safi, 0);
bgp_default_originate(member, afi, safi, false);
bgp_announce_route(member, afi, safi, false);
}
}
@ -5743,7 +5743,7 @@ int peer_default_originate_unset(struct peer *peer, afi_t afi, safi_t safi)
if (peer_established(peer->connection) &&
peer->afc_nego[afi][safi]) {
update_group_adjust_peer(peer_af_find(peer, afi, safi));
bgp_default_originate(peer, afi, safi, 1);
bgp_default_originate(peer, afi, safi, true);
bgp_announce_route(peer, afi, safi, false);
}
@ -5782,7 +5782,7 @@ int peer_default_originate_unset(struct peer *peer, afi_t afi, safi_t safi)
if (peer_established(member->connection) &&
member->afc_nego[afi][safi]) {
update_group_adjust_peer(peer_af_find(member, afi, safi));
bgp_default_originate(member, afi, safi, 1);
bgp_default_originate(member, afi, safi, true);
bgp_announce_route(member, afi, safi, false);
}
}

View File

@ -1,12 +1,17 @@
router bgp 65000
no bgp ebgp-requires-policy
neighbor 192.168.255.2 remote-as 65001
neighbor 192.168.255.2 timers 3 10
address-family ipv4 unicast
neighbor 192.168.255.2 default-originate route-map default
exit-address-family
router bgp 65001
no bgp ebgp-requires-policy
neighbor 192.168.255.2 remote-as external
neighbor 192.168.255.2 timers 3 10
neighbor PG peer-group
neighbor PG remote-as external
neighbor PG timers 3 10
bgp listen range 192.168.255.0/24 peer-group PG
address-family ipv4 unicast
neighbor PG default-originate route-map default
neighbor 192.168.255.2 default-originate route-map default
exit-address-family
!
route-map default permit 10
set metric 123
set as-path prepend 65000 65000 65000
set metric 123
set as-path prepend 65001 65001 65001
!

View File

@ -5,5 +5,3 @@ interface lo
interface r1-eth0
ip address 192.168.255.1/24
!
ip forwarding
!

View File

@ -1,8 +1,8 @@
router bgp 65001
no bgp ebgp-requires-policy
neighbor 192.168.255.1 remote-as 65000
neighbor 192.168.255.1 timers 3 10
address-family ipv4 unicast
redistribute connected
exit-address-family
router bgp 65002
no bgp ebgp-requires-policy
neighbor 192.168.255.1 remote-as external
neighbor 192.168.255.1 timers 3 10
address-family ipv4 unicast
redistribute connected
exit-address-family
!

View File

@ -2,5 +2,3 @@
interface r2-eth0
ip address 192.168.255.2/24
!
ip forwarding
!

View File

@ -0,0 +1,8 @@
router bgp 65003
no bgp ebgp-requires-policy
neighbor 192.168.255.1 remote-as external
neighbor 192.168.255.1 timers 3 10
address-family ipv4 unicast
redistribute connected
exit-address-family
!

View File

@ -0,0 +1,4 @@
!
interface r3-eth0
ip address 192.168.255.3/24
!

View File

@ -26,12 +26,13 @@ pytestmark = [pytest.mark.bgpd]
def build_topo(tgen):
for routern in range(1, 3):
for routern in range(1, 4):
tgen.add_router("r{}".format(routern))
switch = tgen.add_switch("s1")
switch.add_link(tgen.gears["r1"])
switch.add_link(tgen.gears["r2"])
switch.add_link(tgen.gears["r3"])
def setup_module(mod):
@ -62,14 +63,17 @@ def test_bgp_default_originate_route_map():
if tgen.routers_have_failure():
pytest.skip(tgen.errors)
router = tgen.gears["r2"]
r2 = tgen.gears["r2"]
r3 = tgen.gears["r3"]
def _bgp_converge(router):
def _bgp_converge(router, pfxCount):
output = json.loads(router.vtysh_cmd("show ip bgp neighbor 192.168.255.1 json"))
expected = {
"192.168.255.1": {
"bgpState": "Established",
"addressFamilyInfo": {"ipv4Unicast": {"acceptedPrefixCounter": 1}},
"addressFamilyInfo": {
"ipv4Unicast": {"acceptedPrefixCounter": pfxCount}
},
}
}
return topotest.json_cmp(output, expected)
@ -77,21 +81,25 @@ def test_bgp_default_originate_route_map():
def _bgp_default_route_has_metric(router):
output = json.loads(router.vtysh_cmd("show ip bgp 0.0.0.0/0 json"))
expected = {
"paths": [{"aspath": {"string": "65000 65000 65000 65000"}, "metric": 123}]
"paths": [{"aspath": {"string": "65001 65001 65001 65001"}, "metric": 123}]
}
return topotest.json_cmp(output, expected)
test_func = functools.partial(_bgp_converge, router)
success, result = topotest.run_and_expect(test_func, None, count=30, wait=0.5)
test_func = functools.partial(_bgp_converge, r2, 1)
_, result = topotest.run_and_expect(test_func, None, count=30, wait=1)
assert result is None, "Failed to see bgp convergence in r2"
assert result is None, 'Failed to see bgp convergence in "{}"'.format(router)
test_func = functools.partial(_bgp_default_route_has_metric, r2)
_, result = topotest.run_and_expect(test_func, None, count=30, wait=1)
assert result is None, "Failed to see applied metric for default route in r2"
test_func = functools.partial(_bgp_default_route_has_metric, router)
success, result = topotest.run_and_expect(test_func, None, count=30, wait=0.5)
test_func = functools.partial(_bgp_converge, r3, 2)
_, result = topotest.run_and_expect(test_func, None, count=30, wait=1)
assert result is None, "Failed to see bgp convergence in r3"
assert (
result is None
), 'Failed to see applied metric for default route in "{}"'.format(router)
test_func = functools.partial(_bgp_default_route_has_metric, r3)
_, result = topotest.run_and_expect(test_func, None, count=30, wait=1)
assert result is None, "Failed to see applied metric for default route in r3"
if __name__ == "__main__":