tests: check bgp vpn table in bgp_vpnv4_route_leak_basic

Check bgp vpn table in bgp_vpnv4_route_leak_basic

Signed-off-by: Louis Scalbert <louis.scalbert@6wind.com>
This commit is contained in:
Louis Scalbert 2024-11-06 11:11:19 +01:00
parent 5b22c79c3d
commit 1e826d5d0c
6 changed files with 522 additions and 0 deletions

View File

@ -28,6 +28,9 @@ ip router-id 10.0.4.1
! !
router bgp 99 router bgp 99
no bgp ebgp-requires-policy no bgp ebgp-requires-policy
! 10.0.4.254 peer session will not be established
! it is there just to activate the ipv4 vpn table
neighbor 10.0.4.254 remote-as external
address-family ipv4 unicast address-family ipv4 unicast
redistribute connected redistribute connected
rd vpn export 10.0.4.1:1 rd vpn export 10.0.4.1:1
@ -36,6 +39,8 @@ router bgp 99
export vpn export vpn
import vpn import vpn
! !
address-family ipv4 vpn
neighbor 10.0.4.254 activate
! !
router bgp 99 vrf DONNA router bgp 99 vrf DONNA
no bgp ebgp-requires-policy no bgp ebgp-requires-policy

View File

@ -0,0 +1,137 @@
{
"routerId": "10.0.4.1",
"localAS": 99,
"routes": {
"routeDistinguishers": {
"10.0.4.1:1": {
"10.0.0.0/24": [
{
"valid": true,
"pathFrom": "external",
"path": "",
"origin": "incomplete",
"announceNexthopSelf": true,
"nhVrfName": "DONNA",
"nexthops": [
{
"ip": "0.0.0.0",
"hostname": "r1",
"afi": "ipv4",
"used": true
}
]
}
],
"10.0.1.0/24": [
{
"valid": true,
"pathFrom": "external",
"path": "",
"origin": "incomplete",
"announceNexthopSelf": true,
"nhVrfName": "EVA",
"nexthops": [
{
"ip": "0.0.0.0",
"hostname": "r1",
"afi": "ipv4",
"used": true
}
]
}
],
"10.0.2.0/24": [
{
"valid": true,
"pathFrom": "external",
"path": "",
"origin": "incomplete",
"announceNexthopSelf": true,
"nhVrfName": "DONNA",
"nexthops": [
{
"ip": "0.0.0.0",
"hostname": "r1",
"afi": "ipv4",
"used": true
}
]
}
],
"10.0.3.0/24": [
{
"valid": true,
"pathFrom": "external",
"path": "",
"origin": "incomplete",
"announceNexthopSelf": true,
"nhVrfName": "EVA",
"nexthops": [
{
"ip": "0.0.0.0",
"hostname": "r1",
"afi": "ipv4",
"used": true
}
]
}
],
"10.0.4.0/24": [
{
"valid": true,
"pathFrom": "external",
"path": "",
"origin": "incomplete",
"announceNexthopSelf": true,
"nhVrfName": "default",
"nexthops": [
{
"ip": "0.0.0.0",
"hostname": "r1",
"afi": "ipv4",
"used": true
}
]
}
],
"172.16.3.0/24": [
{
"valid": true,
"pathFrom": "external",
"path": "",
"origin": "IGP",
"announceNexthopSelf": true,
"nhVrfName": "DONNA",
"nexthops": [
{
"ip": "0.0.0.0",
"hostname": "r1",
"afi": "ipv4",
"used": true
}
]
}
],
"172.16.101.0/24": [
{
"valid": null,
"pathFrom": "external",
"path": "",
"origin": "IGP",
"announceNexthopSelf": true,
"nhVrfName": "ZITA",
"nexthops": [
{
"ip": "0.0.0.0",
"hostname": "r1",
"afi": "ipv4",
"used": true
}
]
}
]
}
}
}
}

View File

