]> git.puffer.fish Git - mirror/frr.git/commitdiff
topotests: bgp_bmp, add test for import-vrf-view service
authorPhilippe Guibert <philippe.guibert@6wind.com>
Mon, 28 Oct 2024 17:52:58 +0000 (18:52 +0100)
committerPhilippe Guibert <philippe.guibert@6wind.com>
Tue, 7 Jan 2025 14:35:31 +0000 (15:35 +0100)
Add a test with a new peer defined in a VRF, and where
the BGP updates are imported in the BMP instance of the
default BGP instance.

Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
15 files changed:
tests/topotests/bgp_bmp/bmp1import/bmp-update-loc-rib-step1.json [new file with mode: 0644]
tests/topotests/bgp_bmp/bmp1import/bmp-update-post-policy-step1.json [new file with mode: 0644]
tests/topotests/bgp_bmp/bmp1import/bmp-update-pre-policy-step1.json [new file with mode: 0644]
tests/topotests/bgp_bmp/bmp1import/bmp-withdraw-loc-rib-step1.json [new file with mode: 0644]
tests/topotests/bgp_bmp/bmp1import/bmp-withdraw-loc-rib-step2.json [new file with mode: 0644]
tests/topotests/bgp_bmp/bmp1import/bmp-withdraw-post-policy-step1.json [new file with mode: 0644]
tests/topotests/bgp_bmp/bmp1import/bmp-withdraw-post-policy-step2.json [new file with mode: 0644]
tests/topotests/bgp_bmp/bmp1import/bmp-withdraw-pre-policy-step1.json [new file with mode: 0644]
tests/topotests/bgp_bmp/r1import/frr.conf [new file with mode: 0644]
tests/topotests/bgp_bmp/r1import/show-bgp-vrf1-ipv4-update-step1.json [new file with mode: 0644]
tests/topotests/bgp_bmp/r1import/show-bgp-vrf1-ipv4-withdraw-step1.json [new file with mode: 0644]
tests/topotests/bgp_bmp/r1import/show-bgp-vrf1-ipv6-update-step1.json [new file with mode: 0644]
tests/topotests/bgp_bmp/r1import/show-bgp-vrf1-ipv6-withdraw-step1.json [new file with mode: 0644]
tests/topotests/bgp_bmp/r3/frr.conf [new file with mode: 0644]
tests/topotests/bgp_bmp/test_bgp_bmp_3.py [new file with mode: 0644]

