diff options
author | Kuldeep Kashyap <kashyapk@vmware.com> | 2022-03-02 00:31:25 +0100 |
---|---|---|
committer | Kuldeep Kashyap <kashyapk@vmware.com> | 2022-03-15 02:40:18 +0100 |
commit | cbeda33d013c39063b7599583a0fcee3b2e786d1 (patch) | |
tree | 27cbe282884f795ee5143b80ff57b6c1b04213cb /tests | |
parent | Merge pull request #10738 from LabNConsulting/chopps/fixgrpc (diff) | |
download | frr-cbeda33d013c39063b7599583a0fcee3b2e786d1.tar.xz frr-cbeda33d013c39063b7599583a0fcee3b2e786d1.zip |
tests: Adding EVPN-GR scenario to evpn_type5 suite
1. Adding EVPN-GR scenario to evpn_type5 suite
Signed-off-by: Kuldeep Kashyap <kashyapk@vmware.com>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/topotests/evpn_type5_test_topo1/test_evpn_type5_topo1.py | 217 |
1 files changed, 217 insertions, 0 deletions
diff --git a/tests/topotests/evpn_type5_test_topo1/test_evpn_type5_topo1.py b/tests/topotests/evpn_type5_test_topo1/test_evpn_type5_topo1.py index e7a72ef33..b3ff9d79c 100644 --- a/tests/topotests/evpn_type5_test_topo1/test_evpn_type5_topo1.py +++ b/tests/topotests/evpn_type5_test_topo1/test_evpn_type5_topo1.py @@ -70,6 +70,8 @@ from lib.common_config import ( configure_vxlan, configure_brctl, create_interface_in_kernel, + kill_router_daemons, + start_router_daemons ) from lib.topolog import logger @@ -1755,6 +1757,221 @@ def test_route_map_operations_for_evpn_address_family_p1(request, attribute): write_test_footer(tc_name) +def test_evpn_address_family_with_graceful_restart_p0(request): + """ + Verify Graceful-restart function for EVPN address-family. + """ + + tgen = get_topogen() + tc_name = request.node.name + write_test_header(tc_name) + check_router_status(tgen) + reset_config_on_routers(tgen) + add_default_routes(tgen) + + if tgen.routers_have_failure(): + pytest.skip(tgen.errors) + + for addr_type in ADDR_TYPES: + input_dict_1 = { + "r3": { + "static_routes": [{ + "network": NETWORK1_2[addr_type], + "next_hop": NEXT_HOP_IP[addr_type], + "vrf": "RED" + }] + }, + "r4":{ + "static_routes": [{ + "network": NETWORK1_3[addr_type], + "next_hop": NEXT_HOP_IP[addr_type], + "vrf": "BLUE" + }, + { + "network": NETWORK1_4[addr_type], + "next_hop": NEXT_HOP_IP[addr_type], + "vrf": "GREEN" + }] + } + } + + result = create_static_routes(tgen, input_dict_1) + assert result is True, 'Testcase {} : Failed \n Error: {}'.format( + tc_name, result) + + step("Redistribute static in (IPv4 and IPv6) address-family " + "on Edge-1 for all VRFs.") + + input_dict_2={} + for dut in ["r3", "r4"]: + temp = {dut: {"bgp": []}} + input_dict_2.update(temp) + + if dut == "r3": + VRFS = ["RED"] + AS_NUM = [3] + if dut == "r4": + VRFS = ["BLUE", "GREEN"] + AS_NUM = [4, 4] + + for vrf, as_num in zip(VRFS, AS_NUM): + temp[dut]["bgp"].append( + { + "local_as": as_num, + "vrf": vrf, + "address_family": { + "ipv4": { + "unicast": { + "redistribute": [{ + "redist_type": "static" + }] + } + }, + "ipv6": { + "unicast": { + "redistribute": [{ + "redist_type": "static" + }] + } + } + } + }) + + result = create_router_bgp(tgen, topo, input_dict_2) + assert result is True, "Testcase {} :Failed \n Error: {}". \ + format(tc_name, result) + + step("Verify on router Edge-1 that EVPN routes corresponding to " + "all VRFs are received from both routers DCG-1 and DCG-2") + + for addr_type in ADDR_TYPES: + input_routes = { + "r3": { + "static_routes": [{ + "network": NETWORK1_2[addr_type], + "next_hop": NEXT_HOP_IP[addr_type], + "vrf": "RED" + }] + }, + "r4":{ + "static_routes": [{ + "network": NETWORK1_3[addr_type], + "next_hop": NEXT_HOP_IP[addr_type], + "vrf": "BLUE" + }, + { + "network": NETWORK1_4[addr_type], + "next_hop": NEXT_HOP_IP[addr_type], + "vrf": "GREEN" + }] + } + } + + result = verify_rib(tgen, addr_type, "e1", input_routes) + assert result is True, "Testcase {} :Failed \n Error: {}". \ + format(tc_name, result) + + step("Configure DCG-2 as GR restarting node for EVPN session between" + " DCG-2 and EDGE-1, following by a session reset using 'clear bgp *'" + " command.") + + input_dict_gr = { + "d2": { + "bgp": + [ + { + "local_as": "200", + "graceful-restart": { + "graceful-restart": True, + } + } + ] + } + } + + result = create_router_bgp(tgen, topo, input_dict_gr) + assert result is True, "Testcase {} : Failed \n Error: {}".format( + tc_name, result) + + step("Verify that DCG-2 changes it's role to GR-restarting router " + "and EDGE-1 becomes the GR-helper.") + + step("Kill BGPd daemon on DCG-2.") + kill_router_daemons(tgen, "d2", ["bgpd"]) + + step("Verify that EDGE-1 keep stale entries for EVPN RT-5 routes " + "received from DCG-2 before the restart.") + + for addr_type in ADDR_TYPES: + input_routes = { + "r4":{ + "static_routes": [{ + "network": NETWORK1_3[addr_type], + "next_hop": NEXT_HOP_IP[addr_type], + "vrf": "BLUE" + }, + { + "network": NETWORK1_4[addr_type], + "next_hop": NEXT_HOP_IP[addr_type], + "vrf": "GREEN" + }] + } + } + result = verify_evpn_routes(tgen, topo, "e1", input_routes) + assert result is True, "Testcase {} :Failed \n Error: {}". \ + format(tc_name, result) + + step("Verify that DCG-2 keeps BGP routes in Zebra until BGPd " + "comes up or end of 'rib-stale-time'") + + step("Start BGPd daemon on DCG-2.") + start_router_daemons(tgen, "d2", ["bgpd"]) + + step("Verify that EDGE-1 removed all the stale entries.") + for addr_type in ADDR_TYPES: + input_routes = { + "r4":{ + "static_routes": [{ + "network": NETWORK1_3[addr_type], + "next_hop": NEXT_HOP_IP[addr_type], + "vrf": "BLUE" + }, + { + "network": NETWORK1_4[addr_type], + "next_hop": NEXT_HOP_IP[addr_type], + "vrf": "GREEN" + }] + } + } + result = verify_evpn_routes(tgen, topo, "e1", input_routes) + assert result is True, "Testcase {} :Failed \n Error: {}". \ + format(tc_name, result) + + step("Verify that DCG-2 refresh zebra with EVPN routes. " + "(no significance of 'rib-stale-time'") + + for addr_type in ADDR_TYPES: + input_routes = { + "r4":{ + "static_routes": [{ + "network": NETWORK1_3[addr_type], + "next_hop": NEXT_HOP_IP[addr_type], + "vrf": "BLUE" + }, + { + "network": NETWORK1_4[addr_type], + "next_hop": NEXT_HOP_IP[addr_type], + "vrf": "GREEN" + }] + } + } + result = verify_rib(tgen, addr_type, "d2", input_routes) + assert result is True, "Testcase {} :Failed \n Error: {}". \ + format(tc_name, result) + + write_test_footer(tc_name) + + @pytest.mark.parametrize("attribute", ["locPrf", "weight", "path"]) def test_bgp_attributes_for_evpn_address_family_p1(request, attribute): """ |