tests: check for received Grace-LSAs on the OSPF GR topotests

Ensure GR helpers have received a Grace-LSA before killing the
ospfd/ospf6d process that is undergoing a graceful restart.

Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
This commit is contained in:
Renato Westphal 2021-10-07 21:00:06 -03:00
parent 3e63092b83
commit 10396dc55a
2 changed files with 94 additions and 0 deletions

View File

@ -171,6 +171,41 @@ def router_compare_json_output(rname, command, reference, tries):
assert diff is None, assertmsg
def expect_grace_lsa(restarting, helper):
"""
Check if the given helper neighbor has already received a Grace-LSA from
the router performing a graceful restart.
"""
tgen = get_topogen()
logger.info(
"'{}': checking if a Grace-LSA was received from '{}'".format(
helper, restarting
)
)
test_func = partial(
topotest.router_json_cmp,
tgen.gears[helper],
"show ipv6 ospf6 database json",
{
"interfaceScopedLinkStateDb": [
{
"lsa": [
{
"type": "GR",
"advRouter": restarting,
}
]
}
]
},
)
_, result = topotest.run_and_expect(test_func, None, count=60, wait=1)
assertmsg = '"{}" didn\'t receive a Grace-LSA from "{}"'.format(helper, restarting)
assert result is None, assertmsg
def check_routers(initial_convergence=False, exiting=None, restarting=None):
for rname in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6", "rt7"]:
# Check the RIB first, which should be preserved across restarts in
@ -269,6 +304,7 @@ def test_gr_rt1():
pytest.skip(tgen.errors)
tgen.net["rt1"].cmd('vtysh -c "graceful-restart prepare ipv6 ospf"')
expect_grace_lsa(restarting="1.1.1.1", helper="rt2")
ensure_gr_is_in_zebra("rt1")
kill_router_daemons(tgen, "rt1", ["ospf6d"], save_config=False)
check_routers(exiting="rt1")
@ -288,6 +324,8 @@ def test_gr_rt2():
pytest.skip(tgen.errors)
tgen.net["rt2"].cmd('vtysh -c "graceful-restart prepare ipv6 ospf"')
expect_grace_lsa(restarting="2.2.2.2", helper="rt1")
expect_grace_lsa(restarting="2.2.2.2", helper="rt3")
ensure_gr_is_in_zebra("rt2")
kill_router_daemons(tgen, "rt2", ["ospf6d"], save_config=False)
check_routers(exiting="rt2")
@ -308,6 +346,9 @@ def test_gr_rt3():
pytest.skip(tgen.errors)
tgen.net["rt3"].cmd('vtysh -c "graceful-restart prepare ipv6 ospf"')
expect_grace_lsa(restarting="3.3.3.3", helper="rt2")
expect_grace_lsa(restarting="3.3.3.3", helper="rt4")
expect_grace_lsa(restarting="3.3.3.3", helper="rt6")
ensure_gr_is_in_zebra("rt3")
kill_router_daemons(tgen, "rt3", ["ospf6d"], save_config=False)
check_routers(exiting="rt3")
@ -328,6 +369,8 @@ def test_gr_rt4():
pytest.skip(tgen.errors)
tgen.net["rt4"].cmd('vtysh -c "graceful-restart prepare ipv6 ospf"')
expect_grace_lsa(restarting="4.4.4.4", helper="rt3")
expect_grace_lsa(restarting="4.4.4.4", helper="rt5")
ensure_gr_is_in_zebra("rt4")
kill_router_daemons(tgen, "rt4", ["ospf6d"], save_config=False)
check_routers(exiting="rt4")
@ -348,6 +391,7 @@ def test_gr_rt5():
pytest.skip(tgen.errors)
tgen.net["rt5"].cmd('vtysh -c "graceful-restart prepare ipv6 ospf"')
expect_grace_lsa(restarting="5.5.5.5", helper="rt4")
ensure_gr_is_in_zebra("rt5")
kill_router_daemons(tgen, "rt5", ["ospf6d"], save_config=False)
check_routers(exiting="rt5")
@ -368,6 +412,8 @@ def test_gr_rt6():
pytest.skip(tgen.errors)
tgen.net["rt6"].cmd('vtysh -c "graceful-restart prepare ipv6 ospf"')
expect_grace_lsa(restarting="6.6.6.6", helper="rt3")
expect_grace_lsa(restarting="6.6.6.6", helper="rt7")
ensure_gr_is_in_zebra("rt6")
kill_router_daemons(tgen, "rt6", ["ospf6d"], save_config=False)
check_routers(exiting="rt6")
@ -388,6 +434,7 @@ def test_gr_rt7():
pytest.skip(tgen.errors)
tgen.net["rt7"].cmd('vtysh -c "graceful-restart prepare ipv6 ospf"')
expect_grace_lsa(restarting="6.6.6.6", helper="rt6")
ensure_gr_is_in_zebra("rt7")
kill_router_daemons(tgen, "rt7", ["ospf6d"], save_config=False)
check_routers(exiting="rt7")