@ -0,0 +1,102 @@
{
"routerId": "10.0.4.1",
"localAS": 99,
"routes": {
"routeDistinguishers": {
"10.0.4.1:1": {
"10.0.0.0/24": [
{
"valid": true,
"pathFrom": "external",
"path": "",
"origin": "incomplete",
"announceNexthopSelf": true,
"nhVrfName": "DONNA",
"nexthops": [
{
"ip": "0.0.0.0",
"hostname": "r1",
"afi": "ipv4",
"used": true
}
]
}
],
"10.0.1.0/24": [
{
"valid": null,
"pathFrom": "external",
"path": "",
"origin": "incomplete",
"announceNexthopSelf": true,
"nhVrfName": "EVA",
"nexthops": [
{
"ip": "0.0.0.0",
"hostname": "r1",
"afi": "ipv4",
"used": true
}
]
}
],
"10.0.2.0/24": [
{
"valid": true,
"pathFrom": "external",
"path": "",
"origin": "incomplete",
"announceNexthopSelf": true,
"nhVrfName": "DONNA",
"nexthops": [
{
"ip": "0.0.0.0",
"hostname": "r1",
"afi": "ipv4",
"used": true
}
]
}
],
"10.0.3.0/24": [
{
"valid": null,
"pathFrom": "external",
"path": "",
"origin": "incomplete",
"announceNexthopSelf": true,
"nhVrfName": "EVA",
"nexthops": [
{
"ip": "0.0.0.0",
"hostname": "r1",
"afi": "ipv4",
"used": true
}
]
}
],
"10.0.4.0/24": [
{
"valid": true,
"pathFrom": "external",
"path": "",
"origin": "incomplete",
"announceNexthopSelf": true,
"nhVrfName": "default",
"nexthops": [
{
"ip": "0.0.0.0",
"hostname": "r1",
"afi": "ipv4",
"used": true
}
]
}
],
"172.16.101.0/24": null
}
}
}
}

View File

@ -0,0 +1,102 @@
{
"routerId": "10.0.4.1",
"localAS": 99,
"routes": {
"routeDistinguishers": {
"10.0.4.1:1": {
"10.0.0.0/24": [
{
"valid": true,
"pathFrom": "external",
"path": "",
"origin": "incomplete",
"announceNexthopSelf": true,
"nhVrfName": "DONNA",
"nexthops": [
{
"ip": "0.0.0.0",
"hostname": "r1",
"afi": "ipv4",
"used": true
}
]
}
],
"10.0.1.0/24": [
{
"valid": true,
"pathFrom": "external",
"path": "",
"origin": "incomplete",
"announceNexthopSelf": true,
"nhVrfName": "EVA",
"nexthops": [
{
"ip": "0.0.0.0",
"hostname": "r1",
"afi": "ipv4",
"used": true
}
]
}
],
"10.0.2.0/24": [
{
"valid": true,
"pathFrom": "external",
"path": "",
"origin": "incomplete",
"announceNexthopSelf": true,
"nhVrfName": "DONNA",
"nexthops": [
{
"ip": "0.0.0.0",
"hostname": "r1",
"afi": "ipv4",
"used": true
}
]
}
],
"10.0.3.0/24": [
{
"valid": true,
"pathFrom": "external",
"path": "",
"origin": "incomplete",
"announceNexthopSelf": true,
"nhVrfName": "EVA",
"nexthops": [
{
"ip": "0.0.0.0",
"hostname": "r1",
"afi": "ipv4",
"used": true
}
]
}
],
"10.0.4.0/24": [
{
"valid": true,
"pathFrom": "external",
"path": "",
"origin": "incomplete",
"announceNexthopSelf": true,
"nhVrfName": "default",
"nexthops": [
{
"ip": "0.0.0.0",
"hostname": "r1",
"afi": "ipv4",
"used": true
}
]
}
],
"172.16.101.0/24": null
}
}
}
}

View File

