def prerequisite_config_for_test_suite(tgen): """ API to do prerequisite config for testsuite parameters: ----------- * `tgen`: topogen object """ step("Configure vxlan, bridge interface") for dut in ["e1", "d1", "d2"]: step("[DUT: ]Configure vxlan") vxlan_input = { dut: { "vxlan": [ { "vxlan_name": VXLAN["vxlan_name"], "vxlan_id": VXLAN["vxlan_id"], "dstport": VXLAN["dstport"], "local_addr": VXLAN["local_addr"][dut], "learning": VXLAN["learning"], } ] } } result = configure_vxlan(tgen, vxlan_input) assert result is True, "Testcase {} :Failed \n Error: {}".format( tc_name, result ) step("Configure bridge interface") brctl_input = { dut: { "brctl": [ { "brctl_name": BRCTL["brctl_name"], "addvxlan": BRCTL["addvxlan"], "vrf": BRCTL["vrf"], "stp": BRCTL["stp"], } ] } } result = configure_brctl(tgen, topo, brctl_input) assert result is True, "Testcase {} :Failed \n Error: {}".format( tc_name, result ) step("Configure default routes") add_default_routes(tgen)
def test_RT_verification_auto_p0(request): """ RT verification(auto) """ 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) step( "Advertise overlapping prefixes from VNFs R1 and R2 in all VRFs " "RED, GREEN and BLUE 100.1.1.1/32 and 100::100/128" ) for addr_type in ADDR_TYPES: input_dict_1 = { "r1": { "static_routes": [ { "network": NETWORK4_1[addr_type], "next_hop": NEXT_HOP_IP[addr_type], "vrf": "RED", } ] }, "r2": { "static_routes": [ { "network": NETWORK4_1[addr_type], "next_hop": NEXT_HOP_IP[addr_type], "vrf": "BLUE", }, { "network": NETWORK4_1[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( "Verify that Edge-1 receives same prefixes in all 3 VRFs via " "corresponding next-hop in associated VRF sh bgp vrf all" ) for addr_type in ADDR_TYPES: input_routes = { "r1": { "static_routes": [ { "network": NETWORK4_1[addr_type], "next_hop": NEXT_HOP_IP[addr_type], "vrf": "RED", } ] }, "r2": { "static_routes": [ { "network": NETWORK4_1[addr_type], "next_hop": NEXT_HOP_IP[addr_type], "vrf": "BLUE", }, { "network": NETWORK4_1[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 4-byte local AS number on Edge-1 and establish EVPN " "neighborship with DCG-1 & DCG-2." ) topo_local = deepcopy(topo) step("Delete BGP config for vrf RED.") input_dict_vni = { "e1": { "vrfs": [ {"name": "RED", "no_vni": VNI_1}, {"name": "BLUE", "no_vni": VNI_2}, {"name": "GREEN", "no_vni": VNI_3}, ] } } result = create_vrf_cfg(tgen, topo, input_dict=input_dict_vni) assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result) input_dict_2 = {} for dut in ["e1"]: temp = {dut: {"bgp": []}} input_dict_2.update(temp) INDEX = [0, 1, 2, 3] VRFS = ["RED", "BLUE", "GREEN", None] AS_NUM = [100, 100, 100, 100] for index, vrf, as_num in zip(INDEX, VRFS, AS_NUM): topo_local["routers"][dut]["bgp"][index]["local_as"] = 4294967293 if vrf: temp[dut]["bgp"].append( {"local_as": as_num, "vrf": vrf, "delete": True} ) else: temp[dut]["bgp"].append({"local_as": as_num, "delete": True}) result = create_router_bgp(tgen, topo, input_dict_2) assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result) result = create_router_bgp(tgen, topo_local["routers"]) assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result) input_dict_vni = { "e1": { "vrfs": [ {"name": "RED", "vni": VNI_1}, {"name": "BLUE", "vni": VNI_2}, {"name": "GREEN", "vni": VNI_3}, ] } } result = create_vrf_cfg(tgen, topo, input_dict=input_dict_vni) assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result) step( "Verify that all overlapping prefixes across different VRFs are " "advertised in EVPN with unique RD value(auto derived)." ) step( "Verify that FRR uses only the lower 2 bytes of ASN+VNI for auto " "derived RT value." ) for addr_type in ADDR_TYPES: input_routes_1 = { "r1": {"static_routes": [{"network": NETWORK4_1[addr_type], "vrf": "RED"}]} } input_routes_2 = { "r2": {"static_routes": [{"network": NETWORK4_1[addr_type], "vrf": "BLUE"}]} } input_routes_3 = { "r2": { "static_routes": [{"network": NETWORK4_1[addr_type], "vrf": "GREEN"}] } } result = verify_attributes_for_evpn_routes( tgen, topo, "e1", input_routes_1, rd="auto", rd_peer="e1" ) assert result is True, "Testcase {} :Failed \n Error: {}".format( tc_name, result ) result = verify_attributes_for_evpn_routes( tgen, topo, "e1", input_routes_1, rt="auto", rt_peer="e1" ) assert result is True, "Testcase {} :Failed \n Error: {}".format( tc_name, result ) result = verify_attributes_for_evpn_routes( tgen, topo, "e1", input_routes_2, rd="auto", rd_peer="e1" ) assert result is True, "Testcase {} :Failed \n Error: {}".format( tc_name, result ) result = verify_attributes_for_evpn_routes( tgen, topo, "e1", input_routes_2, rt="auto", rt_peer="e1" ) assert result is True, "Testcase {} :Failed \n Error: {}".format( tc_name, result ) result = verify_attributes_for_evpn_routes( tgen, topo, "e1", input_routes_3, rd="auto", rd_peer="e1" ) assert result is True, "Testcase {} :Failed \n Error: {}".format( tc_name, result ) result = verify_attributes_for_evpn_routes( tgen, topo, "e1", input_routes_3, rt="auto", rt_peer="e1" ) assert result is True, "Testcase {} :Failed \n Error: {}".format( tc_name, result ) step( "Verify that DCG-1(iBGP peer) automatically imports the prefixes" " from EVPN address-family to respective VRFs." ) step( "Verify if DCG-2(eBGP peer) automatically imports the prefixes " "from EVPN address-family to respective VRFs or not." ) for addr_type in ADDR_TYPES: input_routes = { "r1": { "static_routes": [ { "network": NETWORK4_1[addr_type], "next_hop": NEXT_HOP_IP[addr_type], "vrf": "RED", } ] }, "r2": { "static_routes": [ { "network": NETWORK4_1[addr_type], "next_hop": NEXT_HOP_IP[addr_type], "vrf": "BLUE", }, { "network": NETWORK4_1[addr_type], "next_hop": NEXT_HOP_IP[addr_type], "vrf": "GREEN", }, ] }, } result = verify_rib(tgen, addr_type, "d1", input_routes) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result ) result = verify_rib(tgen, addr_type, "d2", input_routes) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result ) step( "Change the VNI number for all 3 VRFs on Edge-1 as:" "RED : 75400, GREEN: 75500, BLUE: 75600" ) input_dict_vni = { "e1": { "vrfs": [ {"name": "RED", "no_vni": VNI_1}, {"name": "BLUE", "no_vni": VNI_2}, {"name": "GREEN", "no_vni": VNI_3}, ] } } result = create_vrf_cfg(tgen, topo, input_dict=input_dict_vni) assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result) input_dict_vni = { "e1": { "vrfs": [ {"name": "RED", "vni": 75400}, {"name": "BLUE", "vni": 75500}, {"name": "GREEN", "vni": 75600}, ] } } result = create_vrf_cfg(tgen, topo, input_dict=input_dict_vni) assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result) step("Delete configured vxlan") dut = "e1" vxlan_input = { dut: { "vxlan": [ { "vxlan_name": VXLAN["vxlan_name"], "vxlan_id": VXLAN["vxlan_id"], "dstport": VXLAN["dstport"], "local_addr": VXLAN["local_addr"][dut], "learning": VXLAN["learning"], "delete": True, } ] } } result = configure_vxlan(tgen, vxlan_input) assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result) step("Configured vxlan") VXLAN["vxlan_id"] = [75400, 75500, 75600] vxlan_input = { dut: { "vxlan": [ { "vxlan_name": VXLAN["vxlan_name"], "vxlan_id": VXLAN["vxlan_id"], "dstport": VXLAN["dstport"], "local_addr": VXLAN["local_addr"][dut], "learning": VXLAN["learning"], } ] } } result = configure_vxlan(tgen, vxlan_input) assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result) step("Configure bridge interface") brctl_input = { dut: { "brctl": [ { "brctl_name": BRCTL["brctl_name"], "addvxlan": BRCTL["addvxlan"], "vrf": BRCTL["vrf"], "stp": BRCTL["stp"], } ] } } result = configure_brctl(tgen, topo, brctl_input) assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result) step( "Verify on Edge-1 that auto derived RT value has changed for " "each VRF based on VNI number.." ) input_dict = { "e1": { "vrfs": [ {"RED": {"vni": 75400}}, {"BLUE": {"vni": 75500}}, {"GREEN": {"vni": 75600}}, ] } } result = verify_vrf_vni(tgen, input_dict) assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result) step( "Verify on Edge-1 that auto derived RT value has changed for " "each VRF based on VNI number." ) for addr_type in ADDR_TYPES: input_routes = { "r1": {"static_routes": [{"network": NETWORK4_1[addr_type], "vrf": "RED"}]} } result = verify_attributes_for_evpn_routes( tgen, topo, "e1", input_routes, rt="auto", rt_peer="e1" ) assert result is True, "Testcase {} :Failed \n Error: {}".format( tc_name, result ) step( "Verify on DCG-2 that prefixes are not imported from EVPN " "address-family to VRFs as RT values are different on sending(" "edge-1) and receiving(DCG-2) end." ) for addr_type in ADDR_TYPES: input_routes = { "r1": {"static_routes": [{"network": NETWORK4_1[addr_type], "vrf": "RED"}]} } result = verify_rib(tgen, addr_type, "d2", input_routes, expected=False) assert result is not True, "Testcase {} :Failed \n " "Routes are still present: {}".format(tc_name, result) logger.info("Expected Behavior: {}".format(result)) step( "Revert back to original VNI number for all 3 VRFs on Edge-1 " "as: RED : 75100, GREEN: 75200, BLUE: 75300" ) input_dict_vni = { "e1": { "vrfs": [ {"name": "RED", "no_vni": 75400}, {"name": "BLUE", "no_vni": 75500}, {"name": "GREEN", "no_vni": 75600}, ] } } result = create_vrf_cfg(tgen, topo, input_dict=input_dict_vni) assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result) input_dict_vni = { "e1": { "vrfs": [ {"name": "RED", "vni": VNI_1}, {"name": "BLUE", "vni": VNI_2}, {"name": "GREEN", "vni": VNI_3}, ] } } result = create_vrf_cfg(tgen, topo, input_dict=input_dict_vni) assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result) step("Delete configured vxlan") dut = "e1" vxlan_input = { dut: { "vxlan": [ { "vxlan_name": VXLAN["vxlan_name"], "vxlan_id": VXLAN["vxlan_id"], "dstport": VXLAN["dstport"], "local_addr": VXLAN["local_addr"][dut], "learning": VXLAN["learning"], "delete": True, } ] } } result = configure_vxlan(tgen, vxlan_input) assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result) step("Configured vxlan") VXLAN["vxlan_id"] = [75100, 75200, 75300] vxlan_input = { dut: { "vxlan": [ { "vxlan_name": VXLAN["vxlan_name"], "vxlan_id": VXLAN["vxlan_id"], "dstport": VXLAN["dstport"], "local_addr": VXLAN["local_addr"][dut], "learning": VXLAN["learning"], } ] } } result = configure_vxlan(tgen, vxlan_input) assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result) step("Configure bridge interface") brctl_input = { dut: { "brctl": [ { "brctl_name": BRCTL["brctl_name"], "addvxlan": BRCTL["addvxlan"], "vrf": BRCTL["vrf"], "stp": BRCTL["stp"], } ] } } result = configure_brctl(tgen, topo, brctl_input) assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result) step( "Verify on Edge-1 that auto derived RT value has changed for " "each VRF based on VNI number." ) step( "Verify that DCG-1(iBGP peer) automatically imports the prefixes" " from EVPN address-family to respective VRFs." ) for addr_type in ADDR_TYPES: input_routes = { "r1": {"static_routes": [{"network": NETWORK4_1[addr_type], "vrf": "RED"}]} } result = verify_attributes_for_evpn_routes( tgen, topo, "e1", input_routes, rt="auto", rt_peer="e1" ) assert result is True, "Testcase {} :Failed \n Error: {}".format( tc_name, result ) result = verify_rib(tgen, addr_type, "d1", input_routes) assert result is True, "Testcase {} :Failed \n Error: {}".format( tc_name, result ) step("Test with smaller VNI numbers (1-75000)") input_dict_vni = {"e1": {"vrfs": [{"name": "RED", "no_vni": VNI_1}]}} result = create_vrf_cfg(tgen, topo, input_dict=input_dict_vni) assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result) input_dict_vni = {"e1": {"vrfs": [{"name": "RED", "vni": 111}]}} result = create_vrf_cfg(tgen, topo, input_dict=input_dict_vni) assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result) step( "Verify that DCG-2 receives EVPN prefixes along with auto " "derived RT values(based on smaller VNI numbers)" ) for addr_type in ADDR_TYPES: input_routes_1 = { "r1": {"static_routes": [{"network": NETWORK4_1[addr_type], "vrf": "RED"}]} } result = verify_attributes_for_evpn_routes( tgen, topo, "d2", input_routes_1, rt="auto", rt_peer="e1", expected=False ) assert result is not True, "Testcase {} :Failed \n " "Malfaromed Auto-RT value accepted: {}".format(tc_name, result) logger.info("Expected Behavior: {}".format(result)) step("Configure VNI number more than boundary limit (16777215)") input_dict_vni = {"e1": {"vrfs": [{"name": "RED", "no_vni": 111}]}} result = create_vrf_cfg(tgen, topo, input_dict=input_dict_vni) assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result) input_dict_vni = {"e1": {"vrfs": [{"name": "RED", "vni": 16777215}]}} result = create_vrf_cfg(tgen, topo, input_dict=input_dict_vni) assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result) step("CLI error for malformed VNI.") input_dict = { "e1": { "vrfs": [{"RED": {"vni": 16777215, "routerMac": "None", "state": "Down"}}] } } result = verify_vrf_vni(tgen, input_dict) assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result) for addr_type in ADDR_TYPES: input_routes_1 = { "r1": {"static_routes": [{"network": NETWORK4_1[addr_type], "vrf": "RED"}]} } result = verify_attributes_for_evpn_routes( tgen, topo, "d2", input_routes_1, rt="auto", rt_peer="e1", expected=False ) assert result is not True, "Testcase {} :Failed \n " "Malfaromed Auto-RT value accepted: {}".format(tc_name, result) logger.info("Expected Behavior: {}".format(result)) step("Un-configure VNI number more than boundary limit (16777215)") input_dict_vni = {"e1": {"vrfs": [{"name": "RED", "no_vni": 16777215}]}} result = create_vrf_cfg(tgen, topo, input_dict=input_dict_vni) assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result) write_test_footer(tc_name)