View File

@ -180,6 +180,41 @@ def router_compare_json_output(rname, command, reference, tries):
assert diff is None, assertmsg
def expect_grace_lsa(restarting, area, helper):
"""
Check if the given helper neighbor has already received a Grace-LSA from
the router performing a graceful restart.
"""
tgen = get_topogen()
logger.info(
"'{}': checking if a Grace-LSA was received from '{}'".format(
helper, restarting
)
)
test_func = partial(
topotest.router_json_cmp,
tgen.gears[helper],
"show ip ospf database opaque-link json",
{
"linkLocalOpaqueLsa": {
"areas": {
area: [
{
"advertisingRouter": restarting,
"opaqueType": "Grace-LSA",
}
]
}
}
},
)
_, result = topotest.run_and_expect(test_func, None, count=60, wait=1)
assertmsg = '"{}" didn\'t receive a Grace-LSA from "{}"'.format(helper, restarting)
assert result is None, assertmsg
def check_routers(initial_convergence=False, exiting=None, restarting=None):
for rname in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6", "rt7"]:
# Check the RIB first, which should be preserved across restarts in
@ -272,6 +307,7 @@ def test_gr_rt1():
pytest.skip(tgen.errors)
tgen.net["rt1"].cmd('vtysh -c "graceful-restart prepare ip ospf"')
expect_grace_lsa(restarting="1.1.1.1", area="0.0.0.1", helper="rt2")
ensure_gr_is_in_zebra("rt1")
kill_router_daemons(tgen, "rt1", ["ospfd"], save_config=False)
check_routers(exiting="rt1")
@ -292,6 +328,8 @@ def test_gr_rt2():
pytest.skip(tgen.errors)
tgen.net["rt2"].cmd('vtysh -c "graceful-restart prepare ip ospf"')
expect_grace_lsa(restarting="2.2.2.2", area="0.0.0.1", helper="rt1")
expect_grace_lsa(restarting="2.2.2.2", area="0.0.0.0", helper="rt3")
ensure_gr_is_in_zebra("rt2")
kill_router_daemons(tgen, "rt2", ["ospfd"], save_config=False)
check_routers(exiting="rt2")
@ -312,6 +350,9 @@ def test_gr_rt3():
pytest.skip(tgen.errors)
tgen.net["rt3"].cmd('vtysh -c "graceful-restart prepare ip ospf"')
expect_grace_lsa(restarting="3.3.3.3", area="0.0.0.0", helper="rt2")
expect_grace_lsa(restarting="3.3.3.3", area="0.0.0.0", helper="rt4")
expect_grace_lsa(restarting="3.3.3.3", area="0.0.0.0", helper="rt6")
ensure_gr_is_in_zebra("rt3")
kill_router_daemons(tgen, "rt3", ["ospfd"], save_config=False)
check_routers(exiting="rt3")
@ -332,6 +373,8 @@ def test_gr_rt4():
pytest.skip(tgen.errors)
tgen.net["rt4"].cmd('vtysh -c "graceful-restart prepare ip ospf"')
expect_grace_lsa(restarting="4.4.4.4", area="0.0.0.0", helper="rt3")
expect_grace_lsa(restarting="4.4.4.4", area="0.0.0.2", helper="rt5")
ensure_gr_is_in_zebra("rt4")
kill_router_daemons(tgen, "rt4", ["ospfd"], save_config=False)
check_routers(exiting="rt4")
@ -352,6 +395,7 @@ def test_gr_rt5():
pytest.skip(tgen.errors)
tgen.net["rt5"].cmd('vtysh -c "graceful-restart prepare ip ospf"')
expect_grace_lsa(restarting="5.5.5.5", area="0.0.0.2", helper="rt4")
ensure_gr_is_in_zebra("rt5")
kill_router_daemons(tgen, "rt5", ["ospfd"], save_config=False)
check_routers(exiting="rt5")
@ -372,6 +416,8 @@ def test_gr_rt6():
pytest.skip(tgen.errors)
tgen.net["rt6"].cmd('vtysh -c "graceful-restart prepare ip ospf"')
expect_grace_lsa(restarting="6.6.6.6", area="0.0.0.0", helper="rt3")
expect_grace_lsa(restarting="6.6.6.6", area="0.0.0.3", helper="rt7")
ensure_gr_is_in_zebra("rt6")
kill_router_daemons(tgen, "rt6", ["ospfd"], save_config=False)
check_routers(exiting="rt6")
@ -392,6 +438,7 @@ def test_gr_rt7():
pytest.skip(tgen.errors)
tgen.net["rt7"].cmd('vtysh -c "graceful-restart prepare ip ospf"')
expect_grace_lsa(restarting="7.7.7.7", area="0.0.0.3", helper="rt6")
ensure_gr_is_in_zebra("rt7")
kill_router_daemons(tgen, "rt7", ["ospfd"], save_config=False)
check_routers(exiting="rt7")