]> git.puffer.fish Git - mirror/frr.git/commitdiff
tests: check for received Grace-LSAs on the OSPF GR topotests 9779/head
authorRenato Westphal <renato@opensourcerouting.org>
Fri, 8 Oct 2021 00:00:06 +0000 (21:00 -0300)
committerRenato Westphal <renato@opensourcerouting.org>
Fri, 8 Oct 2021 17:38:27 +0000 (14:38 -0300)
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>
tests/topotests/ospf6_gr_topo1/test_ospf6_gr_topo1.py
tests/topotests/ospf_gr_topo1/test_ospf_gr_topo1.py

index d50223191d56cef3544c6cbdf6a54497b34a5cb9..e59333ebd2a9c69bf268007b74384d3af362147c 100755 (executable)
@@ -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")
index 1432d53ffc825709667754747075c71b11134197..3e3bf5cb8c2cb598c4bfce3e40d89513f43a6ec2 100755 (executable)
@@ -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")