diff --git a/tests/topotests/bgp_bmp/bmp1import/bmp-update-loc-rib-step1.json b/tests/topotests/bgp_bmp/bmp1import/bmp-update-loc-rib-step1.json
new file mode 100644 (file)
index 0000000..3542f4e
--- /dev/null
@@ -0,0 +1,34 @@
+{
+    "loc-rib": {
+        "update": {
+            "172.31.0.77/32": {
+                "as_path": "",
+                "bgp_nexthop": "192.168.1.3",
+                "bmp_log_type": "update",
+                "ip_prefix": "172.31.0.77/32",
+                "is_filtered": false,
+                "origin": "IGP",
+                "peer_asn": 65501,
+                "peer_bgp_id": "192.168.0.1",
+                "peer_distinguisher": "444:1",
+                "peer_type": "loc-rib instance",
+                "policy": "loc-rib"
+            },
+            "2001::1125/128": {
+                "afi": 2,
+                "as_path": "",
+                "bmp_log_type": "update",
+                "ip_prefix": "2001::1125/128",
+                "is_filtered": false,
+                "nxhp_ip": "192:167::3",
+                "origin": "IGP",
+                "peer_asn": 65501,
+                "peer_bgp_id": "192.168.0.1",
+                "peer_distinguisher": "555:1",
+                "peer_type": "loc-rib instance",
+                "policy": "loc-rib",
+                "safi": 1
+            }
+        }
+    }
+}
diff --git a/tests/topotests/bgp_bmp/bmp1import/bmp-update-post-policy-step1.json b/tests/topotests/bgp_bmp/bmp1import/bmp-update-post-policy-step1.json
new file mode 100644 (file)
index 0000000..cf71f20
--- /dev/null
@@ -0,0 +1,36 @@
+{
+    "post-policy": {
+        "update": {
+            "172.31.0.77/32": {
+                "as_path": "",
+                "bgp_nexthop": "192.168.1.3",
+                "bmp_log_type": "update",
+                "ip_prefix": "172.31.0.77/32",
+                "ipv6": false,
+                "origin": "IGP",
+                "peer_asn": 65501,
+                "peer_bgp_id": "192.168.1.3",
+                "peer_distinguisher": "444:1",
+                "peer_ip": "192.168.1.3",
+                "peer_type": "route distinguisher instance",
+                "policy": "post-policy"
+            },
+            "2001::1125/128": {
+                "afi": 2,
+                "as_path": "",
+                "bmp_log_type": "update",
+                "ip_prefix": "2001::1125/128",
+                "ipv6": true,
+                "nxhp_ip": "192:167::3",
+                "origin": "IGP",
+                "peer_asn": 65501,
+                "peer_bgp_id": "192.168.1.3",
+                "peer_distinguisher": "555:1",
+                "peer_ip": "192:167::3",
+                "peer_type": "route distinguisher instance",
+                "policy": "post-policy",
+                "safi": 1
+            }
+        }
+    }
+}
diff --git a/tests/topotests/bgp_bmp/bmp1import/bmp-update-pre-policy-step1.json b/tests/topotests/bgp_bmp/bmp1import/bmp-update-pre-policy-step1.json
new file mode 100644 (file)
index 0000000..43273cc
--- /dev/null
@@ -0,0 +1,36 @@
+{
+    "pre-policy": {
+        "update": {
+            "172.31.0.77/32": {
+                "as_path": "",
+                "bgp_nexthop": "192.168.1.3",
+                "bmp_log_type": "update",
+                "ip_prefix": "172.31.0.77/32",
+                "ipv6": false,
+                "origin": "IGP",
+                "peer_asn": 65501,
+                "peer_bgp_id": "192.168.1.3",
+                "peer_distinguisher": "444:1",
+                "peer_ip": "192.168.1.3",
+                "peer_type": "route distinguisher instance",
+                "policy": "pre-policy"
+            },
+            "2001::1125/128": {
+                "afi": 2,
+                "as_path": "",
+                "bmp_log_type": "update",
+                "ip_prefix": "2001::1125/128",
+                "ipv6": true,
+                "nxhp_ip": "192:167::3",
+                "origin": "IGP",
+                "peer_asn": 65501,
+                "peer_bgp_id": "192.168.1.3",
+                "peer_distinguisher": "555:1",
+                "peer_ip": "192:167::3",
+                "peer_type": "route distinguisher instance",
+                "policy": "pre-policy",
+                "safi": 1
+            }
+        }
+    }
+}
diff --git a/tests/topotests/bgp_bmp/bmp1import/bmp-withdraw-loc-rib-step1.json b/tests/topotests/bgp_bmp/bmp1import/bmp-withdraw-loc-rib-step1.json
new file mode 100644 (file)
index 0000000..fcf5183
--- /dev/null
@@ -0,0 +1,28 @@
+{
+    "loc-rib": {
+        "withdraw": {
+            "172.31.0.77/32": {
+                "bmp_log_type": "withdraw",
+                "ip_prefix": "172.31.0.77/32",
+                "is_filtered": false,
+                "peer_asn": 65501,
+                "peer_bgp_id": "192.168.0.1",
+                "peer_distinguisher": "444:1",
+                "peer_type": "loc-rib instance",
+                "policy": "loc-rib"
+            },
+            "2001::1125/128": {
+                "afi": 2,
+                "bmp_log_type": "withdraw",
+                "ip_prefix": "2001::1125/128",
+                "is_filtered": false,
+                "peer_asn": 65501,
+                "peer_bgp_id": "192.168.0.1",
+                "peer_distinguisher": "555:1",
+                "peer_type": "loc-rib instance",
+                "policy": "loc-rib",
+                "safi": 1
+            }
+        }
+    }
+}
diff --git a/tests/topotests/bgp_bmp/bmp1import/bmp-withdraw-loc-rib-step2.json b/tests/topotests/bgp_bmp/bmp1import/bmp-withdraw-loc-rib-step2.json
new file mode 100644 (file)
index 0000000..1e5040b
--- /dev/null
@@ -0,0 +1,34 @@
+{
+    "loc-rib": {
+        "withdraw": {
+            "172.31.0.15/32": {
+                "afi": 1,
+                "bmp_log_type": "withdraw",
+                "ip_prefix": "172.31.0.15/32",
+                "is_filtered": false,
+                "label": 0,
+                "peer_asn": 65501,
+                "peer_bgp_id": "192.168.0.1",
+                "peer_distinguisher": "0:0",
+                "peer_type": "loc-rib instance",
+                "policy": "loc-rib",
+                "rd": "444:2",
+                "safi": 128
+            },
+            "2001::1111/128": {
+                "afi": 2,
+                "bmp_log_type": "withdraw",
+                "ip_prefix": "2001::1111/128",
+                "is_filtered": false,
+                "label": 0,
+                "peer_asn": 65501,
+                "peer_bgp_id": "192.168.0.1",
+                "peer_distinguisher": "0:0",
+                "peer_type": "loc-rib instance",
+                "policy": "loc-rib",
+                "rd": "555:2",
+                "safi": 128
+            }
+        }
+    }
+}
diff --git a/tests/topotests/bgp_bmp/bmp1import/bmp-withdraw-post-policy-step1.json b/tests/topotests/bgp_bmp/bmp1import/bmp-withdraw-post-policy-step1.json
new file mode 100644 (file)
index 0000000..6626e91
--- /dev/null
@@ -0,0 +1,30 @@
+{
+    "post-policy": {
+        "withdraw": {
+            "172.31.0.77/32": {
+                "bmp_log_type": "withdraw",
+                "ip_prefix": "172.31.0.77/32",
+                "ipv6": false,
+                "peer_asn": 65501,
+                "peer_bgp_id": "192.168.1.3",
+                "peer_distinguisher": "444:1",
+                "peer_ip": "192.168.1.3",
+                "peer_type": "route distinguisher instance",
+                "policy": "post-policy"
+            },
+            "2001::1125/128": {
+                "afi": 2,
+                "bmp_log_type": "withdraw",
+                "ip_prefix": "2001::1125/128",
+                "ipv6": true,
+                "peer_asn": 65501,
+                "peer_bgp_id": "192.168.1.3",
+                "peer_distinguisher": "555:1",
+                "peer_ip": "192:167::3",
+                "peer_type": "route distinguisher instance",
+                "policy": "post-policy",
+                "safi": 1
+            }
+        }
+    }
+}
diff --git a/tests/topotests/bgp_bmp/bmp1import/bmp-withdraw-post-policy-step2.json b/tests/topotests/bgp_bmp/bmp1import/bmp-withdraw-post-policy-step2.json
new file mode 100644 (file)
index 0000000..9eb221d
--- /dev/null
@@ -0,0 +1,36 @@
+{
+    "post-policy": {
+        "withdraw": {
+            "2001::1111/128": {
+                "afi": 2,
+                "bmp_log_type": "withdraw",
+                "ip_prefix": "2001::1111/128",
+                "ipv6": true,
+                "label": 0,
+                "peer_asn": 65502,
+                "peer_bgp_id": "192.168.0.2",
+                "peer_distinguisher": "0:0",
+                "peer_ip": "192:168::2",
+                "peer_type": "global instance",
+                "policy": "post-policy",
+                "rd": "555:2",
+                "safi": 128
+            },
+            "172.31.0.15/32": {
+                "afi": 1,
+                "bmp_log_type": "withdraw",
+                "ip_prefix": "172.31.0.15/32",
+                "ipv6": false,
+                "label": 0,
+                "peer_asn": 65502,
+                "peer_bgp_id": "192.168.0.2",
+                "peer_distinguisher": "0:0",
+                "peer_ip": "192.168.0.2",
+                "peer_type": "global instance",
+                "policy": "post-policy",
+                "rd": "444:2",
+                "safi": 128
+            }
+        }
+    }
+}
diff --git a/tests/topotests/bgp_bmp/bmp1import/bmp-withdraw-pre-policy-step1.json b/tests/topotests/bgp_bmp/bmp1import/bmp-withdraw-pre-policy-step1.json
new file mode 100644 (file)
index 0000000..d3fb1b7
--- /dev/null
@@ -0,0 +1,30 @@
+{
+    "pre-policy": {
+        "withdraw": {
+            "172.31.0.77/32": {
+                "bmp_log_type": "withdraw",
+                "ip_prefix": "172.31.0.77/32",
+                "ipv6": false,
+                "peer_asn": 65501,
+                "peer_bgp_id": "192.168.1.3",
+                "peer_distinguisher": "444:1",
+                "peer_ip": "192.168.1.3",
+                "peer_type": "route distinguisher instance",
+                "policy": "pre-policy"
+            },
+            "2001::1125/128": {
+                "afi": 2,
+                "bmp_log_type": "withdraw",
+                "ip_prefix": "2001::1125/128",
+                "ipv6": true,
+                "peer_asn": 65501,
+                "peer_bgp_id": "192.168.1.3",
+                "peer_distinguisher": "555:1",
+                "peer_ip": "192:167::3",
+                "peer_type": "route distinguisher instance",
+                "policy": "pre-policy",
+                "safi": 1
+            }
+        }
+    }
+}
diff --git a/tests/topotests/bgp_bmp/r1import/frr.conf b/tests/topotests/bgp_bmp/r1import/frr.conf
new file mode 100644 (file)
index 0000000..bec4eb0
--- /dev/null
@@ -0,0 +1,73 @@
+interface r1import-eth0
+ ip address 192.0.2.1/24
+!
+interface r1import-eth1
+ ip address 192.168.0.1/24
+ ipv6 address 192:168::1/64
+!
+interface r1import-eth2
+ ip address 192.168.1.1/24
+ ipv6 address 192:167::1/64
+!
+router bgp 65501
+ bgp router-id 192.168.0.1
+ bgp log-neighbor-changes
+ no bgp ebgp-requires-policy
+ neighbor 192.168.0.2 remote-as 65502
+ neighbor 192:168::2 remote-as 65502
+!
+ bmp targets bmp1
+  bmp connect 192.0.2.10 port 1789 min-retry 100 max-retry 10000
+   bmp monitor ipv4 unicast pre-policy
+   bmp monitor ipv6 unicast pre-policy
+   bmp monitor ipv4 unicast post-policy
+   bmp monitor ipv6 unicast post-policy
+   bmp monitor ipv4 unicast loc-rib
+   bmp monitor ipv6 unicast loc-rib
+   bmp import-vrf-view vrf1
+ exit
+!
+ address-family ipv4 vpn
+  neighbor 192.168.0.2 activate
+  neighbor 192.168.0.2 soft-reconfiguration inbound
+ exit-address-family
+ address-family ipv6 vpn
+  neighbor 192:168::2 activate
+  neighbor 192:168::2 soft-reconfiguration inbound
+ exit-address-family
+ address-family ipv4 unicast
+  neighbor 192.168.0.2 activate
+  neighbor 192.168.0.2 soft-reconfiguration inbound
+  no neighbor 192:168::2 activate
+ exit-address-family
+!
+ address-family ipv6 unicast
+  neighbor 192:168::2 activate
+  neighbor 192:168::2 soft-reconfiguration inbound
+ exit-address-family
+!
+router bgp 65501 vrf vrf1
+ bgp router-id 192.168.0.1
+ bgp log-neighbor-changes
+ neighbor 192.168.1.3 remote-as 65501
+ neighbor 192:167::3 remote-as 65501
+ address-family ipv4 unicast
+  neighbor 192.168.1.3 activate
+  neighbor 192.168.1.3 soft-reconfiguration inbound
+  no neighbor 192:167::3 activate
+  label vpn export 101
+  rd vpn export 444:1
+  rt vpn both 52:100
+  export vpn
+  import vpn
+  exit-address-family
+ address-family ipv6 unicast
+  neighbor 192:167::3 activate
+  neighbor 192:167::3 soft-reconfiguration inbound
+  label vpn export 103
+  rd vpn export 555:1
+  rt vpn both 54:200
+  export vpn
+  import vpn
+  exit-address-family
+exit
diff --git a/tests/topotests/bgp_bmp/r1import/show-bgp-vrf1-ipv4-update-step1.json b/tests/topotests/bgp_bmp/r1import/show-bgp-vrf1-ipv4-update-step1.json
new file mode 100644 (file)
index 0000000..c21a586
--- /dev/null
@@ -0,0 +1,21 @@
+{
+    "routes": {
+        "172.31.0.77/32": [
+            {
+                "bestpath": true,
+                "pathFrom": "internal",
+                "path": "",
+                "origin": "IGP",
+                "nexthops": [
+                    {
+                        "ip": "192.168.1.3",
+                        "hostname": "r3",
+                        "afi": "ipv4",
+                        "used": true
+                    }
+                ]
+            }
+        ]
+    }
+}
+
diff --git a/tests/topotests/bgp_bmp/r1import/show-bgp-vrf1-ipv4-withdraw-step1.json b/tests/topotests/bgp_bmp/r1import/show-bgp-vrf1-ipv4-withdraw-step1.json
new file mode 100644 (file)
index 0000000..154bef7
--- /dev/null
@@ -0,0 +1,6 @@
+{
+    "routes": {
+        "172.31.0.77/32": null
+    }
+}
+
diff --git a/tests/topotests/bgp_bmp/r1import/show-bgp-vrf1-ipv6-update-step1.json b/tests/topotests/bgp_bmp/r1import/show-bgp-vrf1-ipv6-update-step1.json
new file mode 100644 (file)
index 0000000..14df5ec
--- /dev/null
@@ -0,0 +1,27 @@
+{
+    "routes": {
+        "2001::1125/128": [
+            {
+                "bestpath": true,
+                "pathFrom": "internal",
+                "path": "",
+                "origin": "IGP",
+                "nexthops": [
+                    {
+                        "ip": "192:167::3",
+                        "hostname": "r3",
+                        "afi": "ipv6",
+                        "scope": "global"
+                    },
+                    {
+                        "hostname": "r3",
+                        "afi": "ipv6",
+                        "scope": "link-local",
+                        "used": true
+                    }
+                ]
+            }
+        ]
+    }
+}
+
diff --git a/tests/topotests/bgp_bmp/r1import/show-bgp-vrf1-ipv6-withdraw-step1.json b/tests/topotests/bgp_bmp/r1import/show-bgp-vrf1-ipv6-withdraw-step1.json
new file mode 100644 (file)
index 0000000..7c7a95e
--- /dev/null
@@ -0,0 +1,6 @@
+{
+    "routes": {
+        "2001::1125/128": null
+    }
+}
+
diff --git a/tests/topotests/bgp_bmp/r3/frr.conf b/tests/topotests/bgp_bmp/r3/frr.conf
new file mode 100644 (file)
index 0000000..145e156
--- /dev/null
@@ -0,0 +1,18 @@
+interface r3-eth0
+ ip address 192.168.1.3/24
+ ipv6 address 192:167::3/64
+!
+router bgp 65501
+ bgp router-id 192.168.1.3
+ bgp log-neighbor-changes
+ no bgp network import-check
+ neighbor 192.168.1.1 remote-as 65501
+ neighbor 192:167::1 remote-as 65501
+ address-family ipv4 unicast
+  neighbor 192.168.1.1 activate
+  no neighbor 192:167::1 activate
+  exit-address-family
+ address-family ipv6 unicast
+  neighbor 192:167::1 activate
+  exit-address-family
+exit
diff --git a/tests/topotests/bgp_bmp/test_bgp_bmp_3.py b/tests/topotests/bgp_bmp/test_bgp_bmp_3.py
new file mode 100644 (file)
index 0000000..0d2bf18
--- /dev/null
@@ -0,0 +1,267 @@
+#!/usr/bin/env python
+# SPDX-License-Identifier: ISC
+
+# Copyright 2024 6WIND S.A.
+#
+
+"""
+test_bgp_bmp.py_3: Test BGP BMP functionalities
+
+    +------+            +------+               +------+
+    |      |            |      |               |      |
+    | BMP1 |------------|  R1  |---------------|  R2  |
+    |      |            |      |               |      |
+    +------+            +--+---+               +------+
+                           |
+                        +--+---+
+                        |      |
+                        |  R3  |
+                        |      |
+                        +------+
+
+Setup two routers R1 and R2 with one link configured with IPv4 and
+IPv6 addresses.
+Configure BGP in R1 and R2 to exchange prefixes from
+the latter to the first router.
+Setup a link between R1 and the BMP server, activate the BMP feature in R1
+and ensure the monitored BGP sessions logs are well present on the BMP server.
+"""
+
+from functools import partial
+import json
+import os
+import pytest
+import sys
+
+# Save the Current Working Directory to find configuration files.
+CWD = os.path.dirname(os.path.realpath(__file__))
+sys.path.append(os.path.join("../"))
+sys.path.append(os.path.join("../lib/"))
+
+# pylint: disable=C0413
+# Import topogen and topotest helpers
+from lib import topotest
+from lib.bgp import verify_bgp_convergence_from_running_config
+from lib.bgp import bgp_configure_prefixes
+from .bgpbmp import (
+    bmp_check_for_prefixes,
+    bmp_check_for_peer_message,
+    bmp_update_seq,
+    bmp_reset_seq,
+)
+from lib.topogen import Topogen, TopoRouter, get_topogen
+from lib.topolog import logger
+
+pytestmark = [pytest.mark.bgpd]
+
+PRE_POLICY = "pre-policy"
+POST_POLICY = "post-policy"
+LOC_RIB = "loc-rib"
+
+UPDATE_EXPECTED_JSON = False
+DEBUG_PCAP = False
+
+
+def build_topo(tgen):
+    tgen.add_router("r1import")
+    tgen.add_router("r2")
+    tgen.add_router("r3")  # CPE behind r1
+
+    tgen.add_bmp_server("bmp1import", ip="192.0.2.10", defaultRoute="via 192.0.2.1")
+
+    switch = tgen.add_switch("s1")
+    switch.add_link(tgen.gears["r1import"])
+    switch.add_link(tgen.gears["bmp1import"])
+
+    tgen.add_link(tgen.gears["r1import"], tgen.gears["r2"], "r1import-eth1", "r2-eth0")
+    tgen.add_link(tgen.gears["r1import"], tgen.gears["r3"], "r1import-eth2", "r3-eth0")
+
+
+def setup_module(mod):
+    tgen = Topogen(build_topo, mod.__name__)
+    tgen.start_topology()
+
+    tgen.net["r1import"].cmd(
+        """
+ip link add vrf1 type vrf table 10
+ip link set vrf1 up
+ip link set r1import-eth2 master vrf1
+        """
+    )
+
+    bmp_reset_seq()
+    if DEBUG_PCAP:
+        tgen.gears["r1import"].run("rm /tmp/bmp.pcap")
+        tgen.gears["r1import"].run(
+            "tcpdump -nni r1import-eth0 -s 0 -w /tmp/bmp.pcap &", stdout=None
+        )
+
+    for rname, router in tgen.routers().items():
+        logger.info("Loading router %s" % rname)
+        router.load_frr_config(
+            os.path.join(CWD, "{}/frr.conf".format(rname)),
+            [(TopoRouter.RD_ZEBRA, None), (TopoRouter.RD_BGP, "-M bmp")],
+        )
+
+    tgen.start_router()
+
+    logger.info("starting BMP servers")
+    for bmp_name, server in tgen.get_bmp_servers().items():
+        server.start(log_file=os.path.join(tgen.logdir, bmp_name, "bmp.log"))
+
+
+def teardown_module(_mod):
+    tgen = get_topogen()
+    tgen.stop_topology()
+
+
+def test_bgp_convergence():
+    tgen = get_topogen()
+    if tgen.routers_have_failure():
+        pytest.skip(tgen.errors)
+
+    result = verify_bgp_convergence_from_running_config(tgen, dut="r1import")
+    assert result is True, "BGP is not converging"
+
+
+def _test_prefixes(policy, vrf=None, step=0):
+    """
+    Setup the BMP  monitor policy, Add and withdraw ipv4/v6 prefixes.
+    Check if the previous actions are logged in the BMP server with the right
+    message type and the right policy.
+    """
+    tgen = get_topogen()
+
+    safi = "vpn" if vrf else "unicast"
+
+    prefixes = ["172.31.0.77/32", "2001::1125/128"]
+
+    for type in ("update", "withdraw"):
+        bmp_update_seq(
+            tgen.gears["bmp1import"], os.path.join(tgen.logdir, "bmp1import", "bmp.log")
+        )
+
+        bgp_configure_prefixes(
+            tgen.gears["r3"],
+            65501,
+            "unicast",
+            prefixes,
+            vrf=None,
+            update=(type == "update"),
+        )
+
+        logger.info(f"checking for prefixes {type}")
+
+        for ipver in [4, 6]:
+            if UPDATE_EXPECTED_JSON:
+                continue
+            ref_file = "{}/r1import/show-bgp-{}-ipv{}-{}-step{}.json".format(
+                CWD, vrf, ipver, type, step
+            )
+            expected = json.loads(open(ref_file).read())
+
+            test_func = partial(
+                topotest.router_json_cmp,
+                tgen.gears["r1import"],
+                f"show bgp vrf {vrf} ipv{ipver} json",
+                expected,
+            )
+            _, res = topotest.run_and_expect(test_func, None, count=30, wait=1)
+            assertmsg = f"r1: BGP IPv{ipver} convergence failed"
+            assert res is None, assertmsg
+
+        # check
+        test_func = partial(
+            bmp_check_for_prefixes,
+            prefixes,
+            type,
+            policy,
+            step,
+            tgen.gears["bmp1import"],
+            os.path.join(tgen.logdir, "bmp1import"),
+            tgen.gears["r1import"],
+            f"{CWD}/bmp1import",
+            UPDATE_EXPECTED_JSON,
+            LOC_RIB,
+        )
+        success, res = topotest.run_and_expect(test_func, None, count=30, wait=1)
+        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():
+    """
+    Checking for BMP peers up messages
+    """
+
+    tgen = get_topogen()
+    peers = ["0.0.0.0", "192.168.1.3", "192:167::3"]
+
+    logger.info("checking for BMP peers up messages")
+
+    test_func = partial(
+        bmp_check_for_peer_message,
+        peers,
+        "peer up",
+        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 updated prefixes has been failed !."
+
+
+def test_bmp_bgp_unicast():
+    """
+    Add/withdraw bgp unicast prefixes and check the bmp logs.
+    """
+    logger.info("*** Unicast prefixes pre-policy logging ***")
+    _test_prefixes(PRE_POLICY, vrf="vrf1", step=1)
+    logger.info("*** Unicast prefixes post-policy logging ***")
+    _test_prefixes(POST_POLICY, vrf="vrf1", step=1)
+    logger.info("*** Unicast prefixes loc-rib logging ***")
+    _test_prefixes(LOC_RIB, vrf="vrf1", step=1)
+
+
+def test_peer_down():
+    """
+    Checking for BMP peers down messages
+    """
+    tgen = get_topogen()
+
+    tgen.gears["r3"].vtysh_cmd("clear bgp *")
+
+    peers = ["192.168.1.3", "192:167::3"]
+
+    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 updated prefixes has been failed !."
+
+
+if __name__ == "__main__":
+    args = ["-s"] + sys.argv[1:]
+    sys.exit(pytest.main(args))