mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-03 08:56:13 +00:00
tests: uniq vrf names when using netns
- In order to run tests in parallel the netns-based vrfs need to have unique names primarily bc they are all tracked/looked-up in `/run/netns` which is not network namespace nesting friendly - use ip(8) exclusively rather than a mix of `ip` and `ifconfig` and `vconfig`, reducing required pkg count by a couple. Signed-off-by: Christian Hopps <chopps@labn.net>
This commit is contained in:
parent
2570a9f165
commit
6a95bfc8b0
@ -4,7 +4,7 @@ debug bfd peer
|
||||
debug bfd zebra
|
||||
!
|
||||
bfd
|
||||
peer 192.168.0.2 vrf r1-cust1
|
||||
peer 192.168.0.2 vrf r1-bfd-cust1
|
||||
echo-mode
|
||||
no shutdown
|
||||
!
|
||||
|
@ -1,4 +1,4 @@
|
||||
router bgp 101 vrf r1-cust1
|
||||
router bgp 101 vrf r1-bfd-cust1
|
||||
no bgp ebgp-requires-policy
|
||||
no bgp network import-check
|
||||
neighbor 192.168.0.2 remote-as 102
|
||||
|
@ -1,3 +1,3 @@
|
||||
interface r1-eth0 vrf r1-cust1
|
||||
interface r1-eth0 vrf r1-bfd-cust1
|
||||
ip address 192.168.0.1/24
|
||||
!
|
||||
|
@ -4,13 +4,13 @@ debug bfd peer
|
||||
debug bfd zebra
|
||||
!
|
||||
bfd
|
||||
peer 192.168.0.1 vrf r2-cust1
|
||||
peer 192.168.0.1 vrf r2-bfd-cust1
|
||||
receive-interval 1000
|
||||
transmit-interval 500
|
||||
echo-mode
|
||||
no shutdown
|
||||
!
|
||||
peer 192.168.1.1 vrf r2-cust1
|
||||
peer 192.168.1.1 vrf r2-bfd-cust1
|
||||
echo-mode
|
||||
no shutdown
|
||||
!
|
||||
|
@ -1,4 +1,4 @@
|
||||
router bgp 102 vrf r2-cust1
|
||||
router bgp 102 vrf r2-bfd-cust1
|
||||
no bgp ebgp-requires-policy
|
||||
no bgp network import-check
|
||||
neighbor 192.168.0.1 remote-as 101
|
||||
|
@ -1,9 +1,9 @@
|
||||
interface r2-eth0 vrf r2-cust1
|
||||
interface r2-eth0 vrf r2-bfd-cust1
|
||||
ip address 192.168.0.2/24
|
||||
!
|
||||
interface r2-eth1 vrf r2-cust1
|
||||
interface r2-eth1 vrf r2-bfd-cust1
|
||||
ip address 192.168.1.2/24
|
||||
!
|
||||
interface r2-eth2 vrf r2-cust1
|
||||
interface r2-eth2 vrf r2-bfd-cust1
|
||||
ip address 192.168.2.2/24
|
||||
!
|
||||
|
@ -4,7 +4,7 @@ debug bfd peer
|
||||
debug bfd zebra
|
||||
!
|
||||
bfd
|
||||
peer 192.168.1.2 vrf r3-cust1
|
||||
peer 192.168.1.2 vrf r3-bfd-cust1
|
||||
echo-interval 100
|
||||
echo-mode
|
||||
no shutdown
|
||||
|
@ -1,4 +1,4 @@
|
||||
router bgp 103 vrf r3-cust1
|
||||
router bgp 103 vrf r3-bfd-cust1
|
||||
no bgp ebgp-requires-policy
|
||||
no bgp network import-check
|
||||
neighbor 192.168.1.2 remote-as 102
|
||||
|
@ -1,3 +1,3 @@
|
||||
interface r3-eth0 vrf r3-cust1
|
||||
interface r3-eth0 vrf r3-bfd-cust1
|
||||
ip address 192.168.1.1/24
|
||||
!
|
||||
|
@ -4,7 +4,7 @@ debug bfd peer
|
||||
debug bfd zebra
|
||||
!
|
||||
bfd
|
||||
peer 192.168.2.2 vrf r4-cust1
|
||||
peer 192.168.2.2 vrf r4-bfd-cust1
|
||||
transmit-interval 2000
|
||||
receive-interval 2000
|
||||
no shutdown
|
||||
|
@ -1,4 +1,4 @@
|
||||
router bgp 104 vrf r4-cust1
|
||||
router bgp 104 vrf r4-bfd-cust1
|
||||
no bgp ebgp-requires-policy
|
||||
no bgp network import-check
|
||||
neighbor 192.168.2.2 remote-as 102
|
||||
|
@ -1,3 +1,3 @@
|
||||
interface r4-eth0 vrf r4-cust1
|
||||
interface r4-eth0 vrf r4-bfd-cust1
|
||||
ip address 192.168.2.1/24
|
||||
!
|
||||
|
@ -95,20 +95,18 @@ def setup_module(mod):
|
||||
logger.info("Testing with VRF Namespace support")
|
||||
|
||||
cmds = [
|
||||
"if [ -e /var/run/netns/{0}-cust1 ] ; then ip netns del {0}-cust1 ; fi",
|
||||
"ip netns add {0}-cust1",
|
||||
"ip link set dev {0}-eth0 netns {0}-cust1",
|
||||
"ip netns exec {0}-cust1 ifconfig {0}-eth0 up",
|
||||
"if [ -e /var/run/netns/{0}-bfd-cust1 ] ; then ip netns del {0}-bfd-cust1 ; fi",
|
||||
"ip netns add {0}-bfd-cust1",
|
||||
"ip link set dev {0}-eth0 netns {0}-bfd-cust1 up",
|
||||
]
|
||||
cmds2 = [
|
||||
"ip link set dev {0}-eth1 netns {0}-cust1",
|
||||
"ip netns exec {0}-cust1 ifconfig {0}-eth1 up",
|
||||
"ip link set dev {0}-eth2 netns {0}-cust1",
|
||||
"ip netns exec {0}-cust1 ifconfig {0}-eth2 up",
|
||||
"ip link set dev {0}-eth1 netns {0}-bfd-cust1",
|
||||
"ip netns exec {0}-bfd-cust1 ip link set {0}-eth1 up",
|
||||
"ip link set dev {0}-eth2 netns {0}-bfd-cust1 up",
|
||||
]
|
||||
|
||||
for rname, router in router_list.items():
|
||||
# create VRF rx-cust1 and link rx-eth0 to rx-cust1
|
||||
# create VRF rx-bfd-cust1 and link rx-eth0 to rx-bfd-cust1
|
||||
for cmd in cmds:
|
||||
output = tgen.net[rname].cmd(cmd.format(rname))
|
||||
if rname == "r2":
|
||||
@ -138,11 +136,11 @@ def teardown_module(_mod):
|
||||
# move back rx-eth0 to default VRF
|
||||
# delete rx-vrf
|
||||
cmds = [
|
||||
"ip netns exec {0}-cust1 ip link set {0}-eth0 netns 1",
|
||||
"ip netns delete {0}-cust1",
|
||||
"ip netns exec {0}-bfd-cust1 ip link set {0}-eth0 netns 1",
|
||||
"ip netns delete {0}-bfd-cust1",
|
||||
]
|
||||
cmds2 = [
|
||||
"ip netns exec {0}-cust1 ip link set {0}-eth1 netns 1",
|
||||
"ip netns exec {0}-bfd-cust1 ip link set {0}-eth1 netns 1",
|
||||
"ip netns exec {0}-cust2 ip link set {0}-eth1 netns 1",
|
||||
]
|
||||
|
||||
@ -189,7 +187,7 @@ def test_bgp_convergence():
|
||||
test_func = partial(
|
||||
topotest.router_json_cmp,
|
||||
router,
|
||||
"show ip bgp vrf {}-cust1 summary json".format(router.name),
|
||||
"show ip bgp vrf {}-bfd-cust1 summary json".format(router.name),
|
||||
expected,
|
||||
)
|
||||
_, res = topotest.run_and_expect(test_func, None, count=125, wait=1.0)
|
||||
@ -211,7 +209,7 @@ def test_bgp_fast_convergence():
|
||||
test_func = partial(
|
||||
topotest.router_json_cmp,
|
||||
router,
|
||||
"show ip bgp vrf {}-cust1 json".format(router.name),
|
||||
"show ip bgp vrf {}-bfd-cust1 json".format(router.name),
|
||||
expected,
|
||||
)
|
||||
_, res = topotest.run_and_expect(test_func, None, count=40, wait=1)
|
||||
@ -231,7 +229,7 @@ def test_bfd_fast_convergence():
|
||||
# Disable r2-eth0 link
|
||||
router2 = tgen.gears["r2"]
|
||||
topotest.interface_set_status(
|
||||
router2, "r2-eth0", ifaceaction=False, vrf_name="r2-cust1"
|
||||
router2, "r2-eth0", ifaceaction=False, vrf_name="r2-bfd-cust1"
|
||||
)
|
||||
|
||||
# Wait the minimum time we can before checking that BGP/BFD
|
||||
@ -286,7 +284,7 @@ def test_bgp_fast_reconvergence():
|
||||
test_func = partial(
|
||||
topotest.router_json_cmp,
|
||||
router,
|
||||
"show ip bgp vrf {}-cust1 json".format(router.name),
|
||||
"show ip bgp vrf {}-bfd-cust1 json".format(router.name),
|
||||
expected,
|
||||
)
|
||||
_, res = topotest.run_and_expect(test_func, None, count=16, wait=1)
|
||||
|
@ -178,14 +178,10 @@ NEXT_HOP_IP = {"ipv4": "Null0", "ipv6": "Null0"}
|
||||
LOOPBACK_1 = {
|
||||
"ipv4": "10.10.10.10/32",
|
||||
"ipv6": "10::10:10/128",
|
||||
"ipv4_mask": "255.255.255.255",
|
||||
"ipv6_mask": None,
|
||||
}
|
||||
LOOPBACK_2 = {
|
||||
"ipv4": "20.20.20.20/32",
|
||||
"ipv6": "20::20:20/128",
|
||||
"ipv4_mask": "255.255.255.255",
|
||||
"ipv6_mask": None,
|
||||
}
|
||||
|
||||
|
||||
@ -1911,7 +1907,6 @@ def test_static_routes_for_inter_vrf_route_leaking_p0(request):
|
||||
"loopback1",
|
||||
LOOPBACK_1[addr_type],
|
||||
"RED_A",
|
||||
LOOPBACK_1["{}_mask".format(addr_type)],
|
||||
)
|
||||
create_interface_in_kernel(
|
||||
tgen,
|
||||
@ -1919,7 +1914,6 @@ def test_static_routes_for_inter_vrf_route_leaking_p0(request):
|
||||
"loopback2",
|
||||
LOOPBACK_2[addr_type],
|
||||
"RED_B",
|
||||
LOOPBACK_2["{}_mask".format(addr_type)],
|
||||
)
|
||||
|
||||
step(
|
||||
@ -2047,7 +2041,6 @@ def test_inter_vrf_and_intra_vrf_communication_iBGP_p0(request):
|
||||
"loopback1",
|
||||
LOOPBACK_1[addr_type],
|
||||
"RED_A",
|
||||
LOOPBACK_1["{}_mask".format(addr_type)],
|
||||
)
|
||||
|
||||
create_interface_in_kernel(
|
||||
@ -2056,7 +2049,6 @@ def test_inter_vrf_and_intra_vrf_communication_iBGP_p0(request):
|
||||
"loopback2",
|
||||
LOOPBACK_2[addr_type],
|
||||
"BLUE_A",
|
||||
LOOPBACK_2["{}_mask".format(addr_type)],
|
||||
)
|
||||
|
||||
step(
|
||||
@ -2216,7 +2208,6 @@ def test_inter_vrf_and_intra_vrf_communication_eBGP_p0(request):
|
||||
"loopback1",
|
||||
LOOPBACK_1[addr_type],
|
||||
"RED_A",
|
||||
LOOPBACK_1["{}_mask".format(addr_type)],
|
||||
)
|
||||
create_interface_in_kernel(
|
||||
tgen,
|
||||
@ -2224,7 +2215,6 @@ def test_inter_vrf_and_intra_vrf_communication_eBGP_p0(request):
|
||||
"loopback2",
|
||||
LOOPBACK_2[addr_type],
|
||||
"BLUE_A",
|
||||
LOOPBACK_2["{}_mask".format(addr_type)],
|
||||
)
|
||||
|
||||
step(
|
||||
|
@ -131,8 +131,6 @@ NEXT_HOP_IP = {"ipv4": "Null0", "ipv6": "Null0"}
|
||||
LOOPBACK_2 = {
|
||||
"ipv4": "20.20.20.20/32",
|
||||
"ipv6": "20::20:20/128",
|
||||
"ipv4_mask": "255.255.255.255",
|
||||
"ipv6_mask": None,
|
||||
}
|
||||
|
||||
MAX_PATHS = 2
|
||||
@ -1928,7 +1926,6 @@ def test_vrf_route_leaking_next_hop_interface_flapping_p1(request):
|
||||
"loopback2",
|
||||
LOOPBACK_2[addr_type],
|
||||
"RED_B",
|
||||
LOOPBACK_2["{}_mask".format(addr_type)],
|
||||
)
|
||||
|
||||
intf_red1_r11 = topo["routers"]["red1"]["links"]["r1-link2"]["interface"]
|
||||
|
@ -1103,7 +1103,7 @@ def test_next_hop_with_recursive_lookup_p1(request):
|
||||
tc_name, result
|
||||
)
|
||||
|
||||
step("Toggle the interface on R3(ifconfig 192.34).")
|
||||
step("Toggle the interface on R3.")
|
||||
|
||||
intf_r3_r4 = topo["routers"]["r3"]["links"]["r4"]["interface"]
|
||||
shutdown_bringup_interface(tgen, "r3", intf_r3_r4)
|
||||
@ -1161,7 +1161,7 @@ def test_next_hop_with_recursive_lookup_p1(request):
|
||||
tc_name, result
|
||||
)
|
||||
|
||||
step("Toggle the interface on R4(ifconfig 192.34).")
|
||||
step("Toggle the interface on R4.")
|
||||
|
||||
intf_r4_r3 = topo["routers"]["r4"]["links"]["r3"]["interface"]
|
||||
shutdown_bringup_interface(tgen, "r4", intf_r4_r3)
|
||||
|
@ -123,8 +123,6 @@ LOOPBACK_1 = {
|
||||
LOOPBACK_2 = {
|
||||
"ipv4": "10.0.0.16/24",
|
||||
"ipv6": "fd00:0:0:3::5/64",
|
||||
"ipv4_mask": "255.255.255.0",
|
||||
"ipv6_mask": None,
|
||||
}
|
||||
PREFERRED_NEXT_HOP = "global"
|
||||
|
||||
@ -692,14 +690,13 @@ def test_dynamic_imported_routes_advertised_to_iBGP_peer_p0(request):
|
||||
"loopback2",
|
||||
LOOPBACK_2[addr_type],
|
||||
"ISR",
|
||||
LOOPBACK_2["{}_mask".format(addr_type)],
|
||||
)
|
||||
|
||||
for addr_type in ADDR_TYPES:
|
||||
|
||||
step(
|
||||
"On router R1 Change the next-hop of static routes in vrf "
|
||||
"ISR to LOOPBACK_1"
|
||||
"ISR to LOOPBACK_2"
|
||||
)
|
||||
|
||||
input_routes_r1 = {
|
||||
|
@ -1,5 +1,5 @@
|
||||
!
|
||||
router bgp 100 vrf r1-cust1
|
||||
router bgp 100 vrf r1-bgp-cust1
|
||||
bgp router-id 10.0.1.1
|
||||
bgp bestpath as-path multipath-relax
|
||||
no bgp ebgp-requires-policy
|
||||
|
@ -2,7 +2,7 @@
|
||||
"ipv4Unicast":{
|
||||
"routerId":"10.0.1.1",
|
||||
"as":100,
|
||||
"vrfName":"r1-cust1",
|
||||
"vrfName":"r1-bgp-cust1",
|
||||
"peerCount":1,
|
||||
"peers":{
|
||||
"10.0.1.101":{
|
||||
|
@ -1,7 +1,7 @@
|
||||
{
|
||||
"routerId":"10.0.1.1",
|
||||
"as":100,
|
||||
"vrfName":"re1-cust1",
|
||||
"vrfName":"re1-bgp-cust1",
|
||||
"peerCount":1,
|
||||
"peers":{
|
||||
"10.0.1.101":{
|
||||
|
@ -1,5 +1,5 @@
|
||||
!
|
||||
interface r1-eth0 vrf r1-cust1
|
||||
interface r1-eth0 vrf r1-bgp-cust1
|
||||
ip address 10.0.1.1/24
|
||||
!
|
||||
line vty
|
||||
|
@ -106,13 +106,12 @@ def setup_module(module):
|
||||
if CustomizeVrfWithNetns == True:
|
||||
logger.info("Testing with VRF Namespace support")
|
||||
|
||||
# create VRF r1-cust1
|
||||
# move r1-eth0 to VRF r1-cust1
|
||||
# create VRF r1-bgp-cust1
|
||||
# move r1-eth0 to VRF r1-bgp-cust1
|
||||
cmds = [
|
||||
"if [ -e /var/run/netns/{0}-cust1 ] ; then ip netns del {0}-cust1 ; fi",
|
||||
"ip netns add {0}-cust1",
|
||||
"ip link set dev {0}-eth0 netns {0}-cust1",
|
||||
"ip netns exec {0}-cust1 ifconfig {0}-eth0 up",
|
||||
"if [ -e /var/run/netns/{0}-bgp-cust1 ] ; then ip netns del {0}-bgp-cust1 ; fi",
|
||||
"ip netns add {0}-bgp-cust1",
|
||||
"ip link set {0}-eth0 netns {0}-bgp-cust1 up",
|
||||
]
|
||||
for cmd in cmds:
|
||||
cmd = cmd.format("r1")
|
||||
@ -154,10 +153,10 @@ def setup_module(module):
|
||||
def teardown_module(module):
|
||||
tgen = get_topogen()
|
||||
# move back r1-eth0 to default VRF
|
||||
# delete VRF r1-cust1
|
||||
# delete VRF r1-bgp-cust1
|
||||
cmds = [
|
||||
"ip netns exec {0}-cust1 ip link set {0}-eth0 netns 1",
|
||||
"ip netns delete {0}-cust1",
|
||||
"ip netns exec {0}-bgp-cust1 ip link set {0}-eth0 netns 1",
|
||||
"ip netns delete {0}-bgp-cust1",
|
||||
]
|
||||
for cmd in cmds:
|
||||
tgen.net["r1"].cmd(cmd.format("r1"))
|
||||
@ -203,7 +202,7 @@ def test_bgp_convergence():
|
||||
expected = json.loads(open(reffile).read())
|
||||
|
||||
test_func = functools.partial(
|
||||
topotest.router_json_cmp, router, "show bgp vrf r1-cust1 summary json", expected
|
||||
topotest.router_json_cmp, router, "show bgp vrf r1-bgp-cust1 summary json", expected
|
||||
)
|
||||
_, res = topotest.run_and_expect(test_func, None, count=90, wait=0.5)
|
||||
assertmsg = "BGP router network did not converge"
|
||||
@ -231,11 +230,11 @@ def test_bgp_vrf_netns():
|
||||
test_func = functools.partial(
|
||||
topotest.router_json_cmp,
|
||||
tgen.gears["r1"],
|
||||
"show ip bgp vrf r1-cust1 ipv4 json",
|
||||
"show ip bgp vrf r1-bgp-cust1 ipv4 json",
|
||||
expect,
|
||||
)
|
||||
_, res = topotest.run_and_expect(test_func, None, count=12, wait=0.5)
|
||||
assertmsg = 'expected routes in "show ip bgp vrf r1-cust1 ipv4" output'
|
||||
assertmsg = 'expected routes in "show ip bgp vrf r1-bgp-cust1 ipv4" output'
|
||||
assert res is None, assertmsg
|
||||
|
||||
|
||||
|
@ -971,22 +971,31 @@ def add_interfaces_to_vlan(tgen, input_dict):
|
||||
for intf_dict in interfaces:
|
||||
for interface, data in intf_dict.items():
|
||||
# Adding interface to VLAN
|
||||
cmd = "vconfig add {} {}".format(interface, vlan)
|
||||
vlan_intf = "{}.{}".format(interface, vlan)
|
||||
cmd = "ip link add link {} name {} type vlan id {}".format(
|
||||
interface,
|
||||
vlan_intf,
|
||||
vlan
|
||||
)
|
||||
logger.info("[DUT: %s]: Running command: %s", dut, cmd)
|
||||
rnode.run(cmd)
|
||||
|
||||
vlan_intf = "{}.{}".format(interface, vlan)
|
||||
|
||||
ip = data["ip"]
|
||||
subnet = data["subnet"]
|
||||
|
||||
# Bringing interface up
|
||||
cmd = "ip link set up {}".format(vlan_intf)
|
||||
cmd = "ip link set {} up".format(vlan_intf)
|
||||
logger.info("[DUT: %s]: Running command: %s", dut, cmd)
|
||||
rnode.run(cmd)
|
||||
|
||||
# Assigning IP address
|
||||
cmd = "ifconfig {} {} netmask {}".format(vlan_intf, ip, subnet)
|
||||
ifaddr = ipaddress.ip_interface(
|
||||
u"{}/{}".format(
|
||||
frr_unicode(data["ip"]),
|
||||
frr_unicode(data["subnet"])
|
||||
)
|
||||
)
|
||||
|
||||
cmd = "ip -{0} a flush {1} scope global && ip a add {2} dev {1} && ip l set {1} up".format(
|
||||
ifaddr.version, vlan_intf, ifaddr
|
||||
)
|
||||
logger.info("[DUT: %s]: Running command: %s", dut, cmd)
|
||||
rnode.run(cmd)
|
||||
|
||||
@ -1391,15 +1400,20 @@ def create_interface_in_kernel(
|
||||
rnode = tgen.routers()[dut]
|
||||
|
||||
if create:
|
||||
cmd = "sudo ip link add name {} type dummy".format(name)
|
||||
cmd = "ip link show {0} >/dev/null || ip link add {0} type dummy".format(name)
|
||||
rnode.run(cmd)
|
||||
|
||||
addr_type = validate_ip_address(ip_addr)
|
||||
if addr_type == "ipv4":
|
||||
cmd = "ifconfig {} {} netmask {}".format(name, ip_addr, netmask)
|
||||
if not netmask:
|
||||
ifaddr = ipaddress.ip_interface(frr_unicode(ip_addr))
|
||||
else:
|
||||
cmd = "ifconfig {} inet6 add {}/{}".format(name, ip_addr, netmask)
|
||||
|
||||
ifaddr = ipaddress.ip_interface(u"{}/{}".format(
|
||||
frr_unicode(ip_addr),
|
||||
frr_unicode(netmask)
|
||||
))
|
||||
cmd = "ip -{0} a flush {1} scope global && ip a add {2} dev {1} && ip l set {1} up".format(
|
||||
ifaddr.version, name, ifaddr
|
||||
)
|
||||
logger.info("[DUT: %s]: Running command: %s", dut, cmd)
|
||||
rnode.run(cmd)
|
||||
|
||||
if vrf:
|
||||
@ -2933,7 +2947,7 @@ def configure_interface_mac(tgen, input_dict):
|
||||
rnode = tgen.routers()[dut]
|
||||
|
||||
for intf, mac in input_dict[dut].items():
|
||||
cmd = "ifconfig {} hw ether {}".format(intf, mac)
|
||||
cmd = "ip link set {} address {}".format(intf, mac)
|
||||
logger.info("[DUT: %s]: Running command: %s", dut, cmd)
|
||||
|
||||
try:
|
||||
|
@ -1008,8 +1008,8 @@ def test_BSM_fragmentation_p1(request):
|
||||
|
||||
# set mtu of fhr(f1) to i1 interface to 100 so that bsm fragments
|
||||
step("set mtu of fhr(f1) to i1 interface to 100 so that bsm fragments")
|
||||
fhr_node.run("ifconfig f1-i1-eth2 mtu 100")
|
||||
inter_node.run("ifconfig i1-f1-eth0 mtu 100")
|
||||
fhr_node.run("ip link set f1-i1-eth2 mtu 100")
|
||||
inter_node.run("ip link set i1-f1-eth0 mtu 100")
|
||||
|
||||
# Use scapy to send pre-defined packet from senser to receiver
|
||||
result = scapy_send_bsr_raw_packet(tgen, topo, "b1", "f1", "packet2")
|
||||
|
@ -1011,7 +1011,7 @@ def test_ospf_tc4_mtu_ignore_p0(request):
|
||||
r0_r1_intf = topo["routers"]["r0"]["links"]["r1"]["interface"]
|
||||
r1_r0_intf = topo["routers"]["r1"]["links"]["r0"]["interface"]
|
||||
|
||||
rtr0.run("ifconfig {} mtu 1200".format(r0_r1_intf))
|
||||
rtr0.run("ip link set {} mtu 1200".format(r0_r1_intf))
|
||||
|
||||
clear_ospf(tgen, "r0")
|
||||
|
||||
@ -1037,7 +1037,7 @@ def test_ospf_tc4_mtu_ignore_p0(request):
|
||||
"Modify the MTU to non default Value on R0 to R1 interface. "
|
||||
"Reset ospf neighbors on R0."
|
||||
)
|
||||
rtr0.run("ifconfig {} mtu 1500".format(r0_r1_intf))
|
||||
rtr0.run("ip link set {} mtu 1500".format(r0_r1_intf))
|
||||
|
||||
clear_ospf(tgen, "r0")
|
||||
|
||||
@ -1062,7 +1062,7 @@ def test_ospf_tc4_mtu_ignore_p0(request):
|
||||
result = config_ospf_interface(tgen, topo, r1_ospf_mtu)
|
||||
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||
|
||||
rtr0.run("ifconfig {} mtu 1200".format(r0_r1_intf))
|
||||
rtr0.run("ip link set {} mtu 1200".format(r0_r1_intf))
|
||||
|
||||
clear_ospf(tgen, "r0")
|
||||
|
||||
@ -1094,7 +1094,7 @@ def test_ospf_tc4_mtu_ignore_p0(request):
|
||||
|
||||
step("Modify the MTU to again default valaue on R0 to R1 interface.")
|
||||
|
||||
rtr0.run("ifconfig {} mtu 1500".format(r0_r1_intf))
|
||||
rtr0.run("ip link set {} mtu 1500".format(r0_r1_intf))
|
||||
|
||||
clear_ospf(tgen, "r0")
|
||||
|
||||
@ -1106,8 +1106,8 @@ def test_ospf_tc4_mtu_ignore_p0(request):
|
||||
"Configure ospf interface with jumbo MTU (9216)." "Reset ospf neighbors on R0."
|
||||
)
|
||||
|
||||
rtr0.run("ifconfig {} mtu 9216".format(r0_r1_intf))
|
||||
rtr1.run("ifconfig {} mtu 9216".format(r1_r0_intf))
|
||||
rtr0.run("ip link set {} mtu 9216".format(r0_r1_intf))
|
||||
rtr1.run("ip link set {} mtu 9216".format(r1_r0_intf))
|
||||
|
||||
clear_ospf(tgen, "r0")
|
||||
clear_ospf(tgen, "r1")
|
||||
|
@ -3,7 +3,7 @@ hostname r1
|
||||
password zebra
|
||||
log file /tmp/r1-ospfd.log
|
||||
!
|
||||
router ospf vrf r1-cust1
|
||||
router ospf vrf r1-ospf-cust1
|
||||
ospf router-id 10.0.255.1
|
||||
redistribute kernel
|
||||
redistribute connected
|
||||
|
@ -1,4 +1,4 @@
|
||||
VRF Name: r1-cust1
|
||||
VRF Name: r1-ospf-cust1
|
||||
============ OSPF network routing table ============
|
||||
N 10.0.1.0/24 [10] area: 0.0.0.0
|
||||
directly attached to r1-eth0
|
||||
|
@ -1,4 +1,4 @@
|
||||
VRF Name: r1-cust1
|
||||
VRF Name: r1-ospf-cust1
|
||||
============ OSPF network routing table ============
|
||||
N 10.0.1.0/24 [10] area: 0.0.0.0
|
||||
directly attached to r1-eth0
|
||||
|
@ -7,10 +7,10 @@ hostname r1
|
||||
password zebra
|
||||
log file /tmp/r1-zebra.log
|
||||
!
|
||||
interface r1-eth0 vrf r1-cust1
|
||||
interface r1-eth0 vrf r1-ospf-cust1
|
||||
ip address 10.0.1.1/24
|
||||
!
|
||||
interface r1-eth1 vrf r1-cust1
|
||||
interface r1-eth1 vrf r1-ospf-cust1
|
||||
ip address 10.0.3.2/24
|
||||
!
|
||||
ip forwarding
|
||||
|
@ -1,4 +1,4 @@
|
||||
VRF r1-cust1:
|
||||
VRF r1-ospf-cust1:
|
||||
O 10.0.1.0/24 [110/10] is directly connected, r1-eth0, weight 1, XX:XX:XX
|
||||
C>* 10.0.1.0/24 is directly connected, r1-eth0, XX:XX:XX
|
||||
O>* 10.0.2.0/24 [110/20] via 10.0.3.3, r1-eth1, weight 1, XX:XX:XX
|
||||
|
@ -1,4 +1,4 @@
|
||||
VRF r1-cust1:
|
||||
VRF r1-ospf-cust1:
|
||||
O 10.0.1.0/24 [110/10] is directly connected, r1-eth0, weight 1, XX:XX:XX
|
||||
C>* 10.0.1.0/24 is directly connected, r1-eth0, XX:XX:XX
|
||||
O>* 10.0.2.0/24 [110/20] via 10.0.3.3, r1-eth1, weight 1, XX:XX:XX
|
||||
|
@ -4,7 +4,7 @@ password zebra
|
||||
log file /tmp/r2-ospfd.log
|
||||
!
|
||||
!
|
||||
router ospf vrf r2-cust1
|
||||
router ospf vrf r2-ospf-cust1
|
||||
ospf router-id 10.0.255.2
|
||||
redistribute kernel
|
||||
redistribute connected
|
||||
|
@ -1,4 +1,4 @@
|
||||
VRF Name: r2-cust1
|
||||
VRF Name: r2-ospf-cust1
|
||||
============ OSPF network routing table ============
|
||||
N 10.0.1.0/24 [20] area: 0.0.0.0
|
||||
via 10.0.3.2, r2-eth1
|
||||
|
@ -1,4 +1,4 @@
|
||||
VRF Name: r2-cust1
|
||||
VRF Name: r2-ospf-cust1
|
||||
============ OSPF network routing table ============
|
||||
N 10.0.1.0/24 [20] area: 0.0.0.0
|
||||
via 10.0.3.2, r2-eth1
|
||||
|
@ -3,10 +3,10 @@ hostname r2
|
||||
password zebra
|
||||
log file /tmp/r2-zebra.log
|
||||
!
|
||||
interface r2-eth0 vrf r2-cust1
|
||||
interface r2-eth0 vrf r2-ospf-cust1
|
||||
ip address 10.0.2.1/24
|
||||
!
|
||||
interface r2-eth1 vrf r2-cust1
|
||||
interface r2-eth1 vrf r2-ospf-cust1
|
||||
ip address 10.0.3.3/24
|
||||
!
|
||||
ip forwarding
|
||||
|
@ -1,4 +1,4 @@
|
||||
VRF r2-cust1:
|
||||
VRF r2-ospf-cust1:
|
||||
O>* 10.0.1.0/24 [110/20] via 10.0.3.2, r2-eth1, weight 1, XX:XX:XX
|
||||
O 10.0.2.0/24 [110/10] is directly connected, r2-eth0, weight 1, XX:XX:XX
|
||||
C>* 10.0.2.0/24 is directly connected, r2-eth0, XX:XX:XX
|
||||
|
@ -1,4 +1,4 @@
|
||||
VRF r2-cust1:
|
||||
VRF r2-ospf-cust1:
|
||||
O>* 10.0.1.0/24 [110/20] via 10.0.3.2, r2-eth1, weight 1, XX:XX:XX
|
||||
O 10.0.2.0/24 [110/10] is directly connected, r2-eth0, weight 1, XX:XX:XX
|
||||
C>* 10.0.2.0/24 is directly connected, r2-eth0, XX:XX:XX
|
||||
|
@ -4,7 +4,7 @@ password zebra
|
||||
log file /tmp/r3-ospfd.log
|
||||
!
|
||||
!
|
||||
router ospf vrf r3-cust1
|
||||
router ospf vrf r3-ospf-cust1
|
||||
ospf router-id 10.0.255.3
|
||||
redistribute kernel
|
||||
redistribute connected
|
||||
|
@ -1,4 +1,4 @@
|
||||
VRF Name: r3-cust1
|
||||
VRF Name: r3-ospf-cust1
|
||||
============ OSPF network routing table ============
|
||||
N 10.0.1.0/24 [20] area: 0.0.0.0
|
||||
via 10.0.3.2, r3-eth0
|
||||
|
@ -1,4 +1,4 @@
|
||||
VRF Name: r3-cust1
|
||||
VRF Name: r3-ospf-cust1
|
||||
============ OSPF network routing table ============
|
||||
N 10.0.10.0/24 [10] area: 0.0.0.0
|
||||
directly attached to r3-eth1
|
||||
|
@ -3,10 +3,10 @@ hostname r3
|
||||
password zebra
|
||||
log file /tmp/r3-zebra.log
|
||||
!
|
||||
interface r3-eth0 vrf r3-cust1
|
||||
interface r3-eth0 vrf r3-ospf-cust1
|
||||
ip address 10.0.3.1/24
|
||||
!
|
||||
interface r3-eth1 vrf r3-cust1
|
||||
interface r3-eth1 vrf r3-ospf-cust1
|
||||
ip address 10.0.10.1/24
|
||||
!
|
||||
ip forwarding
|
||||
|
@ -1,4 +1,4 @@
|
||||
VRF r3-cust1:
|
||||
VRF r3-ospf-cust1:
|
||||
O>* 10.0.1.0/24 [110/20] via 10.0.3.2, r3-eth0, weight 1, XX:XX:XX
|
||||
O>* 10.0.2.0/24 [110/20] via 10.0.3.3, r3-eth0, weight 1, XX:XX:XX
|
||||
O 10.0.3.0/24 [110/10] is directly connected, r3-eth0, weight 1, XX:XX:XX
|
||||
|
@ -1,4 +1,4 @@
|
||||
VRF r3-cust1:
|
||||
VRF r3-ospf-cust1:
|
||||
O 10.0.10.0/24 [110/10] is directly connected, r3-eth1, weight 1, XX:XX:XX
|
||||
C>* 10.0.10.0/24 is directly connected, r3-eth1, XX:XX:XX
|
||||
|
||||
|
@ -100,17 +100,17 @@ def setup_module(mod):
|
||||
logger.info("Testing with VRF Namespace support")
|
||||
|
||||
cmds = [
|
||||
"if [ -e /var/run/netns/{0}-cust1 ] ; then ip netns del {0}-cust1 ; fi",
|
||||
"ip netns add {0}-cust1",
|
||||
"ip link set dev {0}-eth0 netns {0}-cust1",
|
||||
"ip netns exec {0}-cust1 ifconfig {0}-eth0 up",
|
||||
"ip link set dev {0}-eth1 netns {0}-cust1",
|
||||
"ip netns exec {0}-cust1 ifconfig {0}-eth1 up",
|
||||
"if [ -e /var/run/netns/{0}-ospf-cust1 ] ; then ip netns del {0}-ospf-cust1 ; fi",
|
||||
"ip netns add {0}-ospf-cust1",
|
||||
"ip link set dev {0}-eth0 netns {0}-ospf-cust1",
|
||||
"ip netns exec {0}-ospf-cust1 ip link set {0}-eth0 up",
|
||||
"ip link set dev {0}-eth1 netns {0}-ospf-cust1",
|
||||
"ip netns exec {0}-ospf-cust1 ip link set {0}-eth1 up",
|
||||
]
|
||||
|
||||
for rname, router in router_list.items():
|
||||
|
||||
# create VRF rx-cust1 and link rx-eth0 to rx-cust1
|
||||
# create VRF rx-ospf-cust1 and link rx-eth0 to rx-ospf-cust1
|
||||
for cmd in cmds:
|
||||
output = tgen.net[rname].cmd(cmd.format(rname))
|
||||
|
||||
@ -137,9 +137,9 @@ def teardown_module(mod):
|
||||
# move back rx-eth0 to default VRF
|
||||
# delete rx-vrf
|
||||
cmds = [
|
||||
"ip netns exec {0}-cust1 ip link set {0}-eth0 netns 1",
|
||||
"ip netns exec {0}-cust1 ip link set {0}-eth1 netns 1",
|
||||
"ip netns delete {0}-cust1",
|
||||
"ip netns exec {0}-ospf-cust1 ip link set {0}-eth0 netns 1",
|
||||
"ip netns exec {0}-ospf-cust1 ip link set {0}-eth1 netns 1",
|
||||
"ip netns delete {0}-ospf-cust1",
|
||||
]
|
||||
|
||||
router_list = tgen.routers()
|
||||
@ -152,11 +152,11 @@ def teardown_module(mod):
|
||||
# Shared test function to validate expected output.
|
||||
def compare_show_ip_route_vrf(rname, expected):
|
||||
"""
|
||||
Calls 'show ip ospf vrf [rname]-cust1 route' for router `rname` and compare the obtained
|
||||
Calls 'show ip ospf vrf [rname]-ospf-cust1 route' for router `rname` and compare the obtained
|
||||
result with the expected output.
|
||||
"""
|
||||
tgen = get_topogen()
|
||||
vrf_name = "{0}-cust1".format(rname)
|
||||
vrf_name = "{0}-ospf-cust1".format(rname)
|
||||
current = topotest.ip4_route_zebra(tgen.gears[rname], vrf_name)
|
||||
ret = topotest.difflines(
|
||||
current, expected, title1="Current output", title2="Expected output"
|
||||
@ -182,7 +182,7 @@ def test_ospf_convergence():
|
||||
test_func = partial(
|
||||
topotest.router_output_cmp,
|
||||
router,
|
||||
"show ip ospf vrf {0}-cust1 route".format(rname),
|
||||
"show ip ospf vrf {0}-ospf-cust1 route".format(rname),
|
||||
expected,
|
||||
)
|
||||
result, diff = topotest.run_and_expect(test_func, "", count=160, wait=0.5)
|
||||
@ -220,13 +220,13 @@ def test_ospf_json():
|
||||
|
||||
for rname, router in tgen.routers().items():
|
||||
logger.info(
|
||||
'Comparing router "%s" "show ip ospf vrf %s-cust1 json" output',
|
||||
'Comparing router "%s" "show ip ospf vrf %s-ospf-cust1 json" output',
|
||||
router.name,
|
||||
router.name,
|
||||
)
|
||||
expected = {
|
||||
"{}-cust1".format(router.name): {
|
||||
"vrfName": "{}-cust1".format(router.name),
|
||||
"{}-ospf-cust1".format(router.name): {
|
||||
"vrfName": "{}-ospf-cust1".format(router.name),
|
||||
"routerId": "10.0.255.{}".format(rname[1:]),
|
||||
"tosRoutesOnly": True,
|
||||
"rfc2328Conform": True,
|
||||
@ -244,7 +244,7 @@ def test_ospf_json():
|
||||
}
|
||||
# Area specific additional checks
|
||||
if router.name == "r1" or router.name == "r2" or router.name == "r3":
|
||||
expected["{}-cust1".format(router.name)]["areas"]["0.0.0.0"] = {
|
||||
expected["{}-ospf-cust1".format(router.name)]["areas"]["0.0.0.0"] = {
|
||||
"areaIfActiveCounter": 2,
|
||||
"areaIfTotalCounter": 2,
|
||||
"authentication": "authenticationNone",
|
||||
@ -263,7 +263,7 @@ def test_ospf_json():
|
||||
test_func = partial(
|
||||
topotest.router_json_cmp,
|
||||
router,
|
||||
"show ip ospf vrf {0}-cust1 json".format(rname),
|
||||
"show ip ospf vrf {0}-ospf-cust1 json".format(rname),
|
||||
expected,
|
||||
)
|
||||
_, diff = topotest.run_and_expect(test_func, None, count=10, wait=0.5)
|
||||
@ -281,7 +281,7 @@ def test_ospf_link_down():
|
||||
# Simulate a network down event on router3 switch3 interface.
|
||||
router3 = tgen.gears["r3"]
|
||||
topotest.interface_set_status(
|
||||
router3, "r3-eth0", ifaceaction=False, vrf_name="r3-cust1"
|
||||
router3, "r3-eth0", ifaceaction=False, vrf_name="r3-ospf-cust1"
|
||||
)
|
||||
|
||||
# Expect convergence on all routers
|
||||
@ -295,7 +295,7 @@ def test_ospf_link_down():
|
||||
test_func = partial(
|
||||
topotest.router_output_cmp,
|
||||
router,
|
||||
"show ip ospf vrf {0}-cust1 route".format(rname),
|
||||
"show ip ospf vrf {0}-ospf-cust1 route".format(rname),
|
||||
expected,
|
||||
)
|
||||
result, diff = topotest.run_and_expect(test_func, "", count=140, wait=0.5)
|
||||
@ -316,7 +316,7 @@ def test_ospf_link_down_kernel_route():
|
||||
'Checking OSPF IPv4 kernel routes in "%s" after link down', router.name
|
||||
)
|
||||
|
||||
str = "{0}-cust1".format(router.name)
|
||||
str = "{0}-ospf-cust1".format(router.name)
|
||||
reffile = os.path.join(CWD, "{}/zebraroutedown.txt".format(router.name))
|
||||
expected = open(reffile).read()
|
||||
# Run test function until we get an result. Wait at most 60 seconds.
|
||||
|
Loading…
Reference in New Issue
Block a user