]> git.puffer.fish Git - mirror/frr.git/commitdiff
topotests: label per nexthop test adds add a while loop for mpls table 13665/head
authorPhilippe Guibert <philippe.guibert@6wind.com>
Fri, 2 Jun 2023 08:55:07 +0000 (10:55 +0200)
committerPhilippe Guibert <philippe.guibert@6wind.com>
Tue, 20 Jun 2023 07:09:22 +0000 (09:09 +0200)
The bgp_vpnv4_per_nexthop_label tests only check to see if the mpls labels
are installed one time. Test runs show that all but one label is installed.
More than likely the test has asked for data while zebra is still installing
it. the mpls_label_check functions must check this result multiple times as
that system may be under heavy load.

A loop is introduced in order to let zebra check the mpls table.

Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
tests/topotests/bgp_vpnv4_per_nexthop_label/test_bgp_vpnv4_per_nexthop_label.py

index 966b717ab2bcfada8bdfd07d87b7b0151b4cb4fc..934c2ff16a6bcae665dde5da51e40efc654c5dd9 100644 (file)
@@ -232,54 +232,61 @@ def bgp_vpnv4_table_check_all(router, label_list=None, same=False):
             bgp_vpnv4_table_check(router, group=group, label_list=label_list)
 
 
-def mpls_table_check(router, blacklist=None, label_list=None, whitelist=None):
-    """
-    Dump and check 'show mpls table json' output. An assert is triggered in case test fails
-    * 'router': the router to check
-    * 'blacklist': the list of nexthops (IP or interface) that should not be on output
-    * 'label_list': the list of labels that should be in inLabel value
-    * 'whitelist': the list of nexthops (IP or interface) that should be on output
-    """
+def check_show_mpls_table(router, blacklist=None, label_list=None, whitelist=None):
     nexthop_list = []
     if blacklist:
         nexthop_list.append(blacklist)
-    logger.info("Checking MPLS labels on {}".format(router.name))
+
     dump = router.vtysh_cmd("show mpls table json", isjson=True)
     for in_label, label_info in dump.items():
         if label_list is not None:
             label_list.add(in_label)
         for nh in label_info["nexthops"]:
-            assert (
-                nh["installed"] == True and nh["type"] == "BGP"
-            ), "{}, show mpls table, nexthop is not installed".format(router.name)
-            if "nexthop" in nh.keys():
-                assert (
-                    nh["nexthop"] not in nexthop_list
-                ), "{}, show mpls table, duplicated or blacklisted nexthop address".format(
+            if nh["installed"] != True or nh["type"] != "BGP":
+                return "{}, show mpls table, nexthop is not installed".format(
                     router.name
                 )
+            if "nexthop" in nh.keys():
+                if nh["nexthop"] in nexthop_list:
+                    return "{}, show mpls table, duplicated or blacklisted nexthop address".format(
+                        router.name
+                    )
                 nexthop_list.append(nh["nexthop"])
             elif "interface" in nh.keys():
-                assert (
-                    nh["interface"] not in nexthop_list
-                ), "{}, show mpls table, duplicated or blacklisted nexthop interface".format(
-                    router.name
-                )
+                if nh["interface"] in nexthop_list:
+                    return "{}, show mpls table, duplicated or blacklisted nexthop interface".format(
+                        router.name
+                    )
                 nexthop_list.append(nh["interface"])
             else:
-                assert (
-                    0
-                ), "{}, show mpls table, entry with neither nexthop nor interface".format(
+                return "{}, show mpls table, entry with neither nexthop nor interface".format(
                     router.name
                 )
 
     if whitelist:
         for entry in whitelist:
-            assert (
-                entry in nexthop_list
-            ), "{}, show mpls table, entry with nexthop {} not present in nexthop list".format(
-                router.name, entry
-            )
+            if entry not in nexthop_list:
+                return "{}, show mpls table, entry with nexthop {} not present in nexthop list".format(
+                    router.name, entry
+                )
+    return None
+
+
+def mpls_table_check(router, blacklist=None, label_list=None, whitelist=None):
+    """
+    Dump and check 'show mpls table json' output. An assert is triggered in case test fails
+    * 'router': the router to check
+    * 'blacklist': the list of nexthops (IP or interface) that should not be on output
+    * 'label_list': the list of labels that should be in inLabel value
+    * 'whitelist': the list of nexthops (IP or interface) that should be on output
+    """
+    logger.info("Checking MPLS labels on {}".format(router.name))
+    # Check r2 removed 172.31.0.30 vpnv4 update
+    test_func = functools.partial(
+        check_show_mpls_table, router, blacklist, label_list, whitelist
+    )
+    success, result = topotest.run_and_expect(test_func, None, count=10, wait=0.5)
+    assert success, "{}, MPLS labels check fail: {}".format(router.name, result)
 
 
 def check_show_bgp_vpn_prefix_not_found(router, ipversion, prefix, rd, label=None):