mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-07-27 10:04:18 +00:00
tests: Add new pim mrib tests
Test mrib overrides and rpf lookup mode changes. Signed-off-by: Nathan Bahr <nbahr@atcorp.com>
This commit is contained in:
parent
5cce666d49
commit
d334f84156
0
tests/topotests/pim_mrib/__init__.py
Executable file
0
tests/topotests/pim_mrib/__init__.py
Executable file
28
tests/topotests/pim_mrib/r1/frr.conf
Normal file
28
tests/topotests/pim_mrib/r1/frr.conf
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
!
|
||||||
|
hostname r1
|
||||||
|
password zebra
|
||||||
|
log file /tmp/r1-frr.log
|
||||||
|
!
|
||||||
|
!debug pim nht
|
||||||
|
!debug pim nht detail
|
||||||
|
!debug pim nht rp
|
||||||
|
!
|
||||||
|
interface r1-eth0
|
||||||
|
ip address 10.0.0.1/24
|
||||||
|
ip igmp
|
||||||
|
ip pim
|
||||||
|
!
|
||||||
|
interface r1-eth1
|
||||||
|
ip address 10.0.1.1/24
|
||||||
|
ip igmp
|
||||||
|
ip pim
|
||||||
|
!
|
||||||
|
ip forwarding
|
||||||
|
!
|
||||||
|
ip route 10.0.2.0/24 10.0.0.2 50
|
||||||
|
ip route 10.0.3.0/24 10.0.1.3 50
|
||||||
|
!
|
||||||
|
router pim
|
||||||
|
rpf-lookup-mode mrib-then-urib
|
||||||
|
rp 10.0.0.1 224.0.0.0/4
|
||||||
|
!
|
28
tests/topotests/pim_mrib/r2/frr.conf
Normal file
28
tests/topotests/pim_mrib/r2/frr.conf
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
!
|
||||||
|
hostname r2
|
||||||
|
password zebra
|
||||||
|
log file /tmp/r2-frr.log
|
||||||
|
!
|
||||||
|
!debug pim nht
|
||||||
|
!debug pim nht detail
|
||||||
|
!debug pim nht rp
|
||||||
|
!
|
||||||
|
interface r2-eth0
|
||||||
|
ip address 10.0.0.2/24
|
||||||
|
ip igmp
|
||||||
|
ip pim
|
||||||
|
!
|
||||||
|
interface r2-eth1
|
||||||
|
ip address 10.0.2.2/24
|
||||||
|
ip igmp
|
||||||
|
ip pim
|
||||||
|
!
|
||||||
|
ip forwarding
|
||||||
|
!
|
||||||
|
ip route 10.0.1.0/24 10.0.0.1 50
|
||||||
|
ip route 10.0.3.0/24 10.0.2.4 50
|
||||||
|
!
|
||||||
|
router pim
|
||||||
|
rpf-lookup-mode mrib-then-urib
|
||||||
|
rp 10.0.0.1 224.0.0.0/4
|
||||||
|
!
|
28
tests/topotests/pim_mrib/r3/frr.conf
Normal file
28
tests/topotests/pim_mrib/r3/frr.conf
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
!
|
||||||
|
hostname r3
|
||||||
|
password zebra
|
||||||
|
log file /tmp/r3-frr.log
|
||||||
|
!
|
||||||
|
!debug pim nht
|
||||||
|
!debug pim nht detail
|
||||||
|
!debug pim nht rp
|
||||||
|
!
|
||||||
|
interface r3-eth0
|
||||||
|
ip address 10.0.1.3/24
|
||||||
|
ip igmp
|
||||||
|
ip pim
|
||||||
|
!
|
||||||
|
interface r3-eth1
|
||||||
|
ip address 10.0.3.3/24
|
||||||
|
ip igmp
|
||||||
|
ip pim
|
||||||
|
!
|
||||||
|
ip forwarding
|
||||||
|
!
|
||||||
|
ip route 10.0.0.0/24 10.0.1.1 50
|
||||||
|
ip route 10.0.2.0/24 10.0.3.4 50
|
||||||
|
!
|
||||||
|
router pim
|
||||||
|
rpf-lookup-mode mrib-then-urib
|
||||||
|
rp 10.0.0.1 224.0.0.0/4
|
||||||
|
!
|
29
tests/topotests/pim_mrib/r4/frr.conf
Normal file
29
tests/topotests/pim_mrib/r4/frr.conf
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
!
|
||||||
|
hostname r4
|
||||||
|
password zebra
|
||||||
|
log file /tmp/r4-frr.log
|
||||||
|
!
|
||||||
|
debug pim nht
|
||||||
|
debug pim nht detail
|
||||||
|
debug pim nht rp
|
||||||
|
debug zebra rib detail
|
||||||
|
!
|
||||||
|
interface r4-eth0
|
||||||
|
ip address 10.0.2.4/24
|
||||||
|
ip igmp
|
||||||
|
ip pim
|
||||||
|
!
|
||||||
|
interface r4-eth1
|
||||||
|
ip address 10.0.3.4/24
|
||||||
|
ip igmp
|
||||||
|
ip pim
|
||||||
|
!
|
||||||
|
ip forwarding
|
||||||
|
!
|
||||||
|
ip route 10.0.0.0/24 10.0.2.2 50
|
||||||
|
ip route 10.0.1.0/24 10.0.3.3 50
|
||||||
|
!
|
||||||
|
router pim
|
||||||
|
rpf-lookup-mode mrib-then-urib
|
||||||
|
rp 10.0.0.1 224.0.0.0/4
|
||||||
|
!
|
328
tests/topotests/pim_mrib/test_pim_mrib.py
Normal file
328
tests/topotests/pim_mrib/test_pim_mrib.py
Normal file
@ -0,0 +1,328 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# SPDX-License-Identifier: ISC
|
||||||
|
|
||||||
|
#
|
||||||
|
# test_pim_mrib.py
|
||||||
|
#
|
||||||
|
# Copyright (c) 2024 ATCorp
|
||||||
|
# Nathan Bahr
|
||||||
|
#
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import pytest
|
||||||
|
from functools import partial
|
||||||
|
|
||||||
|
# pylint: disable=C0413
|
||||||
|
# Import topogen and topotest helpers
|
||||||
|
from lib import topotest
|
||||||
|
from lib.topogen import Topogen, get_topogen
|
||||||
|
from lib.topolog import logger
|
||||||
|
from lib.pim import (
|
||||||
|
verify_pim_rp_info,
|
||||||
|
)
|
||||||
|
from lib.common_config import step, write_test_header
|
||||||
|
|
||||||
|
"""
|
||||||
|
test_pim_mrib.py: Test PIM MRIB overrides and RPF modes
|
||||||
|
"""
|
||||||
|
|
||||||
|
TOPOLOGY = """
|
||||||
|
Test PIM MRIB overrides and RPF modes
|
||||||
|
|
||||||
|
+---+---+ +---+---+
|
||||||
|
| | 10.0.0.0/24 | |
|
||||||
|
+ R1 +----------------------+ R2 |
|
||||||
|
| | .1 .2 | |
|
||||||
|
+---+---+ r1-eth0 r2-eth0 +---+---+
|
||||||
|
.1 | r1-eth1 r2-eth1 | .2
|
||||||
|
| |
|
||||||
|
10.0.1.0/24 | | 10.0.2.0/24
|
||||||
|
| |
|
||||||
|
.3 | r3-eth0 r4-eth0 | .4
|
||||||
|
+---+---+ r3-eth1 r4-eth1 +---+---+
|
||||||
|
| | .3 .4 | |
|
||||||
|
+ R3 +----------------------+ R4 |
|
||||||
|
| | 10.0.3.0/24 | |
|
||||||
|
+---+---+ +---+---+
|
||||||
|
"""
|
||||||
|
|
||||||
|
# Save the Current Working Directory to find configuration files.
|
||||||
|
CWD = os.path.dirname(os.path.realpath(__file__))
|
||||||
|
sys.path.append(os.path.join(CWD, "../"))
|
||||||
|
|
||||||
|
# Required to instantiate the topology builder class.
|
||||||
|
pytestmark = [pytest.mark.pimd]
|
||||||
|
|
||||||
|
|
||||||
|
def build_topo(tgen):
|
||||||
|
'''Build function'''
|
||||||
|
|
||||||
|
# Create routers
|
||||||
|
tgen.add_router("r1")
|
||||||
|
tgen.add_router("r2")
|
||||||
|
tgen.add_router("r3")
|
||||||
|
tgen.add_router("r4")
|
||||||
|
|
||||||
|
# Create topology links
|
||||||
|
tgen.add_link(tgen.gears["r1"], tgen.gears["r2"], "r1-eth0", "r2-eth0")
|
||||||
|
tgen.add_link(tgen.gears["r1"], tgen.gears["r3"], "r1-eth1", "r3-eth0")
|
||||||
|
tgen.add_link(tgen.gears["r2"], tgen.gears["r4"], "r2-eth1", "r4-eth0")
|
||||||
|
tgen.add_link(tgen.gears["r3"], tgen.gears["r4"], "r3-eth1", "r4-eth1")
|
||||||
|
|
||||||
|
|
||||||
|
def setup_module(mod):
|
||||||
|
logger.info("PIM MRIB/RPF functionality:\n {}".format(TOPOLOGY))
|
||||||
|
|
||||||
|
tgen = Topogen(build_topo, mod.__name__)
|
||||||
|
tgen.start_topology()
|
||||||
|
|
||||||
|
router_list = tgen.routers()
|
||||||
|
for rname, router in router_list.items():
|
||||||
|
logger.info("Loading router %s" % rname)
|
||||||
|
router.load_frr_config(os.path.join(CWD, "{}/frr.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_pim_mrib_init(request):
|
||||||
|
'''Test boot in MRIB-than-URIB with the default MRIB'''
|
||||||
|
tgen = get_topogen()
|
||||||
|
tc_name = request.node.name
|
||||||
|
write_test_header(tc_name)
|
||||||
|
|
||||||
|
if tgen.routers_have_failure():
|
||||||
|
pytest.skip(tgen.errors)
|
||||||
|
|
||||||
|
step("Verify rp-info using default URIB nexthop")
|
||||||
|
result = verify_pim_rp_info(
|
||||||
|
tgen,
|
||||||
|
None,
|
||||||
|
"r4",
|
||||||
|
"224.0.0.0/4",
|
||||||
|
"r4-eth0",
|
||||||
|
"10.0.0.1",
|
||||||
|
"Static",
|
||||||
|
False,
|
||||||
|
"ipv4",
|
||||||
|
True,
|
||||||
|
)
|
||||||
|
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
def test_pim_mrib_override(request):
|
||||||
|
'''Test MRIB override nexthop'''
|
||||||
|
tgen = get_topogen()
|
||||||
|
tc_name = request.node.name
|
||||||
|
write_test_header(tc_name)
|
||||||
|
|
||||||
|
if tgen.routers_have_failure():
|
||||||
|
pytest.skip("skipped because of router(s) failure")
|
||||||
|
|
||||||
|
# Install a MRIB route that has a shorter prefix length and lower cost.
|
||||||
|
# In MRIB-than-URIB mode, it should use this route
|
||||||
|
tgen.routers()["r4"].vtysh_cmd(
|
||||||
|
'''
|
||||||
|
conf term
|
||||||
|
ip mroute 10.0.0.0/16 10.0.3.3 25
|
||||||
|
'''
|
||||||
|
)
|
||||||
|
|
||||||
|
step("Verify rp-info using MRIB nexthop")
|
||||||
|
result = verify_pim_rp_info(
|
||||||
|
tgen,
|
||||||
|
None,
|
||||||
|
"r4",
|
||||||
|
"224.0.0.0/4",
|
||||||
|
"r4-eth1",
|
||||||
|
"10.0.0.1",
|
||||||
|
"Static",
|
||||||
|
False,
|
||||||
|
"ipv4",
|
||||||
|
True,
|
||||||
|
)
|
||||||
|
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
def test_pim_mrib_prefix_mode(request):
|
||||||
|
'''Test longer prefix lookup mode'''
|
||||||
|
tgen = get_topogen()
|
||||||
|
tc_name = request.node.name
|
||||||
|
write_test_header(tc_name)
|
||||||
|
|
||||||
|
if tgen.routers_have_failure():
|
||||||
|
pytest.skip("skipped because of router(s) failure")
|
||||||
|
|
||||||
|
# Switch to longer prefix match, should switch back to the URIB route
|
||||||
|
# even with the lower cost, the longer prefix match will win because of the mode
|
||||||
|
tgen.routers()["r4"].vtysh_cmd(
|
||||||
|
'''
|
||||||
|
conf term
|
||||||
|
router pim
|
||||||
|
rpf-lookup-mode longer-prefix
|
||||||
|
'''
|
||||||
|
)
|
||||||
|
|
||||||
|
step("Verify rp-info using URIB nexthop")
|
||||||
|
result = verify_pim_rp_info(
|
||||||
|
tgen,
|
||||||
|
None,
|
||||||
|
"r4",
|
||||||
|
"224.0.0.0/4",
|
||||||
|
"r4-eth0",
|
||||||
|
"10.0.0.1",
|
||||||
|
"Static",
|
||||||
|
False,
|
||||||
|
"ipv4",
|
||||||
|
True,
|
||||||
|
)
|
||||||
|
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
def test_pim_mrib_dist_mode(request):
|
||||||
|
'''Test lower distance lookup mode'''
|
||||||
|
tgen = get_topogen()
|
||||||
|
tc_name = request.node.name
|
||||||
|
write_test_header(tc_name)
|
||||||
|
|
||||||
|
if tgen.routers_have_failure():
|
||||||
|
pytest.skip("skipped because of router(s) failure")
|
||||||
|
|
||||||
|
# Switch to lower distance match, should switch back to the MRIB route
|
||||||
|
tgen.routers()["r4"].vtysh_cmd(
|
||||||
|
'''
|
||||||
|
conf term
|
||||||
|
router pim
|
||||||
|
rpf-lookup-mode lower-distance
|
||||||
|
'''
|
||||||
|
)
|
||||||
|
|
||||||
|
step("Verify rp-info using MRIB nexthop")
|
||||||
|
result = verify_pim_rp_info(
|
||||||
|
tgen,
|
||||||
|
None,
|
||||||
|
"r4",
|
||||||
|
"224.0.0.0/4",
|
||||||
|
"r4-eth1",
|
||||||
|
"10.0.0.1",
|
||||||
|
"Static",
|
||||||
|
False,
|
||||||
|
"ipv4",
|
||||||
|
True,
|
||||||
|
)
|
||||||
|
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
def test_pim_mrib_urib_mode(request):
|
||||||
|
'''Test URIB only lookup mode'''
|
||||||
|
tgen = get_topogen()
|
||||||
|
tc_name = request.node.name
|
||||||
|
write_test_header(tc_name)
|
||||||
|
|
||||||
|
if tgen.routers_have_failure():
|
||||||
|
pytest.skip("skipped because of router(s) failure")
|
||||||
|
|
||||||
|
# Switch to urib only match, should switch back to the URIB route
|
||||||
|
tgen.routers()["r4"].vtysh_cmd(
|
||||||
|
'''
|
||||||
|
conf term
|
||||||
|
router pim
|
||||||
|
rpf-lookup-mode urib-only
|
||||||
|
'''
|
||||||
|
)
|
||||||
|
|
||||||
|
step("Verify rp-info using URIB nexthop")
|
||||||
|
result = verify_pim_rp_info(
|
||||||
|
tgen,
|
||||||
|
None,
|
||||||
|
"r4",
|
||||||
|
"224.0.0.0/4",
|
||||||
|
"r4-eth0",
|
||||||
|
"10.0.0.1",
|
||||||
|
"Static",
|
||||||
|
False,
|
||||||
|
"ipv4",
|
||||||
|
True,
|
||||||
|
)
|
||||||
|
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
def test_pim_mrib_mrib_mode(request):
|
||||||
|
'''Test MRIB only lookup mode'''
|
||||||
|
tgen = get_topogen()
|
||||||
|
tc_name = request.node.name
|
||||||
|
write_test_header(tc_name)
|
||||||
|
|
||||||
|
if tgen.routers_have_failure():
|
||||||
|
pytest.skip("skipped because of router(s) failure")
|
||||||
|
|
||||||
|
# Switch to mrib only match, should switch back to the MRIB route
|
||||||
|
tgen.routers()["r4"].vtysh_cmd(
|
||||||
|
'''
|
||||||
|
conf term
|
||||||
|
router pim
|
||||||
|
rpf-lookup-mode mrib-only
|
||||||
|
'''
|
||||||
|
)
|
||||||
|
|
||||||
|
step("Verify rp-info using MRIB nexthop")
|
||||||
|
result = verify_pim_rp_info(
|
||||||
|
tgen,
|
||||||
|
None,
|
||||||
|
"r4",
|
||||||
|
"224.0.0.0/4",
|
||||||
|
"r4-eth1",
|
||||||
|
"10.0.0.1",
|
||||||
|
"Static",
|
||||||
|
False,
|
||||||
|
"ipv4",
|
||||||
|
True,
|
||||||
|
)
|
||||||
|
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
def test_pim_mrib_mrib_mode_no_route(request):
|
||||||
|
'''Test MRIB only with no route'''
|
||||||
|
tgen = get_topogen()
|
||||||
|
tc_name = request.node.name
|
||||||
|
write_test_header(tc_name)
|
||||||
|
|
||||||
|
if tgen.routers_have_failure():
|
||||||
|
pytest.skip("skipped because of router(s) failure")
|
||||||
|
|
||||||
|
# Remove the MRIB route, in mrib-only mode, it should switch to no path for the RP
|
||||||
|
tgen.routers()["r4"].vtysh_cmd(
|
||||||
|
'''
|
||||||
|
conf term
|
||||||
|
no ip mroute 10.0.0.0/16 10.0.3.3 25
|
||||||
|
'''
|
||||||
|
)
|
||||||
|
|
||||||
|
step("Verify rp-info with Unknown next hop")
|
||||||
|
result = verify_pim_rp_info(
|
||||||
|
tgen,
|
||||||
|
None,
|
||||||
|
"r4",
|
||||||
|
"224.0.0.0/4",
|
||||||
|
"Unknown",
|
||||||
|
"10.0.0.1",
|
||||||
|
"Static",
|
||||||
|
False,
|
||||||
|
"ipv4",
|
||||||
|
True,
|
||||||
|
)
|
||||||
|
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
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))
|
Loading…
Reference in New Issue
Block a user