Skip to content

Commit

Permalink
topotests: add bgp vpnv4 over gre test
Browse files Browse the repository at this point in the history
This test ensures that MPLS VPN routes can be installed into a
gre interface with route-map l3vpn next-hop encapsulation command
set. On the other hand, if this command is not set, incoming bgp
routes are not considered as valid.

Signed-off-by: Philippe Guibert <[email protected]>
  • Loading branch information
pguibert6WIND committed Sep 23, 2021
1 parent 1f2b55b commit dc7ed20
Show file tree
Hide file tree
Showing 8 changed files with 338 additions and 0 deletions.
Empty file.
25 changes: 25 additions & 0 deletions tests/topotests/bgp_vpnv4_gre/r1/bgpd.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
router bgp 65500
bgp router-id 1.1.1.1
neighbor 192.168.0.2 remote-as 65500
address-family ipv4 unicast
no neighbor 192.168.0.2 activate
exit-address-family
address-family ipv4 vpn
neighbor 192.168.0.2 activate
neighbor 192.168.0.2 route-map rmap in
exit-address-family
!
router bgp 65500 vrf vrf1
bgp router-id 1.1.1.1
address-family ipv4 unicast
redistribute connected
label vpn export 101
rd vpn export 444:1
rt vpn both 52:100
export vpn
import vpn
exit-address-family
!
route-map rmap permit 1
set l3vpn next-hop encapsulation gre
!
50 changes: 50 additions & 0 deletions tests/topotests/bgp_vpnv4_gre/r1/ipv4_routes.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
{
"10.200.0.0/24": [
{
"prefix": "10.200.0.0/24",
"prefixLen": 24,
"protocol": "bgp",
"vrfName": "vrf1",
"selected": true,
"destSelected": true,
"distance": 20,
"metric": 0,
"nexthops": [
{
"flags": 3,
"fib": true,
"ip": "192.168.0.2",
"afi": "ipv4",
"interfaceName": "r1-gre0",
"vrf": "default",
"active": true,
"labels":[
102
]
}
]
}
],
"10.201.0.0/24": [
{
"prefix": "10.201.0.0/24",
"prefixLen": 24,
"protocol": "connected",
"vrfName": "vrf1",
"selected": true,
"destSelected": true,
"distance": 0,
"metric": 0,
"installed": true,
"nexthops":[
{
"flags": 3,
"fib": true,
"directlyConnected": true,
"interfaceName": "r1-eth1",
"active": true
}
]
}
]
}
13 changes: 13 additions & 0 deletions tests/topotests/bgp_vpnv4_gre/r1/zebra.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
log stdout
interface lo
ip address 1.1.1.1/32
!
interface r1-gre0
ip address 192.168.0.1/24
!
interface r1-eth1 vrf vrf1
ip address 10.201.0.1/24
!
interface r1-eth0
ip address 10.125.0.1/24
!
38 changes: 38 additions & 0 deletions tests/topotests/bgp_vpnv4_gre/r2/bgp_ipv4_routes.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
{
"vrfName": "vrf1",
"localAS": 65500,
"routes":
{
"10.201.0.0/24": [
{
"prefix": "10.201.0.0",
"prefixLen": 24,
"network": "10.201.0.0\/24",
"nhVrfName": "default",
"nexthops": [
{
"ip": "192.168.0.1",
"afi": "ipv4",
"used": true
}
]
}
],
"10.200.0.0/24": [
{
"valid": true,
"bestpath": true,
"prefix": "10.200.0.0",
"prefixLen": 24,
"network": "10.200.0.0\/24",
"nexthops": [
{
"ip": "0.0.0.0",
"afi": "ipv4",
"used": true
}
]
}
]
}
}
21 changes: 21 additions & 0 deletions tests/topotests/bgp_vpnv4_gre/r2/bgpd.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
router bgp 65500
bgp router-id 2.2.2.2
neighbor 192.168.0.1 remote-as 65500
address-family ipv4 unicast
no neighbor 192.168.0.1 activate
exit-address-family
address-family ipv4 vpn
neighbor 192.168.0.1 activate
exit-address-family
!
router bgp 65500 vrf vrf1
bgp router-id 2.2.2.2
address-family ipv4 unicast
redistribute connected
label vpn export 102
rd vpn export 444:2
rt vpn both 52:100
export vpn
import vpn
exit-address-family
!
13 changes: 13 additions & 0 deletions tests/topotests/bgp_vpnv4_gre/r2/zebra.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
log stdout
interface lo
ip address 2.2.2.2/32
!
interface r2-gre0
ip address 192.168.0.2/24
!
interface r2-eth1 vrf vrf1
ip address 10.200.0.2/24
!
interface r2-eth0
ip address 10.125.0.2/24
!
178 changes: 178 additions & 0 deletions tests/topotests/bgp_vpnv4_gre/test_bgp_vpnv4_gre.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,178 @@
#!/usr/bin/env python

