+---------+ +------------+ | +---------+
| Host H1 | 192.168.100.0/24 | | .1 | .11 | Host H2 |
| receive |------------------| VRF Blue |---------+--------| PIM RP |
-|IGMP JOIN| .10 .1 | | 192.168.101.0/24 | |
+|IGMP JOIN| .10 .1 | | 192.168.101.0/24 | |
+---------+ | | +---------+
=| = = R1 = = |=
+---------+ | | +---------+
| receive |------------------| VRF Red |---------+--------| PIM RP |
|IGMP JOIN| .20 .1 | | .1 | .12 | |
+---------+ +------------+ | +---------+
- .4 |
+ .4 |
+----------+
| Host H4 |
| Source |
import os
import sys
import pytest
+import logging
# Save the Current Working Directory to find configuration files.
CWD = os.path.dirname(os.path.realpath(__file__))
from lib.topogen import Topogen, TopoRouter, get_topogen
from lib.topolog import logger
from lib.topotest import iproute2_is_vrf_capable
-from lib.common_config import required_linux_kernel_version
+from lib.common_config import required_linux_kernel_version, retry
from lib.pim import McastTesterHelper
tgen.start_router()
+ # iproute2 needs to support VRFs for this suite to run.
+ if not iproute2_is_vrf_capable():
+ pytest.skip(
+ "Installed iproute2 version does not support VRFs", allow_module_level=True
+ )
+
+ if os.getenv("MROUTE_VRF_MISSING"):
+ pytest.skip(
+ "Kernel does not support vrf mroute tables.", allow_module_level=True
+ )
+
def teardown_module(module):
tgen = get_topogen()
"Test for OSPFv2 convergence"
tgen = get_topogen()
- # iproute2 needs to support VRFs for this suite to run.
- if not iproute2_is_vrf_capable():
- pytest.skip("Installed iproute2 version does not support VRFs")
-
# Skip if previous fatal error condition is raised
if tgen.routers_have_failure():
pytest.skip(tgen.errors)
logger.info("Checking OSPFv2 convergence on router r1 for VRF blue")
+ # Check for blue neighbor
router = tgen.gears["r1"]
reffile = os.path.join(CWD, "r1/ospf_blue_neighbor.json")
expected = json.loads(open(reffile).read())
expected,
)
_, res = topotest.run_and_expect(test_func, None, count=60, wait=2)
- assertmsg = "OSPF router R1 did not converge on VRF blue"
+ assertmsg = "OSPF router R1 did not converge on VRF blue (nbr)"
+ assert res is None, assertmsg
+
+ # Check for blue loopback route
+ router = tgen.gears["r1"]
+ reffile = os.path.join(CWD, "r1/ospf_blue_route.json")
+ expected = json.loads(open(reffile).read())
+
+ test_func = functools.partial(
+ topotest.router_json_cmp,
+ router,
+ "show ip ospf vrf blue route json",
+ expected,
+ )
+ _, res = topotest.run_and_expect(test_func, None, count=30, wait=2)
+ assertmsg = "OSPF router R1 did not converge on VRF blue (route)"
assert res is None, assertmsg
logger.info("Checking OSPFv2 convergence on router r1 for VRF red")
topotest.router_json_cmp, router, "show ip ospf vrf red neighbor json", expected
)
_, res = topotest.run_and_expect(test_func, None, count=60, wait=2)
- assertmsg = "OSPF router R1 did not converge on VRF red"
+ assertmsg = "OSPF router R1 did not converge on VRF red (nbr)"
+ assert res is None, assertmsg
+
+ # Check for red loopback route
+ router = tgen.gears["r1"]
+ reffile = os.path.join(CWD, "r1/ospf_red_route.json")
+ expected = json.loads(open(reffile).read())
+
+ test_func = functools.partial(
+ topotest.router_json_cmp,
+ router,
+ "show ip ospf vrf red route json",
+ expected,
+ )
+ _, res = topotest.run_and_expect(test_func, None, count=30, wait=2)
+ assertmsg = "OSPF router R1 did not converge on VRF red (route)"
assert res is None, assertmsg
assert res is None, assertmsg
-def test_vrf_pimreg_interfaces():
+def _test_vrf_pimreg_interfaces():
"Adding PIM RP in VRF information and verify pimreg interfaces"
tgen = get_topogen()
+ if tgen.routers_have_failure():
+ pytest.skip(tgen.errors)
+
r1 = tgen.gears["r1"]
r1.vtysh_cmd("conf\ninterface blue\nip pim")
r1.vtysh_cmd("conf\nvrf blue\nip pim rp 192.168.0.11 239.100.0.1/32\nexit-vrf")
"show ip pim vrf blue inter pimreg11 json",
expected,
)
- _, res = topotest.run_and_expect(test_func, None, count=5, wait=2)
+ _, res = topotest.run_and_expect(test_func, None, count=15, wait=2)
assertmsg = "PIM router R1, VRF blue (table 11) pimreg11 interface missing or incorrect status"
assert res is None, assertmsg
"show ip pim vrf red inter pimreg12 json",
expected,
)
- _, res = topotest.run_and_expect(test_func, None, count=5, wait=2)
+ _, res = topotest.run_and_expect(test_func, None, count=15, wait=2)
assertmsg = "PIM router R1, VRF red (table 12) pimreg12 interface missing or incorrect status"
assert res is None, assertmsg
+def test_vrf_pimreg_interfaces():
+ tgen = get_topogen()
+ r1 = tgen.gears["r1"]
+ try:
+ _test_vrf_pimreg_interfaces()
+ except Exception:
+ # get some debug info.
+ output = r1.net.cmd_nostatus("ip -o link")
+ logging.error("ip link info after failure: %s", output)
+ raise
##################################
### Test PIM / IGMP with VRF