]> git.puffer.fish Git - mirror/frr.git/commitdiff
bgpd, topotests: bmp, send peer down when unconfiguring imported vrf
authorPhilippe Guibert <philippe.guibert@6wind.com>
Tue, 12 Nov 2024 07:46:24 +0000 (08:46 +0100)
committerPhilippe Guibert <philippe.guibert@6wind.com>
Tue, 7 Jan 2025 14:35:32 +0000 (15:35 +0100)
When unconfiguring an imported BGP instance, a peer down
should be sent to notify BMP collector that the BGP instance
is leaving.

Add a test that controls the presence of the peer down loc-rib
message.

Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
bgpd/bgp_bmp.c
tests/topotests/bgp_bmp/test_bgp_bmp_3.py

index c1eaa55c4a05aa083b6673add4aa90fb26f58c8f..c8baf161def14f609b2d91d294b2aa1eb07e1f6b 100644 (file)
@@ -705,6 +705,17 @@ static void bmp_send_bt_safe(struct bmp_targets *bt, struct stream *s)
        stream_free(s);
 }
 
+static void bmp_send_peerdown_vrf_per_instance(struct bmp_targets *bt, struct bgp *bgp)
+{
+       struct stream *s;
+
+       s = bmp_peerstate(bgp->peer_self, true);
+       if (!s)
+               return;
+       bmp_send_bt(bt, s);
+       stream_free(s);
+}
+
 /* send a stream to all bmp sessions configured in a bgp instance */
 /* XXX: kludge - filling the pullwr's buffer */
 static void bmp_send_all(struct bmp_bgp *bmpbgp, struct stream *s)
@@ -2765,7 +2776,10 @@ DEFPY(bmp_import_vrf,
                        vty_out(vty, "%% BMP imported BGP instance not found\n");
                        return CMD_WARNING;
                }
-               /* TODO: handle loc-rib peer down change */
+               bgp = bgp_lookup_by_name(bib->name);
+               if (!bgp)
+                       return CMD_WARNING;
+               bmp_send_peerdown_vrf_per_instance(bt, bgp);
                bmp_imported_bgp_put(bt, bib);
                return CMD_SUCCESS;
        }
index 70037a5257e9fec8a59628bae1c3e3e353030326..7a68dcde801e537aa4217a3e9d4f550a8d30313f 100644 (file)
@@ -188,31 +188,16 @@ def _test_prefixes(policy, vrf=None, step=0):
         assert success, "Checking the updated prefixes has failed ! %s" % res
 
 
-def test_bmp_server_logging():
-    """
-    Assert the logging of the bmp server.
-    """
-
-    def check_for_log_file():
-        tgen = get_topogen()
-        output = tgen.gears["bmp1import"].run(
-            "ls {}".format(os.path.join(tgen.logdir, "bmp1import"))
-        )
-        if "bmp.log" not in output:
-            return False
-        return True
-
-    success, _ = topotest.run_and_expect(check_for_log_file, True, count=30, wait=1)
-    assert success, "The BMP server is not logging"
-
-
-def test_peer_up():
+def _test_peer_up(check_locrib=True):
     """
     Checking for BMP peers up messages
     """
 
     tgen = get_topogen()
-    peers = ["0.0.0.0", "192.168.1.3", "192:167::3"]
+    if check_locrib:
+        peers = ["0.0.0.0", "192.168.1.3", "192:167::3"]
+    else:
+        peers = ["192.168.1.3", "192:167::3"]
 
     logger.info("checking for BMP peers up messages")
 
@@ -228,6 +213,28 @@ def test_peer_up():
     assert success, "Checking the updated prefixes has been failed !."
 
 
+def test_bmp_server_logging():
+    """
+    Assert the logging of the bmp server.
+    """
+
+    def check_for_log_file():
+        tgen = get_topogen()
+        output = tgen.gears["bmp1import"].run(
+            "ls {}".format(os.path.join(tgen.logdir, "bmp1import"))
+        )
+        if "bmp.log" not in output:
+            return False
+        return True
+
+    success, _ = topotest.run_and_expect(check_for_log_file, True, count=30, wait=1)
+    assert success, "The BMP server is not logging"
+
+
+def test_bmp_peer_up_start():
+    _test_peer_up()
+
+
 def test_bmp_bgp_unicast():
     """
     Add/withdraw bgp unicast prefixes and check the bmp logs.
@@ -353,6 +360,43 @@ def test_bgp_instance_flapping():
     assert success, "Checking the BMP peer up LOC-RIB message failed !."
 
 
+def test_peer_up_after_flush():
+    """
+    Checking for BMP peers down messages
+    """
+    _test_peer_up(check_locrib=False)
+
+
+def test_peer_down_locrib():
+    """
+    Checking for BMP peers down loc-rib messages
+    """
+    tgen = get_topogen()
+
+    tgen.gears["r1import"].vtysh_cmd(
+        """
+        configure terminal
+        router bgp 65501
+        bmp targets bmp1
+        no bmp import-vrf-view vrf1
+        """
+    )
+
+    peers = ["0.0.0.0"]
+
+    logger.info("checking for BMP peers down messages")
+
+    test_func = partial(
+        bmp_check_for_peer_message,
+        peers,
+        "peer down",
+        tgen.gears["bmp1import"],
+        os.path.join(tgen.logdir, "bmp1import", "bmp.log"),
+    )
+    success, _ = topotest.run_and_expect(test_func, True, count=30, wait=1)
+    assert success, "Checking the BMP peer down message has failed !."
+
+
 if __name__ == "__main__":
     args = ["-s"] + sys.argv[1:]
     sys.exit(pytest.main(args))