#
# test_bgp_vpnv4_gre.py
# Part of NetDEF Topology Tests
#
# Copyright (c) 2021 by 6WIND
#
# Permission to use, copy, modify, and/or distribute this software
# for any purpose with or without fee is hereby granted, provided
# that the above copyright notice and this permission notice appear
# in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND NETDEF DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NETDEF BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY
# DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
# ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
# OF THIS SOFTWARE.
#

"""
test_bgp_vpnv4_gre.py: Test the FRR BGP daemon with BGP IPv6 interface
with route advertisements on a separate netns.
"""

import os
import sys
import json
from functools import partial
import pytest

# Save the Current Working Directory to find configuration files.
CWD = os.path.dirname(os.path.realpath(__file__))
sys.path.append(os.path.join(CWD, "../"))

# pylint: disable=C0413
# Import topogen and topotest helpers
from lib import topotest
from lib.topogen import Topogen, TopoRouter, get_topogen
from lib.topolog import logger

# Required to instantiate the topology builder class.


pytestmark = [pytest.mark.bgpd]


def build_topo(tgen):
"Build function"

# Create 2 routers.
tgen.add_router("r1")
tgen.add_router("r2")

switch = tgen.add_switch("s1")
switch.add_link(tgen.gears["r1"])
switch.add_link(tgen.gears["r2"])

switch = tgen.add_switch("s2")
switch.add_link(tgen.gears["r1"])

switch = tgen.add_switch("s3")
switch.add_link(tgen.gears["r2"])

def _populate_iface():
tgen = get_topogen()
cmds_list = [
'ip link add vrf1 type vrf table 10',
'echo 10 > /proc/sys/net/mpls/platform_labels',
'ip link set dev vrf1 up',
'ip link set dev {0}-eth1 master vrf1',
'echo 1 > /proc/sys/net/mpls/conf/{0}-eth0/input',
'ip tunnel add {0}-gre0 mode gre ttl 64 dev {0}-eth0 local 10.125.0.{1} remote 10.125.0.{2}',
'ip link set dev {0}-gre0 up',
'echo 1 > /proc/sys/net/mpls/conf/{0}-gre0/input',
]

for cmd in cmds_list:
input = cmd.format('r1', '1', '2')
logger.info('input: ' + cmd)
output = tgen.net['r1'].cmd(cmd.format('r1', '1', '2'))
logger.info('output: ' + output)

for cmd in cmds_list:
input = cmd.format('r2', '2', '1')
logger.info('input: ' + cmd)
output = tgen.net['r2'].cmd(cmd.format('r2', '2', '1'))
logger.info('output: ' + output)

def setup_module(mod):
"Sets up the pytest environment"
tgen = Topogen(build_topo, mod.__name__)
tgen.start_topology()

router_list = tgen.routers()
_populate_iface()

for rname, router in router_list.items():
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))
)

# Initialize all routers.
tgen.start_router()


def teardown_module(_mod):
"Teardown the pytest environment"
tgen = get_topogen()

tgen.stop_topology()


def test_protocols_convergence():
"""
Assert that all protocols have converged
statuses as they depend on it.
"""
tgen = get_topogen()
if tgen.routers_have_failure():
pytest.skip(tgen.errors)

# Check IPv4 routing tables on r1
logger.info("Checking IPv4 routes for convergence on r1")
router = tgen.gears['r1']
json_file = "{}/{}/ipv4_routes.json".format(CWD, router.name)
if not os.path.isfile(json_file):
logger.info("skipping file {}".format(json_file))
assert 0, 'ipv4_routes.json file not found'
return

expected = json.loads(open(json_file).read())
test_func = partial(
topotest.router_json_cmp,
router,
"show ip route vrf vrf1 json",
expected,
)
_, result = topotest.run_and_expect(test_func, None, count=10, wait=0.5)
assertmsg = '"{}" JSON output mismatches'.format(router.name)
assert result is None, assertmsg

# Check BGP IPv4 routing tables on r2 not installed
logger.info("Checking BGP IPv4 routes for convergence on r2")
router = tgen.gears['r2']
json_file = "{}/{}/bgp_ipv4_routes.json".format(CWD, router.name)
if not os.path.isfile(json_file):
assert 0, 'bgp_ipv4_routes.json file not found'

expected = json.loads(open(json_file).read())
test_func = partial(
topotest.router_json_cmp,
router,
"show bgp vrf vrf1 ipv4 json",
expected,
)
_, result = topotest.run_and_expect(test_func, None, count=10, wait=0.5)
assertmsg = '"{}" JSON output mismatches'.format(router.name)
assert result is None, assertmsg

def test_memory_leak():
"Run the memory leak test and report results."
tgen = get_topogen()
if not tgen.is_memleak_enabled():
pytest.skip("Memory leak test/report is disabled")

tgen.report_memory_leaks()


if __name__ == "__main__":
args = ["-s"] + sys.argv[1:]
sys.exit(pytest.main(args))

0 comments on commit dc7ed20

Please sign in to comment.