@ -0,0 +1,119 @@
{
"routerId": "10.0.4.1",
"localAS": 99,
"routes": {
"routeDistinguishers": {
"10.0.4.1:1": {
"10.0.0.0/24": [
{
"valid": true,
"pathFrom": "external",
"path": "",
"origin": "incomplete",
"announceNexthopSelf": true,
"nhVrfName": "DONNA",
"nexthops": [
{
"ip": "0.0.0.0",
"hostname": "r1",
"afi": "ipv4",
"used": true
}
]
}
],
"10.0.1.0/24": [
{
"valid": true,
"pathFrom": "external",
"path": "",
"origin": "incomplete",
"announceNexthopSelf": true,
"nhVrfName": "EVA",
"nexthops": [
{
"ip": "0.0.0.0",
"hostname": "r1",
"afi": "ipv4",
"used": true
}
]
}
],
"10.0.2.0/24": [
{
"valid": true,
"pathFrom": "external",
"path": "",
"origin": "incomplete",
"announceNexthopSelf": true,
"nhVrfName": "DONNA",
"nexthops": [
{
"ip": "0.0.0.0",
"hostname": "r1",
"afi": "ipv4",
"used": true
}
]
}
],
"10.0.3.0/24": [
{
"valid": true,
"pathFrom": "external",
"path": "",
"origin": "incomplete",
"announceNexthopSelf": true,
"nhVrfName": "EVA",
"nexthops": [
{
"ip": "0.0.0.0",
"hostname": "r1",
"afi": "ipv4",
"used": true
}
]
}
],
"10.0.4.0/24": [
{
"valid": true,
"pathFrom": "external",
"path": "",
"origin": "incomplete",
"announceNexthopSelf": true,
"nhVrfName": "default",
"nexthops": [
{
"ip": "0.0.0.0",
"hostname": "r1",
"afi": "ipv4",
"used": true
}
]
}
],
"172.16.101.0/24": [
{
"valid": true,
"pathFrom": "external",
"path": "",
"origin": "IGP",
"announceNexthopSelf": true,
"nhVrfName": "ZITA",
"nexthops": [
{
"ip": "0.0.0.0",
"hostname": "r1",
"afi": "ipv4",
"used": true
}
]
}
]
}
}
}
}

View File

