mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-02 15:34:30 +00:00
tests: Super simple babel test
Just get babel started and ensure that the v4 routes are actually installed. Signed-off-by: Donald Sharp <sharpd@nvidia.com>
This commit is contained in:
parent
6d078ff808
commit
d844d516da
21
tests/topotests/babel_topo1/r1/babeld.conf
Normal file
21
tests/topotests/babel_topo1/r1/babeld.conf
Normal file
@ -0,0 +1,21 @@
|
||||
log file eigrpd.log
|
||||
|
||||
interface r1-eth0
|
||||
babel hello-interval 1000
|
||||
babel wired
|
||||
babel update-interval 50
|
||||
!
|
||||
interface r1-eth1
|
||||
babel hello-interval 1000
|
||||
babel wired
|
||||
babel update-interval 50
|
||||
!
|
||||
router babel
|
||||
network r1-eth0
|
||||
network r1-eth1
|
||||
redistribute ipv4 connected
|
||||
redistribute ipv6 connected
|
||||
!
|
||||
line vty
|
||||
!
|
||||
|
80
tests/topotests/babel_topo1/r1/show_ip_route.json_ref
Normal file
80
tests/topotests/babel_topo1/r1/show_ip_route.json_ref
Normal file
@ -0,0 +1,80 @@
|
||||
{
|
||||
"192.168.1.0/24":[
|
||||
{
|
||||
"prefix":"192.168.1.0/24",
|
||||
"protocol":"connected",
|
||||
"selected":true,
|
||||
"nexthops":[
|
||||
{
|
||||
"fib":true,
|
||||
"directlyConnected":true,
|
||||
"interfaceName":"r1-eth0",
|
||||
"active":true
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"192.168.2.0/24":[
|
||||
{
|
||||
"prefix":"192.168.2.0/24",
|
||||
"prefixLen":24,
|
||||
"protocol":"babel",
|
||||
"selected":true,
|
||||
"nexthops":[
|
||||
{
|
||||
"fib":true,
|
||||
"ip":"193.1.1.2",
|
||||
"afi":"ipv4",
|
||||
"interfaceName":"r1-eth1"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"192.168.3.0/24":[
|
||||
{
|
||||
"prefix":"192.168.3.0/24",
|
||||
"protocol":"babel",
|
||||
"selected":true,
|
||||
"nexthops":[
|
||||
{
|
||||
"fib":true,
|
||||
"ip":"193.1.1.2",
|
||||
"afi":"ipv4",
|
||||
"interfaceName":"r1-eth1",
|
||||
"active":true
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"193.1.1.0/26":[
|
||||
{
|
||||
"prefix":"193.1.1.0/26",
|
||||
"protocol":"connected",
|
||||
"selected":true,
|
||||
"nexthops":[
|
||||
{
|
||||
"fib":true,
|
||||
"directlyConnected":true,
|
||||
"interfaceName":"r1-eth1",
|
||||
"active":true
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"193.1.2.0/24":[
|
||||
{
|
||||
"prefix":"193.1.2.0/24",
|
||||
"protocol":"babel",
|
||||
"selected":true,
|
||||
"nexthops":[
|
||||
{
|
||||
"fib":true,
|
||||
"ip":"193.1.1.2",
|
||||
"afi":"ipv4",
|
||||
"interfaceName":"r1-eth1",
|
||||
"active":true
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
22
tests/topotests/babel_topo1/r1/zebra.conf
Normal file
22
tests/topotests/babel_topo1/r1/zebra.conf
Normal file
@ -0,0 +1,22 @@
|
||||
log file zebra.log
|
||||
! debug zebra rib detail
|
||||
!
|
||||
hostname r1
|
||||
!
|
||||
interface r1-eth0
|
||||
ip address 192.168.1.1/24
|
||||
ipv6 address 192:168:1::1/64
|
||||
!
|
||||
interface r1-eth1
|
||||
description to sw2 - babel interface
|
||||
ip address 193.1.1.1/26
|
||||
ipv6 address 193:1:1::1/64
|
||||
no link-detect
|
||||
!
|
||||
ip forwarding
|
||||
ipv6 forwarding
|
||||
!
|
||||
!
|
||||
line vty
|
||||
!
|
||||
|
18
tests/topotests/babel_topo1/r2/babeld.conf
Normal file
18
tests/topotests/babel_topo1/r2/babeld.conf
Normal file
@ -0,0 +1,18 @@
|
||||
log file eigrpd.log
|
||||
!
|
||||
interface r2-eth0
|
||||
babel hello-interval 1000
|
||||
babel wired
|
||||
babel update-interval 50
|
||||
!
|
||||
interface r2-eth1
|
||||
babel hello-interval 1000
|
||||
babel wired
|
||||
babel update-interval 50
|
||||
!
|
||||
router babel
|
||||
network r2-eth0
|
||||
network r2-eth1
|
||||
redistribute ipv4 connected
|
||||
redistribute ipv6 connected
|
||||
!
|
80
tests/topotests/babel_topo1/r2/show_ip_route.json_ref
Normal file
80
tests/topotests/babel_topo1/r2/show_ip_route.json_ref
Normal file
@ -0,0 +1,80 @@
|
||||
{
|
||||
"192.168.1.0/24":[
|
||||
{
|
||||
"prefix":"192.168.1.0/24",
|
||||
"protocol":"babel",
|
||||
"selected":true,
|
||||
"nexthops":[
|
||||
{
|
||||
"fib":true,
|
||||
"ip":"193.1.1.1",
|
||||
"afi":"ipv4",
|
||||
"interfaceName":"r2-eth0",
|
||||
"active":true
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"192.168.2.0/24":[
|
||||
{
|
||||
"prefix":"192.168.2.0/24",
|
||||
"protocol":"babel",
|
||||
"selected":true,
|
||||
"nexthops":[
|
||||
{
|
||||
"fib":true,
|
||||
"ip":"193.1.2.2",
|
||||
"afi":"ipv4",
|
||||
"interfaceName":"r2-eth1",
|
||||
"active":true
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"192.168.3.0/24":[
|
||||
{
|
||||
"prefix":"192.168.3.0/24",
|
||||
"protocol":"babel",
|
||||
"selected":true,
|
||||
"nexthops":[
|
||||
{
|
||||
"fib":true,
|
||||
"ip":"193.1.2.2",
|
||||
"afi":"ipv4",
|
||||
"interfaceName":"r2-eth1",
|
||||
"active":true
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"193.1.1.0/26":[
|
||||
{
|
||||
"prefix":"193.1.1.0/26",
|
||||
"protocol":"connected",
|
||||
"selected":true,
|
||||
"nexthops":[
|
||||
{
|
||||
"fib":true,
|
||||
"directlyConnected":true,
|
||||
"interfaceName":"r2-eth0",
|
||||
"active":true
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"193.1.2.0/24":[
|
||||
{
|
||||
"prefix":"193.1.2.0/24",
|
||||
"protocol":"connected",
|
||||
"selected":true,
|
||||
"nexthops":[
|
||||
{
|
||||
"fib":true,
|
||||
"directlyConnected":true,
|
||||
"interfaceName":"r2-eth1",
|
||||
"active":true
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
23
tests/topotests/babel_topo1/r2/zebra.conf
Normal file
23
tests/topotests/babel_topo1/r2/zebra.conf
Normal file
@ -0,0 +1,23 @@
|
||||
log file zebra.log
|
||||
!
|
||||
hostname r2
|
||||
!
|
||||
interface r2-eth0
|
||||
description to sw2 - babel interface
|
||||
ip address 193.1.1.2/26
|
||||
ipv6 address 193:1:1::2/64
|
||||
no link-detect
|
||||
!
|
||||
interface r2-eth1
|
||||
description to sw3 - babel interface
|
||||
ip address 193.1.2.1/24
|
||||
ipv6 address 193:1:2::1/64
|
||||
no link-detect
|
||||
!
|
||||
ip forwarding
|
||||
ipv6 forwarding
|
||||
!
|
||||
!
|
||||
line vty
|
||||
!
|
||||
|
18
tests/topotests/babel_topo1/r3/babeld.conf
Normal file
18
tests/topotests/babel_topo1/r3/babeld.conf
Normal file
@ -0,0 +1,18 @@
|
||||
log file eigrpd.log
|
||||
!
|
||||
interface r3-eth0
|
||||
babel hello-interval 1000
|
||||
babel wired
|
||||
babel update-interval 50
|
||||
!
|
||||
interface r3-eth1
|
||||
babel hello-interval 1000
|
||||
babel wired
|
||||
babel update-interval 50
|
||||
!
|
||||
router babel
|
||||
network r3-eth0
|
||||
network r3-eth1
|
||||
redistribute ipv4 connected
|
||||
redistribute ipv4 static
|
||||
redistirbute ipv6 connected
|
81
tests/topotests/babel_topo1/r3/show_ip_route.json_ref
Normal file
81
tests/topotests/babel_topo1/r3/show_ip_route.json_ref
Normal file
@ -0,0 +1,81 @@
|
||||
{
|
||||
"192.168.1.0/24":[
|
||||
{
|
||||
"prefix":"192.168.1.0/24",
|
||||
"protocol":"babel",
|
||||
"selected":true,
|
||||
"nexthops":[
|
||||
{
|
||||
"fib":true,
|
||||
"ip":"193.1.2.1",
|
||||
"afi":"ipv4",
|
||||
"interfaceName":"r3-eth1",
|
||||
"active":true
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"192.168.2.0/24":[
|
||||
{
|
||||
"prefix":"192.168.2.0/24",
|
||||
"protocol":"static",
|
||||
"selected":true,
|
||||
"distance":1,
|
||||
"nexthops":[
|
||||
{
|
||||
"fib":true,
|
||||
"ip":"192.168.3.10",
|
||||
"afi":"ipv4",
|
||||
"interfaceName":"r3-eth0",
|
||||
"active":true
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"192.168.3.0/24":[
|
||||
{
|
||||
"prefix":"192.168.3.0/24",
|
||||
"protocol":"connected",
|
||||
"selected":true,
|
||||
"nexthops":[
|
||||
{
|
||||
"fib":true,
|
||||
"directlyConnected":true,
|
||||
"interfaceName":"r3-eth0",
|
||||
"active":true
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"193.1.1.0/26":[
|
||||
{
|
||||
"prefix":"193.1.1.0/26",
|
||||
"protocol":"babel",
|
||||
"selected":true,
|
||||
"nexthops":[
|
||||
{
|
||||
"fib":true,
|
||||
"ip":"193.1.2.1",
|
||||
"afi":"ipv4",
|
||||
"interfaceName":"r3-eth1",
|
||||
"active":true
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"193.1.2.0/24":[
|
||||
{
|
||||
"prefix":"193.1.2.0/24",
|
||||
"protocol":"connected",
|
||||
"selected":true,
|
||||
"nexthops":[
|
||||
{
|
||||
"fib":true,
|
||||
"directlyConnected":true,
|
||||
"interfaceName":"r3-eth1",
|
||||
"active":true
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
25
tests/topotests/babel_topo1/r3/zebra.conf
Normal file
25
tests/topotests/babel_topo1/r3/zebra.conf
Normal file
@ -0,0 +1,25 @@
|
||||
log file zebra.log
|
||||
!
|
||||
hostname r3
|
||||
!
|
||||
interface r3-eth0
|
||||
description to sw4 - Stub interface
|
||||
ip address 192.168.3.1/24
|
||||
ipv6 address 192:168:3::1/64
|
||||
no link-detect
|
||||
!
|
||||
interface r3-eth1
|
||||
description to sw3 - RIPv2 interface
|
||||
ip address 193.1.2.2/24
|
||||
ipv6 address 193:1:2::2/64
|
||||
no link-detect
|
||||
!
|
||||
ip route 192.168.2.0/24 192.168.3.10
|
||||
ipv6 route 192:168:2::0/64 192:168:3::10
|
||||
!
|
||||
ip forwarding
|
||||
ipv6 forwarding
|
||||
!
|
||||
!
|
||||
line vty
|
||||
!
|
171
tests/topotests/babel_topo1/test_babel_topo1.py
Normal file
171
tests/topotests/babel_topo1/test_babel_topo1.py
Normal file
@ -0,0 +1,171 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
#
|
||||
# test_babel_topo1.py
|
||||
#
|
||||
# Copyright (c) 2017 by
|
||||
# Cumulus Networks, Inc.
|
||||
# Donald Sharp
|
||||
#
|
||||
# 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_babel_topo1.py: Testing BABEL
|
||||
|
||||
"""
|
||||
|
||||
import os
|
||||
import re
|
||||
import sys
|
||||
import pytest
|
||||
import json
|
||||
|
||||
pytestmark = [pytest.mark.babeld]
|
||||
|
||||
# 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.
|
||||
|
||||
#####################################################
|
||||
##
|
||||
## Network Topology Definition
|
||||
##
|
||||
#####################################################
|
||||
|
||||
|
||||
def build_topo(tgen):
|
||||
for routern in range(1, 4):
|
||||
tgen.add_router("r{}".format(routern))
|
||||
|
||||
# On main router
|
||||
# First switch is for a dummy interface (for local network)
|
||||
switch = tgen.add_switch("sw1")
|
||||
switch.add_link(tgen.gears["r1"])
|
||||
|
||||
# Switches for BABEL
|
||||
# switch 2 switch is for connection to BABEL router
|
||||
switch = tgen.add_switch("sw2")
|
||||
switch.add_link(tgen.gears["r1"])
|
||||
switch.add_link(tgen.gears["r2"])
|
||||
|
||||
# switch 4 is stub on remote BABEL router
|
||||
switch = tgen.add_switch("sw4")
|
||||
switch.add_link(tgen.gears["r3"])
|
||||
|
||||
# switch 3 is between BABEL routers
|
||||
switch = tgen.add_switch("sw3")
|
||||
switch.add_link(tgen.gears["r2"])
|
||||
switch.add_link(tgen.gears["r3"])
|
||||
|
||||
|
||||
#####################################################
|
||||
##
|
||||
## Tests starting
|
||||
##
|
||||
#####################################################
|
||||
|
||||
|
||||
def setup_module(module):
|
||||
"Setup topology"
|
||||
tgen = Topogen(build_topo, module.__name__)
|
||||
tgen.start_topology()
|
||||
|
||||
# This is a sample of configuration loading.
|
||||
router_list = tgen.routers()
|
||||
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_BABEL, os.path.join(CWD, "{}/babeld.conf".format(rname))
|
||||
)
|
||||
|
||||
tgen.start_router()
|
||||
|
||||
|
||||
def teardown_module(_mod):
|
||||
"Teardown the pytest environment"
|
||||
tgen = get_topogen()
|
||||
|
||||
# This function tears down the whole topology.
|
||||
tgen.stop_topology()
|
||||
|
||||
|
||||
def test_converge_protocols():
|
||||
"Wait for protocol convergence"
|
||||
|
||||
tgen = get_topogen()
|
||||
# Don't run this test if we have any failure.
|
||||
if tgen.routers_have_failure():
|
||||
pytest.skip(tgen.errors)
|
||||
|
||||
topotest.sleep(10, "Waiting for BABEL convergence")
|
||||
|
||||
|
||||
def test_zebra_ipv4_routingTable():
|
||||
"Test 'show ip route'"
|
||||
|
||||
tgen = get_topogen()
|
||||
# Don't run this test if we have any failure.
|
||||
if tgen.routers_have_failure():
|
||||
pytest.skip(tgen.errors)
|
||||
|
||||
failures = 0
|
||||
router_list = tgen.routers().values()
|
||||
for router in router_list:
|
||||
output = router.vtysh_cmd("show ip route json", isjson=True)
|
||||
refTableFile = "{}/{}/show_ip_route.json_ref".format(CWD, router.name)
|
||||
expected = json.loads(open(refTableFile).read())
|
||||
|
||||
assertmsg = "Zebra IPv4 Routing Table verification failed for router {}".format(
|
||||
router.name
|
||||
)
|
||||
assert topotest.json_cmp(output, expected) is None, assertmsg
|
||||
|
||||
def test_shutdown_check_stderr():
|
||||
if os.environ.get("TOPOTESTS_CHECK_STDERR") is None:
|
||||
pytest.skip("Skipping test for Stderr output and memory leaks")
|
||||
|
||||
tgen = get_topogen()
|
||||
# Don't run this test if we have any failure.
|
||||
if tgen.routers_have_failure():
|
||||
pytest.skip(tgen.errors)
|
||||
|
||||
logger.info("Verifying unexpected STDERR output from daemons")
|
||||
|
||||
router_list = tgen.routers().values()
|
||||
for router in router_list:
|
||||
router.stop()
|
||||
|
||||
log = tgen.net[router.name].getStdErr("babeld")
|
||||
if log:
|
||||
logger.error("BABELd StdErr Log:" + log)
|
||||
log = tgen.net[router.name].getStdErr("zebra")
|
||||
if log:
|
||||
logger.error("Zebra StdErr Log:" + log)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
args = ["-s"] + sys.argv[1:]
|
||||
sys.exit(pytest.main(args))
|
Loading…
Reference in New Issue
Block a user