summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/topotests/bgp_bmp/bmp1import/bmp-update-loc-rib-step1.json34
-rw-r--r--tests/topotests/bgp_bmp/bmp1import/bmp-update-loc-rib-step2.json34
-rw-r--r--tests/topotests/bgp_bmp/bmp1import/bmp-update-post-policy-step1.json36
-rw-r--r--tests/topotests/bgp_bmp/bmp1import/bmp-update-post-policy-step2.json36
-rw-r--r--tests/topotests/bgp_bmp/bmp1import/bmp-update-pre-policy-step1.json36
-rw-r--r--tests/topotests/bgp_bmp/bmp1import/bmp-update-pre-policy-step2.json36
-rw-r--r--tests/topotests/bgp_bmp/bmp1import/bmp-withdraw-loc-rib-step1.json28
-rw-r--r--tests/topotests/bgp_bmp/bmp1import/bmp-withdraw-loc-rib-step2.json34
-rw-r--r--tests/topotests/bgp_bmp/bmp1import/bmp-withdraw-post-policy-step1.json30
-rw-r--r--tests/topotests/bgp_bmp/bmp1import/bmp-withdraw-pre-policy-step1.json30
-rw-r--r--tests/topotests/bgp_bmp/r1import/frr.conf73
-rw-r--r--tests/topotests/bgp_bmp/r1import/show-bgp-vrf1-ipv4-update-step1.json21
-rw-r--r--tests/topotests/bgp_bmp/r1import/show-bgp-vrf1-ipv4-withdraw-step1.json6
-rw-r--r--tests/topotests/bgp_bmp/r1import/show-bgp-vrf1-ipv6-update-step1.json27
-rw-r--r--tests/topotests/bgp_bmp/r1import/show-bgp-vrf1-ipv6-withdraw-step1.json6
-rw-r--r--tests/topotests/bgp_bmp/r3/frr.conf18
-rw-r--r--tests/topotests/bgp_bmp/test_bgp_bmp_3.py567
-rw-r--r--tests/topotests/bgp_vpnv4_import_allowas_in_between_vrf/__init__.py0
-rw-r--r--tests/topotests/bgp_vpnv4_import_allowas_in_between_vrf/r1/frr.conf35
-rw-r--r--tests/topotests/bgp_vpnv4_import_allowas_in_between_vrf/r2/frr.conf48
-rw-r--r--tests/topotests/bgp_vpnv4_import_allowas_in_between_vrf/test_bgp_vpnv4_import_allowas_in_between_vrf.py142
-rwxr-xr-xtests/topotests/conftest.py2
-rw-r--r--tests/topotests/mgmt_notif/r1/frr.conf2
-rw-r--r--tests/topotests/mgmt_notif/r2/frr.conf2
-rw-r--r--tests/topotests/mgmt_notif/test_notif.py228
-rw-r--r--tests/topotests/pim_mrib/r1/frr.conf3
-rw-r--r--tests/topotests/pim_mrib/r2/frr.conf1
-rw-r--r--tests/topotests/pim_mrib/r3/frr.conf1
-rw-r--r--tests/topotests/pim_mrib/r4/frr.conf14
-rw-r--r--tests/topotests/pim_mrib/test_pim_mrib.py965
30 files changed, 2443 insertions, 52 deletions
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
index 0000000000..3542f4e495
--- /dev/null
+++ b/tests/topotests/bgp_bmp/bmp1import/bmp-update-loc-rib-step1.json
@@ -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-loc-rib-step2.json b/tests/topotests/bgp_bmp/bmp1import/bmp-update-loc-rib-step2.json
new file mode 100644
index 0000000000..60066d502c
--- /dev/null
+++ b/tests/topotests/bgp_bmp/bmp1import/bmp-update-loc-rib-step2.json
@@ -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": "666:22",
+ "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": "666:22",
+ "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
index 0000000000..cf71f20485
--- /dev/null
+++ b/tests/topotests/bgp_bmp/bmp1import/bmp-update-post-policy-step1.json
@@ -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-post-policy-step2.json b/tests/topotests/bgp_bmp/bmp1import/bmp-update-post-policy-step2.json
new file mode 100644
index 0000000000..b555c2a371
--- /dev/null
+++ b/tests/topotests/bgp_bmp/bmp1import/bmp-update-post-policy-step2.json
@@ -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": "666:22",
+ "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": "666:22",
+ "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
index 0000000000..43273cc93a
--- /dev/null
+++ b/tests/topotests/bgp_bmp/bmp1import/bmp-update-pre-policy-step1.json
@@ -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-update-pre-policy-step2.json b/tests/topotests/bgp_bmp/bmp1import/bmp-update-pre-policy-step2.json
new file mode 100644
index 0000000000..20549926d5
--- /dev/null
+++ b/tests/topotests/bgp_bmp/bmp1import/bmp-update-pre-policy-step2.json
@@ -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": "666:22",
+ "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": "666:22",
+ "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
index 0000000000..fcf518390d
--- /dev/null
+++ b/tests/topotests/bgp_bmp/bmp1import/bmp-withdraw-loc-rib-step1.json
@@ -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
index 0000000000..1e5040ba60
--- /dev/null
+++ b/tests/topotests/bgp_bmp/bmp1import/bmp-withdraw-loc-rib-step2.json
@@ -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
index 0000000000..6626e91361
--- /dev/null
+++ b/tests/topotests/bgp_bmp/bmp1import/bmp-withdraw-post-policy-step1.json
@@ -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-pre-policy-step1.json b/tests/topotests/bgp_bmp/bmp1import/bmp-withdraw-pre-policy-step1.json
new file mode 100644
index 0000000000..d3fb1b7ba1
--- /dev/null
+++ b/tests/topotests/bgp_bmp/bmp1import/bmp-withdraw-pre-policy-step1.json
@@ -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
index 0000000000..bec4eb01c7
--- /dev/null
+++ b/tests/topotests/bgp_bmp/r1import/frr.conf
@@ -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
index 0000000000..c21a586c3b
--- /dev/null
+++ b/tests/topotests/bgp_bmp/r1import/show-bgp-vrf1-ipv4-update-step1.json
@@ -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
index 0000000000..154bef7995
--- /dev/null
+++ b/tests/topotests/bgp_bmp/r1import/show-bgp-vrf1-ipv4-withdraw-step1.json
@@ -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
index 0000000000..14df5ec931
--- /dev/null
+++ b/tests/topotests/bgp_bmp/r1import/show-bgp-vrf1-ipv6-update-step1.json
@@ -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
index 0000000000..7c7a95e33e
--- /dev/null
+++ b/tests/topotests/bgp_bmp/r1import/show-bgp-vrf1-ipv6-withdraw-step1.json
@@ -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
index 0000000000..145e156b11
--- /dev/null
+++ b/tests/topotests/bgp_bmp/r3/frr.conf
@@ -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
index 0000000000..212cf9e696
--- /dev/null
+++ b/tests/topotests/bgp_bmp/test_bgp_bmp_3.py
@@ -0,0 +1,567 @@
+#!/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_syncro(policy, vrf=None, step=1):
+ """
+ Check that the given policy has syncronised the previously received BGP
+ updates.
+ """
+ tgen = get_topogen()
+
+ prefixes = ["172.31.0.77/32", "2001::1125/128"]
+ # check
+ test_func = partial(
+ bmp_check_for_prefixes,
+ prefixes,
+ "update",
+ 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_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_peer_up(check_locrib=True):
+ """
+ Checking for BMP peers up messages
+ """
+
+ tgen = get_topogen()
+ 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")
+
+ test_func = partial(
+ bmp_check_for_peer_message,
+ peers,
+ "peer up",
+ tgen.gears["bmp1import"],
+ os.path.join(tgen.logdir, "bmp1import", "bmp.log"),
+ is_rd_instance=True,
+ )
+ success, _ = topotest.run_and_expect(test_func, True, count=30, wait=1)
+ 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.
+ """
+ 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 !."
+
+
+def test_reconfigure_prefixes():
+ """
+ Reconfigured BGP networks from R3. Check for BGP VRF update messages
+ """
+
+ tgen = get_topogen()
+
+ prefixes = ["172.31.0.77/32", "2001::1125/128"]
+ bgp_configure_prefixes(
+ tgen.gears["r3"],
+ 65501,
+ "unicast",
+ prefixes,
+ vrf=None,
+ update=True,
+ )
+
+ for ipver in [4, 6]:
+ ref_file = "{}/r1import/show-bgp-{}-ipv{}-{}-step{}.json".format(
+ CWD, "vrf1", ipver, "update", 1
+ )
+ expected = json.loads(open(ref_file).read())
+
+ test_func = partial(
+ topotest.router_json_cmp,
+ tgen.gears["r1import"],
+ f"show bgp vrf vrf1 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
+
+
+def test_monitor_syncro():
+ """
+ Checking for BMP peers down messages
+ """
+ tgen = get_topogen()
+
+ tgen.gears["r1import"].vtysh_cmd(
+ """
+ configure terminal
+ router bgp 65501
+ bmp targets bmp1
+ bmp import-vrf-view vrf1
+ """
+ )
+
+ logger.info("*** Unicast prefixes pre-policy logging ***")
+ _test_prefixes_syncro(PRE_POLICY, vrf="vrf1")
+ logger.info("*** Unicast prefixes post-policy logging ***")
+ _test_prefixes_syncro(POST_POLICY, vrf="vrf1")
+ logger.info("*** Unicast prefixes loc-rib logging ***")
+ _test_prefixes_syncro(LOC_RIB, vrf="vrf1")
+
+
+def test_reconfigure_route_distinguisher_vrf1():
+ """
+ Checking for BMP peers down messages
+ """
+ tgen = get_topogen()
+
+ bmp_update_seq(
+ tgen.gears["bmp1import"], os.path.join(tgen.logdir, "bmp1import", "bmp.log")
+ )
+ peers = ["0.0.0.0"]
+
+ tgen.gears["r1import"].vtysh_cmd(
+ """
+ configure terminal
+ router bgp 65501 vrf vrf1
+ address-family ipv4 unicast
+ rd vpn export 666:22
+ exit-address-family
+ address-family ipv6 unicast
+ rd vpn export 666:22
+ """
+ )
+ logger.info(
+ "Checking for BMP peer down LOC-RIB message with route-distinguisher set to 444:1"
+ )
+ test_func = partial(
+ bmp_check_for_peer_message,
+ peers,
+ "peer down",
+ tgen.gears["bmp1import"],
+ os.path.join(tgen.logdir, "bmp1import", "bmp.log"),
+ is_rd_instance=True,
+ peer_distinguisher="444:1",
+ )
+ success, _ = topotest.run_and_expect(test_func, True, count=30, wait=1)
+ assert (
+ success
+ ), "Checking the BMP peer down LOC-RIB message with route-distinguisher set to 444:1 failed !."
+
+ logger.info(
+ "Checking for BMP peer up LOC-RIB messages with route-distinguisher set to 666:22"
+ )
+ test_func = partial(
+ bmp_check_for_peer_message,
+ peers,
+ "peer up",
+ tgen.gears["bmp1import"],
+ os.path.join(tgen.logdir, "bmp1import", "bmp.log"),
+ is_rd_instance=True,
+ peer_distinguisher="666:22",
+ )
+ success, _ = topotest.run_and_expect(test_func, True, count=30, wait=1)
+ assert (
+ success
+ ), "Checking the BMP peer up LOC-RIB message with route-distinguisher set to 666:22 failed !."
+
+ logger.info(
+ "Checking for BMP peer up messages with route-distinguisher set to 666:22"
+ )
+ peers = ["192.168.1.3", "192:167::3"]
+ test_func = partial(
+ bmp_check_for_peer_message,
+ peers,
+ "peer up",
+ tgen.gears["bmp1import"],
+ os.path.join(tgen.logdir, "bmp1import", "bmp.log"),
+ is_rd_instance=True,
+ peer_distinguisher="666:22",
+ )
+ success, _ = topotest.run_and_expect(test_func, True, count=30, wait=1)
+ assert (
+ success
+ ), "Checking the BMP peer up messages with route-distinguisher set to 666:22 failed !."
+
+ logger.info("*** Unicast prefixes pre-policy logging ***")
+ _test_prefixes_syncro(PRE_POLICY, vrf="vrf1", step=2)
+ logger.info("*** Unicast prefixes post-policy logging ***")
+ _test_prefixes_syncro(POST_POLICY, vrf="vrf1", step=2)
+ logger.info("*** Unicast prefixes loc-rib logging ***")
+ _test_prefixes_syncro(LOC_RIB, vrf="vrf1", step=2)
+
+
+def test_bgp_routerid_changed():
+ """
+ Checking for BGP loc-rib up messages with new router-id
+ """
+ tgen = get_topogen()
+
+ tgen.gears["r1import"].vtysh_cmd(
+ """
+ configure terminal
+ router bgp 65501 vrf vrf1
+ bgp router-id 192.168.1.77
+ """
+ )
+
+ peers = ["0.0.0.0"]
+
+ logger.info(
+ "checking for BMP peer down LOC-RIB message with router-id set to 192.168.0.1."
+ )
+ test_func = partial(
+ bmp_check_for_peer_message,
+ peers,
+ "peer down",
+ tgen.gears["bmp1import"],
+ os.path.join(tgen.logdir, "bmp1import", "bmp.log"),
+ is_rd_instance=True,
+ peer_bgp_id="192.168.0.1",
+ )
+ success, _ = topotest.run_and_expect(test_func, True, count=30, wait=1)
+ assert (
+ success
+ ), "Checking the BMP peer down LOC-RIB message with router-id set to 192.168.0.1 failed !."
+
+ logger.info(
+ "checking for BMP peer up LOC-RIB message with router-id set to 192.168.1.77."
+ )
+ test_func = partial(
+ bmp_check_for_peer_message,
+ peers,
+ "peer up",
+ tgen.gears["bmp1import"],
+ os.path.join(tgen.logdir, "bmp1import", "bmp.log"),
+ is_rd_instance=True,
+ peer_bgp_id="192.168.1.77",
+ )
+ success, _ = topotest.run_and_expect(test_func, True, count=30, wait=1)
+ assert (
+ success
+ ), "Checking the BMP peer up LOC-RIB message with router-id set to 192.168.1.77 failed !."
+
+
+def test_bgp_instance_flapping():
+ """
+ Checking for BGP loc-rib up messages
+ """
+ tgen = get_topogen()
+
+ # create flapping at BMP
+ # note: only peer up are handled at BMP level today
+ tgen.net["r1import"].cmd("ip link set dev vrf1 down")
+
+ peers = ["0.0.0.0"]
+
+ logger.info("checking for BMP peer down LOC-RIB message.")
+ test_func = partial(
+ bmp_check_for_peer_message,
+ peers,
+ "peer down",
+ tgen.gears["bmp1import"],
+ os.path.join(tgen.logdir, "bmp1import", "bmp.log"),
+ is_rd_instance=True,
+ )
+ success, _ = topotest.run_and_expect(test_func, True, count=30, wait=1)
+ assert success, "Checking the BMP peer down LOC-RIB message failed !."
+
+ tgen.net["r1import"].cmd("ip link set dev vrf1 up")
+
+ logger.info("checking for BMP peer up LOC-RIB message.")
+ test_func = partial(
+ bmp_check_for_peer_message,
+ peers,
+ "peer up",
+ tgen.gears["bmp1import"],
+ os.path.join(tgen.logdir, "bmp1import", "bmp.log"),
+ is_rd_instance=True,
+ )
+ success, _ = topotest.run_and_expect(test_func, True, count=30, wait=1)
+ 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))
diff --git a/tests/topotests/bgp_vpnv4_import_allowas_in_between_vrf/__init__.py b/tests/topotests/bgp_vpnv4_import_allowas_in_between_vrf/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/tests/topotests/bgp_vpnv4_import_allowas_in_between_vrf/__init__.py
diff --git a/tests/topotests/bgp_vpnv4_import_allowas_in_between_vrf/r1/frr.conf b/tests/topotests/bgp_vpnv4_import_allowas_in_between_vrf/r1/frr.conf
new file mode 100644
index 0000000000..428b1d992f
--- /dev/null
+++ b/tests/topotests/bgp_vpnv4_import_allowas_in_between_vrf/r1/frr.conf
@@ -0,0 +1,35 @@
+!
+interface r1-eth0
+ ip address 192.168.179.4/24
+exit
+!
+router bgp 65001
+!
+router bgp 65001 vrf CUSTOMER-A
+ bgp router-id 192.168.179.4
+ no bgp ebgp-requires-policy
+ no bgp network import-check
+ neighbor 192.168.179.5 remote-as external
+!
+ address-family ipv4 unicast
+ neighbor 192.168.179.5 next-hop-self
+ neighbor 192.168.179.5 allowas-in 10
+ label vpn export auto
+ rd vpn export 100:1
+ rt vpn both 100:1 100:2
+ export vpn
+ import vpn
+ exit-address-family
+!
+router bgp 65001 vrf CUSTOMER-B
+ bgp router-id 192.168.0.1
+ no bgp ebgp-requires-policy
+ no bgp network import-check
+!
+ address-family ipv4 unicast
+ label vpn export auto
+ rd vpn export 100:2
+ rt vpn import 100:1 100:2
+ export vpn
+ import vpn
+ exit-address-family
diff --git a/tests/topotests/bgp_vpnv4_import_allowas_in_between_vrf/r2/frr.conf b/tests/topotests/bgp_vpnv4_import_allowas_in_between_vrf/r2/frr.conf
new file mode 100644
index 0000000000..58e63d6cf0
--- /dev/null
+++ b/tests/topotests/bgp_vpnv4_import_allowas_in_between_vrf/r2/frr.conf
@@ -0,0 +1,48 @@
+!
+interface lo
+ ip address 10.10.10.10/32
+!
+interface r2-eth0
+ ip address 192.168.179.5/24
+exit
+!
+interface r2-eth1
+ ip address 192.168.2.2/24
+exit
+!
+router bgp 65002
+!
+router bgp 65002 vrf CUSTOMER-A
+ bgp router-id 192.168.179.5
+ no bgp ebgp-requires-policy
+ no bgp network import-check
+ neighbor 192.168.179.4 remote-as external
+!
+ address-family ipv4 unicast
+ neighbor 192.168.179.4 next-hop-self
+ neighbor 192.168.179.4 route-map r1 out
+ label vpn export auto
+ rd vpn export 100:1
+ rt vpn import 100:1 100:2
+ export vpn
+ import vpn
+ exit-address-family
+!
+router bgp 65002 vrf CUSTOMER-B
+ bgp router-id 192.168.0.2
+ no bgp ebgp-requires-policy
+ no bgp network import-check
+!
+ address-family ipv4 unicast
+ redistribute connected
+ network 10.10.10.10/32
+ label vpn export auto
+ rd vpn export 100:2
+ rt vpn both 100:2
+ export vpn
+ import vpn
+ exit-address-family
+!
+route-map r1 permit 10
+ set as-path prepend 65001
+!
diff --git a/tests/topotests/bgp_vpnv4_import_allowas_in_between_vrf/test_bgp_vpnv4_import_allowas_in_between_vrf.py b/tests/topotests/bgp_vpnv4_import_allowas_in_between_vrf/test_bgp_vpnv4_import_allowas_in_between_vrf.py
new file mode 100644
index 0000000000..23325c7a17
--- /dev/null
+++ b/tests/topotests/bgp_vpnv4_import_allowas_in_between_vrf/test_bgp_vpnv4_import_allowas_in_between_vrf.py
@@ -0,0 +1,142 @@
+#!/usr/bin/env python
+# SPDX-License-Identifier: ISC
+
+#
+# Copyright (c) 2024 by
+# Donatas Abraitis <donatas@opensourcerouting.org>
+#
+
+import os
+import sys
+import json
+import pytest
+import functools
+
+CWD = os.path.dirname(os.path.realpath(__file__))
+sys.path.append(os.path.join(CWD, "../"))
+
+# pylint: disable=C0413
+from lib import topotest
+from lib.topogen import Topogen, get_topogen
+
+pytestmark = [pytest.mark.bgpd]
+
+
+def build_topo(tgen):
+ tgen.add_router("r1")
+ tgen.add_router("r2")
+
+ switch = tgen.add_switch("s1")
+ switch.add_link(tgen.gears["r1"])
+ switch.add_link(tgen.gears["r2"])
+
+ switch = tgen.add_switch("s2")
+ switch.add_link(tgen.gears["r1"])
+
+ switch = tgen.add_switch("s3")
+ switch.add_link(tgen.gears["r2"])
+
+
+def setup_module(mod):
+ tgen = Topogen(build_topo, mod.__name__)
+ tgen.start_topology()
+
+ r1 = tgen.gears["r1"]
+ r2 = tgen.gears["r2"]
+
+ r1.run("ip link add CUSTOMER-A type vrf table 1001")
+ r1.run("ip link set up dev CUSTOMER-A")
+ r1.run("ip link set r1-eth0 master CUSTOMER-A")
+
+ r1.run("ip link add CUSTOMER-B type vrf table 1002")
+ r1.run("ip link set up dev CUSTOMER-B")
+ r1.run("ip link set r1-eth1 master CUSTOMER-B")
+
+ r2.run("ip link add CUSTOMER-A type vrf table 1001")
+ r2.run("ip link set up dev CUSTOMER-A")
+ r2.run("ip link set r2-eth0 master CUSTOMER-A")
+
+ r2.run("ip link add CUSTOMER-B type vrf table 1002")
+ r2.run("ip link set up dev CUSTOMER-B")
+ r2.run("ip link set r2-eth1 master CUSTOMER-B")
+
+ router_list = tgen.routers()
+
+ for _, (rname, router) in enumerate(router_list.items(), 1):
+ router.load_frr_config(os.path.join(CWD, "{}/frr.conf".format(rname)))
+
+ tgen.start_router()
+
+
+def teardown_module(mod):
+ tgen = get_topogen()
+ tgen.stop_topology()
+
+
+def test_bgp_vpnv4_import_allowas_in_between_vrf():
+ tgen = get_topogen()
+
+ if tgen.routers_have_failure():
+ pytest.skip(tgen.errors)
+
+ r1 = tgen.gears["r1"]
+
+ def _bgp_converge():
+ output = json.loads(
+ r1.vtysh_cmd("show bgp vrf CUSTOMER-A ipv4 unicast 10.10.10.10/32 json")
+ )
+ expected = {
+ "paths": [
+ {
+ "aspath": {
+ "string": "65002 65001",
+ },
+ "valid": True,
+ }
+ ]
+ }
+ return topotest.json_cmp(output, expected)
+
+ test_func = functools.partial(_bgp_converge)
+ _, result = topotest.run_and_expect(test_func, None, count=30, wait=1)
+ assert result is None, "Failed to see 10.10.10.10/32 with a valid next-hop"
+
+ def _vrf_route_imported_to_vrf():
+ output = json.loads(
+ r1.vtysh_cmd("show ip route vrf CUSTOMER-B 10.10.10.10/32 json")
+ )
+ expected = {
+ "10.10.10.10/32": [
+ {
+ "protocol": "bgp",
+ "vrfName": "CUSTOMER-B",
+ "selected": True,
+ "installed": True,
+ "table": 1002,
+ "internalNextHopNum": 1,
+ "internalNextHopActiveNum": 1,
+ "nexthops": [
+ {
+ "fib": True,
+ "ip": "192.168.179.5",
+ "afi": "ipv4",
+ "interfaceName": "r1-eth0",
+ "vrf": "CUSTOMER-A",
+ "active": True,
+ }
+ ],
+ }
+ ]
+ }
+ return topotest.json_cmp(output, expected)
+
+ test_func = functools.partial(_vrf_route_imported_to_vrf)
+ _, result = topotest.run_and_expect(test_func, None, count=30, wait=1)
+ assert (
+ result is None
+ ), "Failed to see 10.10.10.10/32 to be imported into CUSTOMER-B VRF (Zebra)"
+
+
+if __name__ == "__main__":
+ args = ["-s"] + sys.argv[1:]
+ sys.exit(pytest.main(args))
diff --git a/tests/topotests/conftest.py b/tests/topotests/conftest.py
index dafd19c283..117ff74e43 100755
--- a/tests/topotests/conftest.py
+++ b/tests/topotests/conftest.py
@@ -31,7 +31,7 @@ from lib import topolog, topotest
try:
# Used by munet native tests
- from munet.testing.fixtures import unet # pylint: disable=all # noqa
+ from munet.testing.fixtures import stepf, unet # pylint: disable=all # noqa
@pytest.fixture(scope="module")
def rundir_module(pytestconfig):
diff --git a/tests/topotests/mgmt_notif/r1/frr.conf b/tests/topotests/mgmt_notif/r1/frr.conf
index 47e73956cf..36981c94d3 100644
--- a/tests/topotests/mgmt_notif/r1/frr.conf
+++ b/tests/topotests/mgmt_notif/r1/frr.conf
@@ -4,7 +4,7 @@ log file frr.log
no debug memstats-at-exit
debug northbound notifications
-debug northbound libyang
+!! debug northbound libyang
debug northbound events
debug northbound callbacks
diff --git a/tests/topotests/mgmt_notif/r2/frr.conf b/tests/topotests/mgmt_notif/r2/frr.conf
index cd052011e0..540961a0e0 100644
--- a/tests/topotests/mgmt_notif/r2/frr.conf
+++ b/tests/topotests/mgmt_notif/r2/frr.conf
@@ -16,7 +16,7 @@ ip route 22.22.22.22/32 lo
interface r2-eth0
ip address 1.1.1.2/24
- ip rip authentication string bar
+ ip rip authentication string foo
ip rip authentication mode text
exit
diff --git a/tests/topotests/mgmt_notif/test_notif.py b/tests/topotests/mgmt_notif/test_notif.py
index e5286faae2..526f051e6b 100644
--- a/tests/topotests/mgmt_notif/test_notif.py
+++ b/tests/topotests/mgmt_notif/test_notif.py
@@ -10,9 +10,12 @@
Test YANG Notifications
"""
import json
+import logging
import os
+import re
import pytest
+from lib.micronet import Timeout, comm_error
from lib.topogen import Topogen
from lib.topotest import json_cmp
from oper import check_kernel_32
@@ -42,7 +45,57 @@ def tgen(request):
tgen.stop_topology()
-def test_frontend_notification(tgen):
+def myreadline(f):
+ buf = ""
+ while True:
+ # logging.debug("READING 1 CHAR")
+ c = f.read(1)
+ if not c:
+ return buf if buf else None
+ buf += c
+ # logging.debug("READ CHAR: '%s'", c)
+ if c == "\n":
+ return buf
+
+
+def _wait_output(f, regex, maxwait=120):
+ timeout = Timeout(maxwait)
+ while not timeout.is_expired():
+ # line = p.stdout.readline()
+ line = myreadline(f)
+ if not line:
+ assert None, "EOF waiting for '{}'".format(regex)
+ line = line.rstrip()
+ if line:
+ logging.debug("GOT LINE: '%s'", line)
+ m = re.search(regex, line)
+ if m:
+ return m
+ assert None, "Failed to get output matching '{}' withint {} actual {}s".format(
+ regex, maxwait, timeout.elapsed()
+ )
+
+
+def get_op_and_json(output):
+ op = ""
+ path = ""
+ data = ""
+ for line in output.split("\n"):
+ if not line:
+ continue
+ if not op:
+ m = re.match("#OP=([A-Z]*): (.*)", line)
+ if m:
+ op = m.group(1)
+ path = m.group(2)
+ continue
+ data += line + "\n"
+ if not op:
+ assert False, f"No notifcation op present in:\n{output}"
+ return op, path, data
+
+
+def test_frontend_datastore_notification(tgen):
if tgen.routers_have_failure():
pytest.skip(tgen.errors)
@@ -50,30 +103,141 @@ def test_frontend_notification(tgen):
check_kernel_32(r1, "11.11.11.11", 1, "")
- fe_client_path = CWD + "/../lib/fe_client.py --verbose"
+ fe_client_path = CWD + "/../lib/fe_client.py"
rc, _, _ = r1.cmd_status(fe_client_path + " --help")
if rc:
pytest.skip("No protoc or present cannot run test")
- # The first notifications is a frr-ripd:authentication-type-failure
- # So we filter to avoid that, all the rest are frr-ripd:authentication-failure
- # making our test deterministic
- output = r1.cmd_raises(
- fe_client_path + " --listen /frr-ripd:authentication-failure"
+ # Start our FE client in the background
+ p = r1.popen(
+ [fe_client_path, "--datastore", "--listen=/frr-interface:lib/interface"]
)
- jsout = json.loads(output)
+ _wait_output(p.stderr, "Connected", maxwait=10)
+
+ r1.cmd_raises("ip link set r1-eth0 mtu 1200")
+
+ # {"frr-interface:lib":{"interface":[{"name":"r1-eth0","state":{"if-index":2,"mtu":1200,"mtu6":1200,"speed":10000,"metric":0,"phy-address":"ba:fd:de:b5:8b:90"}}]}}
+
+ try:
+ # Wait for FE client to exit
+ output, error = p.communicate(timeout=10)
+ op, path, data = get_op_and_json(output)
+
+ assert op == "REPLACE"
+ assert path.startswith("/frr-interface:lib/interface[name='r1-eth0']/state")
+
+ jsout = json.loads(data)
+ expected = json.loads(
+ '{"frr-interface:lib":{"interface":[{"name":"r1-eth0","state":{"mtu":1200}}]}}'
+ )
+ result = json_cmp(jsout, expected)
+ assert result is None
+ finally:
+ p.kill()
+ r1.cmd_raises("ip link set r1-eth0 mtu 1500")
+
+
+def test_frontend_notification(tgen):
+ if tgen.routers_have_failure():
+ pytest.skip(tgen.errors)
+
+ r1 = tgen.gears["r1"].net
+
+ check_kernel_32(r1, "11.11.11.11", 1, "")
+
+ fe_client_path = CWD + "/../lib/fe_client.py"
+ rc, _, _ = r1.cmd_status(fe_client_path + " --help")
+
+ if rc:
+ pytest.skip("No protoc or present cannot run test")
+
+ # Update config to non-matching authentication.
+ conf = """
+ conf t
+ interface r1-eth0
+ ip rip authentication string bar
+ """
+ r1.cmd_raises("vtysh", stdin=conf)
+
+ try:
+ output = r1.cmd_raises(
+ fe_client_path + " --listen /frr-ripd:authentication-failure"
+ )
- expected = {"frr-ripd:authentication-failure": {"interface-name": "r1-eth0"}}
- result = json_cmp(jsout, expected)
- assert result is None
+ jsout = json.loads(output)
+ expected = {"frr-ripd:authentication-failure": {"interface-name": "r1-eth0"}}
+ result = json_cmp(jsout, expected)
+ assert result is None
- output = r1.cmd_raises(fe_client_path + " --use-protobuf --listen")
- jsout = json.loads(output)
+ output = r1.cmd_raises(
+ fe_client_path + " --use-protobuf --listen /frr-ripd:authentication-failure"
+ )
+ jsout = json.loads(output)
+ expected = {"frr-ripd:authentication-failure": {"interface-name": "r1-eth0"}}
+ result = json_cmp(jsout, expected)
+ assert result is None
+ finally:
+ # Update config to matching authentication.
+ conf = """
+ conf t
+ interface r1-eth0
+ ip rip authentication string foo
+ """
+ r1.cmd_raises("vtysh", stdin=conf)
- expected = {"frr-ripd:authentication-failure": {"interface-name": "r1-eth0"}}
- result = json_cmp(jsout, expected)
- assert result is None
+
+def test_frontend_all_notification(tgen):
+ if tgen.routers_have_failure():
+ pytest.skip(tgen.errors)
+
+ r1 = tgen.gears["r1"].net
+
+ check_kernel_32(r1, "11.11.11.11", 1, "")
+
+ fe_client_path = CWD + "/../lib/fe_client.py"
+ rc, _, _ = r1.cmd_status(fe_client_path + " --help")
+
+ if rc:
+ pytest.skip("No protoc or present cannot run test")
+
+ # Update config to non-matching authentication.
+ conf = """
+ conf t
+ interface r1-eth0
+ ip rip authentication string bar
+ """
+ r1.cmd_raises("vtysh", stdin=conf)
+
+ try:
+ # The first notifications is a frr-ripd:authentication-type-failure
+ # All the rest are frr-ripd:authentication-failure so we check for both.
+ output = r1.cmd_raises(fe_client_path + " --listen /")
+ jsout = json.loads(output)
+ expected = {
+ "frr-ripd:authentication-type-failure": {"interface-name": "r1-eth0"}
+ }
+ result = json_cmp(jsout, expected)
+ if result is not None:
+ expected = {
+ "frr-ripd:authentication-failure": {"interface-name": "r1-eth0"}
+ }
+ result = json_cmp(jsout, expected)
+ assert result is None
+
+ output = r1.cmd_raises(fe_client_path + " --use-protobuf --listen /")
+ jsout = json.loads(output)
+ expected = {"frr-ripd:authentication-failure": {"interface-name": "r1-eth0"}}
+ result = json_cmp(jsout, expected)
+ assert result is None
+ finally:
+ # Update config to matching authentication.
+ conf = """
+ conf t
+ interface r1-eth0
+ ip rip authentication string foo
+ """
+ r1.cmd_raises("vtysh", stdin=conf)
def test_backend_notification(tgen):
@@ -90,12 +254,28 @@ def test_backend_notification(tgen):
if rc:
pytest.skip("No mgmtd_testc")
- output = r1.cmd_raises(
- be_client_path + " --timeout 20 --log file:mgmt_testc.log --listen /frr-ripd"
- )
-
- jsout = json.loads(output)
+ # Update config to non-matching authentication.
+ conf = """
+ conf t
+ interface r1-eth0
+ ip rip authentication string bar
+ """
+ r1.cmd_raises("vtysh", stdin=conf)
- expected = {"frr-ripd:authentication-failure": {"interface-name": "r1-eth0"}}
- result = json_cmp(jsout, expected)
- assert result is None
+ try:
+ output = r1.cmd_raises(
+ be_client_path
+ + " --timeout 20 --log file:mgmt_testc.log --listen /frr-ripd"
+ )
+ jsout = json.loads(output)
+ expected = {"frr-ripd:authentication-failure": {"interface-name": "r1-eth0"}}
+ result = json_cmp(jsout, expected)
+ assert result is None
+ finally:
+ # Update config to matching authentication.
+ conf = """
+ conf t
+ interface r1-eth0
+ ip rip authentication string foo
+ """
+ r1.cmd_raises("vtysh", stdin=conf)
diff --git a/tests/topotests/pim_mrib/r1/frr.conf b/tests/topotests/pim_mrib/r1/frr.conf
index 28cf2b2c46..7c9d27c60b 100644
--- a/tests/topotests/pim_mrib/r1/frr.conf
+++ b/tests/topotests/pim_mrib/r1/frr.conf
@@ -20,9 +20,10 @@ interface r1-eth1
ip forwarding
!
ip route 10.0.2.0/24 10.0.0.2 50
-ip route 10.0.3.0/24 10.0.1.3 50
+ip route 10.0.3.0/24 10.0.0.2 50
!
router pim
rpf-lookup-mode mrib-then-urib
rp 10.0.0.1 224.0.0.0/4
+ rp 10.0.1.1 225.0.0.0/24
! \ No newline at end of file
diff --git a/tests/topotests/pim_mrib/r2/frr.conf b/tests/topotests/pim_mrib/r2/frr.conf
index 3e647f6795..260b6b0f72 100644
--- a/tests/topotests/pim_mrib/r2/frr.conf
+++ b/tests/topotests/pim_mrib/r2/frr.conf
@@ -25,4 +25,5 @@ ip route 10.0.3.0/24 10.0.2.4 50
router pim
rpf-lookup-mode mrib-then-urib
rp 10.0.0.1 224.0.0.0/4
+ rp 10.0.1.1 225.0.0.0/24
! \ No newline at end of file
diff --git a/tests/topotests/pim_mrib/r3/frr.conf b/tests/topotests/pim_mrib/r3/frr.conf
index 9815484d02..5966ae0e8c 100644
--- a/tests/topotests/pim_mrib/r3/frr.conf
+++ b/tests/topotests/pim_mrib/r3/frr.conf
@@ -25,4 +25,5 @@ ip route 10.0.2.0/24 10.0.3.4 50
router pim
rpf-lookup-mode mrib-then-urib
rp 10.0.0.1 224.0.0.0/4
+ rp 10.0.1.1 225.0.0.0/24
! \ No newline at end of file
diff --git a/tests/topotests/pim_mrib/r4/frr.conf b/tests/topotests/pim_mrib/r4/frr.conf
index 8432a7a350..8d9d8f7e2b 100644
--- a/tests/topotests/pim_mrib/r4/frr.conf
+++ b/tests/topotests/pim_mrib/r4/frr.conf
@@ -18,12 +18,24 @@ interface r4-eth1
ip igmp
ip pim
!
+interface r4-dum0
+ ip address 10.10.0.4/24
+ ip igmp
+ ip pim
+ ip pim passive
+!
ip forwarding
!
ip route 10.0.0.0/24 10.0.2.2 50
-ip route 10.0.1.0/24 10.0.3.3 50
+ip route 10.0.1.0/24 10.0.2.2 50
+!
+ip prefix-list SRCPLIST permit 10.0.0.1/32
+ip prefix-list SRCPLIST2 permit 10.0.1.1/32
+ip prefix-list GRPPLIST permit 239.1.1.1/32
+ip prefix-list GRPPLIST2 permit 239.2.2.2/32
!
router pim
rpf-lookup-mode mrib-then-urib
rp 10.0.0.1 224.0.0.0/4
+ rp 10.0.1.1 225.0.0.0/24
! \ No newline at end of file
diff --git a/tests/topotests/pim_mrib/test_pim_mrib.py b/tests/topotests/pim_mrib/test_pim_mrib.py
index 355c503e3b..2a391fa575 100644
--- a/tests/topotests/pim_mrib/test_pim_mrib.py
+++ b/tests/topotests/pim_mrib/test_pim_mrib.py
@@ -20,6 +20,8 @@ from lib.topogen import Topogen, get_topogen
from lib.topolog import logger
from lib.pim import (
verify_pim_rp_info,
+ verify_upstream_iif,
+ McastTesterHelper,
)
from lib.common_config import step, write_test_header
@@ -29,6 +31,8 @@ test_pim_mrib.py: Test PIM MRIB overrides and RPF modes
TOPOLOGY = """
Test PIM MRIB overrides and RPF modes
+ Static routes installed that uses R2 to get between R1 and R4.
+ Tests will install MRIB override through R3
+---+---+ +---+---+
| | 10.0.0.0/24 | |
@@ -42,7 +46,7 @@ TOPOLOGY = """
.3 | r3-eth0 r4-eth0 | .4
+---+---+ r3-eth1 r4-eth1 +---+---+
| | .3 .4 | |
- + R3 +----------------------+ R4 |
+ + R3 +----------------------+ R4 |---r4-dum0 10.10.0.4/24
| | 10.0.3.0/24 | |
+---+---+ +---+---+
"""
@@ -54,9 +58,12 @@ sys.path.append(os.path.join(CWD, "../"))
# Required to instantiate the topology builder class.
pytestmark = [pytest.mark.pimd]
+GROUP1 = "239.1.1.1"
+GROUP2 = "239.2.2.2"
+
def build_topo(tgen):
- '''Build function'''
+ """Build function"""
# Create routers
tgen.add_router("r1")
@@ -70,6 +77,8 @@ def build_topo(tgen):
tgen.add_link(tgen.gears["r2"], tgen.gears["r4"], "r2-eth1", "r4-eth0")
tgen.add_link(tgen.gears["r3"], tgen.gears["r4"], "r3-eth1", "r4-eth1")
+ tgen.gears["r4"].run("ip link add r4-dum0 type dummy")
+
def setup_module(mod):
logger.info("PIM MRIB/RPF functionality:\n {}".format(TOPOLOGY))
@@ -87,13 +96,13 @@ def setup_module(mod):
def teardown_module(mod):
- '''Teardown the pytest environment'''
+ """Teardown the pytest environment"""
tgen = get_topogen()
tgen.stop_topology()
def test_pim_mrib_init(request):
- '''Test boot in MRIB-than-URIB with the default MRIB'''
+ """Test boot in MRIB-than-URIB with the default MRIB"""
tgen = get_topogen()
tc_name = request.node.name
write_test_header(tc_name)
@@ -116,8 +125,23 @@ def test_pim_mrib_init(request):
)
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+ result = verify_pim_rp_info(
+ tgen,
+ None,
+ "r4",
+ "225.0.0.0/24",
+ "r4-eth0",
+ "10.0.1.1",
+ "Static",
+ False,
+ "ipv4",
+ True,
+ )
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+
+
def test_pim_mrib_override(request):
- '''Test MRIB override nexthop'''
+ """Test MRIB override nexthop"""
tgen = get_topogen()
tc_name = request.node.name
write_test_header(tc_name)
@@ -128,10 +152,11 @@ def test_pim_mrib_override(request):
# Install a MRIB route that has a shorter prefix length and lower cost.
# In MRIB-than-URIB mode, it should use this route
tgen.routers()["r4"].vtysh_cmd(
- '''
+ """
conf term
ip mroute 10.0.0.0/16 10.0.3.3 25
- '''
+ exit
+ """
)
step("Verify rp-info using MRIB nexthop")
@@ -149,8 +174,23 @@ def test_pim_mrib_override(request):
)
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+ result = verify_pim_rp_info(
+ tgen,
+ None,
+ "r4",
+ "225.0.0.0/24",
+ "r4-eth1",
+ "10.0.1.1",
+ "Static",
+ False,
+ "ipv4",
+ True,
+ )
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+
+
def test_pim_mrib_prefix_mode(request):
- '''Test longer prefix lookup mode'''
+ """Test longer prefix lookup mode"""
tgen = get_topogen()
tc_name = request.node.name
write_test_header(tc_name)
@@ -161,11 +201,13 @@ def test_pim_mrib_prefix_mode(request):
# Switch to longer prefix match, should switch back to the URIB route
# even with the lower cost, the longer prefix match will win because of the mode
tgen.routers()["r4"].vtysh_cmd(
- '''
+ """
conf term
router pim
rpf-lookup-mode longer-prefix
- '''
+ exit
+ exit
+ """
)
step("Verify rp-info using URIB nexthop")
@@ -183,8 +225,23 @@ def test_pim_mrib_prefix_mode(request):
)
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+ result = verify_pim_rp_info(
+ tgen,
+ None,
+ "r4",
+ "225.0.0.0/24",
+ "r4-eth0",
+ "10.0.1.1",
+ "Static",
+ False,
+ "ipv4",
+ True,
+ )
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+
+
def test_pim_mrib_dist_mode(request):
- '''Test lower distance lookup mode'''
+ """Test lower distance lookup mode"""
tgen = get_topogen()
tc_name = request.node.name
write_test_header(tc_name)
@@ -194,11 +251,13 @@ def test_pim_mrib_dist_mode(request):
# Switch to lower distance match, should switch back to the MRIB route
tgen.routers()["r4"].vtysh_cmd(
- '''
+ """
conf term
router pim
rpf-lookup-mode lower-distance
- '''
+ exit
+ exit
+ """
)
step("Verify rp-info using MRIB nexthop")
@@ -216,8 +275,23 @@ def test_pim_mrib_dist_mode(request):
)
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+ result = verify_pim_rp_info(
+ tgen,
+ None,
+ "r4",
+ "225.0.0.0/24",
+ "r4-eth1",
+ "10.0.1.1",
+ "Static",
+ False,
+ "ipv4",
+ True,
+ )
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+
+
def test_pim_mrib_urib_mode(request):
- '''Test URIB only lookup mode'''
+ """Test URIB only lookup mode"""
tgen = get_topogen()
tc_name = request.node.name
write_test_header(tc_name)
@@ -227,11 +301,13 @@ def test_pim_mrib_urib_mode(request):
# Switch to urib only match, should switch back to the URIB route
tgen.routers()["r4"].vtysh_cmd(
- '''
+ """
conf term
router pim
rpf-lookup-mode urib-only
- '''
+ exit
+ exit
+ """
)
step("Verify rp-info using URIB nexthop")
@@ -249,8 +325,23 @@ def test_pim_mrib_urib_mode(request):
)
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+ result = verify_pim_rp_info(
+ tgen,
+ None,
+ "r4",
+ "225.0.0.0/24",
+ "r4-eth0",
+ "10.0.1.1",
+ "Static",
+ False,
+ "ipv4",
+ True,
+ )
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+
+
def test_pim_mrib_mrib_mode(request):
- '''Test MRIB only lookup mode'''
+ """Test MRIB only lookup mode"""
tgen = get_topogen()
tc_name = request.node.name
write_test_header(tc_name)
@@ -260,11 +351,13 @@ def test_pim_mrib_mrib_mode(request):
# Switch to mrib only match, should switch back to the MRIB route
tgen.routers()["r4"].vtysh_cmd(
- '''
+ """
conf term
router pim
rpf-lookup-mode mrib-only
- '''
+ exit
+ exit
+ """
)
step("Verify rp-info using MRIB nexthop")
@@ -282,8 +375,23 @@ def test_pim_mrib_mrib_mode(request):
)
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+ result = verify_pim_rp_info(
+ tgen,
+ None,
+ "r4",
+ "225.0.0.0/24",
+ "r4-eth1",
+ "10.0.1.1",
+ "Static",
+ False,
+ "ipv4",
+ True,
+ )
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+
+
def test_pim_mrib_mrib_mode_no_route(request):
- '''Test MRIB only with no route'''
+ """Test MRIB only with no route"""
tgen = get_topogen()
tc_name = request.node.name
write_test_header(tc_name)
@@ -293,10 +401,11 @@ def test_pim_mrib_mrib_mode_no_route(request):
# Remove the MRIB route, in mrib-only mode, it should switch to no path for the RP
tgen.routers()["r4"].vtysh_cmd(
- '''
+ """
conf term
no ip mroute 10.0.0.0/16 10.0.3.3 25
- '''
+ exit
+ """
)
step("Verify rp-info with Unknown next hop")
@@ -314,8 +423,818 @@ def test_pim_mrib_mrib_mode_no_route(request):
)
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+ result = verify_pim_rp_info(
+ tgen,
+ None,
+ "r4",
+ "225.0.0.0/24",
+ "Unknown",
+ "10.0.1.1",
+ "Static",
+ False,
+ "ipv4",
+ True,
+ )
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+
+
+def test_pim_mrib_rpf_lookup_source_list_init(request):
+ """Test RPF lookup source list with initial setup"""
+ tgen = get_topogen()
+ tc_name = request.node.name
+ write_test_header(tc_name)
+
+ if tgen.routers_have_failure():
+ pytest.skip("skipped because of router(s) failure")
+
+ # Reset back to mrib then urib mode
+ # Also add mode using SRCPLIST(10.0.0.1) and SRCPLIST2(10.0.1.1)
+ tgen.routers()["r4"].vtysh_cmd(
+ """
+ conf term
+ router pim
+ rpf-lookup-mode mrib-then-urib
+ rpf-lookup-mode mrib-then-urib source-list SRCPLIST
+ rpf-lookup-mode mrib-then-urib source-list SRCPLIST2
+ exit
+ exit
+ """
+ )
+
+ step("Verify rp-info with default next hop")
+ result = verify_pim_rp_info(
+ tgen,
+ None,
+ "r4",
+ "224.0.0.0/4",
+ "r4-eth0",
+ "10.0.0.1",
+ "Static",
+ False,
+ "ipv4",
+ True,
+ )
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+
+ result = verify_pim_rp_info(
+ tgen,
+ None,
+ "r4",
+ "225.0.0.0/24",
+ "r4-eth0",
+ "10.0.1.1",
+ "Static",
+ False,
+ "ipv4",
+ True,
+ )
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+
+
+def test_pim_mrib_rpf_lookup_source_list_add_mroute(request):
+ """Test RPF lookup source list with MRIB route on alternate path"""
+ tgen = get_topogen()
+ tc_name = request.node.name
+ write_test_header(tc_name)
+
+ if tgen.routers_have_failure():
+ pytest.skip("skipped because of router(s) failure")
+
+ # Add a MRIB route through r4-eth1 that is better distance but worse prefix
+ tgen.routers()["r4"].vtysh_cmd(
+ """
+ conf term
+ ip mroute 10.0.0.0/16 10.0.3.3 25
+ exit
+ """
+ )
+
+ step("Verify rp-info with MRIB next hop")
+ result = verify_pim_rp_info(
+ tgen,
+ None,
+ "r4",
+ "224.0.0.0/4",
+ "r4-eth1",
+ "10.0.0.1",
+ "Static",
+ False,
+ "ipv4",
+ True,
+ )
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+
+ result = verify_pim_rp_info(
+ tgen,
+ None,
+ "r4",
+ "225.0.0.0/24",
+ "r4-eth1",
+ "10.0.1.1",
+ "Static",
+ False,
+ "ipv4",
+ True,
+ )
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+
+
+def test_pim_mrib_rpf_lookup_source_list_src1_prefix_mode(request):
+ """Test RPF lookup source list src1 longer prefix mode"""
+ tgen = get_topogen()
+ tc_name = request.node.name
+ write_test_header(tc_name)
+
+ if tgen.routers_have_failure():
+ pytest.skip("skipped because of router(s) failure")
+
+ # Switch just source 1 to longest prefix
+ tgen.routers()["r4"].vtysh_cmd(
+ """
+ conf term
+ router pim
+ rpf-lookup-mode longer-prefix source-list SRCPLIST
+ exit
+ exit
+ """
+ )
+
+ step("Verify rp-info with URIB next hop for source 1 and MRIB for source 2")
+ result = verify_pim_rp_info(
+ tgen,
+ None,
+ "r4",
+ "224.0.0.0/4",
+ "r4-eth0",
+ "10.0.0.1",
+ "Static",
+ False,
+ "ipv4",
+ True,
+ )
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+
+ result = verify_pim_rp_info(
+ tgen,
+ None,
+ "r4",
+ "225.0.0.0/24",
+ "r4-eth1",
+ "10.0.1.1",
+ "Static",
+ False,
+ "ipv4",
+ True,
+ )
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+
+
+def test_pim_mrib_rpf_lookup_source_list_src1_dist_src2_prefix_mode(request):
+ """Test RPF lookup source list src1 lower distance mode and src2 longer prefix mode"""
+ tgen = get_topogen()
+ tc_name = request.node.name
+ write_test_header(tc_name)
+
+ if tgen.routers_have_failure():
+ pytest.skip("skipped because of router(s) failure")
+
+ # Switch source 1 to shortest distance, source 2 to longest prefix
+ tgen.routers()["r4"].vtysh_cmd(
+ """
+ conf term
+ router pim
+ rpf-lookup-mode lower-distance source-list SRCPLIST
+ rpf-lookup-mode longer-prefix source-list SRCPLIST2
+ exit
+ exit
+ """
+ )
+
+ step("Verify rp-info with MRIB next hop for source 1 and URIB for source 2")
+ result = verify_pim_rp_info(
+ tgen,
+ None,
+ "r4",
+ "224.0.0.0/4",
+ "r4-eth1",
+ "10.0.0.1",
+ "Static",
+ False,
+ "ipv4",
+ True,
+ )
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+
+ result = verify_pim_rp_info(
+ tgen,
+ None,
+ "r4",
+ "225.0.0.0/24",
+ "r4-eth0",
+ "10.0.1.1",
+ "Static",
+ False,
+ "ipv4",
+ True,
+ )
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+
+
+def test_pim_mrib_rpf_lookup_source_list_src1_urib_src2_dist_mode(request):
+ """Test RPF lookup source list src1 urib mode and src2 lower distance mode"""
+ tgen = get_topogen()
+ tc_name = request.node.name
+ write_test_header(tc_name)
+
+ if tgen.routers_have_failure():
+ pytest.skip("skipped because of router(s) failure")
+
+ # Switch source 1 to urib only, source 2 to shorter distance
+ tgen.routers()["r4"].vtysh_cmd(
+ """
+ conf term
+ router pim
+ rpf-lookup-mode urib-only source-list SRCPLIST
+ rpf-lookup-mode lower-distance source-list SRCPLIST2
+ exit
+ exit
+ """
+ )
+
+ step("Verify rp-info with URIB next hop for source 1 and MRIB for source 2")
+ result = verify_pim_rp_info(
+ tgen,
+ None,
+ "r4",
+ "224.0.0.0/4",
+ "r4-eth0",
+ "10.0.0.1",
+ "Static",
+ False,
+ "ipv4",
+ True,
+ )
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+
+ result = verify_pim_rp_info(
+ tgen,
+ None,
+ "r4",
+ "225.0.0.0/24",
+ "r4-eth1",
+ "10.0.1.1",
+ "Static",
+ False,
+ "ipv4",
+ True,
+ )
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+
+
+def test_pim_mrib_rpf_lookup_source_list_src1_mrib_src2_urib_mode(request):
+ """Test RPF lookup source list src1 mrib mode and src2 urib mode"""
+ tgen = get_topogen()
+ tc_name = request.node.name
+ write_test_header(tc_name)
+
+ if tgen.routers_have_failure():
+ pytest.skip("skipped because of router(s) failure")
+
+ # Switch source 1 to mrib only, source 2 to urib only
+ tgen.routers()["r4"].vtysh_cmd(
+ """
+ conf term
+ router pim
+ rpf-lookup-mode mrib-only source-list SRCPLIST
+ rpf-lookup-mode urib-only source-list SRCPLIST2
+ exit
+ exit
+ """
+ )
+
+ step("Verify rp-info with MRIB next hop for source 1 and URIB for source 2")
+ result = verify_pim_rp_info(
+ tgen,
+ None,
+ "r4",
+ "224.0.0.0/4",
+ "r4-eth1",
+ "10.0.0.1",
+ "Static",
+ False,
+ "ipv4",
+ True,
+ )
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+
+ result = verify_pim_rp_info(
+ tgen,
+ None,
+ "r4",
+ "225.0.0.0/24",
+ "r4-eth0",
+ "10.0.1.1",
+ "Static",
+ False,
+ "ipv4",
+ True,
+ )
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+
+
+def test_pim_mrib_rpf_lookup_source_list_removed(request):
+ """Test RPF lookup source list removed"""
+ tgen = get_topogen()
+ tc_name = request.node.name
+ write_test_header(tc_name)
+
+ if tgen.routers_have_failure():
+ pytest.skip("skipped because of router(s) failure")
+
+ # Remove both special modes, both should switch to MRIB route
+ tgen.routers()["r4"].vtysh_cmd(
+ """
+ conf term
+ router pim
+ no rpf-lookup-mode mrib-only source-list SRCPLIST
+ no rpf-lookup-mode urib-only source-list SRCPLIST2
+ exit
+ exit
+ """
+ )
+
+ step("Verify rp-info with MRIB next hop for both sources")
+ result = verify_pim_rp_info(
+ tgen,
+ None,
+ "r4",
+ "224.0.0.0/4",
+ "r4-eth1",
+ "10.0.0.1",
+ "Static",
+ False,
+ "ipv4",
+ True,
+ )
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+
+ result = verify_pim_rp_info(
+ tgen,
+ None,
+ "r4",
+ "225.0.0.0/24",
+ "r4-eth1",
+ "10.0.1.1",
+ "Static",
+ False,
+ "ipv4",
+ True,
+ )
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+
+
+def test_pim_mrib_rpf_lookup_source_list_del_mroute(request):
+ """Test RPF lookup source list delete mroute"""
+ tgen = get_topogen()
+ tc_name = request.node.name
+ write_test_header(tc_name)
+
+ if tgen.routers_have_failure():
+ pytest.skip("skipped because of router(s) failure")
+
+ # Remove the MRIB route, both should switch to URIB
+ tgen.routers()["r4"].vtysh_cmd(
+ """
+ conf term
+ no ip mroute 10.0.0.0/16 10.0.3.3 25
+ exit
+ """
+ )
+
+ step("Verify rp-info with URIB next hop for both sources")
+ result = verify_pim_rp_info(
+ tgen,
+ None,
+ "r4",
+ "224.0.0.0/4",
+ "r4-eth0",
+ "10.0.0.1",
+ "Static",
+ False,
+ "ipv4",
+ True,
+ )
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+
+ result = verify_pim_rp_info(
+ tgen,
+ None,
+ "r4",
+ "225.0.0.0/24",
+ "r4-eth0",
+ "10.0.1.1",
+ "Static",
+ False,
+ "ipv4",
+ True,
+ )
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+
+
+def test_pim_mrib_rpf_lookup_group_list(request):
+ """Test RPF lookup group list"""
+ tgen = get_topogen()
+ tc_name = request.node.name
+ write_test_header(tc_name)
+
+ if tgen.routers_have_failure():
+ pytest.skip("skipped because of router(s) failure")
+
+ with McastTesterHelper(tgen) as apphelper:
+ step(
+ ("Send multicast traffic from R1 to dense groups {}, {}").format(
+ GROUP1, GROUP2
+ )
+ )
+ result = apphelper.run_traffic("r1", [GROUP1, GROUP2], bind_intf="r1-eth1")
+ assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
+
+ # Reset back to mrib then urib mode
+ # Also add mode using GRPPLIST(239.1.1.1) and GRPPLIST2(239.2.2.2)
+ # And do an igmp join to both groups on r4-eth2
+ tgen.routers()["r4"].vtysh_cmd(
+ """
+ conf term
+ router pim
+ rpf-lookup-mode mrib-then-urib
+ rpf-lookup-mode mrib-then-urib group-list GRPPLIST
+ rpf-lookup-mode mrib-then-urib group-list GRPPLIST2
+ exit
+ int r4-dum0
+ ip igmp join-group {}
+ ip igmp join-group {}
+ exit
+ exit
+ """.format(
+ GROUP1, GROUP2
+ )
+ )
+
+ step("Verify upstream iif with default next hop")
+ result = verify_upstream_iif(tgen, "r4", "r4-eth0", "10.0.1.1", GROUP1)
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(
+ tc_name, result
+ )
+
+ result = verify_upstream_iif(tgen, "r4", "r4-eth0", "10.0.1.1", GROUP2)
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(
+ tc_name, result
+ )
+
+ step("Add MRIB route through alternate path")
+ tgen.routers()["r4"].vtysh_cmd(
+ """
+ conf term
+ ip mroute 10.0.0.0/16 10.0.3.3 25
+ exit
+ """
+ )
+
+ step("Verify upstream iif with alternate next hop")
+ result = verify_upstream_iif(tgen, "r4", "r4-eth1", "10.0.1.1", GROUP1)
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(
+ tc_name, result
+ )
+
+ result = verify_upstream_iif(tgen, "r4", "r4-eth1", "10.0.1.1", GROUP2)
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(
+ tc_name, result
+ )
+
+ step("Switch group1 to longer prefix match (URIB)")
+ tgen.routers()["r4"].vtysh_cmd(
+ """
+ conf term
+ router pim
+ rpf-lookup-mode longer-prefix group-list GRPPLIST
+ exit
+ exit
+ """.format(
+ GROUP1, GROUP2
+ )
+ )
+
+ step("Verify upstream iif of group1 is URIB, group2 is MRIB")
+ result = verify_upstream_iif(tgen, "r4", "r4-eth0", "10.0.1.1", GROUP1)
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(
+ tc_name, result
+ )
+
+ result = verify_upstream_iif(tgen, "r4", "r4-eth1", "10.0.1.1", GROUP2)
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(
+ tc_name, result
+ )
+
+ step(
+ "Switch group1 to lower distance match (MRIB), and group2 to longer prefix (URIB)"
+ )
+ tgen.routers()["r4"].vtysh_cmd(
+ """
+ conf term
+ router pim
+ rpf-lookup-mode lower-distance group-list GRPPLIST
+ rpf-lookup-mode longer-prefix group-list GRPPLIST2
+ exit
+ exit
+ """.format(
+ GROUP1, GROUP2
+ )
+ )
+
+ step("Verify upstream iif of group1 is MRIB, group2 is URIB")
+ result = verify_upstream_iif(tgen, "r4", "r4-eth1", "10.0.1.1", GROUP1)
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(
+ tc_name, result
+ )
+
+ result = verify_upstream_iif(tgen, "r4", "r4-eth0", "10.0.1.1", GROUP2)
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(
+ tc_name, result
+ )
+
+ step("Switch group1 to urib match only, and group2 to lower distance (URIB)")
+ tgen.routers()["r4"].vtysh_cmd(
+ """
+ conf term
+ router pim
+ rpf-lookup-mode urib-only group-list GRPPLIST
+ rpf-lookup-mode lower-distance group-list GRPPLIST2
+ exit
+ exit
+ """.format(
+ GROUP1, GROUP2
+ )
+ )
+
+ step("Verify upstream iif of group1 is URIB, group2 is MRIB")
+ result = verify_upstream_iif(tgen, "r4", "r4-eth0", "10.0.1.1", GROUP1)
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(
+ tc_name, result
+ )
+
+ result = verify_upstream_iif(tgen, "r4", "r4-eth1", "10.0.1.1", GROUP2)
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(
+ tc_name, result
+ )
+
+ step("Switch group1 to mrib match only, and group2 to urib match only")
+ tgen.routers()["r4"].vtysh_cmd(
+ """
+ conf term
+ router pim
+ rpf-lookup-mode mrib-only group-list GRPPLIST
+ rpf-lookup-mode urib-only group-list GRPPLIST2
+ exit
+ exit
+ """.format(
+ GROUP1, GROUP2
+ )
+ )
+
+ step("Verify upstream iif of group1 is MRIB, group2 is URIB")
+ result = verify_upstream_iif(tgen, "r4", "r4-eth1", "10.0.1.1", GROUP1)
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(
+ tc_name, result
+ )
+
+ result = verify_upstream_iif(tgen, "r4", "r4-eth0", "10.0.1.1", GROUP2)
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(
+ tc_name, result
+ )
+
+ step("Delete MRIB route")
+ tgen.routers()["r4"].vtysh_cmd(
+ """
+ conf term
+ no ip mroute 10.0.0.0/16 10.0.3.3 25
+ exit
+ """.format(
+ GROUP1, GROUP2
+ )
+ )
+
+ step("Verify upstream iif of group1 is Unknown, group2 is URIB")
+ result = verify_upstream_iif(
+ tgen, "r4", "Unknown", "10.0.1.1", GROUP1, "NotJoined"
+ )
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(
+ tc_name, result
+ )
+
+ result = verify_upstream_iif(tgen, "r4", "r4-eth0", "10.0.1.1", GROUP2)
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(
+ tc_name, result
+ )
+
+
+def test_pim_mrib_rpf_lookup_source_group_lists(request):
+ """Test RPF lookup source and group lists"""
+ tgen = get_topogen()
+ tc_name = request.node.name
+ write_test_header(tc_name)
+
+ if tgen.routers_have_failure():
+ pytest.skip("skipped because of router(s) failure")
+
+ with McastTesterHelper(tgen) as apphelper:
+ step(
+ ("Send multicast traffic from R1 to dense groups {}, {}").format(
+ GROUP1, GROUP2
+ )
+ )
+ result = apphelper.run_traffic("r1", [GROUP1, GROUP2], bind_intf="r1-eth1")
+ assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
+
+ # Reset back to mrib then urib mode
+ # Also add mode using GRPPLIST(239.1.1.1) and GRPPLIST2(239.2.2.2), both using SRCPLIST2
+ # And do an igmp join to both groups on r4-eth2
+ tgen.routers()["r4"].vtysh_cmd(
+ """
+ conf term
+ router pim
+ rpf-lookup-mode mrib-then-urib
+ rpf-lookup-mode mrib-then-urib group-list GRPPLIST source-list SRCPLIST2
+ rpf-lookup-mode mrib-then-urib group-list GRPPLIST2 source-list SRCPLIST2
+ exit
+ int r4-dum0
+ ip igmp join-group {}
+ ip igmp join-group {}
+ exit
+ exit
+ """.format(
+ GROUP1, GROUP2
+ )
+ )
+
+ step("Verify upstream iif with default next hop")
+ result = verify_upstream_iif(tgen, "r4", "r4-eth0", "10.0.1.1", GROUP1)
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(
+ tc_name, result
+ )
+
+ result = verify_upstream_iif(tgen, "r4", "r4-eth0", "10.0.1.1", GROUP2)
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(
+ tc_name, result
+ )
+
+ step("Add MRIB route through alternate path")
+ tgen.routers()["r4"].vtysh_cmd(
+ """
+ conf term
+ ip mroute 10.0.0.0/16 10.0.3.3 25
+ exit
+ """
+ )
+
+ step("Verify upstream iif with alternate next hop")
+ result = verify_upstream_iif(tgen, "r4", "r4-eth1", "10.0.1.1", GROUP1)
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(
+ tc_name, result
+ )
+
+ result = verify_upstream_iif(tgen, "r4", "r4-eth1", "10.0.1.1", GROUP2)
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(
+ tc_name, result
+ )
+
+ step("Switch group1 to longer prefix match (URIB)")
+ tgen.routers()["r4"].vtysh_cmd(
+ """
+ conf term
+ router pim
+ rpf-lookup-mode longer-prefix group-list GRPPLIST source-list SRCPLIST2
+ exit
+ exit
+ """.format(
+ GROUP1, GROUP2
+ )
+ )
+
+ step("Verify upstream iif of group1 is URIB, group2 is MRIB")
+ result = verify_upstream_iif(tgen, "r4", "r4-eth0", "10.0.1.1", GROUP1)
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(
+ tc_name, result
+ )
+
+ result = verify_upstream_iif(tgen, "r4", "r4-eth1", "10.0.1.1", GROUP2)
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(
+ tc_name, result
+ )
+
+ step(
+ "Switch group1 to lower distance match (MRIB), and group2 to longer prefix (URIB)"
+ )
+ tgen.routers()["r4"].vtysh_cmd(
+ """
+ conf term
+ router pim
+ rpf-lookup-mode lower-distance group-list GRPPLIST source-list SRCPLIST2
+ rpf-lookup-mode longer-prefix group-list GRPPLIST2 source-list SRCPLIST2
+ exit
+ exit
+ """.format(
+ GROUP1, GROUP2
+ )
+ )
+
+ step("Verify upstream iif of group1 is MRIB, group2 is URIB")
+ result = verify_upstream_iif(tgen, "r4", "r4-eth1", "10.0.1.1", GROUP1)
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(
+ tc_name, result
+ )
+
+ result = verify_upstream_iif(tgen, "r4", "r4-eth0", "10.0.1.1", GROUP2)
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(
+ tc_name, result
+ )
+
+ step("Switch group1 to urib match only, and group2 to lower distance (URIB)")
+ tgen.routers()["r4"].vtysh_cmd(
+ """
+ conf term
+ router pim
+ rpf-lookup-mode urib-only group-list GRPPLIST source-list SRCPLIST2
+ rpf-lookup-mode lower-distance group-list GRPPLIST2 source-list SRCPLIST2
+ exit
+ exit
+ """.format(
+ GROUP1, GROUP2
+ )
+ )
+
+ step("Verify upstream iif of group1 is URIB, group2 is MRIB")
+ result = verify_upstream_iif(tgen, "r4", "r4-eth0", "10.0.1.1", GROUP1)
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(
+ tc_name, result
+ )
+
+ result = verify_upstream_iif(tgen, "r4", "r4-eth1", "10.0.1.1", GROUP2)
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(
+ tc_name, result
+ )
+
+ step("Switch group1 to mrib match only, and group2 to urib match only")
+ tgen.routers()["r4"].vtysh_cmd(
+ """
+ conf term
+ router pim
+ rpf-lookup-mode mrib-only group-list GRPPLIST source-list SRCPLIST2
+ rpf-lookup-mode urib-only group-list GRPPLIST2 source-list SRCPLIST2
+ exit
+ exit
+ """.format(
+ GROUP1, GROUP2
+ )
+ )
+
+ step("Verify upstream iif of group1 is MRIB, group2 is URIB")
+ result = verify_upstream_iif(tgen, "r4", "r4-eth1", "10.0.1.1", GROUP1)
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(
+ tc_name, result
+ )
+
+ result = verify_upstream_iif(tgen, "r4", "r4-eth0", "10.0.1.1", GROUP2)
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(
+ tc_name, result
+ )
+
+ step("Delete MRIB route")
+ tgen.routers()["r4"].vtysh_cmd(
+ """
+ conf term
+ no ip mroute 10.0.0.0/16 10.0.3.3 25
+ exit
+ """.format(
+ GROUP1, GROUP2
+ )
+ )
+
+ step("Verify upstream iif of group1 is Unknown, group2 is URIB")
+ result = verify_upstream_iif(
+ tgen, "r4", "Unknown", "10.0.1.1", GROUP1, "NotJoined"
+ )
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(
+ tc_name, result
+ )
+
+ result = verify_upstream_iif(tgen, "r4", "r4-eth0", "10.0.1.1", GROUP2)
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(
+ tc_name, result
+ )
+
+
def test_memory_leak():
- '''Run the memory leak test and report results.'''
+ """Run the memory leak test and report results."""
tgen = get_topogen()
if not tgen.is_memleak_enabled():
pytest.skip("Memory leak test/report is disabled")