@ -13,6 +13,7 @@
Test basic VPNv4 route leaking Test basic VPNv4 route leaking
""" """
import json
import os import os
import sys import sys
from functools import partial from functools import partial
@ -60,6 +61,22 @@ def teardown_module(mod):
tgen.stop_topology() tgen.stop_topology()
def test_bgp_convergence():
tgen = get_topogen()
# Don't run this test if we have any failure.
if tgen.routers_have_failure():
pytest.skip(tgen.errors)
r1 = tgen.gears["r1"]
json_file = "{}/{}/show_bgp_ipv4_vpn_init.json".format(CWD, r1.name)
expect = json.loads(open(json_file).read())
test_func = partial(topotest.router_json_cmp, r1, "show bgp ipv4 vpn json", expect)
result, diff = topotest.run_and_expect(test_func, None, count=60, wait=0.5)
assert result, "BGP IPv4 VPN table check failed:\n{}".format(diff)
def test_vrf_route_leak_donna(): def test_vrf_route_leak_donna():
logger.info("Ensure that routes are leaked back and forth") logger.info("Ensure that routes are leaked back and forth")
tgen = get_topogen() tgen = get_topogen()
@ -297,6 +314,14 @@ interface EVA
result, diff = topotest.run_and_expect(test_func, None, count=60, wait=0.5) result, diff = topotest.run_and_expect(test_func, None, count=60, wait=0.5)
assert result, "BGP VRF DONNA check failed:\n{}".format(diff) assert result, "BGP VRF DONNA check failed:\n{}".format(diff)
# check BGP IPv4 VPN table
json_file = "{}/{}/show_bgp_ipv4_vpn_eva_down.json".format(CWD, r1.name)
expect = json.loads(open(json_file).read())
test_func = partial(topotest.router_json_cmp, r1, "show bgp ipv4 vpn json", expect)
result, diff = topotest.run_and_expect(test_func, None, count=60, wait=0.5)
assert result, "BGP IPv4 VPN table check failed:\n{}".format(diff)
def test_vrf_route_leak_donna_after_eva_up(): def test_vrf_route_leak_donna_after_eva_up():
logger.info("Ensure that route states change after EVA interface goes up") logger.info("Ensure that route states change after EVA interface goes up")
@ -352,6 +377,14 @@ interface EVA
result, diff = topotest.run_and_expect(test_func, None, count=60, wait=0.5) result, diff = topotest.run_and_expect(test_func, None, count=60, wait=0.5)
assert result, "BGP VRF DONNA check failed:\n{}".format(diff) assert result, "BGP VRF DONNA check failed:\n{}".format(diff)
# check BGP IPv4 VPN table
json_file = "{}/{}/show_bgp_ipv4_vpn_init.json".format(CWD, r1.name)
expect = json.loads(open(json_file).read())
test_func = partial(topotest.router_json_cmp, r1, "show bgp ipv4 vpn json", expect)
result, diff = topotest.run_and_expect(test_func, None, count=60, wait=0.5)
assert result, "BGP IPv4 VPN table check failed:\n{}".format(diff)
def test_vrf_route_leak_donna_add_vrf_zita(): def test_vrf_route_leak_donna_add_vrf_zita():
logger.info("Add VRF ZITA and ensure that the route from VRF ZITA is updated") logger.info("Add VRF ZITA and ensure that the route from VRF ZITA is updated")
@ -374,6 +407,14 @@ def test_vrf_route_leak_donna_add_vrf_zita():
result, diff = topotest.run_and_expect(test_func, None, count=60, wait=0.5) result, diff = topotest.run_and_expect(test_func, None, count=60, wait=0.5)
assert result, "BGP VRF DONNA check failed:\n{}".format(diff) assert result, "BGP VRF DONNA check failed:\n{}".format(diff)
# check BGP IPv4 VPN table
json_file = "{}/{}/show_bgp_ipv4_vpn_add_zita.json".format(CWD, r1.name)
expect = json.loads(open(json_file).read())
test_func = partial(topotest.router_json_cmp, r1, "show bgp ipv4 vpn json", expect)
result, diff = topotest.run_and_expect(test_func, None, count=60, wait=0.5)
assert result, "BGP IPv4 VPN table check failed:\n{}".format(diff)
def test_vrf_route_leak_donna_set_zita_up(): def test_vrf_route_leak_donna_set_zita_up():
logger.info("Set VRF ZITA up and ensure that the route from VRF ZITA is updated") logger.info("Set VRF ZITA up and ensure that the route from VRF ZITA is updated")
@ -415,6 +456,14 @@ interface ZITA
result, diff = topotest.run_and_expect(test_func, None, count=60, wait=0.5) result, diff = topotest.run_and_expect(test_func, None, count=60, wait=0.5)
assert result, "BGP VRF DONNA check failed:\n{}".format(diff) assert result, "BGP VRF DONNA check failed:\n{}".format(diff)
# check BGP IPv4 VPN table
json_file = "{}/{}/show_bgp_ipv4_vpn_zita_up.json".format(CWD, r1.name)
expect = json.loads(open(json_file).read())
test_func = partial(topotest.router_json_cmp, r1, "show bgp ipv4 vpn json", expect)
result, diff = topotest.run_and_expect(test_func, None, count=60, wait=0.5)
assert result, "BGP IPv4 VPN table check failed:\n{}".format(diff)
def test_vrf_route_leak_donna_delete_vrf_zita(): def test_vrf_route_leak_donna_delete_vrf_zita():
logger.info("Delete VRF ZITA and ensure that the route from VRF ZITA is deleted") logger.info("Delete VRF ZITA and ensure that the route from VRF ZITA is deleted")
@ -437,6 +486,14 @@ def test_vrf_route_leak_donna_delete_vrf_zita():
result, diff = topotest.run_and_expect(test_func, None, count=60, wait=0.5) result, diff = topotest.run_and_expect(test_func, None, count=60, wait=0.5)
assert result, "BGP VRF DONNA check failed:\n{}".format(diff) assert result, "BGP VRF DONNA check failed:\n{}".format(diff)
# check BGP IPv4 VPN table
json_file = "{}/{}/show_bgp_ipv4_vpn_init.json".format(CWD, r1.name)
expect = json.loads(open(json_file).read())
test_func = partial(topotest.router_json_cmp, r1, "show bgp ipv4 vpn json", expect)
result, diff = topotest.run_and_expect(test_func, None, count=60, wait=0.5)
assert result, "BGP IPv4 VPN table check failed:\n{}".format(diff)
def test_memory_leak(): def test_memory_leak():
"Run the memory leak test and report results." "Run the memory leak test and report results."