tests: Check if BGP confederation works with AS_EXTERNAL (!AS_SPECIFIED)

Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
(cherry picked from commit caf65e4a27)
This commit is contained in:
Donatas Abraitis 2023-02-21 23:37:04 +02:00 committed by Mergify
parent ef6f76144b
commit 55189a8d91
8 changed files with 190 additions and 0 deletions

View File

@ -0,0 +1,12 @@
router bgp 65001
no bgp ebgp-requires-policy
bgp confederation identifier 65300
bgp confederation peers 65002 65003
neighbor fabric peer-group
neighbor fabric remote-as external
neighbor 192.168.1.2 peer-group fabric
neighbor 192.168.2.2 remote-as external
address-family ipv4 unicast
neighbor fabric activate
exit-address-family
!

View File

@ -0,0 +1,7 @@
!
int r1-eth0
ip address 192.168.1.1/24
!
int r1-eth1
ip address 192.168.2.1/24
!

View File

@ -0,0 +1,13 @@
router bgp 65002
no bgp ebgp-requires-policy
no bgp network import-check
bgp confederation identifier 65300
bgp confederation peers 65001
neighbor fabric peer-group
neighbor fabric remote-as external
neighbor 192.168.1.1 peer-group fabric
address-family ipv4 unicast
network 172.16.255.254/32
neighbor fabric activate
exit-address-family
!

View File

@ -0,0 +1,4 @@
!
int r2-eth0
ip address 192.168.1.2/24
!

View File

@ -0,0 +1,10 @@
router bgp 65003
no bgp ebgp-requires-policy
no bgp network import-check
bgp confederation identifier 65300
bgp confederation peers 65001
neighbor 192.168.2.1 remote-as external
address-family ipv4 unicast
network 172.16.255.254/32
exit-address-family
!

View File

@ -0,0 +1,4 @@
!
int r3-eth0
ip address 192.168.2.2/24
!

View File

@ -0,0 +1,140 @@
#!/usr/bin/env python
# SPDX-License-Identifier: ISC
# Copyright (c) 2022 by
# Donatas Abraitis <donatas@opensourcerouting.org>
#
"""
Test if BGP confederation works properly when using
remote-as internal/external.
Also, check if the same works with peer-groups as well.
"""
import os
import sys
import json
import pytest
import functools
pytestmark = pytest.mark.bgpd
CWD = os.path.dirname(os.path.realpath(__file__))
sys.path.append(os.path.join(CWD, "../"))
# pylint: disable=C0413
from lib import topotest
from lib.topogen import Topogen, TopoRouter, get_topogen
pytestmark = [pytest.mark.bgpd]
def setup_module(mod):
topodef = {"s1": ("r1", "r2"), "s2": ("r1", "r3")}
tgen = Topogen(topodef, mod.__name__)
tgen.start_topology()
router_list = tgen.routers()
for i, (rname, router) in enumerate(router_list.items(), 1):
router.load_config(
TopoRouter.RD_ZEBRA, os.path.join(CWD, "{}/zebra.conf".format(rname))
)
router.load_config(
TopoRouter.RD_BGP, os.path.join(CWD, "{}/bgpd.conf".format(rname))
)
tgen.start_router()
def teardown_module(mod):
tgen = get_topogen()
tgen.stop_topology()
def test_bgp_confederation_astype():
tgen = get_topogen()
if tgen.routers_have_failure():
pytest.skip(tgen.errors)
r1 = tgen.gears["r1"]
def _bgp_converge():
output = json.loads(r1.vtysh_cmd("show bgp summary json"))
expected = {
"ipv4Unicast": {
"peerCount": 2,
"peers": {
"192.168.1.2": {
"hostname": "r2",
"remoteAs": 65002,
"localAs": 65001,
"pfxRcd": 1,
"state": "Established",
},
"192.168.2.2": {
"hostname": "r3",
"remoteAs": 65003,
"localAs": 65001,
"pfxRcd": 1,
"state": "Established",
},
},
}
}
return topotest.json_cmp(output, expected)
test_func = functools.partial(_bgp_converge)
_, result = topotest.run_and_expect(test_func, None, count=60, wait=0.5)
assert result is None, "Can't converge"
def _bgp_check_neighbors():
output = json.loads(r1.vtysh_cmd("show bgp neighbors json"))
expected = {
"192.168.1.2": {
"nbrCommonAdmin": True,
"nbrConfedExternalLink": True,
"hostname": "r2",
},
"192.168.2.2": {
"nbrCommonAdmin": True,
"nbrConfedExternalLink": True,
"hostname": "r3",
},
}
return topotest.json_cmp(output, expected)
test_func = functools.partial(_bgp_check_neighbors)
_, result = topotest.run_and_expect(test_func, None, count=60, wait=0.5)
assert result is None, "Can't see neighbors to be in BGP confederation"
def _bgp_check_routes():
output = json.loads(r1.vtysh_cmd("show bgp ipv4 unicast json"))
expected = {
"routes": {
"172.16.255.254/32": [
{
"valid": True,
"pathFrom": "external",
"path": "(65003)",
},
{
"valid": True,
"pathFrom": "external",
"path": "(65002)",
},
]
}
}
return topotest.json_cmp(output, expected)
test_func = functools.partial(_bgp_check_routes)
_, result = topotest.run_and_expect(test_func, None, count=60, wait=0.5)
assert result is None, "Can't see routes to be in BGP confederation"
if __name__ == "__main__":
args = ["-s"] + sys.argv[1:]
sys.exit(pytest.main(args))